
# Limbi și teme personalizate

Setul inclus acoperă întregul catalog Shiki, dar puteți înregistra propria gramatică TextMate sau temă VS Code din JSON decodat. Ambele sunt asociate instanței `Highlighter`.

## Teme personalizate

Decodați un fișier de temă VS Code JSON și transmiteți-l lui `loadTheme`. Tema este identificată după `name`, iar o temă personalizată înlocuiește tema inclusă cu același nume.

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

## Gramatici personalizate

`loadGrammar` înregistrează un `.tmLanguage.json` decodat, astfel încât orice punct de intrare să îl poată folosi după ID-ul limbii:

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

- `$langId` — ID-ul după care va fi referit. Dacă este omis, se folosește `name` al gramaticii, apoi `scopeName`.
- `$aliases` — ID-uri suplimentare care se rezolvă la aceeași gramatică.
- `$embedded` — ID-urile limbilor încorporate de această gramatică; gramaticile lor vor fi și ele rezolvate.

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

Referințele gramaticii `include` (`#repo`, `$self`, `$base`, `other.scope`) și limbile încorporate se rezolvă folosind gramaticile deja înregistrate în evidențiator, așa că înregistrați mai întâi toate dependențele.

## Folosirea unui evidențiator personalizat prin fațadă

Dacă doriți ca fațada statică `Shikiphp` să folosească evidențiatorul personalizat, transmiteți-i instanța cu `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']]);
```

Apelați `Shikiphp::reset()` pentru a reveni la evidențiatorul implicit inclus în pachet.
