
# ANSI-Ausgabe

Setze `lang` auf `'ansi'`, um Terminalausgaben hervorzuheben – Text mit ANSI-Escape-Sequenzen – statt sie mit einer Grammatik zu tokenisieren. shikiphp analysiert die Escape-Codes und färbt den Text mit der ANSI-Palette des Themes. Es ist eine Portierung von Shikis `lang: 'ansi'`-Tokenizer. Vier Oracle-Szenarien prüfen dessen HTML anhand von Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

So lassen sich aufgezeichnete CLI-Ausgaben – etwa von Testläufen, Build-Protokollen oder `git`-Ausgaben – natürlich mit den ursprünglichen Farben darstellen. Die Escape-Sequenzen werden aus der Ausgabe entfernt; nur der Text bleibt, umschlossen von farbigen Spans.

Beachte den doppelt in Anführungszeichen gesetzten PHP-String: `"\e"` ist das Escape-Zeichen. Wenn du die Ausgabe eines Prozesses renderst (zum Beispiel mit `shell_exec` oder `proc_open`), sind die Escape-Zeichen bereits im String enthalten.

## Erkannte Sequenzen

Der Tokenizer liest SGR-Sequenzen (Select Graphic Rendition), `ESC [ … m`, mit beliebig vielen durch `;` getrennten Codes:

| Codes | Wirkung |
| --- | --- |
| `0` | setzt alle Farben und Attribute zurück |
| `1`, `3`, `4`, `9` | fett, kursiv, unterstrichen, durchgestrichen |
| `2` | gedimmt: der Vordergrund wird mit halber Deckkraft gezeichnet |
| `7` | invertiert: Vorder- und Hintergrund werden vertauscht |
| `21`, `23`, `24`, `27`, `29` | deaktivieren das entsprechende Attribut |
| `22` | normale Intensität: deaktiviert gedimmt und fett |
| `30`–`37`, `90`–`97` | Vordergrund: die 8 Standardfarben und 8 hellen Farben |
| `40`–`47`, `100`–`107` | Hintergrund: die 8 Standardfarben und 8 hellen Farben |
| `38;5;n`, `48;5;n` | Vorder- oder Hintergrund aus der 256-Farben-Tabelle |
| `38;2;r;g;b`, `48;2;r;g;b` | 24-Bit-Echtfarben für Vorder- oder Hintergrund |
| `39`, `49` | Standardfarbe für Vorder- oder Hintergrund |

Versteckt (`8`) und überstrichen (`53`) werden verarbeitet, ändern die Ausgabe aber nicht. Andere Codes werden ignoriert. Formatierungen gelten über Zeilenumbrüche hinweg weiter, bis sie zurückgesetzt werden – wie in einem Terminal.

## Farben

Die 16 benannten Farben stammen aus den `terminal.ansi*`-Farben des Themes (`terminal.ansiRed`, `terminal.ansiBrightBlue` usw.). Wenn das Theme eine Farbe nicht definiert, wird die Standardpalette von VS Code verwendet (`#cd3131` für Rot, `#2472C8` für Blau usw.). Text ohne festgelegte Farbe erhält die Vordergrundfarbe des Themes, der Blockhintergrund dessen Hintergrundfarbe – wie bei grammatikbasierter Hervorhebung. In der 256-Farben-Tabelle sind die Einträge 0–15 dieselben 16 benannten Farben. Die Einträge 16–255 (der 6×6×6-Farbwürfel und die Graustufenpalette) sowie Echtfarbwerte sind nicht vom Theme abhängig.

[`colorReplacements`](https://shikiphp.inline0.dev/de/docs/options#colorreplacements) gelten auch für ANSI-Farben.

## Duale Themes

ANSI berücksichtigt die Zuordnung `themes` wie die grammatikbasierte Hervorhebung und gibt für die Themes außer dem Standard-Theme CSS-Varianten aus:

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

Jede benannte Farbe wird anhand der Palette des jeweiligen Themes aufgelöst. Daher kann Rot im hellen Theme anders aussehen als im dunklen.

## Kein Grammatikzustand

Da ANSI keine TextMate-Grammatik verwendet, muss kein Grammatikzustand beibehalten werden. `getLastGrammarState` löst für `lang: 'ansi'` einen Fehler aus, und `codeToTokensResult` gibt ein `null` `grammarState` zurück.
