
# Brugerdefinerede sprog og temaer

Den inkluderede samling dækker hele Shiki-kataloget, men du kan registrere din egen
TextMate-grammatik eller dit eget VS Code-tema fra afkodet JSON. Begge dele hører til
`Highlighter`-instansen.

## Brugerdefinerede temaer

Afkod en VS Code-temaJSON-fil, og send den til `loadTheme`. Temaet identificeres
med sit `name`, og et brugerdefineret tema tilsidesætter et inkluderet tema med samme navn.

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

## Brugerdefinerede grammatikker

`loadGrammar` registrerer en afkodet `.tmLanguage.json`, så alle indgangspunkter kan bruge
den via sprog-id'et:

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

- `$langId` — id'et, der bruges til at henvise til grammatikken. Hvis det udelades, bruges grammatikkens `name`,
  derefter dens `scopeName`.
- `$aliases` — ekstra id'er, der peger på den samme grammatik.
- `$embedded` — sprog-id'er, som grammatikken indlejrer, så deres grammatikker også findes.

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

Grammatikreferencerne `include` (`#repo`, `$self`, `$base`, `other.scope`) og
indlejrede sprog slås op blandt de grammatikker, der allerede er registreret på
fremhævningsværktøjet, så registrer eventuelle afhængigheder først.

## Brug af et brugerdefineret fremhævningsværktøj via facaden

Hvis du vil have den statiske `Shikiphp`-facade til at bruge dit tilpassede fremhævningsværktøj,
så overdrag det med `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']]);
```

Kald `Shikiphp::reset()` for at vende tilbage til standardfremhævningsværktøjet i pakken.
