
# Własne języki i motywy

Zestaw dołączony do pakietu obejmuje cały katalog Shiki, ale możesz zarejestrować
własną gramatykę TextMate lub motyw VS Code z dekodowanego JSON. Oba są przechowywane w instancji `Highlighter`.

## Własne motywy

Zdekoduj plik motywu VS Code JSON i przekaż go do `loadTheme`. Motyw jest indeksowany swoją wartością `name`, a własny motyw zastępuje dołączony motyw o tej samej nazwie.

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

## Własne gramatyki

`loadGrammar` rejestruje zdekodowany `.tmLanguage.json`, dzięki czemu każdy punkt wejścia może
używać go według identyfikatora języka:

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

- `$langId` — identyfikator, za pomocą którego można się do niej odwołać. Jeśli go pominięto, używana jest wartość `name` gramatyki,
  a następnie jej `scopeName`.
- `$aliases` — dodatkowe identyfikatory wskazujące tę samą gramatykę.
- `$embedded` — identyfikatory języków osadzanych przez tę gramatykę, których gramatyki również zostaną rozpoznane.

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

Odwołania do gramatyk `include` (`#repo`, `$self`, `$base`, `other.scope`) i osadzone języki są dopasowywane do gramatyk zarejestrowanych już w mechanizmie podświetlania, dlatego najpierw zarejestruj wszystkie zależności.

## Używanie własnego mechanizmu podświetlania przez fasadę

Aby statyczna fasada `Shikiphp` korzystała ze skonfigurowanego przez Ciebie mechanizmu podświetlania,
przekaż go za 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']]);
```

Wywołaj `Shikiphp::reset()`, aby przywrócić domyślny mechanizm podświetlania dołączony do pakietu.
