
# ANSI išvestis

Nustatykite `lang` į `'ansi'`, kad terminalo išvestis — tekstas su ANSI
escape sekomis — būtų paryškinama, o ne skaidoma pagal gramatiką. shikiphp analizuoja
escape kodus ir nuspalvina tekstą pagal temos ANSI paletę. Tai yra Shiki `lang: 'ansi'`
analizatoriaus perkėlimas, o keturi patikrinimo scenarijai patikrina jo HTML
pagal Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Taip natūraliai atvaizduojama užfiksuota CLI išvestis – testų vykdymo, kompiliavimo
žurnalai, `git` išvestis – išsaugant pradines spalvas. Pabėgimo sekos
pašalinamos iš išvesties; lieka tik tekstas, apgaubtas spalvotomis sritimis.

Atkreipkite dėmesį į dvigubomis kabutėmis apgaubtą PHP eilutę: `"\e"` yra pabėgimo simbolis. Kai
atvaizduojate iš proceso užfiksuotą išvestį (pavyzdžiui, naudodami `shell_exec` arba
`proc_open`), pabėgimo simboliai jau yra eilutėje.

## Ką jis supranta

Tokenizeris skaito SGR (Select Graphic Rendition) sekas, `ESC [ … m`, su
bet kokiu skaičiumi kodų, atskirtų `;`:

| Kodai | Poveikis |
| --- | --- |
| `0` | atkuria numatytąsias spalvas ir atributus |
| `1`, `3`, `4`, `9` | paryškina, paverčia kursyvu, pabraukia, perbraukia |
| `2` | prislopina: priekinio plano spalva rodoma perpus mažesniu nepermatomumu |
| `7` | apverčia: sukeičia priekinio ir fono spalvas |
| `21`, `23`, `24`, `27`, `29` | išjungia atitinkamą atributą |
| `22` | įprastas intensyvumas: išjungia prislopinimą ir paryškinimą |
| `30`–`37`, `90`–`97` | priekinis planas: 8 standartinės ir 8 ryškios spalvos |
| `40`–`47`, `100`–`107` | fonas: 8 standartinės ir 8 ryškios spalvos |
| `38;5;n`, `48;5;n` | priekinio plano arba fono spalva iš 256 spalvų lentelės |
| `38;2;r;g;b`, `48;2;r;g;b` | 24 bitų tikroji priekinio plano arba fono spalva |
| `39`, `49` | numatytoji priekinio plano arba fono spalva |

Paslėptasis (`8`) ir viršutinis pabraukimas (`53`) išanalizuojami, bet išvesties nekeičia; kiti
kodai ignoruojami. Stiliai išlieka per eilučių lūžius, kol atkuriami, kaip ir terminale.

## Spalvos

16 pavadintų spalvų paimtos iš temos `terminal.ansi*` spalvų
(`terminal.ansiRed`, `terminal.ansiBrightBlue` ir t. t.). Jei tema vienos iš jų neapibrėžia, naudojama numatytoji VS Code paletė (`#cd3131` raudonai,
`#2472C8` mėlynai ir t. t.). Jei tekstui spalva nenustatyta, naudojama temos priekinio plano spalva, o bloko fonas atitinka temos foną, kaip ir gramatika pagrįsto paryškinimo atveju. 256 spalvų lentelėje įrašai nuo 0 iki 15 yra tos pačios 16 pavadintų spalvų; įrašai nuo 16 iki 255 (6×6×6 spalvų kubas ir pilkų atspalvių skalė) bei tikrosios spalvos reikšmės nuo temos nepriklauso.

[`colorReplacements` taikomi ir ANSI spalvoms.](https://shikiphp.inline0.dev/lt/docs/options#colorreplacements)

## Dvi temos

ANSI atsižvelgia į `themes` žemėlapį taip pat kaip gramatika pagrįstas paryškinimas ir netemoms pagal numatytąją nustato CSS kintamuosius:

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

Kiekviena pavadinta spalva parenkama iš atskiros kiekvienos temos paletės, todėl raudona šviesioje ir tamsioje temoje gali skirtis.

## Be gramatikos būsenos

Kadangi ANSI nenaudoja TextMate gramatikos, nėra ir gramatikos būsenos, kurią reikėtų išsaugoti.
`getLastGrammarState` išmeta klaidą, jei pateikiama `lang: 'ansi'`, o `codeToTokensResult` grąžina
`null` `grammarState`.
