Перейти к содержимому

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

На практике

Подсветите фрагмент из шаблона PHP или скрипта сборки и выведите результат HTML.

Один вызов на блок кода

Shikiphp::codeToHtml принимает код, идентификатор языка и идентификатор темы. Он возвращает готовый блок pre со встроенными цветами, который отображается без дополнительной таблицы стилей.

Передайте карту themes вместо theme, чтобы тот же блок переключал светлые и тёмные цвета с помощью переменных CSS.

PHP
use Shikiphp\Shikiphp;

echo Shikiphp::codeToHtml(<<<'PHP'
<?php
function greet(string $name): string {
    return "Hello, {$name}!";
}
PHP, [
    'lang'  => 'php',
    'theme' => '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.

Начните с руководства по началу работы, а затем добавьте трансформеры, собственные грамматики или вывод ANSI, когда они понадобятся вашим страницам.