
# CLI

shikiphp enthält ein kleines Befehlszeilenwerkzeug unter `bin/shikiphp` (in deinem Projekt installiert als `vendor/bin/shikiphp`). Es bietet drei Befehle: `highlight` rendert eine Datei nach HTML, und `langs` sowie `themes` listen die Inhalte des Pakets auf.

## `highlight`

Eine Datei nach HTML hervorheben und auf stdout ausgeben.

```bash
vendor/bin/shikiphp highlight <file> [--lang=<lang>] [--theme=<theme>]
```

- `<file>` — der einzulesende Pfad. Er muss auf eine vorhandene Datei verweisen; die Standardeingabe wird nicht gelesen.
- `--lang` — die Sprach-ID oder ein Alias. Falls nicht angegeben, wird die Dateiendung unverändert als ID verwendet (falls keine vorhanden ist, kommt `txt` zum Einsatz).
- `--theme` — die Theme-ID. Standardmäßig `github-dark`.

```bash
vendor/bin/shikiphp highlight src/App.php --lang=php --theme=nord
```

Die Ausgabe ist derselbe Single-Theme-`<pre class="shiki …">`-Block, den [`codeToHtml`](https://shikiphp.inline0.dev/de/docs/api#shikiphpcodetohtml) zurückgibt, gefolgt von einem Zeilenumbruch. So kannst du sie direkt in eine Datei umleiten:

```bash
vendor/bin/shikiphp highlight src/App.php --theme=github-light > app.html
```

Der Befehl akzeptiert keine weiteren Optionen. Für Dual-Themes, Transformer oder andere [Optionen](https://shikiphp.inline0.dev/de/docs/options) verwende stattdessen PHP API.

### Optionen und Argumente

Optionen müssen das Format `--name=value` verwenden. Andere Argumente, die mit `--` beginnen, werden ignoriert. Als Datei wird das letzte Argument verwendet, das nicht mit `--` beginnt. `--lang php file.rs` hebt daher `file.rs` als Rust hervor: `--lang` wird ignoriert, `php` durch `file.rs` ersetzt und die Sprache anhand der Endung `.rs` ermittelt.

### Spracherkennung

Ohne `--lang` wird die Dateiendung unverändert als Sprach-ID verwendet. Das funktioniert, wenn die Endung selbst eine mitgelieferte ID oder ein Alias ist — `php`, `js`, `ts`, `tsx`, `py`, `rs`, `go`, `md`, `yml`, `json`, `sh` und viele weitere (siehe [Sprachen](https://shikiphp.inline0.dev/de/docs/languages)). In diesen Fällen funktioniert es nicht:

- Dateien ohne Endung, etwa `Makefile` oder `Dockerfile`; für sie wird `txt` verwendet;
- Endungen, die keine Sprach-ID sind, etwa `.txt`.

`txt` ist keine mitgelieferte Sprache, daher enden beide Fälle derzeit mit einem `Unknown language "txt"`-Fehler ([#3](https://github.com/inline0/shikiphp/issues/3)).
Gib für diese Dateien `--lang` an:

```bash
vendor/bin/shikiphp highlight Dockerfile --lang=docker
vendor/bin/shikiphp highlight Makefile --lang=make
```

## `langs`

Gibt jede ID, die das Paket als Sprache akzeptiert, einzeln pro Zeile aus.

```bash
vendor/bin/shikiphp langs
```

Die Liste umfasst 350 Zeilen: die 253 mitgelieferten Grammatik-IDs in Paket-Reihenfolge (nicht alphabetisch), gefolgt von ihren 97 Aliasen (`js`, `cjs`, `mjs` usw.). Zu den Grammatik-IDs gehören 18 Hilfsgrammatiken, die in andere Grammatiken eingebettet werden, etwa `vue-directives` und `es-tag-css`. Im Katalog unter [Sprachen](https://shikiphp.inline0.dev/de/docs/languages) findest du Namen und Aliase. Leite die Liste durch `sort`, um sie alphabetisch zu sortieren.

## `themes`

Gibt jede mitgelieferte Theme-ID einzeln pro Zeile und alphabetisch sortiert aus (65 Themes).

```bash
vendor/bin/shikiphp themes
```

Im Katalog unter [Themes](https://shikiphp.inline0.dev/de/docs/themes) findest du Namen und helle/dunkle Typen.

## Hilfe und Exit-Status

Führe den Befehl ohne Kommando oder mit `-h` / `--help` / `help` aus, um die Verwendungshinweise auszugeben.

```bash
vendor/bin/shikiphp --help
```

| Situation | Ausgabe | Exit-Status |
| --- | --- | --- |
| Erfolg oder Hilfe | stdout | `0` |
| Unbekanntes Kommando | `Unknown command: <name>` auf stderr | `1` |
| `highlight` ohne Datei oder Datei nicht vorhanden | Verwendungshinweis auf stderr | `1` |
| Unbekannte Sprache oder unbekanntes Theme | nicht abgefangener `Shikiphp\Exceptions\Highlight` (PHP-Abbruchfehler mit Stacktrace) | `255` |
