본문으로 건너뛰기

ANSI 출력

터미널 출력(ANSI 이스케이프 시퀀스가 포함된 텍스트)을 문법으로 토큰화하는 대신 강조 표시하려면 lang을 'ansi'로 설정하세요. shikiphp는 이스케이프 코드를 분석하고 테마의 ANSI 팔레트로 텍스트에 색을 입힙니다. Shiki의 lang: 'ansi' 토크나이저를 포팅한 것으로, 네 가지 오라클 시나리오에서 Shiki 3.23.0에 대한 HTML를 확인합니다.

PHP
use Shikiphp\Shikiphp;

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

캡처한 CLI 출력(테스트 러너, 빌드 로그, git 출력 등)을 원래 색상을 유지해 렌더링하는 자연스러운 방식입니다. 출력에서 이스케이프 시퀀스가 제거되고 텍스트만 색상이 적용된 span으로 감싸집니다.

큰따옴표로 묶인 PHP 문자열에 유의하세요. "\e"은 이스케이프 문자입니다. 프로세스에서 캡처한 출력(예: shell_exec 또는 proc_open)을 렌더링하면 이스케이프 문자는 이미 문자열에 들어 있습니다.

처리하는 항목

토크나이저는 ESC [ … m인 SGR(Select Graphic Rendition) 시퀀스를 읽으며, ;로 구분된 코드는 개수에 제한이 없습니다:

코드 효과
0 모든 색과 속성 초기화
1, 3, 4, 9 굵게, 기울임꼴, 밑줄, 취소선
2 흐리게: 전경을 절반 불투명도로 표시
7 반전: 전경과 배경을 서로 바꿈
21, 23, 24, 27, 29 해당 속성 끄기
22 기본 강도: 흐리게와 굵게 끄기
30–37, 90–97 전경: 기본 색상 8개와 밝은 색상 8개
40–47, 100–107 배경: 기본 색상 8개와 밝은 색상 8개
38;5;n, 48;5;n 256색상 표에서 전경 또는 배경 지정
38;2;r;g;b, 48;2;r;g;b 24비트 트루컬러 전경 또는 배경
39, 49 기본 전경 또는 배경

숨김(8)과 오버라인(53)은 파싱되지만 출력에는 영향을 주지 않으며, 다른 코드는 무시됩니다. 터미널에서처럼 스타일은 초기화될 때까지 줄바꿈을 넘어 유지됩니다.

색상

이름이 지정된 16가지 색상은 테마의 terminal.ansi* 색상(terminal.ansiRed, terminal.ansiBrightBlue 등)에서 가져옵니다. 테마에 색상이 정의되지 않은 경우 VS Code 기본 팔레트(빨간색은 #cd3131, 파란색은 #2472C8 등)를 사용합니다. 색상이 지정되지 않은 텍스트에는 테마의 전경색이 적용되며, 블록 배경에는 문법 기반 강조 표시와 마찬가지로 테마의 배경색이 적용됩니다. 256색상 표에서 0–15 항목은 앞의 이름이 지정된 16가지 색상이며, 16–255 항목(6×6×6 색상 큐브와 회색조 램프)과 트루컬러 값은 테마에 따라 달라지지 않습니다.

colorReplacements도 ANSI 색상에 적용됩니다.

듀얼 테마

ANSI는 문법 기반 강조 표시와 마찬가지로 themes 맵을 따르며, 기본이 아닌 테마에는 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'],
]);

이름이 지정된 각 색상은 각 테마의 자체 팔레트에 따라 결정되므로, 라이트 테마의 빨간색과 다크 테마의 빨간색은 다를 수 있습니다.

문법 상태 없음

ANSI는 TextMate 문법을 사용하지 않으므로 유지할 문법 상태가 없습니다. getLastGrammarState은 lang: 'ansi'에서 오류를 발생시키고, codeToTokensResult은 null grammarState를 반환합니다.