From 80e042d1540f1bbea60f68bfdf0350dc4037d313 Mon Sep 17 00:00:00 2001 From: tamakyi Date: Thu, 22 Oct 2026 21:42:56 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=88=86=E4=BA=AB=E5=8D=A1=E6=8E=92?= =?UTF-8?q?=E6=9F=A5=E8=AE=B0=E5=BD=95=EF=BC=9B.gitignore=20=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=20.workbuddy/local?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++++ .workbuddy/memory/2026-10-22.md | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/.gitignore b/.gitignore index f868b25..b5b8299 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,7 @@ go.work.sum # 主题生成器的自测脚本是 Python:跑一次就会留 __pycache__,别提交。 __pycache__/ *.pyc + +# 本地凭据与一次性状态(测试账号密码等),只留在本机,不进版本库。 +# 目录说明见 .workbuddy/local/test-accounts.md 的抬头注释。 +/.workbuddy/local/ diff --git a/.workbuddy/memory/2026-10-22.md b/.workbuddy/memory/2026-10-22.md index 96aa84c..5344352 100644 --- a/.workbuddy/memory/2026-10-22.md +++ b/.workbuddy/memory/2026-10-22.md @@ -353,3 +353,33 @@ - 水印在右下角("AI生成 WORKBUDDY"),统一裁掉底部 10%,切口平直,正好可以贴页面下沿。 - 提示词关键:no outlines / no gradients、眼睛写死 `solid black vertically elongated rounded rectangles` (否则出白眼球+高光+睫毛)、无嘴要重复强调。3/4 侧脸那版还是画出了嘴唇,弃用。 + +## 分享卡「二维码下链接不对齐 + 长链接乱掉」(已定位,待批准落地) + +- 根因在 `route/question/share.go` 的**字宽估算**:`charPixelWidth` 把 `unicode.Punct/Symbol` + 一律按 1.0em 计,而 URL 里的 `: / . _ -` 在 Noto Sans SC 里只有 0.25~0.35em。 +- 实测(NotoSansSC + 本机原型 `dev/tmpcard`):`https://box.shiroko.one/_/tamakyi` 15px 真实 + 227.9px、估算 352.5px(+55%);卡片可用宽仅 225px → 触发缩字号到 **9.57px**,实际只画 145px 宽, + 且起点按估算算 → 整段左偏 **40px**。dev 域名 7.24px / 偏 39px;长域名 5.26px / 偏 34px。 +- 纯中文不受影响(CJK 就是 1em,偏差 0);底部水印 `Powered by 狼的提问箱` 偏 9.8px。 +- 正确测法:`Font.HMetric(scale).AdvanceWidth` + `Font.Kern` 累加,scale=size*64(DPI 72)。 + 实测与 `freetype.Context.DrawString` 返回笔位完全一致(227.88 vs 227.88)—— 以后居中文字都用它, + 别再靠字符宽度系数猜。 +- 只修测量还不够:等比缩字号没有下限也没有断行/省略兜底,长链接必然掉到 5px 以下。 +- 另记:QR 用 `qr.Image(256)` 再 NearestNeighbor 到 165,41 模块 → 每模块 4.02px,模块宽窄不一; + `qr.Image(-k)` 按模块整数倍直接出图更锐(41*4=164)。 +- 交付:`outputs/sharecard-link-compare-2026-10-22.png`(现状/修复后对照)。 + +**已落地(用户选方案 A:单行优先,放不下才拆 host/path)** +- `measureTextWidth` 改为 `HMetric.AdvanceWidth + Kern` 累加,字体不可用时才回退估算; + 所有 `drawTextCentered` 自动吃到修正(链接、水印、提示语)。 +- 新增 `displayURL`(去 `https://`)/ `layoutLink`(单行 15→13 → host+path 两行 13→11 → + host 中间省略 @11)/ `ellipsizeMiddle`;`LinkMaxWidth = QRCardW-40 = 230`。 +- 卡片内容高度改为按行数算,两行时 startY 自动下移(281 ≤ 315,顶距 17)。 +- 守门测试 `route/question/share_layout_test.go`:测量=笔位(0.01px 级)、限宽、 + 居中(按着墨边界 ±3px)、`TEST_PREVIEW=1` 出图。**变异验证过**:把 measure 换回估算, + 三条用例全 FAIL(偏移 39/59px,且文字真的溢出卡片 615 < 660)。 +- 删掉了临时原型 `dev/tmpcard`(结论已进测试与 outputs 图)。 +- P1 未做(二维码模块整数倍、间距 4px 栅格、水印相对左侧内容区居中)—— 等用户看完效果再定。 + +