
# 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/ru/docs/api#shikiphpcodetohtml), за которым следует символ новой строки, поэтому его можно сразу перенаправить в файл:

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

Команда не принимает другие параметры. Для двух тем, преобразователей или любого другого [параметра](https://shikiphp.inline0.dev/ru/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/ru/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/ru/docs/languages). Для алфавитного списка выполните команду через `sort`.

## `themes`

Вывести идентификаторы всех встроенных тем, по одному в строке, в алфавитном порядке (65 тем).

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

Каталог с названиями и типами светлой/тёмной темы см. в разделе [Темы](https://shikiphp.inline0.dev/ru/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` |
