Lewati ke konten

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 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.