
# Izhod ANSI

Nastavite `lang` na `'ansi'`, da poudarite izhod terminala — besedilo, ki vsebuje ubežna zaporedja ANSI — namesto razčlenjevanja z gramatiko. shikiphp razčleni ubežne kode in obarva besedilo z ANSI-paleto teme. Gre za prenos razčlenjevalnika žetonov `lang: 'ansi'` projekta Shiki; štirje scenariji oracle preverjajo njegovo HTML glede na Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

To je naraven način prikaza zajetega izhoda CLI — izvajalniki testov, dnevniki gradnje, izhod `git` — z ohranjenimi izvirnimi barvami. Ubežna zaporedja se odstranijo iz izhoda; ostane samo besedilo, ovito v barvne razpone.

Bodite pozorni na niz PHP z dvojnimi narekovaji: `"\e"` je ubežni znak. Pri prikazu izhoda, zajetega iz procesa (na primer z `shell_exec` ali `proc_open`), so ubežni znaki že v nizu.

## Kaj razume

Razčlenjevalnik žetonov bere zaporedja SGR (Select Graphic Rendition), `ESC [ … m`, s poljubnim številom kod, ločenih z `;`:

| Kode | Učinek |
| --- | --- |
| `0` | ponastavi vse barve in atribute |
| `1`, `3`, `4`, `9` | krepko, ležeče, podčrtano, prečrtano |
| `2` | zatemnjeno: ospredje je prikazano s polovično prosojnostjo |
| `7` | obrnjeno: ospredje in ozadje zamenjata mesti |
| `21`, `23`, `24`, `27`, `29` | izklopi ustrezni atribut |
| `22` | običajna intenzivnost: izklopi zatemnitev in krepki zapis |
| `30`–`37`, `90`–`97` | ospredje: 8 standardnih in 8 svetlih barv |
| `40`–`47`, `100`–`107` | ozadje: 8 standardnih in 8 svetlih barv |
| `38;5;n`, `48;5;n` | barva ospredja ali ozadja iz 256-barvne tabele 256 |
| `38;2;r;g;b`, `48;2;r;g;b` | 24-bitna barva ospredja ali ozadja |
| `39`, `49` | privzeta barva ospredja ali ozadja |

Skritega sloga (`8`) in nadčrte (`53`) razčleni, vendar ne spremenita izhoda; druge kode prezre. Slogi se prenašajo čez prelome vrstic, dokler jih ne ponastavite, tako kot v terminalu.

## Barve

16 poimenovanih barv izvira iz barv teme `terminal.ansi*` (`terminal.ansiRed`, `terminal.ansiBrightBlue` itd.). Če tema katere od njih ne določa, se uporabi privzeta paleta VS Code (`#cd3131` za rdečo, `#2472C8` za modro itd.). Besedilo brez nastavljene barve prevzame barvo ospredja teme, ozadje bloka pa ozadje teme, tako kot pri poudarjanju na podlagi gramatike. V 256-barvni tabeli 256 je prvih 16 vnosov enakih tem 16 poimenovanim barvam; vnosi od 16 do 255 (barvna kocka 6×6×6 in lestvica sivin) ter vrednosti pravih barv niso odvisni od teme.

[`colorReplacements`](https://shikiphp.inline0.dev/sl/docs/options#colorreplacements) veljajo tudi za barve ANSI.

## Dve temi

ANSI upošteva preslikavo `themes` enako kot poudarjanje na podlagi gramatike in za teme, ki niso privzete, ustvari različice, odvisne od CSS:

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

Vsaka poimenovana barva se določi glede na paleto posamezne teme, zato je lahko rdeča v svetli temi drugačna kot rdeča v temni temi.

## Brez stanja gramatike

Ker ANSI ne uporablja gramatike TextMate, ni stanja gramatike, ki bi ga bilo treba ohraniti. `getLastGrammarState` sproži napako za `lang: 'ansi'`, `codeToTokensResult` pa vrne `null` `grammarState`.
