
# Langages et thèmes personnalisés

L’ensemble fourni couvre tout le catalogue Shiki, mais vous pouvez enregistrer vos propres grammaires TextMate ou thèmes VS Code à partir de JSON décodé. Les deux sont associés à l’instance `Highlighter`.

## Thèmes personnalisés

Décodez un fichier de thème VS Code JSON et transmettez-le à `loadTheme`. Le thème est indexé par son `name` ; un thème personnalisé remplace tout thème fourni dans le bundle portant le même nom.

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

## Grammaires personnalisées

`loadGrammar` enregistre un `.tmLanguage.json` décodé afin que tout point d’entrée puisse l’utiliser avec son identifiant de langage :

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

- `$langId` — l’identifiant permettant de le référencer. S’il est omis, celui de la grammaire `name` est utilisé, puis celui de `scopeName`.
- `$aliases` — identifiants supplémentaires qui renvoient à la même grammaire.
- `$embedded` — identifiants des langages intégrés par cette grammaire, dont les grammaires seront également résolues.

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

Les références de grammaire `include` (`#repo`, `$self`, `$base`, `other.scope`) et les langages intégrés sont résolus à partir des grammaires déjà enregistrées dans le surligneur ; enregistrez donc d’abord toutes les dépendances.

## Utiliser un moteur de coloration syntaxique personnalisé via la façade

Pour que la façade statique `Shikiphp` utilise votre moteur de coloration syntaxique personnalisé, transmettez-le avec `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']]);
```

Appelez `Shikiphp::reset()` pour revenir au moteur de coloration syntaxique par défaut, fourni dans le bundle.
