feat(reader): M27 书架按目录分组(ui.shelf_group=folder|format,默认 format 不变)

- 新增 shelf_model.c/.h:扫描/行序列从 shelf.c 拆出(纯 C,宿主可测);shelf_book 加 group[96](相对 Books/ 的目录路径,根下空串),path 语义/内容完全不变(进度键仍为 rdprog_hash(path))
- folder 模式:目录段头(根下=未分类),未分类置顶、其余按目录名排序;组内沿用最近阅读优先/其次书名;空目录不产生段头
- format 模式逐行保持旧行为;新增 reader.conf ui.shelf_group,缺键默认 format
- 上限 256→2048(SHELF_MAX_ROWS=2N=4096,段头≤书数),超限置可读提示,不再静默截断
- 顶栏加「目录/格式」切换,设置页加「书架分组」;UTF-8 安全截断长中文目录名
- 单测 test/shelf_group_smoke.c(38 断言)+ 计时 test/shelf_scan_bench.c
- build_reader.sh:链 meow_ui.a 解析冒烟 stbi_*;无 qemu 时跳过执行而非失败
This commit is contained in:
AskaEth committed 2026-11-09 21:55:33 +08:00
1 parent db672cbe8f
commit 409fd1edf7
11 files changed
+800 -129

No files matched your search

+2
View File
@@ -5,6 +5,7 @@
*
* 键(本模块常量):
* ui.shelf_layout = list|grid 书架默认布局(shelf.c 读)
* ui.shelf_group = format|folder 书架分段:按格式(默认)或按目录(M27)
* rd.fs = int (14..40) 全局默认字号(无进度书时 reader_open 用)
* rd.ls = int (100..200) 全局默认行距
* rd.bg = auto|black|white|sepia 阅读页底色预设(默认 black;B 定案)
@@ -28,6 +29,7 @@ typedef struct rdconf {
char bg[8]; /* auto|black|white|sepia */
char theme[8]; /* auto|light|dark */
char shelf[8]; /* list|grid */
char shelf_group[10]; /* format|folder(默认 format=旧行为) */
int header; /* 1=阅读页顶条 */
int footer; /* 1=阅读页底条 */
char font[400]; /* 字体路径(空=自动) */