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