Benutzerdefinierte Sprachen und Themes
Das mitgelieferte Set umfasst den vollständigen Shiki-Katalog. Du kannst aber auch eigene TextMate-Grammatiken oder VS Code-Themes aus decodiertem JSON registrieren. Beides wird in der Instanz Highlighter gespeichert.
Benutzerdefinierte Themes
Decodiere eine VS Code-Theme-Datei JSON und übergib sie an loadTheme. Das Theme wird über seine name identifiziert. Ein benutzerdefiniertes Theme ersetzt ein mitgeliefertes Theme mit demselben Namen.
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
]);
Benutzerdefinierte Grammatiken
loadGrammar registriert eine decodierte .tmLanguage.json, sodass jeder Einstiegspunkt sie anhand der Sprach-ID verwenden kann:
public function loadGrammar(
array $rawTmLanguage,
?string $langId = null,
array $aliases = [],
array $embedded = [],
): void
$langId— die ID, über die du darauf verweist. Falls nicht angegeben, wird zuerst dienameder Grammatik verwendet, dann ihrescopeName.$aliases— zusätzliche IDs, die auf dieselbe Grammatik verweisen.$embedded— Sprach-IDs, die diese Grammatik einbettet, damit auch deren Grammatiken aufgelöst werden.
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',
]);
Grammatikreferenzen include (#repo, $self, $base, other.scope) und eingebettete Sprachen werden anhand der bereits beim Highlighter registrierten Grammatiken aufgelöst. Registriere daher zuerst alle Abhängigkeiten.
Einen benutzerdefinierten Highlighter über die Fassade verwenden
Wenn die statische Fassade Shikiphp deinen angepassten Highlighter verwenden soll, übergib ihn mit 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']]);
Rufe Shikiphp::reset() auf, um wieder zum standardmäßigen mitgelieferten Highlighter zu wechseln.