
# Aangepaste talen en thema's

De meegeleverde set omvat de volledige catalogus van Shiki, maar u kunt uw eigen
TextMate-grammatica of VS Code-thema registreren vanuit gedecodeerde JSON. Beide worden opgeslagen op de
`Highlighter`-instantie.

## Aangepaste thema's

Decodeer een VS Code-themaJSON-bestand en geef het door aan `loadTheme`. Het thema wordt geïdentificeerd
op basis van zijn `name`, en een aangepast thema overschrijft een meegeleverd thema met dezelfde naam.

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

## Aangepaste grammatica's

`loadGrammar` registreert een gedecodeerde `.tmLanguage.json`, zodat elk toegangspunt deze
kan gebruiken via de taal-id:

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

- `$langId` — de id waarnaar u verwijst. Als deze ontbreekt, wordt de `name` van de grammatica
  gebruikt, en daarna de `scopeName`.
- `$aliases` — extra id's die naar dezelfde grammatica verwijzen.
- `$embedded` — taal-id's die deze grammatica insluit, zodat ook hun grammatica's worden opgezocht.

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

Verwijzingen in grammatica's naar `include` (`#repo`, `$self`, `$base`, `other.scope`) en
ingesloten talen worden opgelost aan de hand van grammatica's die al bij de
markeerder zijn geregistreerd. Registreer daarom eerst eventuele afhankelijkheden.

## Een aangepaste markeerder gebruiken via de facade

Als u wilt dat de statische `Shikiphp`-facade uw aangepaste markeerder gebruikt,
geef die dan door met `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']]);
```

Roep `Shikiphp::reset()` aan om terug te keren naar de standaard meegeleverde markeerder.
