Przejdź do treści

Wyjście ANSI

Ustaw lang na 'ansi', aby wyróżniać wyjście terminala — tekst zawierający sekwencje ucieczki ANSI — zamiast tokenizować je według gramatyki. shikiphp analizuje kody ucieczki i koloruje tekst na podstawie palety ANSI motywu. To port tokenizatora lang: 'ansi' z Shiki; cztery scenariusze wzorcowe sprawdzają jego HTML względem Shiki 3.23.0.

PHP
use Shikiphp\Shikiphp;

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

To naturalny sposób renderowania przechwyconego wyjścia CLI — na przykład z narzędzi uruchamiających testy, logów kompilacji czy wyjścia git — z zachowaniem oryginalnych kolorów. Sekwencje ucieczki są usuwane z wyjścia; pozostaje tylko tekst ujęty w kolorowe elementy span.

Zwróć uwagę na ciąg PHP w podwójnych cudzysłowach: "\e" to znak ucieczki. Podczas renderowania wyjścia przechwyconego z procesu (na przykład za pomocą shell_exec lub proc_open) znaki ucieczki są już zawarte w ciągu.

Obsługiwane elementy

Tokenizator odczytuje sekwencje SGR (Select Graphic Rendition), ESC [ … m, z dowolną liczbą kodów oddzielonych ;:

Kody Efekt
0 resetuje wszystkie kolory i atrybuty
1, 3, 4, 9 pogrubienie, kursywa, podkreślenie, przekreślenie
2 przygaszenie: pierwszy plan jest wyświetlany z połową krycia
7 odwrócenie: zamienia kolory pierwszego planu i tła
21, 23, 24, 27, 29 wyłącza odpowiadający im atrybut
22 normalna intensywność: wyłącza przygaszenie i pogrubienie
30–37, 90–97 pierwszy plan: 8 kolorów standardowych i 8 jasnych
40–47, 100–107 tło: 8 kolorów standardowych i 8 jasnych
38;5;n, 48;5;n kolor pierwszego planu lub tła z palety 256 kolorów 256
38;2;r;g;b, 48;2;r;g;b 24-bitowy kolor pierwszego planu lub tła
39, 49 domyślny kolor pierwszego planu lub tła

Ukrycie (8) i nadkreślenie (53) są analizowane, ale nie zmieniają wyjścia; pozostałe kody są ignorowane. Style utrzymują się przez kolejne wiersze, aż do ich zresetowania, tak jak w terminalu.

Kolory

16 nazwanych kolorów pochodzi z kolorów terminal.ansi* motywu (terminal.ansiRed, terminal.ansiBrightBlue itd.). Jeśli motyw nie definiuje danego koloru, używana jest domyślna paleta VS Code (#cd3131 dla czerwieni, #2472C8 dla niebieskiego itd.). Tekst bez ustawionego koloru przyjmuje kolor pierwszego planu motywu, a tło bloku — kolor tła motywu, tak jak przy wyróżnianiu opartym na gramatyce. W palecie 256 kolorów 256 pozycje 0–15 odpowiadają tym samym 16 nazwanym kolorom; pozycje 16–255 (sześcian kolorów 6×6×6 i skala szarości) oraz wartości true color nie zależą od motywu.

colorReplacements dotyczą również kolorów ANSI.

Motywy jasny i ciemny

ANSI respektuje mapę themes tak samo jak wyróżnianie oparte na gramatyce, generując warianty zależne od motywu CSS dla motywów innych niż domyślny:

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

Każdy nazwany kolor jest dopasowywany do palety danego motywu, dlatego czerwień w motywie jasnym może różnić się od czerwieni w motywie ciemnym.

Bez stanu gramatyki

Ponieważ ANSI nie używa gramatyki TextMate, nie ma stanu gramatyki do zachowania. getLastGrammarState zgłasza wyjątek dla lang: 'ansi', a codeToTokensResult zwraca null grammarState.