
# Bahasa & Tema Kustom

Kumpulan bawaan mencakup katalog Shiki lengkap, tetapi Anda dapat mendaftarkan
 tata bahasa TextMate atau tema VS Code sendiri dari JSON yang telah didekode.
Keduanya berada pada instance `Highlighter`.

## Tema kustom

Dekode file tema VS Code JSON dan berikan ke `loadTheme`. Tema menggunakan `name` sebagai kunci,
dan tema kustom akan menggantikan tema bawaan dengan nama yang sama.

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

## Tata bahasa kustom

`loadGrammar` mendaftarkan `.tmLanguage.json` yang telah didekode agar titik masuk mana pun dapat
menggunakannya berdasarkan id bahasa:

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

- `$langId` — id untuk merujuknya. Jika tidak diberikan, `name` tata bahasa
  digunakan, lalu `scopeName`-nya.
- `$aliases` — id tambahan yang mengarah ke tata bahasa yang sama.
- `$embedded` — id bahasa yang disematkan oleh tata bahasa ini, sehingga tata bahasanya juga
  akan ditemukan.

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

Referensi tata bahasa `include` (`#repo`, `$self`, `$base`, `other.scope`) dan
bahasa yang disematkan dicocokkan dengan tata bahasa yang sudah terdaftar pada
penyorot, jadi daftarkan semua dependensi terlebih dahulu.

## Menggunakan penyorot kustom melalui facade

Jika Anda ingin facade statis `Shikiphp` menggunakan penyorot yang telah Anda sesuaikan,
serahkan penyorot tersebut dengan `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']]);
```

Panggil `Shikiphp::reset()` untuk kembali menggunakan penyorot bawaan.
