Encore un autre surligneur de syntaxe en PHP censé être aussi extensible et facile à utiliser que possible, mais en gardant les performances à l'esprit.
Vous pouvez l'essayer en direct avec la version la plus récente sur https://KeyLighter.kadet.net/.
Le nom « KeyLighter » est inspiré du concept Key Light en photographie et en cinématographie.
La lumière principale est la première lumière, et généralement la plus importante, qu'un photographe, un directeur de la photographie, un caméraman d'éclairage ou tout autre compositeur de scène utilisera dans une configuration d'éclairage. Le but de la lumière principale est de mettre en valeur la forme et la dimension du sujet.
KeyLighter est censé faire la même chose – pour le code.
$ composer require kadet/ KeyLighter
Pour utiliser KeyLighter vous avez juste besoin de PHP 7.3 ou version ultérieure, aucune extension spéciale n'est requise.
Il est possible d'installer KeyLighter en tant que bibliothèque globale de composition
$ composer global require kadet/ KeyLighter
Ensuite, vous pouvez utiliser l'application de mise en évidence cli simple intégrée :
$ KeyLighter [command = highlight] [-l | --language [LANGUAGE]] [-f | --format [FORMAT]] [-d | --debug [DEBUG]] [--] < path > ...
Si vous souhaitez rediriger vers KeyLighter spécifiez simplement php://stdin
comme chemin. Vous pouvez utiliser la commande list
pour voir toutes les commandes disponibles et l'argument --help
pour une aide détaillée. Vous n'êtes pas obligé de spécifier explicitement la commande highlight
.
Vous utilisez PowerShell sous Windows ? Cool! KeyLighter est livré avec un module PowerShell intégré qui rend l'utilisation de la CLI encore meilleure. Importez simplement le module (par exemple dans le profil) et vous êtes prêt à partir.
PS > Import-Module " ${ env: APPDATA} Composervendorkadet KeyLighter bin KeyLighter .psd1 "
Pour utiliser les fonctionnalités de saisie semi-automatique, vous aurez besoin de PowerShell v5 (livré avec Windows 10) ou installerez le module TabExpansion++.
use Kadet Highlighter Language ;
echo Kadet Highlighter highlight ( $ source , new Language Php (), $ formatter );
// or
echo Kadet Highlighter KeyLighter :: get ()-> highlight ( $ source , new Language Php (), $ formatter );
// or
$ KeyLighter = new Kadet Highlighter KeyLighter ([options]);
echo $ KeyLighter -> highlight ( $ source , new Language Php (), $ formatter );
Vous pouvez trouver toutes les langues disponibles ici et les formateurs ici.
KeyLighter a été initialement conçu comme un surligneur CLI pour mon propre usage, mais j'ai ensuite décidé qu'il devrait être capable de générer n'importe quelle sortie possible, actuellement prise en charge :
KadetHighlighterFormatterCliFormatter
Il peut même être stylisé, les styles par défaut sont stockés dans StylesCliDefault.php
, mais vous pouvez simplement passer un argument supplémentaire dans un constructeur :
new Kadet Highlighter Formatter CliFormatter ([
' string ' => [ ' color ' => ' green ' ],
' keyword ' => [ ' color ' => ' yellow ' ],
...
])
KadetHighlighterFormatterHtmlFormatter
Chaque jeton est placé dans sa propre span
et les classes sont préfixées afin qu'il puisse être facilement stylisé avec CSS et ne devrait interférer avec aucune de vos classes existantes.
< span class =" kl-variable " > $maxOption </ span >
pre > span . kl-variable { color : # F7750D ; }
Il est facile d'écrire vos propres formateurs. Documentation à venir.
Certains jetons sont valides dans certains contextes, d'autres non. Cette bibliothèque est sensible au contexte et vous pouvez définir quand elles sont valides.
Dans ce cas, le contexte signifie simplement "à l'intérieur d'un autre jeton", par exemple, supposons que le jeton string
est défini comme tout ce qui va de "au suivant" et que keyword
est défini comme une sous-chaîne "sit".
↓ string:start ↓ keyword : start
"Lorem ipsum dolor sit amtet"
keyword: end ↑ ↑ string: end
Token tree :
Token . name Token . pos
-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
string : start 0
keyword: start 21
keyword: end 23
string: end 30
Ainsi, comme vous pouvez le voir, keyword
se trouve à l’intérieur de string
et n’est donc pas valide et doit être supprimé. Vous pouvez définir des jetons valides uniquement dans certains contextes ou invalides dans un autre.
Oh, et les noms de jetons en cascade, cela signifie que string.single
est string
, mais string
n'est nécessairement pas string.single
.
Il est possible d'étendre facilement KeyLighter
avec de nouveaux langages, une documentation plus détaillée sera bientôt disponible.
Par exemple, la définition XML ressemble à ceci :
class Xml extends GreedyLanguage
{
private const IDENTIFIER = ' (?P<namespace>[w.-]+:)?(?P<name>[w.-]+) ' ;
/**
* Tokenization rules
*/
public function setupRules ()
{
$ this -> rules -> addMany ([
' tag.open ' => [
new OpenRule ( new RegexMatcher ( ' /(<[w.-]+)[:/>:s]/ ' )),
new CloseRule ( new SubStringMatcher ( ' > ' ), [ ' context ' => [ ' !string ' , ' !comment ' ]])
],
' tag.close ' => new Rule ( new RegexMatcher ( ' /(</ ' . self :: IDENTIFIER . ' >)/ ' )),
' symbol.tag ' => new Rule ( new RegexMatcher ( ' /< \ /? ' . self :: IDENTIFIER . ' / ' , [
' name ' => Token:: NAME ,
' namespace ' => ' $.namespace '
]), [ ' context ' => [ ' tag ' , ' !string ' ]]),
' symbol.attribute ' => new Rule ( new RegexMatcher ( ' / ' . self :: IDENTIFIER . ' =/ ' , [
' name ' => Token:: NAME ,
' namespace ' => ' $.namespace '
]), [ ' context ' => [ ' tag ' , ' !string ' ]]),
' constant.entity ' => new Rule ( new RegexMatcher ( ' /(&(?:#d+|[a-z])+;)/si ' )),
' comment ' => new Rule ( new CommentMatcher ( null , [[ ' <!-- ' , ' --> ' ]])),
' string ' => CommonFeatures:: strings ([ ' single ' => ''' , ' double ' => ' " ' ], [ ' context ' => [ ' tag ' ]]),
]);
}
/** {@inheritdoc} */
public function getIdentifier ()
{
return ' xml ' ;
}
public static function getMetadata ()
{
return [
' name ' => [ ' xml ' ],
' mime ' => [ ' application/xml ' , ' text/xml ' ],
' extension ' => [ ' *.xml ' ]
];
}
}
J'essaierai d'écrire autant de définitions que possible, mais tous les PR sont les bienvenus.
De nombreux langages peuvent être utilisés simultanément, css ou js dans html , sql dans
php et ainsi de suite. KeyLighter peut gérer et mettre en évidence les langues intégrées sans aucun problème.
Même s'il n'était pas censé être le surligneur de code le plus rapide en PHP, il reste assez rapide, plus de 2 fois plus rapide que GeSHi.
KeyLighter utilise phpunit
pour les tests :
$ ./vendor/bin/phpunit
Il y a encore peu de choses à faire, vous pouvez tout trouver sur trello.
Voir CONTRIBUTING.md pour plus de détails.
Pour Maciej, Maciej et Monika pour tout soutien, moral aussi.