Saltar al contenido

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.

PHP
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:

PHP
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 usa name de 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.
PHP
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:

PHP
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.