
# ANSI-väljund

Seadke `lang` väärtuseks `'ansi'`, et tõsta esile terminaliväljund — ANSI-paokoode sisaldav tekst — selle asemel, et seda grammatikaga märgendada. shikiphp parsib paokoodid ja värvib teksti teema ANSI-paletiga. See on Shiki-i `lang: 'ansi'` märgendaja teisendus ning neli võrdlusstsenaariumi kontrollivad selle HTML-i Shiki-i 3.23.0 vastu.

```php
use Shikiphp\Shikiphp;

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

See on loomulik viis kuvada algsete värvidega jäädvustatud CLI väljundit — testikäivitajate, järgu `git` väljundit. Paokoodid eemaldatakse väljundist; alles jääb ainult tekst, mis on ümbritsetud värviliste elementidega.

Pange tähele jutumärkides PHP stringi: `"\e"` on paomärk. Kui kuvate protsessist jäädvustatud väljundit (näiteks `shell_exec` või `proc_open` abil), on paomärgid stringis juba olemas.

## Mida see mõistab

Märgendi tõmmits loeb SGR-jadasid (Select Graphic Rendition), `ESC [ … m`, milles võib olla suvaline arv eraldajaga `;` eraldatud koode:

| Koodid | Mõju |
| --- | --- |
| `0` | lähtestab kõik värvid ja atribuudid |
| `1`, `3`, `4`, `9` | paks kiri, kaldkiri, allajoonimine, läbikriipsutus |
| `2` | tuhm: esiplaan kuvatakse poole läbipaistmatusega |
| `7` | pööratud: esi- ja taustavärv vahetavad koha |
| `21`, `23`, `24`, `27`, `29` | lülitab vastava atribuudi välja |
| `22` | tavaline intensiivsus: lülitab tuhmuse ja paksu kirja välja |
| `30`–`37`, `90`–`97` | esiplaan: 8 standardvärvi ja 8 heledat värvi |
| `40`–`47`, `100`–`107` | taust: 8 standardvärvi ja 8 heledat värvi |
| `38;5;n`, `48;5;n` | esi- või taustavärv 256-värvi tabelist |
| `38;2;r;g;b`, `48;2;r;g;b` | 24-bitine tõevärviline esi- või taustavärv |
| `39`, `49` | vaikimisi esi- või taustavärv |

Peidetud (`8`) ja ülakriips (`53`) parsitakse, kuid need väljundit ei muuda; muud koodid eiratakse. Vormingud säilivad reavahetuste üle kuni nende lähtestamiseni, nagu terminalis.

## Värvid

16 nimega värvi pärinevad teema `terminal.ansi*` värvidest (`terminal.ansiRed`, `terminal.ansiBrightBlue` jne). Kui teema mõnd värvi ei määra, kasutatakse VS Code vaikepaletti (punase jaoks `#cd3131`, sinise jaoks `#2472C8` jne). Värvimääranguta tekst kasutab teema esiplaani ja ploki taust teema taustavärvi, nagu grammatikapõhisel esiletõstmisel. 256-värvi tabelis on kirjed 0–15 samad 16 nimega värvi; kirjed 16–255 (6×6×6 värvikuup ja halltoonide astmestik) ning tõevärviväärtused ei sõltu teemast.

[`colorReplacements`](https://shikiphp.inline0.dev/et/docs/options#colorreplacements) kehtivad ka ANSI-värvide kohta.

## Kaks teemat

ANSI järgib `themes` vastendust nagu grammatikapõhine esiletõstminegi, väljastades vaikeväärtuseta teemade jaoks CSS-muutuja variante:

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

Iga nimega värv määratakse iga teema enda paleti põhjal, seega võivad heleda ja tumeda teema punased värvid erineda.

## Grammatikaseisund puudub

Kuna ANSI ei kasuta TextMate grammatikat, pole säilitatavat grammatikaseisundit. `getLastGrammarState` annab vea väärtuse `lang: 'ansi'` korral ning `codeToTokensResult` tagastab `null` `grammarState`.
