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

@@ -8,6 +8,8 @@
- 保证上传后 HTML 使用微信可访问的正式 URL。
- 自动封面选取:未指定时从正文首图推断。
- WebP → JPG 转换保障兼容性。
- 默认封面配置:若无正文/画廊候选,使用 `defaultCoverPic` (settings)。
- 手动 frontmatter 回退metadata 缺失时行级解析 `title/author/image`
## 2. 图片来源与归一化
| 来源 | 输入示例 | 归一化策略 | 备注 |
@@ -36,6 +38,9 @@ interface ImageInfo {
2. 根据 wikilink / 尺寸参数解析出真实 vault 文件路径:`assetsManager.getResourcePath()`
3. 调用 `LocalImageManager.setImage(res.resUrl, info)` 建档。
4. Markdown 图片(标准语法)若转换启用,提前转成 wikilink 进入同一逻辑;否则需未来扩展 tokenizer 直接登记。
5. Gallery
- 短代码:`{{<gallery dir="..."/>}}{{<load-photoswipe>}}` → 目录枚举(受 `galleryPrePath` + `galleryNumPic` 影响)→ 多行 `![[...]]` 注入。
- 块级:`{{<gallery>}} ... {{</gallery>}}``figure src="..." link="..." caption="..." >` 解析 src basename 加入候选;`link` 预留后续包装;`caption` 未来映射题注。
## 5. 上传阶段
顺序:
@@ -68,22 +73,21 @@ Base64
- 遍历 DOM `<img>` → 查询 Map → 使用上传后 `url` 覆盖 `src`
- 未登记:输出警告(潜在渲染管线遗漏)。
## 6. 自动封面策略
触发点:`getMetadata()` 中,若 frontmatter 未给出封面且无 `thumb_media_id`。步骤
1. 使用 `originalMarkdown`(含 frontmatter 原始文本拷贝)
2. 去除 frontmatter 块
3. 分别用正则匹配:
- Markdown`/!\[[^\]]*\]\(([^)\s]+)\)/g`
- Wikilink`/!\[\[(.+?)\]\]/g`
4. 过滤远程 URL仅保留本地引用或无协议路径
5. 生成候选 `{ idx, basename }` 列表,按出现位置排序。
6. 第一项 → `![[basename]]` 写入 `res.cover`
## 6. 自动封面策略(更新)
触发点:`getMetadata()`;若存在 `thumb_media_id` 则跳过。决策链
1. frontmatter cover/image非空若 metadataCache 缺失,则手动行级解析首个 `---`
2. 正文本地图候选markdown + wikilink
3. gallery 展开产生的首图(短代码或块级 figure 列表)。
4. `defaultCoverPic`settings 配置,允许相对路径 / URL / wikilink
5. 否则封面为空。
Edge Cases
| 情况 | 处理 |
|------|------|
| 所有图片都是 http(s) | 不作为封面候选 |
| 文件名带 query/hash | 使用前切分去除 `?` `#` |
| frontmatter cover: "" | 视为未配置,继续回退 |
| 所有正文图片都是 http(s) | 跳过正文阶段,转 gallery -> defaultCoverPic |
| gallery 块无有效 figure | 不贡献候选 |
| defaultCoverPic 不存在 | 仍返回该引用;上传阶段可能失败(待校验增强) |
| markdown 图片后缀非图片 | 跳过 |
| 重复图片 | 以最先出现的为准 |
@@ -93,6 +97,9 @@ Edge Cases
| Frontmatter 删除 | `/^(---)$.+?^(---)$.+?/ims` | 首段 YAML |
| Markdown 图片 | `/!\[[^\]]*\]\(([^)\s]+)\)/g` | 捕获路径 group1 |
| Wikilink 图片 | `/!\[\[(.+?)\]\]/g` | 捕获内部资源 |
| Gallery 块 | `{{<gallery>}}([\s\S]*?){{<\/gallery>}}` | 包裹内容 |
| Gallery figure | `{{<figure\s+src=\"([^\"]+)\"[^>]*>}}` | 提取 src |
| figure link | `link=\"([^\"]+)\"` | 可选外链属性 |
| WebP 检测 | `/\.webp$/i` | 扩展判断 |
| Base64 前缀 | `^data:image/` | 判断内嵌图 |
@@ -130,13 +137,18 @@ Edge Cases
| 失效重传 | 保存上传映射 + 校验缺失再补传 |
| 分块上传 | 大图分片(若接口支持) |
| 图片校验 | MD5 去重避免重复上传 |
| defaultCoverPic 校验 | 渲染时验证存在性 + Notice |
| 多默认封面池 | 数组随机选择减少视觉重复 |
| caption alias | figure caption -> wikilink alias/figcaption |
| link 包裹 | link 属性生成 `<a>` 包裹 `<img>` |
## 12. 快速检查清单 (Debug Checklist)
- 图片是否在 `LocalImageManager.images` Map 中?
- 是否执行了 `cachedElementsToImages()`Mermaid/Excalidraw
- 上传后 `media_id` 是否为空?(格式/大小不合规)
- DOM 替换后 `<img src>` 是否为微信域?
- 自动封面未生效检查frontmatter cover / 有无本地首图 / 正则是否截获远程 URL
- 自动封面未生效检查frontmatter cover / 正文本地图是否存在 / gallery 是否展开 / defaultCoverPic 是否配置
- 重复封面日志确认日志节流是否失效3 秒窗口内只应出现一次)。
## 13. 示例
输入 Markdown