
# Προσαρμοσμένες γλώσσες & θέματα

Το ενσωματωμένο σύνολο καλύπτει ολόκληρο τον κατάλογο Shiki, αλλά μπορείτε να καταχωρίσετε τη δική σας γραμματική TextMate ή το δικό σας θέμα VS Code από αποκωδικοποιημένο JSON. Και τα δύο ανήκουν στην παρουσία `Highlighter`.

## Προσαρμοσμένα θέματα

Αποκωδικοποιήστε ένα αρχείο θέματος VS Code JSON και περάστε το στο `loadTheme`. Το θέμα καταχωρίζεται με κλειδί το `name` του και ένα προσαρμοσμένο θέμα αντικαθιστά το ενσωματωμένο με το ίδιο όνομα.

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

## Προσαρμοσμένες γραμματικές

Το `loadGrammar` καταχωρίζει ένα αποκωδικοποιημένο `.tmLanguage.json`, ώστε κάθε σημείο εισόδου να μπορεί να το χρησιμοποιεί με το id γλώσσας:

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

- `$langId` — το id με το οποίο θα αναφέρεστε σε αυτό. Αν παραλειφθεί, χρησιμοποιείται το `name` της γραμματικής και έπειτα το `scopeName`.
- `$aliases` — πρόσθετα id που αντιστοιχούν στην ίδια γραμματική.
- `$embedded` — τα id γλωσσών που ενσωματώνει αυτή η γραμματική, ώστε να επιλύονται και οι αντίστοιχες γραμματικές.

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

Οι αναφορές γραμματικών `include` (`#repo`, `$self`, `$base`, `other.scope`) και οι ενσωματωμένες γλώσσες επιλύονται με βάση τις γραμματικές που έχουν ήδη καταχωριστεί στο εργαλείο επισήμανσης. Καταχωρίστε πρώτα τυχόν εξαρτήσεις.

## Χρήση προσαρμοσμένου εργαλείου επισήμανσης μέσω του facade

Αν θέλετε το στατικό facade `Shikiphp` να χρησιμοποιεί το προσαρμοσμένο εργαλείο επισήμανσης, περάστε του το μέσω του `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']]);
```

Καλέστε το `Shikiphp::reset()` για να επιστρέψετε στο προεπιλεγμένο ενσωματωμένο εργαλείο επισήμανσης.
