Idiomas y temas personalizados
El conjunto incluido abarca todo el catálogo de Shiki, pero puedes registrar tu propia gramática TextMate o tema VS Code a partir de JSON decodificado. Ambos se configuran en la instancia Highlighter.
Temas personalizados
Decodifica un archivo de tema VS Code JSON y pásalo a loadTheme. El tema se identifica por su name y reemplaza cualquier tema incluido con el mismo nombre.
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
]);
Gramáticas personalizadas
loadGrammar registra un .tmLanguage.json decodificado para que cualquier punto de entrada pueda usarlo mediante el id del idioma:
public function loadGrammar(
array $rawTmLanguage,
?string $langId = null,
array $aliases = [],
array $embedded = [],
): void
$langId— el id con el que se hará referencia. Si se omite, se usanamede la gramática y, si no,scopeName.$aliases— ids adicionales que apuntan a la misma gramática.$embedded— ids de idioma que incorpora esta gramática; sus gramáticas también se resuelven.
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',
]);
Las referencias include de la gramática (#repo, $self, $base, other.scope) y los idiomas incrustados se resuelven con las gramáticas ya registradas en el resaltador, así que registra primero todas las dependencias.
Usar un resaltador personalizado mediante la fachada
Para que la fachada estática Shikiphp use tu resaltador personalizado,
pásaselo con 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']]);
Llama a Shikiphp::reset() para volver al resaltador predeterminado incluido.