
# Vlastní jazyky a motivy

Soubor obsažený v balíčku pokrývá celý katalog Shiki, můžete však z dekódovaných JSON zaregistrovat vlastní gramatiku TextMate nebo motiv VS Code. Obojí se ukládá do instance `Highlighter`.

## Vlastní motivy

Dekódujte soubor motivu VS Code JSON a předejte jej funkci `loadTheme`. Motiv se identifikuje podle `name` a vlastní motiv přepíše motiv obsažený v balíčku se stejným názvem.

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

## Vlastní gramatiky

`loadGrammar` zaregistruje dekódovanou gramatiku `.tmLanguage.json`, takže ji lze použít v libovolném vstupním bodě podle ID jazyka:

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

- `$langId` — ID, kterým se na ni odkazuje. Pokud jej vynecháte, použije se nejprve `name` gramatiky a poté její `scopeName`.
- `$aliases` — další ID, která odkazují na tutéž gramatiku.
- `$embedded` — ID jazyků, které tato gramatika vkládá; načtou se tedy i jejich gramatiky.

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

Odkazy `include` v gramatice (`#repo`, `$self`, `$base`, `other.scope`) a vložené jazyky se vyhledávají mezi gramatikami již zaregistrovanými ve zvýrazňovači. Nejprve proto zaregistrujte všechny závislosti.

## Použití vlastního zvýrazňovače přes fasádu

Chcete-li, aby statická fasáda `Shikiphp` používala váš upravený zvýrazňovač, předejte jí jej pomocí `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']]);
```

Zavolejte `Shikiphp::reset()` a vraťte se k výchozímu zvýrazňovači obsaženému v balíčku.
