Пользовательские языки и темы
Встроенный набор охватывает весь каталог Shiki, но вы можете зарегистрировать собственную грамматику TextMate или тему VS Code из декодированного JSON. И то и другое хранится в экземпляре Highlighter.
Пользовательские темы
Декодируйте файл темы VS Code формата JSON и передайте его в loadTheme. Тема определяется по name, а пользовательская тема заменяет встроенную тему с таким же именем.
use Shikiphp\Shikiphp;
$highlighter = Shikiphp::highlighter();
$theme = json_decode(file_get_contents('my-theme.json'), true);
$highlighter->loadTheme($theme);
$code = '<?php echo "hello";';
echo $highlighter->codeToHtml($code, [
'lang' => 'php',
'theme' => $theme['name'], // the theme's own name
]);
Пользовательские грамматики
loadGrammar регистрирует декодированный .tmLanguage.json, чтобы любая точка входа могла использовать его по идентификатору языка:
public function loadGrammar(
array $rawTmLanguage,
?string $langId = null,
array $aliases = [],
array $embedded = [],
): void
$langId— идентификатор для ссылки на грамматику. Если он не указан, используетсяnameграмматики, а затем еёscopeName.$aliases— дополнительные идентификаторы, разрешающиеся в ту же грамматику.$embedded— идентификаторы языков, которые встраивает эта грамматика; для них также будут найдены грамматики.
use Shikiphp\Shikiphp;
$highlighter = Shikiphp::highlighter();
$grammar = json_decode(file_get_contents('mylang.tmLanguage.json'), true);
$highlighter->loadGrammar($grammar, 'mylang', aliases: ['ml']);
$code = file_get_contents('example.mylang');
echo $highlighter->codeToHtml($code, [
'lang' => 'mylang',
'theme' => 'github-dark',
]);
Ссылки грамматики include (#repo, $self, $base, other.scope) и встроенные языки разрешаются по грамматикам, уже зарегистрированным в подсветчике, поэтому сначала зарегистрируйте все зависимости.
Использование пользовательского подсветчика через фасад
Чтобы статический фасад Shikiphp использовал настроенный вами подсветчик,
передайте ему экземпляр с помощью Shikiphp::use:
use Shikiphp\Highlighter;
use Shikiphp\Shikiphp;
$myTheme = json_decode(file_get_contents('my-theme.json'), true);
$myGrammar = json_decode(file_get_contents('mylang.tmLanguage.json'), true);
$code = file_get_contents('example.mylang');
$highlighter = Highlighter::createBundled();
$highlighter->loadTheme($myTheme);
$highlighter->loadGrammar($myGrammar, 'mylang');
Shikiphp::use($highlighter);
// Now the facade delegates to your highlighter.
echo Shikiphp::codeToHtml($code, ['lang' => 'mylang', 'theme' => $myTheme['name']]);
Вызовите Shikiphp::reset(), чтобы вернуться к подсветчику из стандартного набора.