shikiphp
shikiphp est un portage pur-PHP de Shiki, le moteur de coloration syntaxique qui colore le code avec les mêmes grammaires TextMate et thèmes que VS Code. Il tokenise le code avec les mêmes grammaires TextMate et le colore avec les mêmes thèmes VS Code qu’utilise Shiki, produisant le même HTML que Shiki 3.23.0 — entièrement en PHP.
Aucun environnement Node. Aucune extension PHP au-delà de json et mbstring. Aucune liaison native Oniguruma. Aucun lancement d’un processus JavaScript ni service API hébergé.
use Shikiphp\Shikiphp;
echo Shikiphp::codeToHtml(<<<'PHP'
<?php
function greet(string $name): string {
return "Hello, {$name}!";
}
PHP, [
'lang' => 'php',
'theme' => 'github-dark',
]);
Pourquoi shikiphp
La coloration syntaxique côté serveur dans PHP implique généralement l’un de ces trois compromis : lancer Node, appeler un API hébergé ou se contenter d’un surligneur basé sur des expressions régulières qui ne comprend pas réellement le langage. Aucun ne s’intègre facilement à une étape de build Laravel, WordPress ou de site statique.
shikiphp élimine ces compromis en portant le véritable pipeline de Shiki vers PHP :
- un tokenizer de grammaire TextMate (portage fidèle de
vscode-textmate), avec langages intégrés, injections et dépôts imbriqués - résolution de thèmes VS Code avec spécificité des sélecteurs de portée et correspondance des portées parentes
- HTML compatible Shiki : thèmes clair et sombre via les variables CSS,
codeToHast, transformateurs (tous les hooks), décorations,colorReplacements,structure: 'inline'et coloration ANSI (lang: 'ansi') - le bundle Shiki complet — chaque langage
tm-grammars(235, plus les 18 grammaires auxiliaires qu’ils intègrent) et chaque thèmetm-themes(65)
Comparé à Shiki 3.23.0
La sortie n’est pas « suffisamment proche » : elle est vérifiée par rapport à une version épinglée de Shiki.
| Paquet | Version | Utilisation |
|---|---|---|
shiki |
3.23.0 | référence, exécutée avec son moteur d’expressions régulières JavaScript |
tm-grammars |
1.31.15 | grammaires fournies dans le bundle |
tm-themes |
1.12.2 | thèmes fournis dans le bundle |
@shikijs/transformers |
4.2.0 | tests de parité des transformateurs |
Shiki est lui-même la référence. Le banc de régression comprend 214 scénarios, chacun correspondant à un exemple dans un langage et un thème avec les options par défaut. Chaque scénario est mis en évidence par Shiki et shikiphp ; les deux chaînes HTML doivent être identiques après suppression des espaces de début et de fin. Ensemble, les scénarios couvrent 167 des 253 grammaires du bundle, lang: 'ansi' et les 65 thèmes. Les options (structure, tabindex, colorReplacements, thèmes doubles, defaultColor et autres), codeToTokensWithThemes et les transformateurs intégrés sont couverts par des tests de parité distincts, dont les sorties attendues ont été capturées à partir des mêmes versions de Shiki.
Deux limites en découlent. Le moteur par défaut de Shiki est Oniguruma compilé en WebAssembly, tandis que la référence utilise le moteur d’expressions régulières JavaScript de Shiki, celui que porte shikiphp. Les versions ultérieures de Shiki (la branche 4.x) n’ont pas été vérifiées.
Fonctionnement
shikiphp repose sur un moteur regex pur-PHP JavaScript intégré, issu de
inline0/phasis, porté depuis PHP
oniguruma-to-es. Le moteur regex de Shiki
JavaScript convertit les motifs Oniguruma des grammaires TextMate en
JavaScript RegExp : un moteur regex JS s’impose donc, pour permettre à
shikiphp de reproduire exactement ses décalages.
code → grammar tokenizer → theme resolver → themed tokens → HTML
│
└─ OnigScanner → PatternConverter (oniguruma-to-es) → Shikiphp\Regex (JS RegExp engine)
Consultez Architecture pour découvrir le pipeline complet.
Prérequis
- PHP 8.2 ou version ultérieure (l'intégration continue exécute la suite de tests sur PHP 8.4)
ext-jsonetext-mbstring(tous deux fournis avec presque toutes les versions de PHP)
Pour la suite
- Prise en main — installez et affichez votre premier bloc.
- API — toutes les méthodes disponibles.
- Options — toutes les options acceptées par
codeToHtml. - Transformateurs — le pipeline de hooks et les éléments intégrés.
- CLI —
bin/shikiphp highlight,langsetthemes.
Licence
MIT, droits d'auteur inline0. Les grammaires et thèmes TextMate intégrés conservent leurs licences amont.