
# ANSI izvade

Iestatiet `lang` uz `'ansi'`, lai iezīmētu termināļa izvadi — tekstu, kas satur ANSI
atsoļa secības — tā vietā, lai to tokenizētu ar gramatiku. shikiphp apstrādā
atslēgkodus un iekrāso tekstu, izmantojot tēmas ANSI paleti. Tas ir Shiki
`lang: 'ansi'` tokenizētāja ports, un četros etalonpiemēros tiek pārbaudīta tā HTML
pret Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Tas ir dabisks veids, kā attēlot no CLI iegūtu izvadi — testu palaidēju un būvējumu
žurnālus, `git` izvadi —, saglabājot sākotnējās krāsas. Atsoļa secības tiek
izņemtas no izvades; paliek tikai teksts, kas ietverts krāsainos span elementos.

Ņemiet vērā dubultpēdiņās ietverto PHP virkni: `"\e"` ir atsoļa rakstzīme. Kad
attēlojat no procesa iegūtu izvadi (piemēram, ar `shell_exec` vai
`proc_open`), atsoļa rakstzīmes jau ir virknē.

## Ko tas saprot

Tokenizētājs nolasa SGR (Select Graphic Rendition) secības — `ESC [ … m` —, kurās ir
jebkurš skaits ar `;` atdalītu kodu:

| Kods | Efekts |
| --- | --- |
| `0` | atiestata visas krāsas un atribūtus |
| `1`, `3`, `4`, `9` | treknraksts, kursīvs, pasvītrojums, pārsvītrojums |
| `2` | blāvs: priekšplāns tiek attēlots ar pusi no necaurspīdīguma |
| `7` | apgriezts: priekšplāna un fona krāsas samainās vietām |
| `21`, `23`, `24`, `27`, `29` | izslēdz atbilstošo atribūtu |
| `22` | normāla intensitāte: izslēdz blāvo un treknrakstu |
| `30`–`37`, `90`–`97` | priekšplāns: 8 standarta un 8 spilgtās krāsas |
| `40`–`47`, `100`–`107` | fons: 8 standarta un 8 spilgtās krāsas |
| `38;5;n`, `48;5;n` | priekšplāna vai fona krāsa no 256 krāsu tabulas |
| `38;2;r;g;b`, `48;2;r;g;b` | 24 bitu patieso krāsu priekšplānam vai fonam |
| `39`, `49` | noklusējuma priekšplāna vai fona krāsa |

Slēptais (`8`) un virsstrīpa (`53`) tiek apstrādāti, bet nemaina izvadi, savukārt pārējie kodi tiek ignorēti. Stili saglabājas arī pāri rindu pārtraukumiem, līdz tie tiek atiestatīti — tāpat kā terminālī.

## Krāsas

16 nosaukto krāsu avots ir tēmas `terminal.ansi*` krāsas
(`terminal.ansiRed`, `terminal.ansiBrightBlue` utt.). Ja tēma kādu no tām nedefinē, tiek izmantota
VS Code noklusējuma palete (`#cd3131` sarkanajai,
`#2472C8` zilajai krāsai utt.). Tekstam bez iestatītas krāsas tiek izmantota tēmas
priekšplāna krāsa, bet bloka fonam — tēmas fona krāsa, tāpat kā gramatikā
balstītā iezīmēšanā. 256 krāsu tabulā ieraksti 0–15 ir tās pašas
16 nosauktās krāsas; ieraksti 16–255 (6×6×6 krāsu kubs un pelēktoņu skala)
un patieso krāsu vērtības nav atkarīgas no tēmas.

[`colorReplacements`](https://shikiphp.inline0.dev/lv/docs/options#colorreplacements) attiecas arī uz ANSI krāsām.

## Divas tēmas

ANSI ievēro `themes` karti tāpat kā gramatikā balstītā iezīmēšana, izvadot
CSS varianta versijas tēmām, kas nav noklusējuma tēmas:

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

Katra nosauktā krāsa tiek iegūta no katras tēmas atsevišķās paletes, tāpēc sarkanā krāsa gaišajā un tumšajā tēmā var atšķirties.

## Bez gramatikas stāvokļa

Tā kā ANSI neizmanto TextMate gramatiku, gramatikas stāvoklis nav jāsaglabā.
`getLastGrammarState` rada izņēmumu, ja tiek padots `lang: 'ansi'`, bet `codeToTokensResult` atgriež
tukšu `null` `grammarState`.
