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.
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 juga berlaku untuk warna ANSI.
Tema ganda
ANSI mengikuti peta themes seperti penyorotan berbasis grammar, dengan menghasilkan varian CSS untuk tema non-default:
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.