
# ANSI-kimenet

Állítsa a `lang` értékét erre: `'ansi'`; ekkor a terminálkimenet — azaz az ANSI escape-sorozatokat tartalmazó szöveg — kiemelése nyelvtan szerinti tokenizálás helyett. A shikiphp feldolgozza az escape-kódokat, és a téma ANSI-palettájából színezi a szöveget. Ez a Shiki `lang: 'ansi'` tokenizálójának portja, és négy oracle-forgatókönyv ellenőrzi a HTML értékét a Shiki 3.23.0 alapján.

```php
use Shikiphp\Shikiphp;

echo Shikiphp::codeToHtml("\e[31merror\e[0m: something broke", [
    'lang'  => 'ansi',
    'theme' => 'github-dark',
]);
```

Ez a természetes módja a rögzített CLI kimenet — például tesztfuttatók, buildnaplók és `git` kimenet — eredeti színeinek megőrzött megjelenítésére. Az escape-sorozatok eltűnnek a kimenetből; csak a szöveg marad, színezett span elemekbe csomagolva.

Figyeljen a dupla idézőjelek közé tett PHP karakterláncra: a `"\e"` az escape-karakter. Amikor egy folyamatból rögzített kimenetet jelenít meg (például `shell_exec` vagy `proc_open` használatával), az escape-karakterek már benne vannak a karakterláncban.

## Amit felismer

A tokenizáló az SGR (Select Graphic Rendition) sorozatokat olvassa, `ESC [ … m`, tetszőleges számú, `;` jellel elválasztott kóddal:

| Kódok | Hatás |
| --- | --- |
| `0` | minden szín és attribútum alaphelyzetbe állítása |
| `1`, `3`, `4`, `9` | félkövér, dőlt, aláhúzott, áthúzott |
| `2` | halvány: az előtér félig átlátszóan jelenik meg |
| `7` | megfordítás: az előtér és a háttér felcserélődik |
| `21`, `23`, `24`, `27`, `29` | a megfelelő attribútum kikapcsolása |
| `22` | normál intenzitás: kikapcsolja a halvány és a félkövér megjelenítést |
| `30`–`37`, `90`–`97` | előtér: a 8 szabványos és 8 élénk szín |
| `40`–`47`, `100`–`107` | háttér: a 8 szabványos és 8 élénk szín |
| `38;5;n`, `48;5;n` | előtér- vagy háttérszín a 256 színtáblából |
| `38;2;r;g;b`, `48;2;r;g;b` | 24 bites valódi színű előtér vagy háttér |
| `39`, `49` | alapértelmezett előtér vagy háttér |

A rejtett (`8`) és az áthúzást követő vonal (`53`) feldolgozásra kerül, de nem módosítja a kimenetet; az egyéb kódokat a rendszer figyelmen kívül hagyja. A stílusok sortöréseken át is érvényben maradnak, amíg alaphelyzetbe nem állítják őket, akárcsak egy terminálban.

## Színek

A 16 elnevezett szín a téma `terminal.ansi*` színei közül kerül ki (`terminal.ansiRed`, `terminal.ansiBrightBlue` stb.). Ha a téma valamelyiket nem definiálja, a VS Code alapértelmezett palettája lép érvénybe (piros: `#cd3131`, kék: `#2472C8` stb.). A színbeállítás nélküli szöveg a téma előterét, a blokk háttere pedig a téma hátterét használja, akárcsak a nyelvtan szerinti kiemelésnél. A 256 színtáblában a 0–15. bejegyzés ugyanaz a 16 elnevezett szín; a 16–255 közötti bejegyzések (a 6×6×6-os színkocka és a szürkeárnyalatos átmenet), valamint a valódi színértékek nem függenek a témától.

[`colorReplacements`](https://shikiphp.inline0.dev/hu/docs/options#colorreplacements) az ANSI-színekre is érvényes.

## Két téma

Az ANSI a nyelvtan szerinti kiemeléshez hasonlóan figyelembe veszi a `themes` leképezést, és a nem alapértelmezett témákhoz CSS-változót használó változatokat állít elő:

```php
use Shikiphp\Shikiphp;

$log = "\e[32mPASS\e[0m tests/Unit\n\e[31mFAIL\e[0m tests/Integration";

echo Shikiphp::codeToHtml($log, [
    'lang'   => 'ansi',
    'themes' => ['light' => 'github-light', 'dark' => 'github-dark'],
]);
```

Az egyes színek minden téma saját palettájából kapják az értéküket, ezért a piros árnyalata eltérhet a világos és a sötét témában.

## Nyelvtanállapot nélkül

Mivel az ANSI nem használ TextMate nyelvtant, nincs továbbvihető nyelvtanállapot. A `getLastGrammarState` hibát jelez a `lang: 'ansi'` esetén, a `codeToTokensResult` pedig `null` `grammarState` ad vissza.
