v5.4.0 — Chunked Copy + Title URLs + Sanitizer Table Fix
Added — 长文一键复制
- "复制富文本"对话框新增长文模式:HTML > 400KB 时弹"分段复制 / 改用草稿箱"选择面板。分段路径按 body 顶层 block 边界递归切到 ~250KB 一段,每段都是自洽的富文本片段,引导用户逐段粘到公众号后台末尾。
- 切分算法
splitHtmlIntoChunks递归下钻:遇到超预算的元素就钻到它的子级,每一层切完都用本层的开/闭标签把内容重新包起来,保证嵌套结构里的标题/卡片/章节等外层样式在每段粘贴时都还在。 - 草稿箱兜底:未绑定公众号 appid+appsecret 时按钮灰掉并提示,绑了就一键跳
/wechat/draft完全跳过剪贴板。
Added — 文章 URL 与标题对应
- 路由从"
/一招走天下"换成/a/<encodeURIComponent(title)>-<4位ID>的标题型 URL。浏览器地址栏现在能看出打开的是哪篇文章,可收藏可分享。 - 标题改名时通过
replaceParams原地同步 URL,不污染后退栈。 - nginx 已有
try_files \$uri \$uri/ /index.html,刷新/a/<slug>直接命中 SPA fallback,无需服务端配置改动。
Fixed — 微信粘贴布局
- Sanitizer 注入
table-layout:fixed:当<table>里至少一个直接子<td>写了width:Xpx,就给该表加table-layout:fixed,让作者的列宽真正生效。默认table-layout:auto会让浏览器把窄列压到 single-character min-content,正是"01""02"等数字徽章被分裂到两行的根因。 - 同步规则:表本身没设 width/max-width/min-width 也没
width=HTML 属性的,自动补width:100%——HTML5 规范里 fixed-layout 在无宽度表上等于 auto,必须给一个宽度才能生效。 table-layout加进 sanitizer allowlist,值限定{fixed, auto}。
Backend 202/202 tests passing · Frontend 232/232 tests passing