# MDView v1.0 (b3) — просмотрщик Markdown для Sprinter

**MDView** — программа просмотра документов Markdown для компьютера
**Sprinter-2000** (Z80, ОС ESTEX). Файл загружается в расширенную память (EMM)
и один раз «прогоняется» через парсер: готовые к показу строки (пары
символ+атрибут) складываются в **рендер-кэш** в EMM, после чего прокрутка в
любую сторону — это просто копирование готовых строк на экран, без повторного
парсинга. Даже на файлах в сотни килобайт листание остаётся мгновенным.

Текстовый режим 80×32, цветное оформление элементов разметки, три режима
просмотра (MD / RAW / HEX) и четыре кодировки с автоопределением.

---

## Возможности

* **Markdown-рендеринг** с цветовым оформлением:
  * заголовки `#`…`######` (H5/H6 отображаются как H4);
  * **жирный** (`**текст**`), *курсив* (`*текст*`), подчёркнутый (`_текст_`),
    ~~зачёркнутый~~ (`~~текст~~`), `встроенный код` (`` `текст` ``);
  * экранирование `\*`, `\_`, `` \` `` и любой ASCII-пунктуации;
  * чекбоксы `[x]` / `[ ]` в списках;
  * ненумерованные (`-`, `*`, `+`) и нумерованные (`1.`, `1)`) списки
    с базовой вложенностью по отступам;
  * цитаты `>` (склейка многострочных, маркер │ на переносах);
  * fenced-блоки кода ` ``` ` (без переносов, горизонтальный скролл);
  * таблицы `| … | … |` — рисуются псевдографической рамкой, ширины колонок
    вычисляются по содержимому (до 16 колонок);
  * горизонтальные разделители `---` / `***` / `___`;
  * жёсткие переносы (два пробела или `\` в конце строки);
  * мягкая склейка абзацев с переносом по словам под ширину экрана.
* **Кодировки: CP866, CP1251, KOI8-R, UTF-8.**
  * автоопределение при открытии (BOM → UTF-8; валидность multibyte-структуры;
    частотный анализ ходовых русских букв для 8-битных);
  * переключение по кругу клавишей **F8** в любой момент;
  * 8-битные кодировки отличаются только перекодировкой глифов на отрисовке —
    переключение мгновенно;
  * UTF-8 декодируется в CP866 в **отдельный набор** (файл + индекс + кэш);
    второй набор готовится **в фоне**, пока вы читаете документ, — обычно
    к первому нажатию F8 он уже построен и переключение мгновенно,
    с сохранением позиции. Если фон не успел, F8 докручивает начатую
    сборку (со спиннером), а не начинает её заново.
* **Три режима просмотра:**
  * **MD** — форматированный Markdown (по умолчанию);
  * **RAW** (**F2**) — исходный текст без разметки: перенос строк кратно 80
    (**F3** — режим панорамы с горизонтальным скроллом);
  * **HEX** (**F4**) — дамп *оригинального* файла:
    `0x012340 │ 16 байт hex │ 16 печатных символов`. Печатная колонка
    интерпретируется текущей кодировкой; для UTF-8 глиф ставится на позиции
    лид-байта, continuation-байты показываются точкой.
* **Единая позиция** при любых переключениях: MD ↔ RAW ↔ HEX и смена
  кодировки сохраняют текущее место в документе (между наборами разного
  размера — пропорционально, с точностью до строки).
* **Прогрессивная загрузка**: первый экран показывается сразу, индексация
  продолжается в фоне; по готовой части документа уже можно листать,
  **Esc**/**F10** прерывают загрузку.
* **Фоновая работа незаметна**: второй набор кодировки строится только в
  паузах между клавишами (после нажатия выдерживается пауза), поэтому
  скролл — в том числе с автоповтором — не теряет плавности.

---

## Запуск

```
MDVIEW2.EXE <файл.md>
```

Без аргумента открывается `README.MD` из текущего каталога.

## Клавиши

| Клавиша      | Действие                                                    |
|--------------|-------------------------------------------------------------|
| ↑ / ↓        | прокрутка на одну строку                                     |
| PgUp / PgDn  | прокрутка на экран (30 строк)                                |
| Home / End   | в начало / в конец документа                                 |
| ← / →        | горизонтальный сдвиг: код/таблицы в MD, панорама в RAW       |
| F1           | справка                                                      |
| F2           | RAW-режим ↔ MD                                               |
| F3           | в RAW: перенос строк ↔ панорама                              |
| F4           | HEX-режим ↔ прежний вид                                      |
| F8           | кодировка: CP866 → CP1251 → KOI8-R → UTF-8 → …               |
| Esc / F10    | выход (во время загрузки — прервать её)                      |

Статус-бар (верхняя строка): имя файла, кодировка, диапазон видимых строк
и процент прокрутки. Нижняя строка — меню доступных F-клавиш.

---

## Ограничения

| Параметр                        | Значение                                  |
|---------------------------------|-------------------------------------------|
| Размер файла                    | до 256 КБ (больший — обрезается с предупреждением) |
| Логических строк (после переносов) | до 18 432                              |
| Длина строки в рендер-кэше      | 255 ячеек (RAW/HEX ограничения не имеют)  |
| Колонок в таблице               | до 16                                     |
| Шаг табуляции                   | 4                                          |

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

## Требования

* Sprinter-2000 с ОС ESTEX;
* расширенная память (EMM): в худшем случае (файл 256 КБ + оба набора
  кодировок) — до ~150 страниц по 16 КБ (~2,4 МБ). Для типичных файлов
  в десятки килобайт достаточно нескольких десятков страниц.

Код, данные, стек и куча программы занимают окна W1+W2 (32 КБ, режим
памяти `small`); окно W3 используется только для доступа к EMM-страницам.

---

## Сборка

Требуется тулчейн этого репозитория (обёртка `sprinter-cc` над SDCC 4.5).
Из каталога `examples/mdview2`:

```
make            # собрать mdview2.exe
make floppy     # собрать и упаковать дискету для MAME (mc.img)
make run        # floppy + автоматический прогон в MAME (скриншоты)
```

На дискету кладутся: `MDVIEW2.EXE` и три документа, каждый в своей кодировке
(заодно покрывают все пути автодетекта): `README.MD` — этот файл, как есть
(UTF-8); `DEMO.MD` — демонстрация всех элементов разметки (CP1251);
`CHANGES.MD` — история версий (CP866).

## Структура исходников

| Файл             | Назначение                                                   |
|------------------|--------------------------------------------------------------|
| `mdview2.c`      | ядро: EMM-аллокации, рендер-кэш, наборы кодировок, загрузка файла, главный цикл |
| `mdview2_index.c`| парсер/индексатор Markdown — единственный проход по файлу    |
| `mdview2_md.c`   | MD-вид: отрисовка из кэша, прокрутка                         |
| `mdview2_raw.c`  | RAW-вид (F2/F3)                                              |
| `mdview2_hex.c`  | HEX-вид (F4)                                                 |
| `mdview2_enc.c`  | кодировки: детект, ремап-таблицы, конвертер UTF-8 → CP866    |
| `mdview2_table.c`| отрисовка таблиц                                             |
| `mdview2_status.c`| статус-бар, меню, спиннер                                   |
| `mdview2_help.c` | справка (F1)                                                 |
| `mdview2_conf.h` | конфигурация: `WITH_RAW` / `WITH_HEX` (модули отключаемы)    |
| `mdview2.h`      | общие константы, атрибуты, межмодульный API                  |

Подробности архитектуры — в `docs/mdview2-plan.md`.

## Лицензия и авторы

© 2026 Петров А.Г. Часть проекта Sprinter C Compiler
(см. LICENSE в корне репозитория).
