update at 2025-09-22 18:54:59
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user