Ein weiterer Syntax-Highlighter in PHP, der so erweiterbar und benutzerfreundlich wie möglich sein soll, aber auf Leistung ausgelegt ist.
Sie können es live mit der neuesten Version auf https://KeyLighter.kadet.net/ ausprobieren.
Der Name „ KeyLighter “ ist vom Key Light-Konzept in der Fotografie und Kinematographie inspiriert.
Das Hauptlicht ist das erste und normalerweise wichtigste Licht, das ein Fotograf, Kameramann, Lichtkameramann oder anderer Szenenkomponist in einer Beleuchtungseinrichtung verwendet. Der Zweck des Hauptlichts besteht darin, die Form und Dimension des Motivs hervorzuheben.
KeyLighter soll dasselbe tun – für Code.
$ composer require kadet/ KeyLighter
Um KeyLighter nutzen zu können, benötigen Sie lediglich PHP 7.3 oder höher, es sind keine speziellen Erweiterungen erforderlich.
Es ist möglich, KeyLighter als globale Composer-Bibliothek zu installieren
$ composer global require kadet/ KeyLighter
Dann können Sie die integrierte einfache CLI-Hervorhebungs-App verwenden:
$ KeyLighter [command = highlight] [-l | --language [LANGUAGE]] [-f | --format [FORMAT]] [-d | --debug [DEBUG]] [--] < path > ...
Wenn Sie eine Weiterleitung an KeyLighter wünschen, geben Sie einfach php://stdin
als Pfad an. Sie können den Befehl list
verwenden, um alle verfügbaren Befehle anzuzeigen, und das Argument --help
für detaillierte Hilfe. Sie müssen den highlight
nicht explizit angeben.
Sie verwenden PowerShell unter Windows? Cool! KeyLighter verfügt über ein integriertes PowerShell-Modul, das die CLI-Nutzung noch besser macht. Importieren Sie einfach das Modul (z. B. im Profil) und schon kann es losgehen.
PS > Import-Module " ${ env: APPDATA} Composervendorkadet KeyLighter bin KeyLighter .psd1 "
Um die Autovervollständigungsfunktionen nutzen zu können, benötigen Sie PowerShell v5 (im Lieferumfang von Windows 10 enthalten) oder installieren das TabExpansion++-Modul.
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 );
Alle verfügbaren Sprachen finden Sie hier und Formatter hier.
KeyLighter war ursprünglich als CLI-Highlighter für meinen eigenen Gebrauch konzipiert, aber dann entschied ich, dass es in der Lage sein sollte, jede mögliche Ausgabe zu generieren, die derzeit unterstützt wird:
KadetHighlighterFormatterCliFormatter
Es kann sogar ein Stil erstellt werden. Standardstile werden in StylesCliDefault.php
gespeichert, aber Sie können einfach zusätzliche Argumente an einen Konstruktor übergeben:
new Kadet Highlighter Formatter CliFormatter ([
' string ' => [ ' color ' => ' green ' ],
' keyword ' => [ ' color ' => ' yellow ' ],
...
])
KadetHighlighterFormatterHtmlFormatter
Jedes Token wird in seinem eigenen span
platziert und Klassen werden mit einem Präfix versehen, sodass es leicht mit CSS gestaltet werden kann und keine Ihrer vorhandenen Klassen beeinträchtigen sollte
< span class =" kl-variable " > $maxOption </ span >
pre > span . kl-variable { color : # F7750D ; }
Es ist einfach, eigene Formatierer zu schreiben. Dokumentation folgt in Kürze.
Einige Token sind in bestimmten Kontexten gültig, andere nicht. Diese Bibliothek ist kontextsensitiv und Sie können definieren, wann sie gültig sind.
In diesem Fall bedeutet Kontext nur „innerhalb eines anderen Tokens“. Nehmen wir beispielsweise an, dass string
-Token als alles von „bis zum nächsten“ definiert ist und keyword
als Teilzeichenfolge „sit“ definiert ist.
↓ 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
Wie Sie sehen, befindet sich keyword
in string
und ist daher ungültig und sollte gelöscht werden. Sie können Token definieren, die nur in einem bestimmten Kontext gültig oder in anderen ungültig sind.
Ach ja, und Token-Namen kaskadieren, das bedeutet, dass string.single
string
ist, aber string
notwendigerweise nicht string.single
ist.
Es ist möglich, KeyLighter
problemlos um neue Sprachen zu erweitern. Eine ausführlichere Dokumentation folgt in Kürze.
Die XML-Definition sieht beispielsweise so aus:
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 ' ]
];
}
}
Ich werde versuchen, so viele Definitionen wie möglich zu schreiben, aber jede PR ist willkommen.
Viele Sprachen können gleichzeitig verwendet werden, CSS oder JS in HTML , SQL in
PHP und so weiter. KeyLighter kann eingebettete Sprachen problemlos verarbeiten und hervorheben.
Auch wenn es nicht der schnellste Code-Highlighter in PHP sein sollte, ist es dennoch recht schnell, mehr als doppelt so schnell wie GeSHi.
KeyLighter verwendet phpunit
zum Testen:
$ ./vendor/bin/phpunit
Es gibt noch einiges zu tun, alles findet ihr auf Trello.
Weitere Informationen finden Sie unter CONTRIBUTING.md.
Für Maciej, Maciej und Monika für jede Unterstützung, auch moralisch.