ShikiPHP
Coloriseur syntaxique purement PHP, un port de Shiki. Stylisez les blocs de code avec les thèmes VS Code et les grammaires TextMate sans Node ; la sortie correspond à Shiki 3.23.0 dans tous les scénarios de référence 214.
composer require shikiphp/shikiphpDernière 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',
]);En pratique
Mettez en évidence un extrait d’un modèle ou script de build PHP et affichez le résultat HTML.
Un appel par bloc de code
Shikiphp::codeToHtml prend le code, un identifiant de langage et un identifiant de thème. Il renvoie un bloc pre complet avec les couleurs intégrées, qui s’affiche sans feuille de style supplémentaire.
Transmettez une map themes plutôt que theme et le même bloc utilise les variables CSS pour gérer les couleurs claires et sombres.
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'],
]);Véritables grammaires TextMate
Un port fidèle de vscode-textmate : langages intégrés, injections et dépôts imbriqués. Les mêmes grammaires avec lesquelles Shiki et VS Code effectuent la tokenisation.
Thèmes VS Code
Spécificité des sélecteurs de portée et correspondance des portées parentes, repris de vscode-textmate. Un thème unique ou deux thèmes clair et sombre via les variables CSS.
Sortie identique à Shiki
Dans 214 scénarios de référence couvrant 167 des 253 grammaires incluses, ANSI et les 65 thèmes, la sortie correspond à celle de HTML de Shiki 3.23.0 avec son moteur regex JavaScript, à l’espace blanc initial et final près.
Moteur regex pur PHP
Moteur RegExp JavaScript fourni avec le projet, issu de inline0/phasis et alimenté par un port oniguruma-to-es. Le moteur regex JavaScript de Shiki suit le même parcours de Oniguruma vers RegExp.
Transformateurs
Chaque hook Shiki (preprocess, tokens, root, pre, code, line, span, postprocess), ainsi que les transformateurs intégrés de notation, de métadonnées et d’espaces blancs.
Le bundle complet
Toutes les grammaires tm-grammars (235, plus 18 grammaires auxiliaires) et tous les thèmes tm-themes (65) sont inclus. Sortie pour terminal ANSI, décorations et colorReplacements inclus.
CLI
Mettez en évidence un fichier pour HTML, ou listez les langages et les thèmes inclus directement depuis la ligne de commande avec bin/shikiphp.
Sans Node
Fonctionne avec PHP 8.2+ et les seules extensions ext-json et ext-mbstring. Pas de runtime Node, de binding natif Oniguruma ni d’appel à un programme externe.
Pourquoi ShikiPHP
S’exécute là où s’exécute votre PHP
La coloration s’effectue dans le processus PHP, sans appeler Node ni un API hébergé. Cela convient à une étape de build Laravel, WordPress ou de site statique.
Une sortie qui se met en cache
Le même code avec les mêmes options produit toujours la même sortie HTML. Effectuez la coloration au moment du build ou mettez en cache le HTML selon le code et les options jusqu’à ce que la source change.
Un bloc pour les thèmes clair et sombre
Une map de thèmes écrit le second thème sous forme de variables CSS dans le même balisage ; quelques lignes de CSS permettent de l’activer. L’option defaultColor détermine le thème écrit en ligne.
Limites pour les entrées non fiables
Le moteur regex mémorise les échecs et se protège contre ReDoS : un motif pathologique ralentit le traitement au lieu de le bloquer. L’option tokenizeMaxLineLength émet les lignes trop longues sous la forme d’un seul jeton brut.
Comparaison avec
Autres moyens de colorer le code pour un site PHP, et différences de ShikiPHP.
| Outil | Idéal pour | Différence avec ShikiPHP |
|---|---|---|
| Shiki | Idéal pourL’implémentation de référence, en JavaScript. Elle fonctionne dans tout runtime JavaScript moderne sans API Node.js, charge les grammaires et les thèmes à la demande et propose des intégrations Twoslash TypeScript. | Différence avec ShikiPHPShikiPHP porte ce pipeline en PHP pour les pages rendues sur un serveur PHP. Son banc de référence compare sa sortie HTML avec Shiki 3.23.0, tandis que la branche principale de Shiki est passée à v4. |
| Phiki | Idéal pourUn coloriseur PHP qui utilise aussi les grammaires TextMate et les thèmes VS Code. Il fournit une extension league/commonmark compatible avec Str::markdown de Laravel, une sortie pour terminal et un exécutable en ligne de commande. | Différence avec ShikiPHPPhiki décrit son tokenizer comme inspiré de vscode-textmate, mais pas comme une traduction à l’identique. ShikiPHP porte vscode-textmate et oniguruma-to-es et teste sa sortie HTML en la comparant à celle de Shiki dans 214 scénarios de référence. |
| highlight.php | Idéal pourUn port PHP côté serveur de highlight.js prenant en charge les langages 185 avec les définitions de langage et de style originales, et capable de détecter automatiquement le langage. | Différence avec ShikiPHPShikiPHP effectue la tokenisation avec les grammaires TextMate et applique les couleurs des thèmes VS Code, à partir des mêmes fichiers que Shiki ; chaque appel doit indiquer son langage. |
| Torchlight | Idéal pourUn service de coloration compatible avec VS Code. C’est une application HTTP API qui utilise des annotations de commentaire pour mettre en évidence, focaliser et comparer les modifications ; elle propose des clients officiels pour Laravel, CommonMark, Statamic et d’autres piles. | Différence avec ShikiPHPShikiPHP s’exécute dans votre processus PHP sans API hébergé. Ses transformateurs de notation intégrés interprètent des commentaires similaires pour les lignes mises en évidence, focalisées et comparées. |
Questions et réponses
Réponses courtes issues de la documentation de ShikiPHP.
Transmettez une map de thèmes avec des entrées claire et sombre. Les couleurs claires sont intégrées, tandis que les couleurs sombres sont définies dans les variables --shiki-dark, qu’active une courte règle CSS ciblant html.dark .shiki. Définissez defaultColor sur false pour n’émettre que des variables.
Toutes les grammaires de tm-grammars 1.31.15, les langages 235 et 18 grammaires auxiliaires, ainsi que les 65 thèmes de tm-themes. Exécutez vendor/bin/shikiphp langs ou vendor/bin/shikiphp themes pour lister les identifiants, ou appelez bundledLanguages() et bundledThemes() sur le coloriseur.
Oui. Décodez le fichier .tmLanguage.json et enregistrez-le avec loadGrammar en indiquant un identifiant et, si besoin, des alias ; ou enregistrez un thème VS Code avec loadTheme. Enregistrez d’abord toute grammaire qu’il inclut ou intègre.
Le moteur regex mémorise les échecs et se protège contre ReDoS : un motif pathologique ralentit le traitement au lieu de le bloquer. Définissez tokenizeMaxLineLength pour émettre un seul jeton brut pour toute ligne dont la longueur atteint ou dépasse cette limite.
La documentation le déconseille. Effectuez la coloration lors du build des pages statiques ou mettez en cache le rendu HTML selon le code et les options. Dans un même processus, réutilisez un coloriseur ; la façade Shikiphp s’en charge pour vous.
Le banc de référence compare la sortie HTML de ShikiPHP à celle de Shiki 3.23.0 avec le moteur regex JavaScript de Shiki. Ses 214 scénarios couvrent 167 des 253 grammaires incluses, ANSI et les 65 thèmes ; les options et transformateurs intégrés font aussi l’objet de tests de parité.
Commencez par le guide de démarrage, puis ajoutez des transformateurs, des grammaires personnalisées ou la sortie ANSI selon les besoins de vos pages.