shikiphp
shikiphp is een pure-PHP-port van Shiki, de syntaxmarkeerder die code kleurt met dezelfde TextMate-grammatica's en thema's als VS Code. De code wordt getokeniseerd met dezelfde TextMate-grammatica's en gekleurd met dezelfde VS Code-thema's als Shiki, met dezelfde HTML als Shiki 3.23.0 — volledig in PHP.
Geen Node-runtime. Geen PHP-extensies buiten json en mbstring. Geen native
Oniguruma-binding. Geen aanroep van een JavaScript-proces en geen gehoste API.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml(<<<'PHP'
<?php
function greet(string $name): string {
return "Hello, {$name}!";
}
PHP, [
'lang' => 'php',
'theme' => 'github-dark',
]);
Waarom shikiphp
Syntaxmarkering aan de serverzijde in PHP betekent meestal een van drie compromissen: een Node-proces aanroepen, een gehoste API gebruiken of genoegen nemen met een markeerder op basis van reguliere expressies die de taal niet echt begrijpt. Geen daarvan past goed in een Laravel-, WordPress- of statische-sitebuildstap.
shikiphp maakt een einde aan dit compromis door de echte pipeline van Shiki naar PHP over te zetten:
- een TextMate-grammaticatokenizer (een getrouwe port van
vscode-textmate), inclusief ingesloten talen, injecties en geneste repositories - VS Code-themaresolutie met specificiteit van scopeselectoren en overeenkomst met bovenliggende scopes
- Shiki-compatibele HTML: dubbele lichte en donkere thema's via CSS-variabelen,
codeToHast, transformers (elke hook), decoraties,colorReplacements,structure: 'inline'en ANSI-markering (lang: 'ansi') - de volledige Shiki-bundel — elke
tm-grammars-taal (235, plus 18 hulpgrammatica's die ze insluiten) en elktm-themes-thema (65)
Vergeleken met Shiki 3.23.0
De uitvoer is niet 'goed genoeg': die wordt vergeleken met een vastgezette Shiki-release.
| Pakket | Versie | Gebruikt voor |
|---|---|---|
shiki |
3.23.0 | de referentie, uitgevoerd met de regex-engine van JavaScript |
tm-grammars |
1.31.15 | de meegeleverde grammatica's |
tm-themes |
1.12.2 | de meegeleverde thema's |
@shikijs/transformers |
4.2.0 | de tests voor overeenkomst van transformers |
Shiki zelf is de referentie. De regressietestset bevat 214 scenario's,
elk een voorbeeld met één taal en één thema en standaardopties. Elk scenario wordt gemarkeerd door Shiki en shikiphp, en de twee HTML-tekenreeksen moeten identiek zijn nadat witruimte aan het begin en einde is verwijderd. Samen dekken de scenario's 167 van de 253 meegeleverde grammatica's, lang: 'ansi' en alle 65 thema's. De opties (structure, tabindex, colorReplacements, dubbele thema's, defaultColor en de rest), codeToTokensWithThemes en de ingebouwde transformers worden behandeld door afzonderlijke tests voor overeenkomst. De verwachte uitvoer daarvan is vastgelegd met dezelfde versies van Shiki.
Daaruit volgen twee beperkingen. De standaardengine van Shiki is Oniguruma gecompileerd naar WebAssembly, terwijl de referentie de Shiki-regex-engine van JavaScript gebruikt, de engine waarnaar shikiphp wordt geport. Latere releases van Shiki (de 4.x-reeks) zijn niet gecontroleerd.
Werking
shikiphp is gebouwd op een meegeleverde pure-PHP JavaScript-regex-engine uit
inline0/phasis, gevoed door een PHP-port van
oniguruma-to-es. De
JavaScript-regex-engine van Shiki zet de Oniguruma-patronen in TextMate-grammatica's om naar
JavaScript RegExp, dus een JS-regex-engine is een logische basis — zo kan
shikiphp de uitvoer van die engine exact overeenkomstig de offsets evenaren.
code → grammar tokenizer → theme resolver → themed tokens → HTML
│
└─ OnigScanner → PatternConverter (oniguruma-to-es) → Shikiphp\Regex (JS RegExp engine)
Zie Architectuur voor de volledige pipeline.
Vereisten
- PHP 8.2 of hoger (CI voert de testsuite uit op PHP 8.4)
ext-jsonenext-mbstring(meegeleverd met vrijwel elke PHP-build)
Waarnaartoe
- Aan de slag — installeer de tool en geef uw eerste blok weer.
- API — alle beschikbare methoden.
- Opties — alle opties die
codeToHtmlaccepteert. - Transformers — de hook-pipeline en de ingebouwde transformers.
- CLI —
bin/shikiphp highlight,langsenthemes.
Licentie
MIT, copyright inline0. De meegeleverde grammatica's en thema's van TextMate behouden hun upstreamlicenties.