ShikiPHP
Підсвічувач синтаксису на чистому PHP, порт Shiki. Оформлюйте блоки коду темами VS Code і граматиками TextMate без Node; результат збігається з Shiki 3.23.0 у 214 еталонних сценаріях перевірки.
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, що охоплюють 167 із 253 вбудованих граматик, ANSI та всі 65 тем, результат збігається з HTML Shiki 3.23.0 із регулярним рушієм JavaScript, за винятком початкових і кінцевих пробілів.
Чистий регулярний рушій PHP
Вбудований рушій RegExp для JavaScript із inline0/phasis, що використовує порт oniguruma-to-es. Регулярний рушій 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 визначає, кольори якої теми буде вбудовано.
Обмеження для недовірених даних
Регулярний рушій запам'ятовує невдалі збіги та захищає від ReDoS, тож патологічний шаблон сповільнює обробку, а не призводить до зависання. Опція tokenizeMaxLineLength виводить надто довгі рядки як один звичайний токен.
Порівняно з
Інші способи підсвічувати код для сайту PHP і відмінності ShikiPHP.
| Інструмент | Переваги | Відмінність від ShikiPHP |
|---|---|---|
| Shiki | ПеревагиЕталонна реалізація в JavaScript. Працює в будь-якому сучасному середовищі виконання JavaScript без API Node.js, завантажує граматики й теми за потреби та має інтеграції Twoslash від TypeScript. | Відмінність від ShikiPHPShikiPHP переносить цей конвеєр на PHP для сторінок, що рендеряться на сервері PHP. Його еталонний набір перевірок порівнює 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. |
| highlight.php | ПеревагиСерверний порт PHP для highlight.js, що підтримує 185 мов із початковими визначеннями мов і стилів та автоматичним визначенням мови. | Відмінність від ShikiPHPShikiPHP токенізує за граматиками TextMate і розфарбовує за темами VS Code — тими самими файлами, які використовує Shiki; для кожного виклику потрібно вказати мову. |
| Torchlight | ПеревагиСервіс підсвічування, сумісний із VS Code. Це HTTP API з анотаціями-коментарями для підсвічування, фокусування й відмінностей; має офіційні клієнти для Laravel, CommonMark, Statamic та інших стеків. | Відмінність від ShikiPHPShikiPHP працює в процесі PHP без розміщеного API. Вбудовані трансформери нотацій читають подібні коментарі для підсвічених і сфокусованих рядків, а також рядків із відмінностями. |
Джерела, позначено
Запитання та відповіді
Короткі відповіді з документації ShikiPHP.
Передайте мапу тем зі світлою й темною темами. Світлі кольори вбудовуються в розмітку, а темні задаються змінними --shiki-dark; коротке правило 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. Спершу зареєструйте всі граматики, які вона містить або вбудовує.
Регулярний рушій кешує невдалі збіги й захищає від ReDoS, тож патологічний шаблон сповільнює обробку, а не призводить до зависання. Задайте tokenizeMaxLineLength, щоб виводити один звичайний токен для кожного рядка, довжина якого дорівнює цьому значенню або перевищує його.
Документація не радить цього робити. Підсвічуйте код під час збирання статичних сторінок або кешуйте відрендерений HTML за кодом і параметрами. У межах процесу використовуйте повторно один підсвічувач — це вже робить фасад Shikiphp.
Еталонний набір перевірок порівнює HTML у ShikiPHP з Shiki 3.23.0, використовуючи регулярний рушій JavaScript з Shiki. Його сценарії 214 охоплюють 167 із 253 вбудованих граматик, ANSI та всі 65 тем; параметри й вбудовані трансформери також мають окремі тести на відповідність.
Почніть із посібника для початківців, а потім додайте трансформери, власні граматики або вивід ANSI, коли вони знадобляться вашим сторінкам.