
# 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`](https://shikiphp.inline0.dev/ko/docs/options#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`를 반환합니다.
