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. Движок регулярных выражений Shiki JavaScript использует тот же путь преобразования 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.
Тестовый стенд oracle сравнивает HTML у ShikiPHP с 3.23.0 Shiki, используя JavaScript — регулярный движок Shiki. В его сценариях 214 охвачены 167 встроенных грамматик из 253, ANSI и все 65 тем; для параметров и встроенных трансформеров есть отдельные тесты на соответствие.
Начните с руководства по началу работы, а затем добавьте трансформеры, собственные грамматики или вывод ANSI, когда они понадобятся вашим страницам.