Pāriet uz saturu

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