update at 2025-09-22 18:54:59

This commit is contained in:
douboer
2025-09-22 18:54:59 +08:00
parent 81c6f52b69
commit 3d2171e837
9 changed files with 493 additions and 72 deletions

View File

@@ -24,6 +24,11 @@
| Gallery 支持 | 将 `{{<gallery .../>}}{{<load-photoswipe>}}` 转成图片 wikilinks 列表 |
| 预处理 | 在 Markdown 渲染前执行自定义语法转 HTML |
| 易扩展 | 提供独立函数/接口减少耦合,如 `selectGalleryImages``extractWeChatMeta` |
| 默认封面配置 | 无任何图片候选时使用 `defaultCoverPic` (可配置) |
| 前置回退解析 | 若 metadataCache 缺失 frontmatter启用手动行级解析回退 |
| Gallery 块扩展 | 支持 `{{<gallery>}}` 块 + 内部 `figure src|link=` 解析 |
| 行级语法扩展 | `[fig .../]``||r`/`||g`/`||b`/`||y`/`||` 统一由 `applyCustomInlineBlocks` 处理 |
| 调试日志节流 | 输出当前文件路径与默认封面选用日志3 秒内同路径不重复 |
## 3. 术语与定义
- **Wikilink 图片语法**`![[xxx.png]]`
@@ -39,7 +44,9 @@ Raw Markdown
↓ extractWeChatMeta (保留 frontmatter 内容供分析)
↓ 去 frontmatter
↓ transformGalleryShortcodes (gallery → ![[...]] 列表)
↓ transformGalleryBlock (gallery 块/figure → ![[...]] 列表)
↓ marked.parse() (图片扩展 -> LocalImage token
↓ applyCustomInlineBlocks (fig/彩色段落 轻语法 HTML 化)
↓ 生成 HTML + 样式注入
↓ setArticle()
↓ getArticleContent() -> preprocessContent(line regex 替换) -> 最终 HTML
@@ -76,6 +83,8 @@ Raw Markdown
- 回退封面:同时匹配 wikilink + markdown 图片,比较 index 取出现最早的一种。
- 返回:`{ title, author, coverLink, rawImage }`
-`getMetadata()` 融合以补齐空缺字段。
- 若 Obsidian `metadataCache` 返回为空或缺失字段,触发手动 fallback扫描首段 frontmatter 行(不依赖外部 YAML 包),支持 `key: value` 单行形式;空字符串的 cover/image 会被视为未提供。
- 追加默认封面逻辑封面候选链frontmatter cover > 正文首本地图/本地 wikilink/markdown > gallery 生成图 > defaultCoverPic
### 7.3 前置处理(`preprocessContent`
- `[fig .../]``<span>`(题注样式)。
@@ -106,6 +115,44 @@ Raw Markdown
- 若块内未匹配到任何 figure保留原文本。
- 正则:`/{{<gallery>}}([\s\S]*?){{<\/gallery>}}/g` 与内部 `figureRegex = /{{<figure\s+src="([^"]+)"[^>]*>}}/g`
- 输出顺序按出现顺序。
- `figure` 标签支持 `src="..."` 与可选 `link="..."`,当存在 link 时仍按 `src` 的 basename 作为图片候选;后续可利用 link 生成超链接包装。
#### 7.4.2 link 属性与未来 caption 计划
- 当前:`link` 仅被解析但未输出额外结构,保留在后续渲染扩展阶段使用(例如生成 `<a>` 包裹 `<img>`)。
- 规划:`caption` 字段可映射为 wikilink alias 或 `<figcaption>`
### 7.5 行级轻语法扩展 (`applyCustomInlineBlocks`)
- 输入:渲染后 HTML / 或预处理文本段落。
- 规则:
- `[fig 内容 /]``<span class="n2m-fig">内容</span>`(当前实现可能用内联 style后续计划换 class
- `||r 文本` / `||g` / `||b` / `||y` / `|| 文本` → 彩色背景段落 `<p style>...</p>`
- 节点安全:通过转义内部 HTML 以防注入(若未实现需列入风险)。
- 后续:提取公共 class + 主题 CSS。
### 7.6 调试日志与节流
- 目的:调试封面选取与路径解析;避免刷屏。
- 机制记录最近一次输出路径时间戳3 秒内同路径日志抑制。
- 日志包括:当前 markdown 文件绝对路径;默认封面 fallback 触发说明gallery 转换统计(可选)。
### 7.7 配置项外化 (Settings 更新)
- 新增:`galleryPrePath`, `galleryNumPic`, `defaultCoverPic`
- 位置:`NMPSettings` + `SettingTab` UI 输入框。
- 迁移:移除硬编码常量 `GALLERY_PRE_PATH` / `GALLERY_NUM_PIC`
- 默认值:`defaultCoverPic = 'cover.png'`(可为相对/绝对/网络 URL 或 wikilink 形式)。
- 风险:用户提供的默认封面不存在 → 目前不校验,可后续增加存在性检查与 Notice。
### 7.8 封面候选决策链(更新版)
1. 若已有 `thumb_media_id`(外部指定)→ 不再上传本地封面,保持 null。
2. frontmatter cover/image非空字符串→ 使用其 basename 生成 wikilink。
3. 正文扫描首个本地图片markdown / wikilink忽略 http/https
4. 若正文无 → 使用 gallery 自动展开生成的第一张候选。
5. 若仍无 → 使用 `defaultCoverPic`(若配置)。
6.`defaultCoverPic` 也无 → cover 为空。
Edge Cases
- frontmatter cover: "" → 视为未提供。
- defaultCoverPic 若为绝对 URL → 在上传阶段需区分远程/本地策略。
- gallery 展开后若所有图片为远程 URL未来支持→ 不作为本地候选,跳到 defaultCoverPic。
## 8. 正则清单
| 场景 | 正则 | 说明 |
@@ -114,6 +161,9 @@ Raw Markdown
| Wikilink 图片 | `!\[\[(.+?)\]\]` | 非贪婪 |
| Markdown 图片 | `!\[[^\]]*\]\(([^\n\r\)]+)\)` | 不跨行 |
| Gallery | `{{<gallery\s+dir=\"([^\"]+)\"(?:\s+figcaption=\"([^\"]*)\")?\s*\/>}}{{<load-photoswipe>}}` | 捕获 dir/caption |
| Gallery 块 | `{{<gallery>}}([\s\S]*?){{<\/gallery>}}` | 块包裹内容 |
| Gallery figure | `{{<figure\s+src=\"([^\"]+)\"[^>]*>}}` | 提取图片 src |
| Figure link 属性 | `link=\"([^\"]+)\"` | 可选外链(当前仅解析) |
| fig | `\[fig([^>]*?)\/]` | 题注 |
| 行块 | `\|\|r (.*)` 等 | 行级匹配 |
@@ -134,8 +184,11 @@ Raw Markdown
## 11. 配置 & 常量
| 常量 | 说明 | 后续计划 |
|------|------|----------|
| `GALLERY_PRE_PATH` | 画廊根目录 | 移入设置面板 |
| `GALLERY_NUM_PIC` | 默认选图数量 | 支持短代码参数覆盖 |
| `galleryPrePath` | 画廊根目录(配置项) | 未来参数化 per-block 覆盖 |
| `galleryNumPic` | 默认选图数量(配置项) | 支持块/短代码 count 覆盖 |
| `defaultCoverPic` | 默认封面备用 | 校验存在 / 多备选随机 |
| 移除GALLERY_PRE_PATH | (已外化) | - |
| 移除GALLERY_NUM_PIC | (已外化) | - |
| 行级样式内联 | 直接 embed style | 可改 class + CSS |
## 12. 对外接口
@@ -167,6 +220,11 @@ Raw Markdown
| 封面策略 | 配置“frontmatter 优先 / 正文优先 / 首图随机” |
| 图廊 HTML 模式 | 直接生成 `<figure>` 集合而非 wikilink 列表 |
| 样式外置 | 行级块样式改为统一 CSS class |
| 默认封面池 | 支持数组随机选择 default cover |
| 默认封面校验 | 选择时校验存在性 + Notice 提示 |
| caption alias | gallery figure caption -> wikilink alias/figcaption |
| link wrap | figure link 生成 `<a>` 包裹图片 |
| debug 开关 | 设置中关闭全部调试日志 |
| 目录缓存 | 减少频繁 IO |
## 15. 风险与规避