
# Output ANSI

Atur `lang` ke `'ansi'` untuk menyorot output terminal — teks yang berisi rangkaian escape ANSI — alih-alih melakukan tokenisasi dengan grammar. shikiphp mengurai kode escape dan mewarnai teks berdasarkan palet ANSI tema. Ini adalah port tokenizer Shiki `lang: 'ansi'`, dan empat skenario oracle memeriksa HTML terhadap Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Inilah cara alami untuk merender output CLI yang direkam — runner pengujian, log build, output `git` — dengan warna aslinya tetap dipertahankan. Rangkaian escape dihapus dari output; hanya teksnya yang tersisa, dibungkus dalam span berwarna.

Perhatikan string PHP dengan tanda kutip ganda: `"\e"` adalah karakter escape. Saat Anda merender output yang direkam dari suatu proses (misalnya dengan `shell_exec` atau `proc_open`), karakter escape sudah ada di dalam string.

## Yang dipahami

Tokenizer membaca rangkaian SGR (Select Graphic Rendition), `ESC [ … m`, dengan sejumlah kode `;` yang dipisahkan:

| Kode | Efek |
| --- | --- |
| `0` | mengatur ulang semua warna dan atribut |
| `1`, `3`, `4`, `9` | tebal, miring, garis bawah, coret |
| `2` | redup: latar depan ditampilkan dengan opasitas setengah |
| `7` | terbalik: latar depan dan latar belakang bertukar |
| `21`, `23`, `24`, `27`, `29` | menonaktifkan atribut yang cocok |
| `22` | intensitas normal: menonaktifkan redup dan tebal |
| `30`–`37`, `90`–`97` | latar depan: 8 warna standar dan 8 warna terang |
| `40`–`47`, `100`–`107` | latar belakang: 8 warna standar dan 8 warna terang |
| `38;5;n`, `48;5;n` | latar depan atau latar belakang dari tabel 256 warna |
| `38;2;r;g;b`, `48;2;r;g;b` | latar depan atau latar belakang true-color 24-bit |
| `39`, `49` | latar depan atau latar belakang default |

Tersembunyi (`8`) dan garis atas (`53`) diurai, tetapi tidak mengubah output, sedangkan kode lainnya diabaikan. Gaya tetap berlaku melewati jeda baris hingga diatur ulang, seperti di terminal.

## Warna

Ke-16 warna bernama berasal dari warna `terminal.ansi*` tema (`terminal.ansiRed`, `terminal.ansiBrightBlue`, dan seterusnya). Jika tema tidak mendefinisikannya, palet default VS Code digunakan (`#cd3131` untuk merah, `#2472C8` untuk biru, dan seterusnya). Teks yang tidak menetapkan warna menggunakan warna latar depan tema, dan latar belakang blok menggunakan warna latar belakang tema, seperti pada penyorotan berbasis grammar. Dalam tabel 256 warna, entri 0–15 adalah 16 warna bernama yang sama; entri 16–255 (kubus warna 6×6×6 dan gradasi skala abu-abu) serta nilai true-color tidak bergantung pada tema.

[`colorReplacements`](https://shikiphp.inline0.dev/id/docs/options#colorreplacements) juga berlaku untuk warna ANSI.

## Tema ganda

ANSI mengikuti peta `themes` seperti penyorotan berbasis grammar, dengan menghasilkan varian CSS untuk tema non-default:

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

Setiap warna bernama dicocokkan dengan palet masing-masing tema, sehingga warna merah pada tema terang dan tema gelap dapat berbeda.

## Tanpa status grammar

Karena ANSI tidak menggunakan grammar TextMate, tidak ada status grammar yang perlu dibawa. `getLastGrammarState` menghasilkan error untuk `lang: 'ansi'`, dan `codeToTokensResult` mengembalikan `null` `grammarState`.
