ChangeLog:
- prebuild.
This commit is contained in:
@@ -6,5 +6,5 @@
|
||||
PROJ_ROOT := $(abspath $(CURDIR)/../..)
|
||||
EXAMPLE := mdview
|
||||
MEMORY := small
|
||||
EXTRA_DATA := SAMPLE.MD
|
||||
EXTRA_DATA := SAMPLE.MD PLAN_866.md
|
||||
include $(PROJ_ROOT)/app.mk
|
||||
|
||||
+66
-23
@@ -5,10 +5,36 @@
|
||||
Тестовая крупная задача — проверить нашу libc на нетривиальном interactive-приложении (полноэкранный UI, файловый I/O, парсер). Параллельно даст хороший showcase платформы и поможет вытащить недоделки в conio/io. Конечная цель: viewer для `.md` файлов с подсветкой синтаксиса, навигацией по тексту и постраничным скроллингом.
|
||||
|
||||
**Ограничения v1 (зафиксированы пользователем):**
|
||||
- POSIX file API (`open/read/lseek/close`); FILE*/fread/fgets — не использовать
|
||||
- Максимум 16 KB на один файл (одна EMM-страница); многостраничный режим — в v2
|
||||
- POSIX file API (open/read/lseek/close); FILE pointer / fread / fgets — не использовать
|
||||
- Подсветка через цвет: **размер заголовка** → цвет шрифта; **bold/italic** → цвет фона (моноширинный фонт без жирного/курсивного начертания)
|
||||
|
||||
**Расширения, реализованные после плана:**
|
||||
- Файлы до 128 KB (1–8 EMM-страниц, lazy map в W3 через `fb()/map_page()`) — изначально было в v2
|
||||
- Анимированный spinner и предварительная отрисовка UI при старте — UX
|
||||
- Inline emphasis: `_`/`*`/`**` подчиняются XOR flanking-правилу (whitespace ровно с одной стороны), `COLOR_YELLOW` и `2 * 3` остаются литералами
|
||||
|
||||
---
|
||||
|
||||
## Текущий статус (2026-06-05)
|
||||
|
||||
| Phase | Статус | Комментарий |
|
||||
|---|---|---|
|
||||
| 1 Plain text + nav | ✓ | загрузка, индексация, status/menu, ↑↓/PgUp/PgDn/Home/End/F1/F10/Esc |
|
||||
| 2 Headers + HR | ✓ | H1..H4, `---`/`***`/`___` (с ≥3 marker'ов) |
|
||||
| 3 Inline emphasis | ✓ | `**` / `*` / `_` / `` ` ``; XOR flanking (см. выше) |
|
||||
| 4 Lists / quote / fenced code | ✓ | `- / * / +`, `N. / N)`, `> `, ``` ``` ```; light nested lists |
|
||||
| 4-tables | ✗ | таблицы отложены вместе с Phase 6 |
|
||||
| 5 Wrap / Unwrap (F2) | ✓ | wrap-by-default; soft wrap; F2 переключает; hpan ←/→ в truncate-режиме |
|
||||
| 6 Полный layout таблиц | ✗ | deferred |
|
||||
| 7 Links + search | ✗ | deferred |
|
||||
| 8 F8 Raw toggle | ✗ | deferred |
|
||||
| Cache рендеренных строк | ✗ | не нужно по скорости |
|
||||
|
||||
**UX-поправки (отдельно от phase-плана, 2026-06-05):**
|
||||
- UI (menu + title bar) отрисовывается ДО `load_file`/`index_lines` — пользователь сразу видит интерфейс, а не чёрный экран
|
||||
- Title bar: `MDVIEW <spinner> <filename>` (3 пробела между MDVIEW и filename, slot спиннера — col 8)
|
||||
- Spinner крутится во время `load_file` (по странице) и `index_lines` (раз в 32 логических строки), включая `toggle_wrap`
|
||||
|
||||
---
|
||||
|
||||
## Архитектура
|
||||
@@ -16,11 +42,14 @@
|
||||
### Раскладка экрана (80×32, текст mode 0x03)
|
||||
|
||||
```
|
||||
Row 0: ┃ mdview.md L 1-30 / 142 21% ┃ ← status bar (BG=blue, FG=white)
|
||||
Row 1: ┃ ┃
|
||||
... ┃ document viewport (30 rows) ┃
|
||||
Row 30: ┃ ┃
|
||||
Row 31: ┃ F1 Help F10 Exit┃ ← menu bar (BG=blue, FG=cyan)
|
||||
Row 0: ┃ MDVIEW │ mdview.md │ L 1-30 / 142 │ 21% ┃ ← status bar (BG=blue, FG=white)
|
||||
▲ ▲
|
||||
│ └── filename @ col 10
|
||||
└────────── spinner slot @ col 8 (anim. while busy)
|
||||
Row 1: ┃ ┃
|
||||
... ┃ document viewport (30 rows) ┃
|
||||
Row 30: ┃ ┃
|
||||
Row 31: ┃ F1 Help F2 Wrap F10 Exit ┃ ← menu bar (BG=blue, FG=cyan)
|
||||
```
|
||||
|
||||
- Viewport = 30 строк × 80 столбцов.
|
||||
@@ -34,15 +63,16 @@ Memory mode: **`small`** — DSS отводит под наш образ **дв
|
||||
W0 (0x0000-0x3FFF): ESTEX (system, untouchable)
|
||||
W1 (0x4000-0x7FFF): CODE (small mode page 1)
|
||||
W2 (0x8000-0xBFFF): DATA + STACK + HEAP (small mode page 2)
|
||||
W3 (0xC000-0xFFFF): paged window — переключается между EMM-страницами:
|
||||
├── file page: исходный текст .md файла (16 KB)
|
||||
└── cache page: кэш отформатированных строк (Phase 3+)
|
||||
W3 (0xC000-0xFFFF): paged window — лениво переключается между EMM-страницами
|
||||
файла (до 8 страниц = 128 KB). `cur_page` кэширует
|
||||
текущую mapping, `fb(p)` маппит нужную страницу при
|
||||
первом обращении.
|
||||
```
|
||||
|
||||
Почему small + W3:
|
||||
- 32 KB на код+данные с большим запасом → нет банкинга
|
||||
- W3 — стандартный paged window, под него у нас уже есть `bank_io_w3` API
|
||||
- v2-расширение (multi-page файлы >16 KB): просто `mem_alloc_pages(N)` и переключение страниц в W3 через `sprinter_page_w3()`
|
||||
- Файлы до 128 KB поддерживаются нативно: `mem_alloc_pages(pages_needed)` под весь файл; `map_page()` через `sprinter_page_w3()`; `fb(p)` — единая точка доступа из индексатора и рендера.
|
||||
|
||||
Статики (в W2):
|
||||
- `line_offset[MAX_LINES]` — uint16_t смещение каждой строки в файловой странице (4 KB на 2048 строк)
|
||||
@@ -65,7 +95,7 @@ main → open() → read() chunks 1KB → write to W1 (mapped EMM page) → clos
|
||||
|
||||
## Реализация — поэтапная
|
||||
|
||||
### Phase 1 — Plain text viewer (MVP)
|
||||
### Phase 1 — Plain text viewer (MVP) ✓
|
||||
|
||||
**Что работает:**
|
||||
- Загрузка файла (`open/read/close`) в W1-страницу
|
||||
@@ -81,7 +111,7 @@ main → open() → read() chunks 1KB → write to W1 (mapped EMM page) → clos
|
||||
- `examples/mdview/Makefile`
|
||||
- `examples/mdview/SAMPLE.MD` — тестовый markdown файл
|
||||
|
||||
### Phase 2 — Headers и горизонтальная линия
|
||||
### Phase 2 — Headers и горизонтальная линия ✓
|
||||
|
||||
**MD фичи:**
|
||||
- `# H1` → ярко-жёлтый (COLOR_YELLOW = 14) на чёрном
|
||||
@@ -90,7 +120,7 @@ main → open() → read() chunks 1KB → write to W1 (mapped EMM page) → clos
|
||||
- `#### H4+` → серый (COLOR_GREY = 8)
|
||||
- `---` / `***` на отдельной строке → линия 0xC4 (горизонтальная рамка ASCII) во всю ширину
|
||||
|
||||
### Phase 3 — Inline emphasis
|
||||
### Phase 3 — Inline emphasis ✓
|
||||
|
||||
**Парсер inline (per-line, runs в одну строку):**
|
||||
- `**bold**` → ATTR_TEXT_BOLD
|
||||
@@ -99,12 +129,23 @@ main → open() → read() chunks 1KB → write to W1 (mapped EMM page) → clos
|
||||
- `` `code` `` → ATTR_TEXT_CODE
|
||||
- Маркеры `**`/`*`/`_`/`` ` `` НЕ рендерятся (съедаются)
|
||||
|
||||
State machine: один активный стиль одновременно (без вложенности); конфликтующий маркер при чужом активном стиле уходит литералом. Состояние сбрасывается на каждой строке.
|
||||
State machine: один активный стиль одновременно (без вложенности); конфликтующий маркер при чужом активном стиле всё равно консьюмится (zero-width) для синхронизации ширины с index_lines. Состояние сбрасывается на каждой строке.
|
||||
|
||||
**Flanking-правило (CommonMark intraword, реализовано после изначального плана):**
|
||||
- `*` / `**` / `_` считаются markdown-маркером только если whitespace/EOL
|
||||
ровно с ОДНОЙ стороны (XOR).
|
||||
- Случаи "оба whitespace" (`2 * 3`, `2 ** 3`) → литералы (арифметика).
|
||||
- Случаи "ни одного whitespace" (`COLOR_YELLOW`, `FILE*/fread`, `foo*bar*baz`)
|
||||
→ литералы (intraword).
|
||||
- Backtick (`` ` ``) flanking НЕ требует — `` `code` `` работает без пробелов.
|
||||
- Правило применено симметрично в 4 местах (`index_lines`, cont-render,
|
||||
основной inline-парсер, truncation peek), иначе wrap-индексатор и
|
||||
рендер разъедутся по ширине.
|
||||
|
||||
> **Кэш отформатированных строк** — отложен в самый конец, см. "Phase ∞: оптимизации".
|
||||
> Скорости текущего наивного рендера хватает на 80×30 = 2400 wrchar / кадр; PgUp/PgDn визуально мгновенен.
|
||||
|
||||
### Phase 4 — Block elements
|
||||
### Phase 4 — Block elements ✓ (без таблиц)
|
||||
|
||||
- Маркированные списки: `- foo`, `* foo`, `+ foo` → префикс `•` (0x07) + пробел; цвет маркера ярче основного
|
||||
- Нумерованные списки: `1. foo`, `2. foo` → как есть (число оставляем)
|
||||
@@ -138,10 +179,11 @@ State machine: один активный стиль одновременно (б
|
||||
≥ content_col родителя, иначе считается breakout. Нужен мини-stack
|
||||
активных списков при индексации.
|
||||
|
||||
### Phase 5 — Wrap / Unwrap длинных строк
|
||||
### Phase 5 — Wrap / Unwrap длинных строк ✓
|
||||
|
||||
Дефолт: **wrap on**. F2 переключает; в меню-баре подпись отражает действие
|
||||
("Unwrap" когда wrap включён, "Wrap" когда выключен).
|
||||
("Unwrap" когда wrap включён, "Wrap" когда выключен). Во время реиндексации
|
||||
крутится спиннер на title bar.
|
||||
|
||||
**v1 — реализовано:**
|
||||
- Один массив `line_offset[2048]` хранит ВИДИМЫЕ сегменты (а не логические
|
||||
@@ -519,9 +561,10 @@ Cache tags (W2 static): uint16_t cache_tag[100] = 200 bytes
|
||||
|
||||
## Что отложено в v2
|
||||
|
||||
- Файлы >16 KB: многостраничное хранение через `mem_alloc_pages(N)`, ленивая загрузка страниц в W3 при доступе.
|
||||
- ~~Файлы >16 KB~~ — **сделано в v1.5** (до 128 KB через 1–8 EMM-страниц + lazy map в W3).
|
||||
- ~~Word wrap~~ — **сделано** (Phase 5, F2 toggle).
|
||||
- Search (Find / Find next) — F3 / F4.
|
||||
- Toggle highlight on/off — F2.
|
||||
- Word wrap.
|
||||
- Image alt-text rendering.
|
||||
- Tables.
|
||||
- F8 Raw / Render toggle — спецификация в Phase 8.
|
||||
- Links `[text](url)` + image alt — Phase 7.
|
||||
- Tables — Phase 6 (полный layout).
|
||||
- Toggle highlight on/off — частный случай F8 Raw.
|
||||
|
||||
+110
-67
@@ -5,9 +5,35 @@
|
||||
’¥á⮢ ï ªàã¯ ï § ¤ ç - ¯à®¢¥à¨âì èã libc ¥âਢ¨ «ì®¬ interactive-¯à¨«®¦¥¨¨ (¯®«®íªà ë© UI, ä ©«®¢ë© I/O, ¯ àá¥à). � à ««¥«ì® ¤ áâ å®à®è¨© showcase ¯« âä®à¬ë ¨ ¯®¬®¦¥â ¢ëâ é¨âì ¥¤®¤¥«ª¨ ¢ conio/io. Š®¥ç ï æ¥«ì: viewer ¤«ï `.md` ä ©«®¢ á ¯®¤á¢¥âª®© á¨â ªá¨á , ¢¨£ 樥© ¯® ⥪áâã ¨ ¯®áâà ¨çë¬ áªà®««¨£®¬.
|
||||
|
||||
**Ž£à ¨ç¥¨ï v1 (§ 䨪á¨à®¢ ë ¯®«ì§®¢ ⥫¥¬):**
|
||||
- POSIX file API (`open/read/lseek/close`); FILE*/fread/fgets - ¥ ¨á¯®«ì§®¢ âì
|
||||
- Œ ªá¨¬ã¬ 16 KB ®¤¨ ä ©« (®¤ EMM-áâà ¨æ ); ¬®£®áâà ¨çë© à¥¦¨¬ - ¢ v2
|
||||
- �®¤á¢¥âª ç¥à¥§ 梥â: **à §¬¥à § £®«®¢ª ** > 梥â èà¨äâ ; **bold/italic** > 梥â ä® (¬®®è¨à¨ë© ä®â ¡¥§ ¦¨à®£®/ªãàᨢ®£® ç¥àâ ¨ï)
|
||||
- POSIX file API (open/read/lseek/close); FILE pointer / fread / fgets - ¥ ¨á¯®«ì§®¢ âì
|
||||
- �®¤á¢¥âª ç¥à¥§ 梥â: **à §¬¥à § £®«®¢ª ** -> 梥â èà¨äâ ; **bold/italic** -> 梥â ä® (¬®®è¨à¨ë© ä®â ¡¥§ ¦¨à®£®/ªãàᨢ®£® ç¥àâ ¨ï)
|
||||
|
||||
**� áè¨à¥¨ï, ॠ«¨§®¢ ë¥ ¯®á«¥ ¯« :**
|
||||
- ” ©«ë ¤® 128 KB (1-8 EMM-áâà ¨æ, lazy map ¢ W3 ç¥à¥§ `fb()/map_page()`) - ¨§ ç «ì® ¡ë«® ¢ v2
|
||||
- €¨¬¨à®¢ ë© spinner ¨ ¯à¥¤¢ à¨â¥«ì ï ®âà¨á®¢ª UI ¯à¨ áâ à⥠- UX
|
||||
- Inline emphasis: `_`/`*`/`**` ¯®¤ç¨ïîâáï XOR flanking-¯à ¢¨«ã (whitespace ஢® á ®¤®© áâ®à®ë), `COLOR_YELLOW` ¨ `2 * 3` ®áâ îâáï «¨â¥à « ¬¨
|
||||
|
||||
---
|
||||
|
||||
## ’¥ªã騩 áâ âãá (2026-06-05)
|
||||
|
||||
| Phase | ‘â âãá | Š®¬¬¥â ਩ |
|
||||
|---|---|---|
|
||||
| 1 Plain text + nav | | § £à㧪 , ¨¤¥ªá æ¨ï, status/menu, ^V/PgUp/PgDn/Home/End/F1/F10/Esc |
|
||||
| 2 Headers + HR | | H1..H4, `---`/`***`/`___` (á >=3 marker'®¢) |
|
||||
| 3 Inline emphasis | | `**` / `*` / `_` / `` ` ``; XOR flanking (á¬. ¢ëè¥) |
|
||||
| 4 Lists / quote / fenced code | | `- / * / +`, `N. / N)`, `> `, ``` ``` ```; light nested lists |
|
||||
| 4-tables | | â ¡«¨æë ®â«®¦¥ë ¢¬¥á⥠á Phase 6 |
|
||||
| 5 Wrap / Unwrap (F2) | | wrap-by-default; soft wrap; F2 ¯¥à¥ª«îç ¥â; hpan <-/-> ¢ truncate-०¨¬¥ |
|
||||
| 6 �®«ë© layout â ¡«¨æ | | deferred |
|
||||
| 7 Links + search | | deferred |
|
||||
| 8 F8 Raw toggle | | deferred |
|
||||
| Cache ।¥à¥ëå áâப | | ¥ 㦮 ¯® ᪮à®á⨠|
|
||||
|
||||
**UX-¯®¯à ¢ª¨ (®â¤¥«ì® ®â phase-¯« , 2026-06-05):**
|
||||
- UI (menu + title bar) ®âà¨á®¢ë¢ ¥âáï „Ž `load_file`/`index_lines` - ¯®«ì§®¢ ⥫ì áà §ã ¢¨¤¨â ¨â¥à䥩á, ¥ çñàë© íªà
|
||||
- Title bar: `MDVIEW <spinner> <filename>` (3 ¯à®¡¥« ¬¥¦¤ã MDVIEW ¨ filename, slot ᯨ¥à - col 8)
|
||||
- Spinner ªàãâ¨âáï ¢® ¢à¥¬ï `load_file` (¯® áâà ¨æ¥) ¨ `index_lines` (à § ¢ 32 «®£¨ç¥áª¨å áâப¨), ¢ª«îç ï `toggle_wrap`
|
||||
|
||||
---
|
||||
|
||||
@@ -16,11 +42,14 @@
|
||||
### � ᪫ ¤ª íªà (80x32, ⥪áâ mode 0x03)
|
||||
|
||||
```
|
||||
Row 0: ³ mdview.md L 1-30 / 142 21% ³ < status bar (BG=blue, FG=white)
|
||||
Row 1: ³ ³
|
||||
... ³ document viewport (30 rows) ³
|
||||
Row 30: ³ ³
|
||||
Row 31: ³ F1 Help F10 Exit³ < menu bar (BG=blue, FG=cyan)
|
||||
Row 0: MDVIEW ³ mdview.md ³ L 1-30 / 142 ³ 21% <- status bar (BG=blue, FG=white)
|
||||
|
||||
³ ÀÄÄ filename @ col 10
|
||||
ÀÄÄÄÄÄÄÄÄÄÄ spinner slot @ col 8 (anim. while busy)
|
||||
Row 1:
|
||||
... document viewport (30 rows)
|
||||
Row 30:
|
||||
Row 31: F1 Help F2 Wrap F10 Exit <- menu bar (BG=blue, FG=cyan)
|
||||
```
|
||||
|
||||
- Viewport = 30 áâப x 80 á⮫¡æ®¢.
|
||||
@@ -34,15 +63,16 @@ Memory mode: **`small`** - DSS
|
||||
W0 (0x0000-0x3FFF): ESTEX (system, untouchable)
|
||||
W1 (0x4000-0x7FFF): CODE (small mode page 1)
|
||||
W2 (0x8000-0xBFFF): DATA + STACK + HEAP (small mode page 2)
|
||||
W3 (0xC000-0xFFFF): paged window - ¯¥à¥ª«îç ¥âáï ¬¥¦¤ã EMM-áâà ¨æ ¬¨:
|
||||
ÃÄÄ file page: ¨áå®¤ë© â¥ªáâ .md ä ©« (16 KB)
|
||||
ÀÄÄ cache page: ªíè ®âä®à¬ â¨à®¢ ëå áâப (Phase 3+)
|
||||
W3 (0xC000-0xFFFF): paged window - «¥¨¢® ¯¥à¥ª«îç ¥âáï ¬¥¦¤ã EMM-áâà ¨æ ¬¨
|
||||
ä ©« (¤® 8 áâà ¨æ = 128 KB). `cur_page` ªíè¨àã¥â
|
||||
⥪ãéãî mapping, `fb(p)` ¬ ¯¯¨â ã¦ãî áâà ¨æã ¯à¨
|
||||
¯¥à¢®¬ ®¡à 饨¨.
|
||||
```
|
||||
|
||||
�®ç¥¬ã small + W3:
|
||||
- 32 KB ª®¤+¤ ë¥ á ¡®«ì訬 § ¯ ᮬ > ¥â ¡ ª¨£
|
||||
- 32 KB ª®¤+¤ ë¥ á ¡®«ì訬 § ¯ ᮬ -> ¥â ¡ ª¨£
|
||||
- W3 - áâ ¤ àâë© paged window, ¯®¤ ¥£® ã á 㦥 ¥áâì `bank_io_w3` API
|
||||
- v2-à áè¨à¥¨¥ (multi-page ä ©«ë >16 KB): ¯à®áâ® `mem_alloc_pages(N)` ¨ ¯¥à¥ª«î票¥ áâà ¨æ ¢ W3 ç¥à¥§ `sprinter_page_w3()`
|
||||
- ” ©«ë ¤® 128 KB ¯®¤¤¥à¦¨¢ îâáï ⨢®: `mem_alloc_pages(pages_needed)` ¯®¤ ¢¥áì ä ©«; `map_page()` ç¥à¥§ `sprinter_page_w3()`; `fb(p)` - ¥¤¨ ï â®çª ¤®áâ㯠¨§ ¨¤¥ªá â®à ¨ ।¥à .
|
||||
|
||||
‘â ⨪¨ (¢ W2):
|
||||
- `line_offset[MAX_LINES]` - uint16_t ᬥ饨¥ ª ¦¤®© áâப¨ ¢ ä ©«®¢®© áâà ¨æ¥ (4 KB 2048 áâப)
|
||||
@@ -54,9 +84,9 @@ W3 (0xC000-0xFFFF): paged window -
|
||||
### �®â®ª ¤ ëå
|
||||
|
||||
```
|
||||
main > open() > read() chunks 1KB > write to W1 (mapped EMM page) > close()
|
||||
> index_lines() (®¤® ᪠¨à®¢ ¨¥, § ¯®«ï¥â line_offset[])
|
||||
> render_viewport() + main loop { getkey(); handle(); render_status(); render_viewport() }
|
||||
main -> open() -> read() chunks 1KB -> write to W1 (mapped EMM page) -> close()
|
||||
-> index_lines() (®¤® ᪠¨à®¢ ¨¥, § ¯®«ï¥â line_offset[])
|
||||
-> render_viewport() + main loop { getkey(); handle(); render_status(); render_viewport() }
|
||||
```
|
||||
|
||||
**’®ª®áâì á `read()`**: ESTEX READ § ¯¨áë¢ ¥â ¯® dst-㪠§ â¥«î ¢ ¤à¥á®¬ ¯à®áâà á⢥ ¢ë§ë¢ î饣®. �®áª®«ìªã ¬ë ¬ ¯¯¨¬ EMM-áâà ¨æã ¢ W3 (0xC000) „Ž ¢ë§®¢ read(), 㪠§ ⥫ì 0xC000+offset ¢ «¨¤¥. …᫨ ¢ëïá¨âáï çâ® BIOS âண ¥â W3 ¢® ¢à¥¬ï read (£à ä¨ç¥áª¨© ¢¨¤¥®¡ãä¥à ¯® 㬮«ç ¨î ¢ W3 ¯à¨ £à ä¨ç¥áª¨å ०¨¬ å, ® ¢ ⥪á⮢®¬ - ¤®«¦¥ ¡ëâì ᢮¡®¤¥) - fallback: ç¨â âì ¢ 1 KB ¡ãä¥à ¢ W2 ¨ ª®¯¨à®¢ âì ¢ W3 ç¥à¥§ `bank_write_w3()`.
|
||||
@@ -65,14 +95,14 @@ main > open() > read() chunks 1KB > write to W1 (mapped EMM page) > close()
|
||||
|
||||
## �¥ «¨§ æ¨ï - ¯®íâ ¯ ï
|
||||
|
||||
### Phase 1 - Plain text viewer (MVP)
|
||||
### Phase 1 - Plain text viewer (MVP)
|
||||
|
||||
**—â® à ¡®â ¥â:**
|
||||
- ‡ £à㧪 ä ©« (`open/read/close`) ¢ W1-áâà ¨æã
|
||||
- ˆ¤¥ªá æ¨ï áâப (LF / CRLF à §¤¥«¨â¥«¨)
|
||||
- Status bar: ¨¬ï ä ©« , L N-M / Total, ¯à®æ¥â áªà®««¨£
|
||||
- Menu bar: `F1 Help F10 Exit`
|
||||
- � ¢¨£ æ¨ï: ^/v (1 áâப ), PgUp/PgDn (30 áâப), Home/End ( ç «®/ª®¥æ), Esc/F10 (¢ë室), F1 (help screen)
|
||||
- � ¢¨£ æ¨ï: ^/V (1 áâப ), PgUp/PgDn (30 áâப), Home/End ( ç «®/ª®¥æ), Esc/F10 (¢ë室), F1 (help screen)
|
||||
- Ž¡à¥§ª áâப ¤«¨¥¥ 80 ᨬ¢®«®¢ (¡¥§ word-wrap)
|
||||
- –¢¥â : ⥪áâ ¡¥«ë© çñ஬; status/menu - ¡¥«ë© ᨥ¬
|
||||
|
||||
@@ -81,46 +111,57 @@ main > open() > read() chunks 1KB > write to W1 (mapped EMM page) > close()
|
||||
- `examples/mdview/Makefile`
|
||||
- `examples/mdview/SAMPLE.MD` - â¥áâ®¢ë© markdown ä ©«
|
||||
|
||||
### Phase 2 - Headers ¨ £®à¨§®â «ì ï «¨¨ï
|
||||
### Phase 2 - Headers ¨ £®à¨§®â «ì ï «¨¨ï
|
||||
|
||||
**MD ä¨ç¨:**
|
||||
- `# H1` > ïમ-¦ñ«âë© (COLOR_YELLOW = 14) çñ஬
|
||||
- `## H2` > ïમ-£®«ã¡®© (COLOR_LBLUE = 11)
|
||||
- `### H3` > ïમ-§¥«ñë© (COLOR_LGREEN = 10)
|
||||
- `#### H4+` > á¥àë© (COLOR_GREY = 8)
|
||||
- `---` / `***` ®â¤¥«ì®© áâப¥ > «¨¨ï 0xC4 (£®à¨§®â «ì ï à ¬ª ASCII) ¢® ¢áî è¨à¨ã
|
||||
- `# H1` -> ïમ-¦ñ«âë© (COLOR_YELLOW = 14) çñ஬
|
||||
- `## H2` -> ïમ-£®«ã¡®© (COLOR_LBLUE = 11)
|
||||
- `### H3` -> ïમ-§¥«ñë© (COLOR_LGREEN = 10)
|
||||
- `#### H4+` -> á¥àë© (COLOR_GREY = 8)
|
||||
- `---` / `***` ®â¤¥«ì®© áâப¥ -> «¨¨ï 0xC4 (£®à¨§®â «ì ï à ¬ª ASCII) ¢® ¢áî è¨à¨ã
|
||||
|
||||
### Phase 3 - Inline emphasis
|
||||
### Phase 3 - Inline emphasis
|
||||
|
||||
**� àá¥à inline (per-line, runs ¢ ®¤ã áâபã):**
|
||||
- `**bold**` > ATTR_TEXT_BOLD
|
||||
- `*italic*` > ATTR_TEXT_ITALIC
|
||||
- `_underscore_` > ATTR_TEXT_UNDERSORE
|
||||
- `` `code` `` > ATTR_TEXT_CODE
|
||||
- `**bold**` -> ATTR_TEXT_BOLD
|
||||
- `*italic*` -> ATTR_TEXT_ITALIC
|
||||
- `_underscore_` -> ATTR_TEXT_UNDERSORE
|
||||
- `` `code` `` -> ATTR_TEXT_CODE
|
||||
- Œ થàë `**`/`*`/`_`/`` ` `` �… ।¥àïâáï (áꥤ îâáï)
|
||||
|
||||
State machine: ®¤¨ ªâ¨¢ë© áâ¨«ì ®¤®¢à¥¬¥® (¡¥§ ¢«®¦¥®áâ¨); ª®ä«¨ªâãî騩 ¬ àª¥à ¯à¨ ç㦮¬ ªâ¨¢®¬ á⨫¥ ã室¨â «¨â¥à «®¬. ‘®áâ®ï¨¥ á¡à áë¢ ¥âáï ª ¦¤®© áâப¥.
|
||||
State machine: ®¤¨ ªâ¨¢ë© áâ¨«ì ®¤®¢à¥¬¥® (¡¥§ ¢«®¦¥®áâ¨); ª®ä«¨ªâãî騩 ¬ àª¥à ¯à¨ ç㦮¬ ªâ¨¢®¬ á⨫¥ ¢áñ à ¢® ª®áìâáï (zero-width) ¤«ï á¨åந§ 樨 è¨à¨ë á index_lines. ‘®áâ®ï¨¥ á¡à áë¢ ¥âáï ª ¦¤®© áâப¥.
|
||||
|
||||
> **Šíè ®âä®à¬ â¨à®¢ ëå áâப** - ®â«®¦¥ ¢ á ¬ë© ª®¥æ, á¬. "Phase ?: ®¯â¨¬¨§ 樨".
|
||||
**Flanking-¯à ¢¨«® (CommonMark intraword, ॠ«¨§®¢ ® ¯®á«¥ ¨§ ç «ì®£® ¯« ):**
|
||||
- `*` / `**` / `_` áç¨â îâáï markdown-¬ થ஬ ⮫쪮 ¥á«¨ whitespace/EOL
|
||||
஢® á Ž„�މ áâ®à®ë (XOR).
|
||||
- ‘«ãç ¨ "®¡ whitespace" (`2 * 3`, `2 ** 3`) -> «¨â¥à «ë ( à¨ä¬¥â¨ª ).
|
||||
- ‘«ãç ¨ "¨ ®¤®£® whitespace" (`COLOR_YELLOW`, `FILE*/fread`, `foo*bar*baz`)
|
||||
-> «¨â¥à «ë (intraword).
|
||||
- Backtick (`` ` ``) flanking �… âॡã¥â - `` `code` `` à ¡®â ¥â ¡¥§ ¯à®¡¥«®¢.
|
||||
- �à ¢¨«® ¯à¨¬¥¥® ᨬ¬¥âà¨ç® ¢ 4 ¬¥áâ å (`index_lines`, cont-render,
|
||||
®á®¢®© inline-¯ àá¥à, truncation peek), ¨ ç¥ wrap-¨¤¥ªá â®à ¨
|
||||
।¥à à §ê¥¤ãâáï ¯® è¨à¨¥.
|
||||
|
||||
> **Šíè ®âä®à¬ â¨à®¢ ëå áâப** - ®â«®¦¥ ¢ á ¬ë© ª®¥æ, á¬. "Phase : ®¯â¨¬¨§ 樨".
|
||||
> ‘ª®à®á⨠⥪ã饣® ¨¢®£® ।¥à å¢ â ¥â 80x30 = 2400 wrchar / ª ¤à; PgUp/PgDn ¢¨§ã «ì® ¬£®¢¥¥.
|
||||
|
||||
### Phase 4 - Block elements
|
||||
### Phase 4 - Block elements (¡¥§ â ¡«¨æ)
|
||||
|
||||
- Œ ન஢ ë¥ á¯¨áª¨: `- foo`, `* foo`, `+ foo` > ¯à¥ä¨ªá `ù` (0x07) + ¯à®¡¥«; 梥⠬ થà ïàç¥ ®á®¢®£®
|
||||
- �㬥஢ ë¥ á¯¨áª¨: `1. foo`, `2. foo` > ª ª ¥áâì (ç¨á«® ®áâ ¢«ï¥¬)
|
||||
- Blockquote: áâப¨ á `> ` > ¯à¥ä¨ªá `³` (0xB3) á¥à®£® 梥â , ®á⠫쮩 ⥪áâ á«¥£ª ¯à¨£«ãèñë©
|
||||
- Œ ન஢ ë¥ á¯¨áª¨: `- foo`, `* foo`, `+ foo` -> ¯à¥ä¨ªá `o` (0x07) + ¯à®¡¥«; 梥⠬ થà ïàç¥ ®á®¢®£®
|
||||
- �㬥஢ ë¥ á¯¨áª¨: `1. foo`, `2. foo` -> ª ª ¥áâì (ç¨á«® ®áâ ¢«ï¥¬)
|
||||
- Blockquote: áâப¨ á `> ` -> ¯à¥ä¨ªá `³` (0xB3) á¥à®£® 梥â , ®á⠫쮩 ⥪áâ á«¥£ª ¯à¨£«ãèñë©
|
||||
- Fenced code blocks: `` ``` `` ®âªàë¢ ¥â/§ ªàë¢ ¥â ¡«®ª; ¢á¥ áâப¨ ¬¥¦¤ã - bg=á¥àë©, ¬®®è¨à¨® (¡¥§ inline-¯ àᨣ )
|
||||
- Indented code blocks (4+ ¯à®¡¥«®¢): «®£¨ç® fenced, ® ¡¥§ £® ¬ થà
|
||||
|
||||
**Light nested lists (v1 - ॠ«¨§®¢ ®):**
|
||||
- `classify_line()` ¯à®¯ã᪠¥â leading spaces ¯¥à¥¤ ulist/olist/quote ¬ થ஬,
|
||||
¢®§¢à é ¥â `content_off` ¯®á«¥ ¬ થà > `content_off - p_start` = indent + marker
|
||||
¢®§¢à é ¥â `content_off` ¯®á«¥ ¬ થà -> `content_off - p_start` = indent + marker
|
||||
¡¨â ¢ visible col.
|
||||
- `render_line()` à¨áã¥â leading-spaces ¢ `ATTR_TEXT`, ¯®â®¬ ¬ થà ᤢ¨ã⮩
|
||||
¯®§¨æ¨¨ (col = indent). Marker ¢áñ ¥éñ 䨪á¨à®¢ ¯à¨ £®à¨§®â «ì®¬ pan'¥.
|
||||
- HR / header / fence delim ®áâ îâáï áâண® col-0 (CommonMark à §à¥è ¥â ¤® 3
|
||||
¢¥¤ãé¨å ¯à®¡¥«®¢ ¤«ï ¨å - ã¯à®á⨫¨).
|
||||
- Tab-indent > ¥ à ᯮ§ ñâáï ª ª nesting (⮫쪮 spaces).
|
||||
- Tab-indent -> ¥ à ᯮ§ ñâáï ª ª nesting (⮫쪮 spaces).
|
||||
|
||||
**Phase 4-full - ¯®« ï ¯®¤¤¥à¦ª ¢«®¦¥®á⨠(deferred):**
|
||||
- **Tab-indent**: áç¨â âì tab = 4 ¯à®¡¥« ¤«ï ®¯à¥¤¥«¥¨ï ã஢ï.
|
||||
@@ -135,18 +176,19 @@ State machine:
|
||||
¯à¥¤ë¤ã騬 bullet'®¬, ¤®«¦ë áç¨â âìáï ¯à®¤®«¦¥¨¥¬ ⮣® bullet'
|
||||
(¢¨§ã «ì® - ®¡é¨© attr).
|
||||
- **Strict CommonMark indent rules**: ¢«®¦¥ë© ¯ãªâ ¤®«¦¥ ¡ëâì indent
|
||||
? content_col த¨â¥«ï, ¨ ç¥ áç¨â ¥âáï breakout. �㦥 ¬¨¨-stack
|
||||
>= content_col த¨â¥«ï, ¨ ç¥ áç¨â ¥âáï breakout. �㦥 ¬¨¨-stack
|
||||
ªâ¨¢ëå ᯨ᪮¢ ¯à¨ ¨¤¥ªá 樨.
|
||||
|
||||
### Phase 5 - Wrap / Unwrap ¤«¨ëå áâப
|
||||
### Phase 5 - Wrap / Unwrap ¤«¨ëå áâப
|
||||
|
||||
„¥ä®«â: **wrap on**. F2 ¯¥à¥ª«îç ¥â; ¢ ¬¥î-¡ ॠ¯®¤¯¨áì ®âà ¦ ¥â ¤¥©á⢨¥
|
||||
("Unwrap" ª®£¤ wrap ¢ª«îçñ, "Wrap" ª®£¤ ¢ëª«îç¥).
|
||||
("Unwrap" ª®£¤ wrap ¢ª«îçñ, "Wrap" ª®£¤ ¢ëª«îç¥). ‚® ¢à¥¬ï २¤¥ªá 樨
|
||||
ªàãâ¨âáï ᯨ¥à title bar.
|
||||
|
||||
**v1 - ॠ«¨§®¢ ®:**
|
||||
- ޤ¨ ¬ áᨢ `line_offset[2048]` åà ¨â ‚ˆ„ˆŒ›… ᥣ¬¥âë ( ¥ «®£¨ç¥áª¨¥
|
||||
áâப¨); ¡¨âë 0..13 - ¡ ©â®¢®¥ ᬥ饨¥, ¡¨â 15 - CONT-ä« £ continuation.
|
||||
- Wrap-०¨¬: soft wrap ¯®á«¥¤¥¬ ¯à®¡¥«¥ ? 80; hard fallback ¥á«¨
|
||||
- Wrap-०¨¬: soft wrap ¯®á«¥¤¥¬ ¯à®¡¥«¥ <= 80; hard fallback ¥á«¨
|
||||
¯à®¡¥« ¥â.
|
||||
- Œ થàë í¬ä §¨á (`**`/`*`/`_`/`` ` ``) ¨ header-¯à¥ä¨ªáë (`#`/`##`/...) ¥
|
||||
ãç¨âë¢ îâáï ¢ visible-col ¯à¨ ¯®¨áª¥ â®çª¨ ¯¥à¥®á .
|
||||
@@ -171,15 +213,15 @@ State machine:
|
||||
seg (3 ¡¨â ).
|
||||
- Compact way: ¤®¡ ¢¨âì ¯ à ««¥«ìë© ¬ áᨢ `seg_meta[MAX_SEGS]` ¯® 1 ¡ ©âã
|
||||
- ¯ ªã¥â marker_width (4 ¡¨â ) + emph_state (3 ¡¨â ) + base_attr_idx
|
||||
(4 ¡¨â ¨§ â ¡«¨æë > 㦥 2-¡ ©â®¢ë© seg_meta).
|
||||
- **Hpan ¤«ï ¤«¨ëå áâப**: ¥á«¨ wrap ¢ëª«îç¥, ¤®¡ ¢¨âì </> ¤«ï
|
||||
(4 ¡¨â ¨§ â ¡«¨æë -> 㦥 2-¡ ©â®¢ë© seg_meta).
|
||||
- **Hpan ¤«ï ¤«¨ëå áâப**: ¥á«¨ wrap ¢ëª«îç¥, ¤®¡ ¢¨âì <-/-> ¤«ï
|
||||
£®à¨§®â «ì®£® áªà®«« >80 cols. ޡ鍩 ¬¥å ¨§¬ á tables (Phase 6).
|
||||
**�…€‹ˆ‡Ž‚€�Ž** (light) - `viewport_x` + ¯®«ë© re-render ª ¦¤®¥ </>.
|
||||
**�…€‹ˆ‡Ž‚€�Ž** (light) - `viewport_x` + ¯®«ë© re-render ª ¦¤®¥ <-/->.
|
||||
- **“᪮२¥ hpan ç¥à¥§ ESTEX WINCOPY/WINREST** (deferred): ᥩç á pan
|
||||
¤¥« ¥â ¯®«ë© `render_viewport()` = 30 áâப x 80 wrchar. Œ®¦®
|
||||
᪮¯¨à®¢ âì áãé¥áâ¢ãî饥 ᮤ¥à¦¨¬®¥ viewport' N cols ¢«¥¢®/¢¯à ¢®
|
||||
ç¥à¥§ win-copy, ¯®â®¬ ।¥à¨âì ⮫쪮 㧪ãî ¯®«®áã á¯à ¢ /á«¥¢
|
||||
(HPAN_STEP cols x 30 rows ~ 240 wrchar ¢¬¥áâ® 2400). ESTEX SCROLL
|
||||
(HPAN_STEP cols x 30 rows 240 wrchar ¢¬¥áâ® 2400). ESTEX SCROLL
|
||||
£®à¨§®â «ì ¥ ¯®¤¤¥à¦¨¢ ¥â - 㦠¨¬¥® WINCOPY-®¯¥à æ¨ï ¨«¨
|
||||
rdchar/wrchar loop. €ªâ¨¢¨à®¢ âì ª®£¤ ®éãâ¨âáï â®à¬®§; ᥩç á
|
||||
⨯®¢®¬ markdown'¥ ¥ § ¬¥â®.
|
||||
@@ -187,13 +229,13 @@ State machine:
|
||||
**v2 - ®â¤¥«ì ï ä¨ç , ¬¨¬® wrap:**
|
||||
- Toggle ¯®¤á¢¥âª¨ 楫¨ª®¬ (F3?)
|
||||
- Search ¯® ⥪áâã (Ctrl+F / F4)
|
||||
- Links `[text](url)` > ᨨ© ¯®¤çñàªãâë© text, url ¯àïç¥âáï
|
||||
- Images `` > `[IMG: alt]`
|
||||
- Links `[text](url)` -> ᨨ© ¯®¤çñàªãâë© text, url ¯àïç¥âáï
|
||||
- Images `` -> `[IMG: alt]`
|
||||
|
||||
### Phase 7 - Links ¨ ¯®¨áª (post-v1)
|
||||
|
||||
- `[text](url)` > ®âà¨á®¢ âì ⮫쪮 `text` á ïમ-ᨨ¬ FG (¢¨§ã «ì® ¯®¤çñàªã⮥)
|
||||
- `` > `[IMG: alt]` ¢ ᪮¡ª å
|
||||
- `[text](url)` -> ®âà¨á®¢ âì ⮫쪮 `text` á ïમ-ᨨ¬ FG (¢¨§ã «ì® ¯®¤çñàªã⮥)
|
||||
- `` -> `[IMG: alt]` ¢ ᪮¡ª å
|
||||
- Search ¯® ⥪áâã (F3 / Ctrl+F): ¨ªà¥¬¥â «ìë©, ¯®¤á¢¥âª ᮢ¯ ¤¥¨©
|
||||
|
||||
### Phase 8 - F8 Raw / Render toggle
|
||||
@@ -223,7 +265,7 @@ State machine:
|
||||
|
||||
**Œ¨¨¬ «ì ï ॠ«¨§ æ¨ï:**
|
||||
- ޤ¨ ®¢ë© static `uint8_t render_mode = 1;`
|
||||
- ‚ `render_line()`: á ¬®¬ ¢¥àåã `if (!render_mode) { ? raw render ? return; }`
|
||||
- ‚ `render_line()`: á ¬®¬ ¢¥àåã `if (!render_mode) { ... raw render ... return; }`
|
||||
- ‚ `render_menu()`: ¤®¡ ¢¨âì ïà«ëª F8 à冷¬ á F2.
|
||||
- ‚ £« ¢®¬ 横«¥: `case KEY_F8: toggle_render(); break;`
|
||||
- `toggle_render()` ®â«¨ç ¥âáï ®â `toggle_wrap()` ⥬, çâ® �… ¯¥à¥áâà ¨¢ ¥â
|
||||
@@ -394,7 +436,7 @@ int main(int argc, char **argv) {
|
||||
uint8_t ascii = k & 0xFF;
|
||||
uint8_t scan = (k >> 8) & 0x7F; // strip mod bit
|
||||
if (ascii) {
|
||||
if (ascii == 0x1B) break; // Esc > exit
|
||||
if (ascii == 0x1B) break; // Esc -> exit
|
||||
continue;
|
||||
}
|
||||
switch (scan) {
|
||||
@@ -424,11 +466,11 @@ exit:
|
||||
### Phase 1
|
||||
1. �®¤£®â®¢¨âì `SAMPLE.MD` ~5 KB (§ £®«®¢ª¨, ¡§ æë, ᯨ᪨) - ।¥à¨âìáï ¡ã¤¥â plain.
|
||||
2. `cd examples/mdview && make`
|
||||
3. `python make_disk.py mdview.exe SAMPLE.MD > mc.img && ./run_mame.sh`
|
||||
3. `python make_disk.py mdview.exe SAMPLE.MD -> mc.img && ./run_mame.sh`
|
||||
4. �஢¥à¨âì:
|
||||
- Status bar ¯®ª §ë¢ ¥â `SAMPLE.MD L 1-30 / N X%`
|
||||
- Menu bar ¢¨§ã
|
||||
- ^/v: 1 áâப
|
||||
- ^/V: 1 áâப
|
||||
- PgUp/PgDn: 30 áâப, ª®à४⮥ clamp £à ¨æ å
|
||||
- Home: top_line=0
|
||||
- End: top_line = total_lines - VIEW_H
|
||||
@@ -447,7 +489,7 @@ exit:
|
||||
## �¥è¥¨ï ¯® ¥®¤®§ ç®áâï¬
|
||||
|
||||
1. **Word-wrap vs truncate**: v1 = truncate (¯à®áâ®). v2 - F2 toggle wrap.
|
||||
2. **ƒ®à¨§®â «ìë© áªà®««¨£**: v1 - ¥â; v2 - `</>` ᤢ¨£ viewport ¯® á⮫¡æ ¬.
|
||||
2. **ƒ®à¨§®â «ìë© áªà®««¨£**: v1 - ¥â; v2 - `<-/->` ᤢ¨£ viewport ¯® á⮫¡æ ¬.
|
||||
3. **Tab handling**: ¯à¥®¡à §®¢ ¨¥ ¯à¨ ।¥à¥, **tabstop = 4** (áâ ¤ àâ MD). Žà¨£¨ « ¢ W3 ¥ âண ¥¬.
|
||||
4. **UTF-8**: ।¥à¨¬ ¡ ©âë ª ª ¥áâì. …᫨ ä ©« ¢ CP866 - ®âà¨áã¥âáï ª¨à¨««¨æ¥© ç¥à¥§ á¨áâ¥¬ë© ä®â. UTF-8 - ¯®ª ¥ ¯®¤¤¥à¦¨¢ ¥¬ (¢¨§ã «ì® ¡ã¤¥â ª è ¥-ASCII ᨬ¢®« å; ¤¥â¥ªâ ¨ ¯à¥¤ã¯à¥¦¤¥¨¥ - ¢ v2).
|
||||
|
||||
@@ -466,13 +508,13 @@ exit:
|
||||
¯¥à¥¯¨á âì áâப¨ ¢ FILE_BUF â ª, çâ®¡ë ¢á¥ ï祩ª¨ ®¤®© ª®«®ª¨ ¨¬¥«¨
|
||||
®¤¨ ª®¢ãî è¨à¨ã; ¤®¡ ¢¨âì top/bottom à ¬ª¨ (`ÚÄÂÄ¿` / `ÀÄÁÄÙ`) ª ª
|
||||
á¨â¥â¨ç¥áª¨¥ áâப¨. �â® ¯®§¢®«¨â á®åà ¨âì 1:1 ᮮ⢥âá⢨¥ "«®£¨ç¥áª ï
|
||||
áâப > ®¤ viewport row" ¡¥§ á¯¥æ¨ «ì®© «®£¨ª¨ ¯à¨ ।¥à¥.
|
||||
áâப -> ®¤ viewport row" ¡¥§ á¯¥æ¨ «ì®© «®£¨ª¨ ¯à¨ ।¥à¥.
|
||||
- **� ¬ïâì**: re-emit ¬®¦¥â “‚…‹ˆ—ˆ’œ ä ©« § áçñâ padding ¨ ¤®¯.à ¬®ª.
|
||||
…᫨ ¡ãä¥à ¡«¨§®ª ª 16KB - ®â१ âì â ¡«¨æã ¨ ¯®¬¥â¨âì ¥ñ overflow'®¬.
|
||||
- **ƒ®à¨§®â «ìë© áªà®««¨£**: ¥á«¨ ¨â®£®¢ ï è¨à¨ â ¡«¨æë (¨«¨ «î¡®©
|
||||
áâப¨) > SCREEN_W = 80 - ¤®¡ ¢¨âì </> ¤«ï horizontal pan. �â® ¡ã¤¥â
|
||||
áâப¨) > SCREEN_W = 80 - ¤®¡ ¢¨âì <-/-> ¤«ï horizontal pan. �â® ¡ã¤¥â
|
||||
®¡é¨© ¬¥å ¨§¬ ¤«ï ¤«¨ëå áâப (á¬. â ª¦¥ wrap mode), ¥ ⮫쪮 â ¡«¨æ.
|
||||
- **‚ëà ¢¨¢ ¨¥ ¨§ separator-row**: `:-` > left, `-:` > right, `:-:` >
|
||||
- **‚ëà ¢¨¢ ¨¥ ¨§ separator-row**: `:-` -> left, `-:` -> right, `:-:` ->
|
||||
center; ãç¨âë¢ âì ¯à¨ padding'¥ ᮤ¥à¦¨¬®£® ï祩ª¨.
|
||||
- **˜ £¨ ॠ«¨§ 樨**:
|
||||
1. Walking pass ¯® ä¥á ¬/â ¡«¨æ ¬ ¯àאַ ¢ `index_lines()` - ᮡà âì
|
||||
@@ -485,12 +527,12 @@ exit:
|
||||
"è¨à®ª¨© ०¨¬" ⮫쪮 ¢ãâਠ⠡«¨æ.
|
||||
|
||||
> �¥ ¡«®ª¨àãîé ï ä¨ç . ‡ ¯ã᪠âì ª®£¤ á⠥⠯®ï⥠⨯®¢®© ¨áâ®ç¨ª
|
||||
> markdown-ä ©«®¢ (㧪¨¥ ç¨â «ª¨ > ¤®áâ â®ç® ⥪ã饣® ¤¥ª®à â®à ;
|
||||
> è¨à®ª¨¥ README á ¡®«ì訬¨ â ¡«¨æ ¬¨ > 㦥 ¯®«ë© layout).
|
||||
> markdown-ä ©«®¢ (㧪¨¥ ç¨â «ª¨ -> ¤®áâ â®ç® ⥪ã饣® ¤¥ª®à â®à ;
|
||||
> è¨à®ª¨¥ README á ¡®«ì訬¨ â ¡«¨æ ¬¨ -> 㦥 ¯®«ë© layout).
|
||||
|
||||
---
|
||||
|
||||
### Phase ? - Šíè ।¥à¥ëå áâப (low priority)
|
||||
### Phase - Šíè ।¥à¥ëå áâப (low priority)
|
||||
|
||||
Žâ«®¦¥®: ⥪ãé ï ᪮à®áâì ¡®«¥¥ 祬 ¤®áâ â®ç . €ªâ¨¢¨à®¢ âì ¥á«¨ ¯®ï¢¨âáï
|
||||
áæ¥ ਩, £¤¥ ¢¨¤ § ¤¥à¦ª PgUp/PgDn ( ¯à¨¬¥à, ¯à¨ âï¦ñ«®¬ inline-¯ àá¥à¥
|
||||
@@ -508,9 +550,9 @@ Cache tags (W2 static): uint16_t cache_tag[100] = 200 bytes
|
||||
cache_tag[i] = line_id, ¨«¨ 0xFFFF = invalid
|
||||
```
|
||||
|
||||
‘âà ⥣¨ï - **direct map (no LRU)**: `slot = line_id % 100`. Š®««¨§¨ï > ¢ëâ¥á¥¨¥.
|
||||
‘âà ⥣¨ï - **direct map (no LRU)**: `slot = line_id % 100`. Š®««¨§¨ï -> ¢ëâ¥á¥¨¥.
|
||||
|
||||
**Batched viewport render**: 2 page-swap' ‚…‘œ viewport (cache > file > cache),
|
||||
**Batched viewport render**: 2 page-swap' ‚…‘œ viewport (cache -> file -> cache),
|
||||
¥ 60 ª ª ¯à¨ ¨¢®© ॠ«¨§ 樨.
|
||||
|
||||
�ਠᡮથ: `cache_blk = mem_alloc_pages(1)` ¯®á«¥ `file_blk`; `mem_free_block` exit.
|
||||
@@ -519,9 +561,10 @@ Cache tags (W2 static): uint16_t cache_tag[100] = 200 bytes
|
||||
|
||||
## —â® ®â«®¦¥® ¢ v2
|
||||
|
||||
- ” ©«ë >16 KB: ¬®£®áâà ¨ç®¥ åà ¥¨¥ ç¥à¥§ `mem_alloc_pages(N)`, «¥¨¢ ï § £à㧪 áâà ¨æ ¢ W3 ¯à¨ ¤®áâ㯥.
|
||||
- ~~” ©«ë >16 KB~~ - **ᤥ« ® ¢ v1.5** (¤® 128 KB ç¥à¥§ 1-8 EMM-áâà ¨æ + lazy map ¢ W3).
|
||||
- ~~Word wrap~~ - **ᤥ« ®** (Phase 5, F2 toggle).
|
||||
- Search (Find / Find next) - F3 / F4.
|
||||
- Toggle highlight on/off - F2.
|
||||
- Word wrap.
|
||||
- Image alt-text rendering.
|
||||
- Tables.
|
||||
- F8 Raw / Render toggle - ᯥæ¨ä¨ª æ¨ï ¢ Phase 8.
|
||||
- Links `[text](url)` + image alt - Phase 7.
|
||||
- Tables - Phase 6 (¯®«ë© layout).
|
||||
- Toggle highlight on/off - ç áâë© á«ãç © F8 Raw.
|
||||
|
||||
+3
-163
@@ -1,165 +1,5 @@
|
||||
# MDVIEW Sample Document
|
||||
MDVIEW Sample Document
|
||||
|
||||
This is a sample Markdown file for testing the Sprinter `mdview` text
|
||||
viewer. Phase 3 adds inline emphasis: **bold**, *italic* and _underscore_
|
||||
This is a sample Markdown file for testing the Sprinter *mdview text
|
||||
viewer*. Phase 3 adds inline emphasis: bold, italic and underscore
|
||||
runs render with distinct background colours.
|
||||
|
||||
---
|
||||
|
||||
## Section: Inline emphasis
|
||||
|
||||
Plain words mixed with **bold words**, *italic words*, _underscore
|
||||
words_ and `code words` to verify all four styles render with their
|
||||
own colours.
|
||||
|
||||
A single **bold** stretch, then a single *italic* stretch, then a single
|
||||
_underscore_ stretch, then a single `code` stretch, all on the same line.
|
||||
|
||||
A *long italic run that spans multiple words and several columns before
|
||||
it closes here* and continues plain.
|
||||
|
||||
Inline code with punctuation: call `printf("%d\n", x)` then check the
|
||||
result; or use `argv[0]` to grab the program name.
|
||||
|
||||
Unclosed emphasis (open **bold left dangling) — should auto-close at the
|
||||
end of the line so the next line starts clean.
|
||||
|
||||
Conflict cases: **bold with a stray * inside** stays bold, and *italic
|
||||
with a stray _ inside* stays italic, and `code with **bold** inside`
|
||||
stays code.
|
||||
|
||||
## Section: Lorem ipsum
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
|
||||
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
|
||||
commodo consequat.
|
||||
|
||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
|
||||
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
## Section: Lists
|
||||
|
||||
Unordered (dash):
|
||||
|
||||
- alpha
|
||||
- bravo
|
||||
- charlie
|
||||
|
||||
Unordered (asterisk):
|
||||
|
||||
* delta
|
||||
* echo
|
||||
|
||||
Unordered (plus):
|
||||
|
||||
+ foxtrot
|
||||
+ golf
|
||||
|
||||
Numbered list (digits + period highlighted):
|
||||
|
||||
1. first
|
||||
2. second
|
||||
3. third
|
||||
10. tenth — verifies multi-digit numbering
|
||||
99. ninety-ninth
|
||||
|
||||
Numbered with parens:
|
||||
|
||||
1) parenthesised one
|
||||
2) parenthesised two
|
||||
|
||||
Nested lists (light v1 — leading spaces enable detection at non-zero col;
|
||||
no hanging indent in wrap continuation yet):
|
||||
|
||||
- top level alpha
|
||||
- nested level 1 bravo
|
||||
- nested level 1 charlie
|
||||
- nested level 2 delta
|
||||
- nested level 2 echo
|
||||
- nested level 3 foxtrot
|
||||
- nested level 1 golf
|
||||
- top level hotel
|
||||
|
||||
Mixed nested:
|
||||
|
||||
1. first top
|
||||
1. nested numeric
|
||||
2. nested numeric
|
||||
- mixed bullet under numeric
|
||||
- another bullet
|
||||
3. nested numeric
|
||||
2. second top
|
||||
|
||||
## Section: Blockquote
|
||||
|
||||
> Single-line blockquote.
|
||||
|
||||
> Multi-line blockquote starts here.
|
||||
> Each line keeps the > prefix highlighted
|
||||
> while the body stays plain text.
|
||||
|
||||
## Section: Code
|
||||
|
||||
Inline code: `printf("hello")`.
|
||||
|
||||
Fenced block (lines inside should render with code attribute on the
|
||||
full row, no inline parsing — note the **stars** and *italics* below
|
||||
remain literal):
|
||||
|
||||
```c
|
||||
int main(void) {
|
||||
/* **not bold**, *not italic*, `not nested` */
|
||||
return 42;
|
||||
}
|
||||
```
|
||||
|
||||
After the block, normal **bold** parsing resumes.
|
||||
|
||||
## Section: Long line truncation
|
||||
|
||||
This line is intentionally long to verify that the viewer truncates at 80 columns instead of wrapping or scrolling horizontally. Anything past the 80th visible column should simply not appear on screen.
|
||||
|
||||
## Section: Tabs
|
||||
|
||||
Indented with tabs:
|
||||
|
||||
tab-indent level 1
|
||||
tab-indent level 2
|
||||
tab-indent level 3
|
||||
|
||||
## Section: Blockquote
|
||||
|
||||
> Markdown blockquotes start with a greater-than sign at column zero.
|
||||
> Multiple lines look like this.
|
||||
|
||||
### Subsection: deeper heading (H3)
|
||||
|
||||
The line above is an H3 — it should render in a colour distinct from
|
||||
H1 and H2.
|
||||
|
||||
#### Subsubsection: H4 and below
|
||||
|
||||
H4 (and the rarely-seen H5/H6) all share the H4 colour slot.
|
||||
|
||||
***
|
||||
|
||||
## Section: Filler
|
||||
|
||||
The remaining content exists to make the document scroll past one viewport.
|
||||
|
||||
Line 50 ........... approx.
|
||||
Line 51 ........... .
|
||||
Line 52 ........... ..
|
||||
Line 53 ........... ...
|
||||
Line 54 ........... ....
|
||||
Line 55 ........... .....
|
||||
Line 56 ........... ......
|
||||
Line 57 ........... .......
|
||||
Line 58 ........... ........
|
||||
Line 59 ........... .........
|
||||
Line 60 ........... ..........
|
||||
|
||||
End-of-document marker. If you can see this line you can use Home / End
|
||||
to bounce between the start and finish of the file.
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
# MDVIEW Sample Document
|
||||
|
||||
This is a sample Markdown file for testing the Sprinter `mdview` text
|
||||
viewer. Phase 3 adds inline emphasis: **bold**, *italic* and _underscore_
|
||||
runs render with distinct background colours.
|
||||
|
||||
---
|
||||
|
||||
## Section: Inline emphasis
|
||||
|
||||
Plain words mixed with **bold words**, *italic words*, _underscore
|
||||
words_ and `code words` to verify all four styles render with their
|
||||
own colours.
|
||||
|
||||
A single **bold** stretch, then a single *italic* stretch, then a single
|
||||
_underscore_ stretch, then a single `code` stretch, all on the same line.
|
||||
|
||||
A *long italic run that spans multiple words and several columns before
|
||||
it closes here* and continues plain.
|
||||
|
||||
Inline code with punctuation: call `printf("%d\n", x)` then check the
|
||||
result; or use `argv[0]` to grab the program name.
|
||||
|
||||
Unclosed emphasis (open **bold left dangling) — should auto-close at the
|
||||
end of the line so the next line starts clean.
|
||||
|
||||
Conflict cases: **bold with a stray * inside** stays bold, and *italic
|
||||
with a stray _ inside* stays italic, and `code with **bold** inside`
|
||||
stays code.
|
||||
|
||||
## Section: Lorem ipsum
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod
|
||||
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
|
||||
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
|
||||
commodo consequat.
|
||||
|
||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
|
||||
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
|
||||
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
## Section: Lists
|
||||
|
||||
Unordered (dash):
|
||||
|
||||
- alpha
|
||||
- bravo
|
||||
- charlie
|
||||
|
||||
Unordered (asterisk):
|
||||
|
||||
* delta
|
||||
* echo
|
||||
|
||||
Unordered (plus):
|
||||
|
||||
+ foxtrot
|
||||
+ golf
|
||||
|
||||
Numbered list (digits + period highlighted):
|
||||
|
||||
1. first
|
||||
2. second
|
||||
3. third
|
||||
10. tenth — verifies multi-digit numbering
|
||||
99. ninety-ninth
|
||||
|
||||
Numbered with parens:
|
||||
|
||||
1) parenthesised one
|
||||
2) parenthesised two
|
||||
|
||||
Nested lists (light v1 — leading spaces enable detection at non-zero col;
|
||||
no hanging indent in wrap continuation yet):
|
||||
|
||||
- top level alpha
|
||||
- nested level 1 bravo
|
||||
- nested level 1 charlie
|
||||
- nested level 2 delta
|
||||
- nested level 2 echo
|
||||
- nested level 3 foxtrot
|
||||
- nested level 1 golf
|
||||
- top level hotel
|
||||
|
||||
Mixed nested:
|
||||
|
||||
1. first top
|
||||
1. nested numeric
|
||||
2. nested numeric
|
||||
- mixed bullet under numeric
|
||||
- another bullet
|
||||
3. nested numeric
|
||||
2. second top
|
||||
|
||||
## Section: Blockquote
|
||||
|
||||
> Single-line blockquote.
|
||||
|
||||
> Multi-line blockquote starts here.
|
||||
> Each line keeps the > prefix highlighted
|
||||
> while the body stays plain text.
|
||||
|
||||
## Section: Code
|
||||
|
||||
Inline code: `printf("hello")`.
|
||||
|
||||
Fenced block (lines inside should render with code attribute on the
|
||||
full row, no inline parsing — note the **stars** and *italics* below
|
||||
remain literal):
|
||||
|
||||
```c
|
||||
int main(void) {
|
||||
/* **not bold**, *not italic*, `not nested` */
|
||||
return 42;
|
||||
}
|
||||
```
|
||||
|
||||
After the block, normal **bold** parsing resumes.
|
||||
|
||||
## Section: Long line truncation
|
||||
|
||||
This line is intentionally long to verify that the viewer truncates at 80 columns instead of wrapping or scrolling horizontally. Anything past the 80th visible column should simply not appear on screen.
|
||||
|
||||
## Section: Tabs
|
||||
|
||||
Indented with tabs:
|
||||
|
||||
tab-indent level 1
|
||||
tab-indent level 2
|
||||
tab-indent level 3
|
||||
|
||||
## Section: Blockquote
|
||||
|
||||
> Markdown blockquotes start with a greater-than sign at column zero.
|
||||
> Multiple lines look like this.
|
||||
|
||||
### Subsection: deeper heading (H3)
|
||||
|
||||
The line above is an H3 — it should render in a colour distinct from
|
||||
H1 and H2.
|
||||
|
||||
#### Subsubsection: H4 and below
|
||||
|
||||
H4 (and the rarely-seen H5/H6) all share the H4 colour slot.
|
||||
|
||||
***
|
||||
|
||||
## Section: Filler
|
||||
|
||||
The remaining content exists to make the document scroll past one viewport.
|
||||
|
||||
Line 50 ........... approx.
|
||||
Line 51 ........... .
|
||||
Line 52 ........... ..
|
||||
Line 53 ........... ...
|
||||
Line 54 ........... ....
|
||||
Line 55 ........... .....
|
||||
Line 56 ........... ......
|
||||
Line 57 ........... .......
|
||||
Line 58 ........... ........
|
||||
Line 59 ........... .........
|
||||
Line 60 ........... ..........
|
||||
|
||||
End-of-document marker. If you can see this line you can use Home / End
|
||||
to bounce between the start and finish of the file.
|
||||
+495
-180
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user