# MDView: описание работы и тестовые паттерны
## Назначение
`mdview` — консольный просмотрщик Markdown для текстового режима 80x32.
Программа загружает `.MD`-файл, индексирует его на экранные сегменты и рендерит содержимое с учётом переносов, стилей и специальных блоков.

## Как работает программа
### 1) Загрузка файла
- На старте вызывается `load_file(path)`.
- Если путь не передан, используется `SAMPLE.MD`.
- При ошибках загрузки программа показывает причину и завершает работу после нажатия клавиши.

### 2) Индексация (`index_lines`)
- Файл разбирается в массив сегментов для быстрого рендера.
- Поддерживаются ключевые типы строк:
  - заголовки `#..####`,
  - маркированные/нумерованные списки,
  - цитаты `>`,
  - горизонтальные разделители,
  - fenced code-блоки,
  - таблицы (nowrap-режим),
  - обычные параграфы.
- Для list/quote/plain используется общая логика сканирования с режимами склейки строк.

### 3) Рендер (`render_line`, `render_viewport`)
- Для каждой видимой строки рисуется префикс (маркер списка, цитаты и т.д.) и текст.
- Поддерживаются inline-стили:
  - `**жирный**`,
  - `*курсив*`,
  - `_подчёркнутый_`,
  - `~~зачёркнутый~~`,
  - `` `code` ``.
- Табы расширяются до фиксированного шага.
- Для длинных nowrap-строк применяется горизонтальный сдвиг и индикаторы `<`/`>`.

### 4) Навигация
- `Up/Down` — прокрутка на 1 строку.
- `PgUp/PgDn` — прокрутка на экран.
- `Home/End` — начало/конец документа.
- `Left/Right` — горизонтальная прокрутка nowrap-контента.
- `Esc` или `F10` — выход.

## Сборка и запуск
```bash
make -C examples/mdview
```

Запуск на целевой системе:
```bash
mdview.exe <путь_к_файлу.md>
```

Если путь не указан, открывается `SAMPLE.MD`.

## Тестовые паттерны
Ниже набор паттернов для ручной регрессии.

### P01 — Базовый smoke-тест открытия
Вход:
- валидный markdown-файл среднего размера.

Ожидается:
- файл открывается без ошибок;
- статус-бар и меню отображаются корректно;
- прокрутка работает.

### P02 — Ошибка открытия файла
Вход:
- несуществующий путь к файлу.

Ожидается:
- сообщение `mdview: cannot load file`;
- корректный код причины (`open failed` и т.п.);
- ожидание клавиши перед выходом.

### P03 — Пустой файл
Вход:
- пустой `.md`.

Ожидается:
- сообщение `mdview: empty file`;
- корректное завершение после нажатия клавиши.

### P04 — Обычный параграф и переносы
Шаблон:
```md
Это длинный абзац для проверки переноса строк в обычном тексте.
Вторая строка должна мягко склеиться с первой.
```

Ожидается:
- строки склеиваются как единый параграф;
- переносы происходят по ширине экрана без потери символов.

### P05 — Hard break в параграфе
Шаблон:
```md
Первая строка с двумя пробелами в конце.  
Вторая строка после hard break.
```

Ожидается:
- между строками сохраняется принудительный разрыв;
- inline-стиль не ломается.

### P06 — Многострочный список с lazy continuation
Шаблон:
```md
- Пункт списка, который продолжается
  на следующей строке с отступом.
```

Ожидается:
- continuation-строка склеивается с пунктом через один пробел;
- лишние ведущие отступы continuation не попадают в итоговый текст;
- переносы не ломают маркер списка.

### P07 — Многострочная цитата
Шаблон:
```md
> Первая строка цитаты
> Вторая строка цитаты
> Третья строка цитаты
```

Ожидается:
- для продолжений корректно повторяется quote-префикс;
- сырой символ `>` из исходника не «просачивается» в середину текста.

### P08 — Пустая quoted-строка как разделитель
Шаблон:
```md
> Первый параграф цитаты
>
> Второй параграф цитаты
```

Ожидается:
- пустая quoted-строка разделяет два параграфа;
- рендер не объединяет их в один поток.

### P09 — Таблица в nowrap-режиме
Шаблон:
```md
| col1 | col2 | col3 |
|------|------|------|
| очень длинное значение | очень длинное значение | очень длинное значение |
```

Ожидается:
- строка таблицы не переносится по словам;
- работает горизонтальный сдвиг `Left/Right`;
- индикаторы `<`/`>` показывают скрытый контент.

### P10 — Fenced code-block
Шаблон:
~~~md
```text
**это не жирный**
_это не подчёркнутый_
```
~~~

Ожидается:
- внутри code-блока inline-разметка не применяется;
- текст отображается как литерал.

### P11 — Inline-стили на обычном тексте
Шаблон:
```md
Текст с **жирным**, *курсивом*, _подчёркнутым_, ~~зачёркнутым~~ и `code`.
```

Ожидается:
- все перечисленные стили рендерятся корректно;
- литеральные случаи вроде `2 * 3` не превращаются в стиль.

### P12 — Статус-бар и границы прокрутки
Вход:
- документ на несколько экранов.

Ожидается:
- корректные `L x-y / total` и `%`;
- `Home/End` приводят к ожидаемым позициям;
- при выходе за границы документа top-line корректно clamp-ится.

## Рекомендация по регрессии
После любых изменений в логике индексации/рендера прогонять минимум:
- `P04`, `P05`, `P06`, `P07`, `P09`, `P10`, `P11`, `P12`.
