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