
# Anpassade språk och teman

Den paketerade uppsättningen täcker hela Shiki-katalogen, men du kan registrera en egen
TextMate-grammatik eller ett VS Code-tema från avkodad JSON. Båda hör till
instansen `Highlighter`.

## Anpassade teman

Avkoda en VS Code-temafil i JSON och skicka den till `loadTheme`. Temat nycklas
efter sitt `name`, och ett anpassat tema åsidosätter ett paketerat tema med samma namn.

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

## Anpassade grammatiker

`loadGrammar` registrerar en avkodad `.tmLanguage.json` så att alla ingångspunkter kan använda
den via språk-id:

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

- `$langId` — id:t som används för att hänvisa till grammatiken. Om det utelämnas används grammatikens `name`,
  sedan dess `scopeName`.
- `$aliases` — extra id:n som pekar på samma grammatik.
- `$embedded` — språk-id:n som grammatiken bäddar in, så att deras grammatiker också slås upp.

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

Grammatikens `include`-referenser (`#repo`, `$self`, `$base`, `other.scope`) och
inbäddade språk matchas mot grammatiker som redan har registrerats i
markeraren, så registrera eventuella beroenden först.

## Använda en anpassad markerare via fasaden

Om du vill att den statiska `Shikiphp`-fasaden ska använda din anpassade markerare,
överlämnar du den 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']]);
```

Anropa `Shikiphp::reset()` för att återgå till den paketerade standardmarkeraren.
