
# Lingue e temi personalizzati

La raccolta inclusa copre l'intero catalogo Shiki, ma potete registrare una vostra
grammatica TextMate o un tema VS Code a partire da JSON decodificato. Entrambi risiedono
nell'istanza `Highlighter`.

## Temi personalizzati

Decodificate un file VS Code di tema JSON e passatelo a `loadTheme`. Il tema è indicizzato
con il suo `name` e un tema personalizzato sostituisce un tema incluso con lo stesso nome.

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

## Grammatiche personalizzate

`loadGrammar` registra un `.tmLanguage.json` decodificato, così che qualsiasi punto di ingresso possa
usarlo tramite id di lingua:

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

- `$langId` — l'id da usare come riferimento. Se omesso, si usa l'`name` della grammatica,
  poi il suo `scopeName`.
- `$aliases` — id aggiuntivi che rimandano alla stessa grammatica.
- `$embedded` — gli id di lingua incorporati da questa grammatica, le cui grammatiche vengono
  risolte a loro volta.

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

I riferimenti `include` della grammatica (`#repo`, `$self`, `$base`, `other.scope`) e le lingue
incorporate vengono risolti usando le grammatiche già registrate nell'evidenziatore di sintassi; registrate prima tutte le dipendenze.

## Usare un evidenziatore personalizzato tramite la facade

Per fare in modo che la facade statica `Shikiphp` usi il vostro evidenziatore personalizzato,
passateglielo con `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']]);
```

Chiamate `Shikiphp::reset()` per ripristinare l'evidenziatore predefinito incluso.
