
# CLI

shikiphp містить невеликий інструмент командного рядка в `bin/shikiphp` (у проєкті його встановлено як `vendor/bin/shikiphp`). Він має три команди: `highlight` виводить один файл у HTML, а `langs` і `themes` показують вміст пакета.

## `highlight`

Підсвічує файл у HTML і виводить результат у stdout.

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

- `<file>` — шлях до файлу. Файл має існувати; стандартне введення не читається.
- `--lang` — ідентифікатор мови або псевдонім. Якщо його не вказано, розширення файлу використовується як є як ідентифікатор (а якщо розширення немає — застосовується `txt`).
- `--theme` — ідентифікатор теми. За замовчуванням — `github-dark`.

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

Результат — той самий блок `<pre class="shiki …">` для однієї теми, який повертає [`codeToHtml`](https://shikiphp.inline0.dev/uk/docs/api#shikiphpcodetohtml), а за ним іде символ нового рядка, тож його можна одразу перенаправити у файл:

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

Команда не приймає інших параметрів. Щоб використати дві теми, трансформери чи будь-який інший [параметр](https://shikiphp.inline0.dev/uk/docs/options), викличте натомість PHP API.

### Параметри й аргументи

Параметри мають бути у форматі `--name=value`. Інші аргументи, що починаються з `--`, ігноруються, а файлом вважається останній аргумент, який не починається з `--`. Тому `--lang php file.rs` підсвічує `file.rs` як Rust: `--lang` ігнорується, `php` замінюється на `file.rs`, а мову визначено за розширенням `.rs`.

### Визначення мови

Якщо не вказано `--lang`, розширення стає ідентифікатором мови без змін. Це працює, коли саме розширення є вбудованим ідентифікатором або псевдонімом — `php`, `js`, `ts`, `tsx`, `py`, `rs`, `go`, `md`, `yml`, `json`, `sh` та багато інших (див. [Мови](https://shikiphp.inline0.dev/uk/docs/languages)). Але це не працює для:

- файлів без розширення, як-от `Makefile` або `Dockerfile`, для яких використовується `txt`;
- розширень, що не є ідентифікаторами мов, як-от `.txt`.

`txt` не є вбудованою мовою, тому в обох випадках роботу зараз зупиняє помилка `Unknown language "txt"` (фатальна помилка [#3](https://github.com/inline0/shikiphp/issues/3)).
Для таких файлів передайте `--lang`:

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

## `langs`

Виводить усі прийнятні пакетом ідентифікатори мов, по одному в рядку.

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

У списку 350 рядків: спершу 253 вбудованих ідентифікаторів граматик у порядку пакета (не за абеткою), а потім 97 псевдонімів (`js`, `cjs`, `mjs` тощо). Ідентифікатори граматик охоплюють 18 допоміжних граматик, вбудованих в інші граматики, як-от `vue-directives` і `es-tag-css`; каталог назв і псевдонімів див. у розділі [Мови](https://shikiphp.inline0.dev/uk/docs/languages). Щоб отримати список за абеткою, передайте вивід через `sort`.

## `themes`

Виводить усі ідентифікатори вбудованих тем, по одному в рядку, за абеткою (65 тем).

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

Каталог назв і світлих/темних типів див. у розділі [Теми](https://shikiphp.inline0.dev/uk/docs/themes).

## Довідка та код завершення

Запустіть без команди або з `-h` / `--help` / `help`, щоб вивести довідку з використання.

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

| Ситуація | Вивід | Код завершення |
| --- | --- | --- |
| Успіх або довідка | stdout | `0` |
| Невідома команда | `Unknown command: <name>` у stderr | `1` |
| `highlight` без файлу або файл не існує | рядок використання у stderr | `1` |
| Невідома мова або тема | необроблена `Shikiphp\Exceptions\Highlight` (фатальна помилка PHP зі стеком викликів) | `255` |
