
# Idiomas e temas personalizados

O conjunto incluído abrange todo o catálogo de Shiki, mas você pode registrar sua própria
gramática TextMate ou tema VS Code a partir de JSON decodificado. Ambos ficam na
instância `Highlighter`.

## Temas personalizados

Decodifique um arquivo JSON de tema VS Code e passe-o para `loadTheme`. O tema é indexado
por seu `name`, e um tema personalizado substitui um tema incluído no pacote com o mesmo nome.

```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 um `.tmLanguage.json` decodificado para que qualquer ponto de entrada possa usá-lo
pelo id de linguagem:

```php
public function loadGrammar(
    array $rawTmLanguage,
    ?string $langId = null,
    array $aliases = [],
    array $embedded = [],
): void
```

- `$langId` — o id para referenciá-la. Se omitido, usa-se o `name` da gramática
  e, depois, seu `scopeName`.
- `$aliases` — ids adicionais que apontam para a mesma gramática.
- `$embedded` — ids de linguagem incorporados por esta gramática, cujas gramáticas também serão resolvidas.

```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',
]);
```

As referências `include` da gramática (`#repo`, `$self`, `$base`, `other.scope`) e
os idiomas incorporados são resolvidos usando as gramáticas já registradas no
realçador de sintaxe; portanto, registre primeiro todas as dependências.

## Usar um realçador personalizado por meio da fachada

Se quiser que a fachada estática `Shikiphp` use seu realçador personalizado,
passe-o com `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']]);
```

Chame `Shikiphp::reset()` para voltar ao realçador padrão incluído no pacote.
