ChangeLog:
- big commit.
This commit is contained in:
+112
-2
@@ -87,6 +87,20 @@ static const uint8_t md_pallete[16 * 4] = {
|
||||
#define ATTR_MENU_T COLOR(COLOR_BLACK, COLOR_LIGHTCYAN)
|
||||
#define ATTR_MENU_K COLOR(COLOR_YELLOW, COLOR_BLACK)
|
||||
|
||||
/* ---- Атрибуты диалога справки ------------------------------------ */
|
||||
|
||||
#define ATTR_HELP_BG COLOR(COLOR_LIGHTGRAY, COLOR_BLACK)
|
||||
#define ATTR_HELP_BDR COLOR(COLOR_WHITE, COLOR_BLACK)
|
||||
#define ATTR_HELP_TIT COLOR(COLOR_YELLOW, COLOR_BLACK)
|
||||
#define ATTR_HELP_HDR COLOR(COLOR_WHITE, COLOR_BLACK)
|
||||
#define ATTR_HELP_HINT COLOR(COLOR_YELLOW, COLOR_BLACK)
|
||||
|
||||
/* Геометрия диалога справки (в символьных координатах 80×32). */
|
||||
#define HELP_X 8u /* левая граница рамки */
|
||||
#define HELP_Y 4u /* верхняя граница рамки */
|
||||
#define HELP_W 64u /* ширина рамки (включая │) */
|
||||
#define HELP_H 22u /* высота рамки (включая ─) */
|
||||
|
||||
/* ---- Глобальное состояние ---------------------------------------- */
|
||||
|
||||
/* Файл до 128 КБ хранится в наборе EMM-страниц (до 8 шт. по 16 КБ).
|
||||
@@ -1662,6 +1676,86 @@ static void die(const char *msg)
|
||||
(void)getkey();
|
||||
}
|
||||
|
||||
/* ==================================================================
|
||||
* Диалог справки (F1)
|
||||
* ================================================================== */
|
||||
|
||||
/* Заполняет одну внутреннюю строку диалога (r=0 — первая строка за рамкой).
|
||||
* Строка s в кодировке CP866; остаток до края дополняется пробелами. */
|
||||
static void help_line(uint8_t r, const char *s, uint8_t attr)
|
||||
{
|
||||
uint8_t x = HELP_X + 1u;
|
||||
uint8_t y = HELP_Y + 1u + r;
|
||||
uint8_t i = 0;
|
||||
while (s[i] && i < HELP_W - 2u) {
|
||||
wrchar((uint8_t)(x + i), y, s[i], attr);
|
||||
i++;
|
||||
}
|
||||
while (i < HELP_W - 2u) {
|
||||
wrchar((uint8_t)(x + i), y, ' ', ATTR_HELP_BG);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void show_help(void)
|
||||
{
|
||||
/* " Помощь " в CP866 (8 байт) */
|
||||
static const char title[] = " \x8F\xAE\xAC\xAE\xE9\xEC ";
|
||||
uint8_t tlen = 8u;
|
||||
uint8_t lft = (uint8_t)((HELP_W - 2u - tlen) / 2u); /* = 27 */
|
||||
uint8_t rgt = (uint8_t)(HELP_W - 2u - tlen - lft);
|
||||
uint8_t cx, i;
|
||||
|
||||
/* Верхняя граница рамки с заголовком по центру */
|
||||
wrchar(HELP_X, HELP_Y, 0xDA, ATTR_HELP_BDR); /* ┌ */
|
||||
cx = HELP_X + 1u;
|
||||
for (i = 0; i < lft; i++, cx++) wrchar(cx, HELP_Y, 0xC4, ATTR_HELP_BDR);
|
||||
for (i = 0; i < tlen; i++, cx++) wrchar(cx, HELP_Y, title[i], ATTR_HELP_TIT);
|
||||
for (i = 0; i < rgt; i++, cx++) wrchar(cx, HELP_Y, 0xC4, ATTR_HELP_BDR);
|
||||
wrchar(HELP_X + HELP_W - 1u, HELP_Y, 0xBF, ATTR_HELP_BDR); /* ┐ */
|
||||
|
||||
/* Боковые границы (левый и правый │ для каждой строки тела) */
|
||||
for (uint8_t r = 1u; r < HELP_H - 1u; r++) {
|
||||
wrchar(HELP_X, HELP_Y + r, 0xB3, ATTR_HELP_BDR); /* │ */
|
||||
wrchar(HELP_X + HELP_W - 1u, HELP_Y + r, 0xB3, ATTR_HELP_BDR); /* │ */
|
||||
}
|
||||
|
||||
/* Нижняя граница рамки */
|
||||
wrchar(HELP_X, HELP_Y + HELP_H - 1u, 0xC0, ATTR_HELP_BDR); /* └ */
|
||||
for (i = 1u; i < HELP_W - 1u; i++)
|
||||
wrchar(HELP_X + i, HELP_Y + HELP_H - 1u, 0xC4, ATTR_HELP_BDR);
|
||||
wrchar(HELP_X + HELP_W - 1u, HELP_Y + HELP_H - 1u, 0xD9, ATTR_HELP_BDR); /* ┘ */
|
||||
|
||||
/* Содержимое (20 внутренних строк) */
|
||||
uint8_t r = 0;
|
||||
help_line(r++, "", ATTR_HELP_BG);
|
||||
help_line(r++, " MDView v0.2 -- Markdown Viewer for Sprinter", ATTR_HELP_HDR);
|
||||
help_line(r++, " (c) 2026 Petrov A.G.", ATTR_HELP_BG);
|
||||
help_line(r++, "", ATTR_HELP_BG);
|
||||
help_line(r++, " Navigation:", ATTR_HELP_HDR);
|
||||
help_line(r++, " \x18 \x19 Scroll one line up / down", ATTR_HELP_BG);
|
||||
help_line(r++, " PgUp PgDn Scroll one page up / down", ATTR_HELP_BG);
|
||||
help_line(r++, " Home End Jump to beginning / end of document", ATTR_HELP_BG);
|
||||
help_line(r++, " \x1B \x1A Horizontal pan (code blocks/tables)", ATTR_HELP_BG);
|
||||
help_line(r++, " Esc F10 Exit", ATTR_HELP_BG);
|
||||
help_line(r++, "", ATTR_HELP_BG);
|
||||
help_line(r++, " Markdown elements:", ATTR_HELP_HDR);
|
||||
help_line(r++, " # ## ### Headings H1-H6", ATTR_HELP_BG);
|
||||
help_line(r++, " **bold** *italic* `code` ~~strike~~", ATTR_HELP_BG);
|
||||
help_line(r++, " > quote ``` ... ``` Fenced code block", ATTR_HELP_BG);
|
||||
help_line(r++, " - * + item 1. 2. Ordered list", ATTR_HELP_BG);
|
||||
help_line(r++, " |----|----| Tables", ATTR_HELP_BG);
|
||||
help_line(r++, "", ATTR_HELP_BG);
|
||||
help_line(r++, " File size: up to 128 KB (EMM). Lines: up to 16384.", ATTR_HELP_BG);
|
||||
help_line(r++, "", ATTR_HELP_BG);
|
||||
|
||||
(void)getkey();
|
||||
|
||||
render_full_status();
|
||||
render_viewport();
|
||||
render_menu();
|
||||
}
|
||||
|
||||
/* ==================================================================
|
||||
* Точка входа
|
||||
* ================================================================== */
|
||||
@@ -1669,8 +1763,23 @@ static void die(const char *msg)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *path;
|
||||
if (argc >= 2) path = argv[1];
|
||||
else path = "SAMPLE.MD";
|
||||
if (argc >= 2) {
|
||||
path = argv[1];
|
||||
} else {
|
||||
path = "README.MD";
|
||||
/* Дефолтный файл отсутствует — выводим подсказку без смены режима экрана. */
|
||||
{
|
||||
int chk = open(path, O_RDONLY);
|
||||
if (chk < 0) {
|
||||
cputs("MDView v0.2 -- Markdown Viewer for Sprinter\r\n");
|
||||
cputs("(c) 2026 Petrov A.G.\r\n\r\n");
|
||||
cputs("Usage: mdview <file.md>\r\n");
|
||||
cputs(" Displays a Markdown document (CP866, up to 128 KB).\r\n");
|
||||
return 1;
|
||||
}
|
||||
close(chk);
|
||||
}
|
||||
}
|
||||
|
||||
/* Копируем путь в static filename[] для отображения в статус-баре. */
|
||||
{
|
||||
@@ -1730,6 +1839,7 @@ int main(int argc, char **argv)
|
||||
continue;
|
||||
}
|
||||
switch (scan) {
|
||||
case KEY_F1: show_help(); break;
|
||||
case KEY_F10: goto exit_loop;
|
||||
case KEY_UP: scroll_up(1); break;
|
||||
case KEY_DOWN: scroll_down(1); break;
|
||||
|
||||
Reference in New Issue
Block a user