- индексатор порезан на резюмируемые шаги index_begin/index_step/index_finish; межшаговое состояние в статиках модуля, в docset_t не входит - bg_build_start/bg_step: второй набор (UTF-8 при 8-битном первичном и наоборот) строится в idle главного цикла; холдаун после клавиш, спиннер погашен (g_bg_building) — фон незаметен - F8 до готовности докручивает начатое фоном (ветка resume в build_doc), а не строит заново; общий setup вынесен в doc_setup - кодировка в статус-баре показывается сразу (детект/F8), не дожидаясь конца индексации - побочный фикс: UTF-конвертация впереди проверки останова — >4КБ абзац больше не обрывает конвертацию остатка - README.md (новый, v1.0 b3), CHANGELOG.md; дискета: README/DEMO/CHANGES в трёх кодировках (пути автодетекта) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
11 KiB
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 в корне репозитория).