# 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 в корне репозитория).