
# Έξοδος ANSI

Ορίστε το `lang` σε `'ansi'` για να επισημάνετε την έξοδο τερματικού — κείμενο που περιέχει ακολουθίες διαφυγής ANSI — αντί να γίνει ανάλυση με γραμματική. Το shikiphp αναλύει τους κωδικούς διαφυγής και χρωματίζει το κείμενο από την παλέτα ANSI του θέματος. Είναι μεταφορά του αναλυτή `lang: 'ansi'` του Shiki και τέσσερα σενάρια oracle ελέγχουν το HTML του σε σύγκριση με το Shiki 3.23.0.

```php
use Shikiphp\Shikiphp;

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

Αυτός είναι ο φυσικός τρόπος απόδοσης καταγεγραμμένης εξόδου CLI — από προγράμματα εκτέλεσης δοκιμών, αρχεία καταγραφής build και έξοδο `git` — με διατήρηση των αρχικών χρωμάτων. Οι ακολουθίες διαφυγής αφαιρούνται από την έξοδο· απομένει μόνο το κείμενο, τυλιγμένο σε χρωματιστά spans.

Προσέξτε τη συμβολοσειρά PHP με διπλά εισαγωγικά: το `"\e"` είναι ο χαρακτήρας διαφυγής. Όταν αποδίδετε έξοδο που καταγράφηκε από μια διεργασία (για παράδειγμα με το `shell_exec` ή το `proc_open`), οι χαρακτήρες διαφυγής βρίσκονται ήδη στη συμβολοσειρά.

## Τι αναγνωρίζει

Ο αναλυτής διαβάζει ακολουθίες SGR (Select Graphic Rendition), `ESC [ … m`, με οποιονδήποτε αριθμό κωδικών διαχωρισμένων με `;`:

| Κωδικοί | Επίδραση |
| --- | --- |
| `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` | χρώμα προσκηνίου ή φόντου true color 24 bit |
| `39`, `49` | προεπιλεγμένο προσκήνιο ή φόντο |

Τα κρυφά (`8`) και η διαγράμμιση από πάνω (`53`) αναλύονται, αλλά δεν αλλάζουν την έξοδο, ενώ οι άλλοι κωδικοί αγνοούνται. Τα στυλ διατηρούνται στα αλλαγμένα σημεία γραμμής μέχρι να γίνει επαναφορά τους, όπως σε ένα τερματικό.

## Χρώματα

Τα 16 επώνυμα χρώματα προέρχονται από τα χρώματα `terminal.ansi*` του θέματος (`terminal.ansiRed`, `terminal.ansiBrightBlue` κ.ο.κ.). Αν το θέμα δεν ορίζει κάποιο, χρησιμοποιείται η προεπιλεγμένη παλέτα VS Code (`#cd3131` για το κόκκινο, `#2472C8` για το μπλε κ.ο.κ.). Το κείμενο χωρίς ορισμένο χρώμα χρησιμοποιεί το χρώμα προσκηνίου του θέματος και το φόντο του μπλοκ χρησιμοποιεί το φόντο του θέματος, όπως και στην επισήμανση βάσει γραμματικής. Στον πίνακα χρωμάτων 256, οι καταχωρίσεις 0–15 είναι τα ίδια 16 επώνυμα χρώματα· οι καταχωρίσεις 16–255 (ο κύβος χρωμάτων 6×6×6 και η κλίμακα του γκρι) και οι τιμές true color δεν εξαρτώνται από το θέμα.

[Το `colorReplacements`](https://shikiphp.inline0.dev/el/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`.
