Skip to content

fix(toolkit): 修复图片路径被 CJK 空格化导致静默丢图,摘要不再取到图注 - #38

Open
99kevindk wants to merge 1 commit into
imraywang:mainfrom
99kevindk:fix/cjk-spacing-image-path-and-digest
Open

99kevindk wants to merge 1 commit into
imraywang:mainfrom
99kevindk:fix/cjk-spacing-image-path-and-digest

Conversation

@99kevindk

Copy link
Copy Markdown

背景

在真实发布流程里踩到两个缺陷,都会让草稿看起来成功、实际内容已经坏了。两个都能在 4.2.1 稳定复现。

问题 1:图片路径被 CJK 空格化 -> 静默丢图

_fix_cjk_spacing() 在原始 Markdown 上给「中文↔英数」补空格,只跳过围栏代码块,没有保护链接/图片目标、行内代码与 URL:

![](edulab-文章素材/05-成品页-第1问.png)
#                          ↑ 被改成 05-成品页-第 1 问.png

后果:publish 在上传阶段找不到文件,只打印一行

Warning: image not found: ... (searched ...)

然后照常创建草稿。一次实测丢了 3 张配图,直到打开草稿箱才发现。

问题 2:自动摘要取到「图注」

_generate_digest() 直接取 soup.get_text() 的第一段。正文以图片/图注开篇时(科技与教育类文章很常见),摘要就变成 图注:本次走查用的输入——...。

改动

文件 改动
src/wewrite/toolkit/converter.py _fix_cjk_spacing:逐行处理,先保护 ](...)、`code`、<url>、裸 URL、= "attr"(占位符+还原),围栏块整块跳过;_generate_digest:跳过图注/纯图片块/标题/列表/文末声明,取第一个实质段落
src/wewrite/toolkit/cli.py 上传前路径自动修复(_despace_path / _repair_image_path);缺图醒目汇总;新增 --strict-images
tests/test_converter.py 新增 §10 共 8 个回归测试

行为兼容性:

  • 正文可见文字的中英空格行为不变(只新增了对路径/代码/URL 的保护)。
  • 摘要会变得更合理(跳过图注);想完全掌控仍可用 --digest 覆盖。
  • --strict-images 是可选新参数,默认行为仍是打印警告后继续建草稿。

验证

# 打补丁后
$ pytest tests/ -q
120 passed in 1.45s

# 同一批新增测试跑在未打补丁的 main 上
7 failed, 1 passed, 69 deselected

端到端(故意把引用写成磁盘上不存在的 05-成品页-第 1 问.png):

Note: repaired image path: 05-成品页-第 1 问.png -> 05-成品页-第1问.png
  -> http://mmbiz.qpic.cn/...
Draft created! media_id: ...

另外回归了「可见文本仍然插空格」:同一篇文章里 第 1 问 照旧出现 3 次,说明只保护了路径,没有误伤排版规则。

备注

补丁不改变任何公开接口;--strict-images 是新增开关。如果维护者更希望「缺图直接失败」成为默认行为,我可以把默认值翻过来(另开一个 PR/或在本 PR 内调整)。

两个真实缺陷(4.2.1 均可复现,均来自本机发布事故):

1) 图片路径被空格化 -> 发布静默丢图
   `_fix_cjk_spacing()` 在原始 Markdown 上补中英空格时只跳过围栏代码块,
   未保护链接/图片目标、行内代码、裸 URL 与 HTML 属性值。于是
   `![](dir/05-第1问.png)` 被改成 `![](dir/05-第 1 问.png)`,
   上传阶段找不到文件,仅打印一行 `Warning: image not found` 后继续建草稿,
   配图静默丢失(实测一次丢 3 张)。

2) 自动摘要取到“图注”
   `_generate_digest()` 直接取全文第一段文本。正文以图片或图注开头时,
   摘要就变成 `图注:...`。

改动:
- converter `_fix_cjk_spacing`:逐行处理,先用占位符保护 `](...)` 目标、`` `code` ``、
  `<url>`、裸 URL、`= "attr"` 属性值,补完空格再还原;围栏代码块整块跳过。
- converter `_generate_digest`:按段落块筛选,跳过图注类(图注/插图/题图/图片来源/数据来源…)、
  纯图片块、标题、列表与文末声明,取第一个实质段落;不足半篇时顺延拼接;仍守 120 字节。
- cli `publish`:上传前自动修复被空格化的路径(新增 `_despace_path` /
  `_repair_image_path`,会去掉中英之间被插入的空格并按同目录文件名忽略大小写匹配);
  缺图时打印醒目汇总块;新增 `--strict-images`(缺图直接退出码 2,不再“带病建草稿”)。
- tests:新增 8 个回归测试(图片目标/链接/行内代码不被空格化、可见文本仍加空格、
  摘要跳过图注、摘要字节上限、`_despace_path`、`_repair_image_path`)。

验证:
- `pytest tests/ -q` -> 120 passed
- 同一批新测试在未打补丁的 main 上 -> 7 failed, 1 passed
- 端到端:把引用写成磁盘上不存在的 `05-成品页-第 1 问.png` ->
  日志出现 `repaired image path` -> 图片上传成功 -> 草稿创建成功

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant