ShikiPHP
Reiner PHP-Syntaxhervorheber, Portierung von Shiki. Gestalte Codeblöcke mit VS Code-Themes und TextMate-Grammatiken ohne Node. Die Ausgabe stimmt in 214 Oracle-Szenarien mit Shiki 3.23.0 überein.
composer require shikiphp/shikiphpNeueste Version v0.1.0 MIT PHP 8.2+, ext-json, ext-mbstring
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
'lang' => 'ansi',
'theme' => 'github-dark',
]);In der Praxis
Hebe ein Snippet aus einem PHP-Template oder Build-Skript hervor und gib das resultierende HTML aus.
Ein Aufruf pro Codeblock
Shikiphp::codeToHtml erhält den Code sowie eine Sprach-ID und eine Theme-ID. Es gibt einen vollständigen pre-Block zurück, dessen Farben inline angegeben sind, sodass er ohne zusätzliches Stylesheet gerendert wird.
Übergib statt theme eine themes-Map. Derselbe Block enthält dann helle und dunkle Farben in CSS-Variablen.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml(<<<'PHP'
<?php
function greet(string $name): string {
return "Hello, {$name}!";
}
PHP, [
'lang' => 'php',
'theme' => 'github-dark',
]);use Shikiphp\Shikiphp;
$code = 'const answer: number = 42';
echo Shikiphp::codeToHtml($code, [
'lang' => 'ts',
'themes' => ['light' => 'github-light', 'dark' => 'github-dark'],
]);Echte TextMate-Grammatiken
Eine originalgetreue Portierung von vscode-textmate: eingebettete Sprachen, Injections und verschachtelte Repositories. Dieselben Grammatiken, die Shiki und VS Code zur Tokenisierung verwenden.
VS Code-Themes
Spezifität von Scope-Selektoren und Abgleich übergeordneter Scopes, portiert von vscode-textmate. Einzelnes Theme oder hell/dunkel mit CSS-Variablen.
Ausgabe wie bei Shiki
In 214 Oracle-Szenarien stimmen 167 der 253 gebündelten Grammatiken, ANSI und alle 65 Themes exakt mit der HTML von Shiki 3.23.0 und seiner Regex-Engine JavaScript überein, abgesehen von vorangestelltem und nachfolgendem Leerraum.
Reine PHP-Regex-Engine
Eine mitgelieferte JavaScript-RegExp-Engine von inline0/phasis, basierend auf einer oniguruma-to-es-Portierung. Shikis Regex-Engine JavaScript nutzt denselben Weg von Oniguruma zu RegExp.
Transformer
Jeder Shiki-Hook (preprocess, tokens, root, pre, code, line, span, postprocess) sowie die integrierten Transformer für Notation, Metadaten und Leerzeichen.
Das vollständige Paket
Alle tm-grammars-Sprachen (235 plus 18 Hilfsgrammatiken) und tm-themes-Themes (65) sind enthalten. ANSI-Terminalausgabe, Dekorationen und colorReplacements ebenfalls.
CLI
Hebe eine Datei bis zu HTML hervor oder führe direkt über die Kommandozeile mit bin/shikiphp eine Liste der gebündelten Sprachen und Themes aus.
Kein Node
Läuft mit PHP 8.2+ und benötigt nur ext-json und ext-mbstring. Keine Node-Laufzeitumgebung, keine native Oniguruma-Bindung und kein Aufruf externer Programme.
Warum ShikiPHP
Läuft dort, wo auch dein PHP läuft
Die Hervorhebung erfolgt im PHP-Prozess, ohne Node aufzurufen oder eine gehostete API zu verwenden. Das passt zu einem Laravel- oder WordPress-Build-Schritt sowie zu statischen Websites.
Ausgabe, die sich cachen lässt
Derselbe Code mit denselben Optionen erzeugt immer dieselbe HTML. Hebe Code zur Build-Zeit hervor oder cache das HTML anhand von Code und Optionen, bis sich der Quelltext ändert.
Ein Block für hell und dunkel
Eine Theme-Map schreibt das zweite Theme als CSS-Variablen in dasselbe Markup. Mit ein paar Zeilen CSS schaltest du darauf um. Die Option defaultColor legt fest, welches Theme inline geschrieben wird.
Schutz für nicht vertrauenswürdige Eingaben
Die Regex-Engine speichert fehlgeschlagene Muster zwischen und schützt vor ReDoS. Dadurch wird ein extremes Muster langsam statt endlos zu laufen. Die Option tokenizeMaxLineLength gibt überlange Zeilen als einzelnes einfaches Token aus.
Im Vergleich zu
Weitere Möglichkeiten zur Codehervorhebung auf einer PHP-Website und die Unterschiede zu ShikiPHP.
| Werkzeug | Gut geeignet für | Unterschiede zu ShikiPHP |
|---|---|---|
| Shiki | Gut geeignet fürDie Referenzimplementierung in JavaScript. Sie läuft in jeder modernen JavaScript-Laufzeitumgebung ohne Node.js-APIs, lädt Grammatiken und Themes bei Bedarf und bietet Twoslash-Integrationen von TypeScript. | Unterschiede zu ShikiPHPShikiPHP portiert diese Pipeline nach PHP für Seiten, die auf einem PHP-Server gerendert werden. Der Oracle-Harness vergleicht die HTML-Ausgabe mit Shiki 3.23.0, während sich der Hauptbranch von Shiki inzwischen auf v4 weiterentwickelt hat. |
| Phiki | Gut geeignet fürEin PHP-Highlighter, der ebenfalls TextMate-Grammatiken und VS Code-Themes verwendet. Er enthält eine league/commonmark-Erweiterung für Str::markdown von Laravel, Terminalausgabe und eine Befehlszeilen-Binärdatei. | Unterschiede zu ShikiPHPPhiki beschreibt seinen Tokenizer als von vscode-textmate inspiriert, aber nicht als 1:1-Portierung. ShikiPHP portiert vscode-textmate und oniguruma-to-es und prüft seine HTML in 214 Oracle-Szenarien anhand der Ausgabe von Shiki. |
| highlight.php | Gut geeignet fürEine serverseitige PHP-Portierung von highlight.js, die 185 Sprachen mit den originalen Sprach- und Stildefinitionen unterstützt und die Sprache automatisch erkennen kann. | Unterschiede zu ShikiPHPShikiPHP zerlegt Text mit TextMate-Grammatiken in Tokens und färbt ihn mit VS Code-Themes – denselben Dateien, die auch Shiki verwendet. Bei jedem Aufruf muss die Sprache angegeben werden. |
| Torchlight | Gut geeignet fürEin mit VS Code kompatibler Dienst zur Codehervorhebung. Es ist ein HTTP-API mit Kommentaranmerkungen für Hervorhebungen, Fokus und Diffs. Dazu kommen offizielle Clients für Laravel, CommonMark, Statamic und andere Tech-Stacks. | Unterschiede zu ShikiPHPShikiPHP läuft im PHP-Prozess, ohne gehostete API. Seine integrierten Notations-Transformer lesen vergleichbare Kommentare für hervorgehobene, fokussierte und geänderte Zeilen aus. |
Quellen, ausgewählt
Fragen und Antworten
Kurze Antworten aus der ShikiPHP-Dokumentation.
Übergib eine Theme-Map mit hellen und dunklen Einträgen. Die hellen Farben werden inline geschrieben, die dunklen als --shiki-dark-Variablen. Eine kurze CSS-Regel für html.dark .shiki aktiviert sie. Setze defaultColor auf false, damit nur Variablen ausgegeben werden.
Enthalten sind alle Grammatiken aus tm-grammars 1.31.15: 235 Sprachen plus 18 Hilfsgrammatiken sowie alle 65 Themes aus tm-themes. Führe vendor/bin/shikiphp langs oder vendor/bin/shikiphp themes aus, um die IDs aufzulisten, oder rufe bundledLanguages() und bundledThemes() für den Highlighter auf.
Ja. Dekodiere die Datei .tmLanguage.json und registriere sie mit loadGrammar samt ID und optionalen Aliasnamen. Alternativ registrierst du ein VS Code-Theme mit loadTheme. Registriere zuerst jede darin eingebundene oder enthaltene Grammatik.
Die Regex-Engine speichert fehlgeschlagene Muster zwischen und schützt vor ReDoS, sodass ein extremes Muster langsamer wird statt endlos zu laufen. Mit tokenizeMaxLineLength gibst du Zeilen ab dieser Länge als einzelnes einfaches Token aus.
Die Dokumentation rät davon ab. Hebe Code für statische Seiten zur Build-Zeit hervor oder cache das gerenderte HTML anhand von Code und Optionen. Verwende innerhalb eines Prozesses denselben Highlighter wieder; die Shikiphp-Fassade erledigt das für dich.
Der Oracle-Testlauf vergleicht die HTML von ShikiPHP mithilfe von Shikis Regex-Engine JavaScript mit Shiki 3.23.0. Die 214 Szenarien decken 167 der 253 enthaltenen Grammatiken, ANSI und alle 65 Themes ab. Für Optionen und integrierte Transformer gibt es eigene Paritätstests.
Beginne mit der Anleitung für den Einstieg und ergänze Transformer, eigene Grammatiken oder ANSI-Ausgabe, wenn deine Seiten sie benötigen.