Preskoči na vsebino

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