ShikiPHP
Чист оцветител за синтаксис PHP, порт на Shiki. Оформяйте блокове с код с теми VS Code и граматики TextMate без Node; изходът съвпада с Shiki 3.23.0 в 214 сценария на oracle.
composer require shikiphp/shikiphpПоследна версия 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',
]);На практика
Откройте откъс от шаблон или скрипт за компилация на PHP и отпечатайте върнатия от него HTML.
Едно извикване за всеки блок с код
Shikiphp::codeToHtml приема кода, идентификатор на език и идентификатор на тема. Връща завършен блок pre с вградени цветове, който се визуализира без допълнителна таблица със стилове.
Подайте карта themes вместо theme и блокът ще съдържа цветове за светъл и тъмен режим чрез променливи CSS.
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'],
]);Истински граматики TextMate
Точен порт на vscode-textmate: вградени езици, инжекции и вложени хранилища. Същите граматики, с които токенизират Shiki и VS Code.
Теми VS Code
Специфичност на селекторите за обхват и съпоставяне с родителски обхват, порт от vscode-textmate. Една тема или двойка светла/тъмна чрез променливи CSS.
Изход, идентичен на Shiki
В 214 сценария на oracle, обхващащи 167 от 253 включени граматики, ANSI и всичките 65 теми, резултатът съвпада точно с HTML на Shiki 3.23.0 с неговия regex механизъм JavaScript, с изключение на водещите и крайните интервали.
Regex механизъм само на PHP
Включен в пакета regex механизъм RegExp на JavaScript от inline0/phasis, използващ порт на oniguruma-to-es. Regex механизмът JavaScript на Shiki следва същия път от Oniguruma до RegExp.
Трансформатори
Всички разширения Shiki (preprocess, tokens, root, pre, code, line, span, postprocess), плюс вградените трансформатори за обозначения, метаданни и интервали.
Пълният пакет
Включени са всички езици tm-grammars (235 плюс 18 помощни граматики) и всички теми tm-themes (65). Включени са и изход за ANSI терминал, декорации и colorReplacements.
CLI
Откройте файл, за да го преобразувате в HTML, или изведете списък с включените езици и теми направо от командния ред с bin/shikiphp.
Без Node
Работи с PHP 8.2+ само с ext-json и ext-mbstring. Не изисква среда за изпълнение на Node, нативно свързване с Oniguruma или извикване на външни команди.
Защо ShikiPHP
Работи там, където работи вашият PHP
Открояването се извършва в процеса PHP, без извикване на Node или хостван API. Подходящо е за стъпка при компилация на Laravel, WordPress или статичен сайт.
Изход, който се кешира
Един и същ код със същите опции винаги създава същия HTML. Откройте кода при компилация или кеширайте HTML по код и опции, докато източникът не се промени.
Един блок за светъл и тъмен режим
Картата с теми записва втората тема като променливи CSS в същата маркировка, а няколко реда CSS активират тази тема. Опцията defaultColor избира коя тема да бъде вградена.
Ограничения за недоверен вход
Regex механизмът запаметява неуспешните опити и защитава от ReDoS, така че патологичен шаблон забавя работата, вместо да я блокира. Опцията tokenizeMaxLineLength извежда прекалено дългите редове като един обикновен токен.
Сравнение с
Други начини за открояване на код за сайт PHP и с какво се различава ShikiPHP.
| Инструмент | Подходящ за | Разлики спрямо ShikiPHP |
|---|---|---|
| Shiki | Подходящ заРеферентната реализация в JavaScript. Работи във всяка съвременна среда за изпълнение на JavaScript без API за Node.js, зарежда граматики и теми при нужда и предлага готови интеграции с TypeScript Twoslash. | Разлики спрямо ShikiPHPShikiPHP пренася този конвейер към PHP за страници, визуализирани на сървър PHP. Неговият тестов набор oracle сравнява HTML с Shiki 3.23.0, докато основният клон на Shiki вече е преминал към v4. |
| Phiki | Подходящ заОцветител за PHP, който също използва граматики TextMate и теми VS Code. Включва разширение league/commonmark, съвместимо със Str::markdown на Laravel, изход за терминал и двоичен файл за командния ред. | Разлики спрямо ShikiPHPPhiki описва своя токенизатор като вдъхновен от vscode-textmate, но не като буквален превод. ShikiPHP портва vscode-textmate и oniguruma-to-es и тества своя HTML спрямо изхода на Shiki в 214 сценария на oracle. |
| highlight.php | Подходящ заСървърен порт на PHP за highlight.js, който поддържа 185 езика с оригиналните езикови и стилови дефиниции и може автоматично да открива езика. | Разлики спрямо ShikiPHPShikiPHP токенизира с граматики TextMate и оцветява с теми VS Code — същите файлове, които използва Shiki; всяко извикване посочва езика. |
| Torchlight | Подходящ заУслуга за открояване, съвместима с VS Code. Това е HTTP API с коментари за открояване, фокус и разлики, както и с официални клиенти за Laravel, CommonMark, Statamic и други технологии. | Разлики спрямо ShikiPHPShikiPHP работи във вашия процес PHP без хостван API. Вградените му трансформатори за обозначения четат сходни коментари за откроени, фокусирани и различаващи се редове. |
Източници, отметнато
Въпроси и отговори
Кратки отговори от документацията на ShikiPHP.
Подайте карта themes със записи за светла и тъмна тема. Светлите цветове се вграждат, а тъмните се записват като променливи --shiki-dark, които активира кратко CSS правило CSS с обхват html.dark .shiki. Задайте defaultColor на false, за да се изведат само променливите.
Всяка граматика от tm-grammars 1.31.15, 235 езика плюс 18 помощни граматики и всичките 65 теми от tm-themes. Изпълнете vendor/bin/shikiphp langs или vendor/bin/shikiphp themes, за да видите идентификаторите, или извикайте bundledLanguages() и bundledThemes() на оцветителя.
Да. Декодирайте файла .tmLanguage.json и го регистрирайте с loadGrammar, като посочите идентификатор и незадължителни псевдоними, или регистрирайте тема VS Code с loadTheme. Първо регистрирайте всяка включена или вградена граматика.
Regex механизмът запаметява неуспешните опити и защитава от ReDoS, така че патологичен шаблон забавя работата, вместо да я блокира. Задайте tokenizeMaxLineLength, за да се изведе един обикновен токен за всеки ред с такава или по-голяма дължина.
Документацията не препоръчва това. Откройте кода при компилация за статични страници или кеширайте визуализирания HTML по код и опции. В рамките на един процес използвайте повторно един оцветител; фасадата на Shikiphp прави това вместо вас.
Тестовият набор oracle сравнява HTML на ShikiPHP с Shiki 3.23.0, използвайки regex механизма JavaScript на Shiki. Сценариите 214 обхващат 167 от включените 253 граматики, ANSI и всичките 65 теми; опциите и вградените трансформатори имат отделни тестове за съответствие.
Започнете с ръководството за първи стъпки, а след това добавете трансформатори, персонализирани граматики или ANSI изход, когато страниците ви имат нужда от тях.