Repository navigation
Releases: snailhome/obsidian-ijipu
Release list
v0.37.0
爱记谱 iJipu 0.37.0
本版是引擎同步版 + 预览口径修复(MINOR):把内嵌的 iJipu 应用从 0.55.2 更新到 0.56.0
(带来多声部试听两处修复、小节序号落位、时值格判定口径、删「虚音符」写「连音线连接点」),
并修掉插件自己的一批实测问题:手机端工具条、点「编辑」不消失、编辑跳转不进历史、
谱面视图裁剪与排版辅助虚线。0.36.3 → 0.37.0。
既有谱面、.jps语法、代码块参数全部零改动 —— 变的只是渲染出来的几何与交互细节。
引擎同步(应用 0.56.0 的引擎,逐字节同步到 vendor/engine)
- 多声部连音线跨小节会演奏成两个音(用户报
(5---|5)---|应为 1 个 8 拍音):连音合并的判据读的是
全局的"上一个已发事件",而多声部序列按小节交替拼 ⇒ 一过小节线就变成对声部的音 ⇒ 不合并。
现在 5 个状态量按声部隔离(实测真谱末句 F4 起奏 3 次 → 1 次 6363ms)。 - 未设置音色时各声部音色/色块不区分(用户报图):缺
Y:的声部原来一律回落同一音色,而色块按音色名
去重 ⇒ 必然同色。现在声部 1 用第 1 个可用音色、声部 ≥2 按启用音色列表顺延(不传列表时保持旧口径)。 - 小节序号落位:方框上沿距小节线 1px;
{dsb}临时多声部把另一水平线下移时,序号跟着主声明的小节线走;
"主声部"改按voice===1认(此前按"最上面一排",Q2:写在Q1:前会挂错行)。 - 「时值格 ⊇ 墨迹」转为真断言:原先报的 16 处不合规全是探针口径错,现已按口径重写并覆盖两条布局路径。
- 删掉「虚音符」这个幽灵概念(文档写了、实现从来没有)、按用户口径写入连音线连接点:
(2)括号紧贴数字 = 结束前一条连音线 + 起下一条(语法文档 §2.7 含用户例子(1 - (2) - | 3) --- |)。
插件修复(用户实测)
- 手机端工具条统一只图标(原来按容器宽度决定 ⇒ 收起/点开两副样子);
- 点「编辑」先收工具条再派发,并在打开
.jps时清掉残留工具条(用户建议的"打开时检查一下"做法); - 「编辑」跳转进导航历史(同一页签打开 + 换视图前先真·打开文件)⇒ 系统「返回」能回到笔记;
- 谱面视图的裁剪:墨迹盒仍用原来那套(量渲染后的真实内容盒),四周留白回到 每边 2px
—— 与导出 / 复制 / CLI 同一份口径(rangeBox,几何全在引擎里); - 排版辅助虚线的盒与 SVG 视框同源(原来自己算的是"整页裁四边距"盒、与墨迹盒原点不同 ⇒ 谱面模式下虚线整体错位 ✗):
现在直接读 SVG 当前的viewBox,读不到才退回自己算。
更新:内嵌的 iJipu 应用 0.55.2 → 0.56.0
按项目的顺序铁律生成:先在应用仓库定稿版本号(0.56.0 提交),
再 npm run build:embed + node scripts/embed-emit.mjs。跨仓闸门 adj733(嵌入产物版本 == 应用 APP_VERSION)通过。
验证
- 插件:
npx tsc -noEmit -skipLibCheck0 错;npm run smoke511 passed, 0 failed
—— 含adj733(嵌入版版本)与adj770(vendor/engine与应用引擎逐字节一致); npm run build通过,产物已同步到本地库做实测。
待办(未修,已登记在 docs/TODO.md)
- 切「整页」视图时
.jps文件页预览持续抖动(嵌入块不抖):疑为"整页拟合 ⇄ 容器尺寸"反馈回路; - 某份谱的"墨迹盒被一个看不见却有 bbox 的元素撑宽"(实测 952 vs 页宽 595)⇒ 该谱谱面视图右侧留白;
等多份谱都复现再查(现按用户裁定保持原实现,不为个别谱加特判)。
0.36.3
爱记谱 iJipu 0.36.3
本版是引擎同步版(PATCH):同步应用引擎的两组「上下对齐」修复
—— 段层逐拍对齐主旋律的「格」、增时线改为「格内左对齐」;
并把内嵌的 iJipu 应用从 0.55.1 更新到 0.55.2。0.36.2 → 0.36.3。
既有谱面、.jps语法、代码块参数全部零改动 —— 变的只是渲染出来的几何。
引擎同步:段层逐拍对齐主旋律的「格」(应用 adj905v,用户裁定 ①)
{bz … } / {dsb … } / {tp … } 段层与主旋律的逐拍对齐此前会越往后越偏
(最小例 {bz 1, 3, 5, 3,} 3 - - - || 实测:段层每拍步进 25,主旋律是 29)。
现在段层拍位直接落在主旋律的格上 —— 第 0 拍仍等于"数字位"(数字与段层首音逐个对齐,不变),
其余各拍的步进等于主旋律的格:
- 段层拍列由
62.5 / 87.5 / 112.4 / 137.4变为62.5 / 91.5 / 120.4 / 149.4(步进29== 主旋律); - 应用默认的空间优先布局下,段层与主旋律逐拍重合(时值优先路径保留与数字一致的常量偏移)。
引擎同步:增时线改为「格内左对齐」(应用 adj905w,用户看图定标)
-(增时线)原来画在所属拍段居中,而数字落在"格左缘 + 偏移"上 ⇒ 段层与主旋律看着错开。
现在增时线的墨迹左缘 = 该拍格左缘 + 数字的格内偏移(与数字同源):
- 空间优先(默认)下增时线与段层数字逐拍对齐(落在同一列);
- 时值优先路径位移约
2px(数字本就在拍槽内近似居中,属正常)。
两条都属于"上下对齐"这条线:口径与验收方式见应用仓库的
docs/ALIGNMENT-PRINCIPLES.md§五之四(含本轮adj905w补记)。
更新:内嵌的 iJipu 应用 0.55.1 → 0.55.2
嵌入版产物按项目的顺序铁律生成:先在应用仓库定稿版本号(0.55.2 提交 + tag v0.55.2),
再 npm run build:embed + node scripts/embed-emit.mjs。
跨仓闸门 adj733(嵌入产物版本 == 应用 APP_VERSION)因此由红转绿。
验证
- 插件:
tsc -noEmit -skipLibCheck0 错;npm run smoke494 passed, 0 failed
—— 含adj733(嵌入版版本闸门,本轮转绿)与adj770(vendor/engine与应用引擎逐字节一致); vendor/engine与应用引擎逐文件哈希零差异(49 = 49;本轮同步layout/index.ts与render/index.ts);npm run build通过。
0.36.2
爱记谱 iJipu 0.36.2
本版是参数改名版(PATCH):代码块的视图参数由
m=改名为v=
(v=p整页 /v=w满宽 /v=s谱面),与应用、网页文档页口径统一;
同时把内嵌的 iJipu 应用从 0.53.1 更新到 0.55.1。0.36.1 → 0.36.2。
既有谱面与.jps语法零改动 —— 只有"代码块参数"这一处写法变了,见下。
改:代码块视图参数 m= → v=(adj887)
在笔记里写 ```jps m=p 的那套参数,键名改成 v=:
| 旧 | 新 | 含义 |
|---|---|---|
m=p |
v=p |
整页(含页边距) |
m=w |
v=w |
满宽(只按宽度铺满) |
m=s |
v=s |
谱面(裁到墨迹,默认) |
- 为什么改:这三档本质是视图,插件内部的类型本来就叫
ViewMode;m(mode)语义偏抽象。
应用与网页文档页同一次改完,两端不会再各写各的。 - ⚠
m=不再被识别:用户口径是"这个参数才设置的,可以直接改,减少代码臃肿" ⇒
直接替换、不保留旧名兼容。若你的笔记里写过m=…,改成v=…即可。
写错的值(如v=x)照旧有明确提示、不会静默退化成默认视图。 z=(缩放)不变:语义清晰,不动。
更新:内嵌的 iJipu 应用 0.53.1 → 0.55.1
插件里那个"嵌入版 iJipu"(桌面端点左侧栏图标打开的完整编辑器)随之更新,跨了三个应用版本:
- 0.54.0:命令行独立成
@ijipu/cli包 + 应用侧「能力宿主」命名管道; - 0.55.0:官网分层(介绍首页 +
/app/+/manual/+/syntax/)、
```jps代码块变成可交互示例、深浅主题、Obsidian 插件专区; - 0.55.1:修桌面版「点官网首页没反应」(Tauri opener 权限缺 URL scope)、
内置音源与许可同目录、播放跟随滚动改「安全区」(提前量 + 顺滑)。
嵌入版产物按项目的顺序铁律生成:先在应用仓库定稿版本号,再
build:embed+embed-emit。
跨仓闸门adj733(嵌入版产物版本 == 应用APP_VERSION)因此由红转绿。
验证
- 插件:
tsc -noEmit -skipLibCheck0 错;npm run smoke494 passed, 0 failed
—— 含adj887三条(v=取值表、v=full的歧义提示、z/v共用边界常量)
与adj733(嵌入版版本闸门,本轮转绿); vendor/engine与应用引擎逐文件哈希零差异(49 = 49;本轮应用引擎未改);npm run build通过。
0.36.0
爱记谱 iJipu 0.36.0
本版是功能版(MINOR):谱面工具条定稿为 5 位、新增「⋯ 更多」菜单(含复制为图片与导出范围)、
新增代码块块级缩放z;并把内嵌的 iJipu 应用更新到 v0.53.0(含「范围」盒通道)。
0.35.2 → 0.36.0。既有谱面与.jps语法零改动。
工具条:固定 5 位,低频入口进「⋯ 更多」
▶ 试听 | ☰ 排版 | 谱面·页面 | ✎ 编辑 | ⋯ 更多
- 「设置」「格式化」「在应用中打开」「打开谱面文件」移入菜单(工具条只留高频操作);
菜单项触发的仍是原来那批按钮 —— 处理器一行没改,行为与之前完全一致。 - 桌面在预览区右键 = 打开同一份菜单;手机点「⋯ 更多」是底部弹出的大行高面板
(Obsidian 在手机上本来就把它渲染成底部面板)⇒ 三处共用同一份菜单数据,不会各写一份再漂。 - 手机端:按钮 ≥44px(此前 24–30px,手指偏小)、工具条常驻不自动收起、
不依赖悬停、不依赖右键;「在应用中打开」在手机上不出现(嵌入版视图只在桌面注册)。
新增:「复制」组
⋯ 更多 → 复制:
- 复制为图片(2× 默认 / 1× / 4×):渲染在嵌入版应用里做(与 GUI 导出同一套),
插件再给 PNG 写上物理密度(pHYs)后放进剪贴板 ⇒ 2× = 144 DPI、4× = 288 DPI,
粘进 Word / 微信 / 飞书就是合适大小(没有这一项时它们会按 96 DPI 兜底,把一张 2× 的 A4 谱
插成 12 英寸的巨图)。
多页谱只复制第 1 页并如实说明;当前环境不支持写入剪贴板图片时明确报错,并指向「导出 PNG」命令。 - 复制 SVG 文本(矢量,含「导出范围」裁剪)、复制谱面源码(
.jps原文)。
新增:「导出范围」
⋯ 更多 → 导出范围(与「设置 → 说明 → 导出范围」是同一个值):
| 选项 | 画布口径 |
|---|---|
| 页面(默认) | 整页(A4 等)+ 四周留白 —— 与改动前一致 |
| 谱面 | 墨迹包围盒 + 每边 2px(不保留页宽) |
| 跟随视图 | 谱面模式 ⇒ 按「谱面」;整页 / 满宽 ⇒ 按「页面」 |
- 「导出 SVG / PNG」与「复制 SVG 文本」都按它裁;「导出谱面」与谱面视图用的是同一份几何
(所以"预览看到的就是导出的")。 - 选「谱面」需要先在预览里显示过这份谱(面板会实测墨迹盒);量不到墨迹、
或预览与嵌入版的页面尺寸不一致(例如两边纸张设置不同)时明确报错 ——
不会悄悄给你一张整页图、也不会裁出一张错位的图。 - 默认仍是「页面」:面板初始显示模式就是「谱面」,若默认跟随视图,升级后导出尺寸会静默变化。
新增:代码块块级缩放 z
写在代码块的语言名后面:
```jps z=150
D: C
P: 4/4
Q: 1 2 3 4 |
```
- 缺省 /
z=100⇒ 100%(自然尺寸):1 个 viewBox 单位 = 1 CSS px ⇒
笔记里只有一两行曲部时不再被拉伸放大(这是本功能的由来); z=<数字>(1–1000)⇒ 百分比;z=*⇒ 自适应笔记栏宽(= 本功能上线前的行为);- 只对笔记里的代码块生效(
.jps文件视图与![[x.jps]]嵌入保持原样); - 只影响屏幕显示:导出/复制仍按「导出范围」的口径,与
z无关。
内嵌应用更新到 v0.53.0
内嵌的 iJipu 应用更新到 v0.53.0(含「范围」盒通道与 PNG 物理密度工具)。
不更新的话,选「导出谱面」时应用不认范围盒、会给你一张整页图 —— 本版已按项目的
「先定稿应用版本 → 再重生成嵌入产物 → 再发插件」顺序重生成;插件冒烟 adj733
会核对"内嵌版本号 == 应用版本号"。
既有功能与数据
.jps 语法、谱面排版几何、设置项含义均无破坏性改动;.jps 文件、笔记里的代码块、
试听、排版辅助虚线、页面设置等照旧可用。
验证
tsc -noEmit -skipLibCheck0 错;npm run smoke447 passed, 0 failed
(含adj733:嵌入版产物版本 == 应用APP_VERSION(0.53.0));- 发布后终验:CI 产物与本地同提交重建逐字节比对 → 装进用户库 →
gh attestation verify。
0.35.2
爱记谱 iJipu 0.35.1
本版是修复 + 内嵌产物更新版(PATCH):把含 Obsidian IPC 桥的应用产物(v0.52.0)重新内嵌,
并修掉两个你在真机上抓到的 bug。0.35.0 → 0.35.1。既有谱面与.jps语法零改动。
修:导出 PNG / MIDI 提示「嵌入版无响应」
根因(你实测抓到的正是项目 AGENTS §五.8.1 那条顺序铁律 ✗):
插件的嵌入版产物(src/gen/webappAssets.ts)此前是应用 0.51.2 构建的 ✓,
而应用侧的入站 RPC 桥(src/ipc/obsidianBridge.ts)是之后才写的 ⇒
内嵌的那份应用里根本没有桥 ✗ ⇒ 插件发 render.png / export.midi 后永远等不到应答 ⇒ 10 秒超时 ⇒ 提示"无响应" ✓。
修法:按铁律走完整顺序 —— 应用升 0.52.0 并发布 ✓ → npm run build:embed && node scripts/embed-emit.mjs ✓
→ 本版插件内嵌产物更新为 0.52.0(含桥) ✓ ⇒ 「导出 PNG / MIDI」现在应能真正走通 ✓。
修:墨迹裁剪退化
现象(你的诊断):按墨迹裁剪 489×27(整页 595×842,高度只剩 3%) ✗ ——
原来只要求"盒比整页小" ⇒ 又扁又窄的退化盒能溜过去 ⇒ 谱面会被裁成一条 27px 横带,
而「导出谱面」(墨迹 ± 2px)更会直接报废 ✗。
修法:加 MIN_INK = 40 闸 —— 量到的盒小于 40px 即视为量取不可靠 ⇒ 退回按边距裁剪 ✓
并把原因写进诊断 ✓(比裁成条带好得多 ✗)。
修:「嵌入版未打开」误报
根因:定位 iframe 用了 src.includes('token=') ✗ —— 而 embed/frame.ts 建的 URL 不含 token
(token 是加载后经 bridge.setToken() 传的 ✓)⇒ 判据永远不成立 ✗ ⇒ 即使嵌入版开着也报"未打开" ✓。
修法:改按本机服务地址识别(127.0.0.1 / localhost ✓)并保留 token 兜底 ✓。
新增(诊断)
- 源码态事件序列记录器:记录
window.focus/blur、visibilitychange、active-leaf-change,
并逐块报出「预览 n/源码 m(共 k)」(判据 = 该块含不含.ijipu-score✓);
结果进「生成完整诊断报告」✓。用途:排查"代码块闪回预览"这类问题 ✓。经你实测判定:该现象属 Obsidian 焦点行为、非插件问题 ⇒ 不改 ✓。
未完成(如实说明)
playback.play/stop未接线:应用侧「播放无头化」第一步(src/playback/headless.ts✓)已完成,
第②③步见应用仓库docs/HANDOVER-CLI-AND-COMMAND-API.md✓;此前capabilities.audio = false✓、不谎报 ✓。- A·P3 桌面端隐藏窗口渲染(CLI 导出 PNG/PDF/WAV)待实现 ✓(需桌面构建 + 图形环境 ✓,
8 项验证清单见应用仓库docs/CLI.md§七之二 ✓)。
验证
npx tsc -noEmit -skipLibCheck0 错;npm run smoke387 passed, 0 failed
(含adj733:嵌入版产物版本 == 应用APP_VERSION✓ —— 本版正是靠它确认"重新 embed"确实生效 ✓);- 发布后终验:CI 产物与本地同提交重建逐字节比对 → 装进用户库 →
gh attestation verify✓。
0.35.1
爱记谱 iJipu 0.35.1
本版是修复 + 内嵌产物更新版(PATCH):把含 Obsidian IPC 桥的应用产物(v0.52.0)重新内嵌,
并修掉两个你在真机上抓到的 bug。0.35.0 → 0.35.1。既有谱面与.jps语法零改动。
修:导出 PNG / MIDI 提示「嵌入版无响应」
根因(你实测抓到的正是项目 AGENTS §五.8.1 那条顺序铁律 ✗):
插件的嵌入版产物(src/gen/webappAssets.ts)此前是应用 0.51.2 构建的 ✓,
而应用侧的入站 RPC 桥(src/ipc/obsidianBridge.ts)是之后才写的 ⇒
内嵌的那份应用里根本没有桥 ✗ ⇒ 插件发 render.png / export.midi 后永远等不到应答 ⇒ 10 秒超时 ⇒ 提示"无响应" ✓。
修法:按铁律走完整顺序 —— 应用升 0.52.0 并发布 ✓ → npm run build:embed && node scripts/embed-emit.mjs ✓
→ 本版插件内嵌产物更新为 0.52.0(含桥) ✓ ⇒ 「导出 PNG / MIDI」现在应能真正走通 ✓。
修:墨迹裁剪退化
现象(你的诊断):按墨迹裁剪 489×27(整页 595×842,高度只剩 3%) ✗ ——
原来只要求"盒比整页小" ⇒ 又扁又窄的退化盒能溜过去 ⇒ 谱面会被裁成一条 27px 横带,
而「导出谱面」(墨迹 ± 2px)更会直接报废 ✗。
修法:加 MIN_INK = 40 闸 —— 量到的盒小于 40px 即视为量取不可靠 ⇒ 退回按边距裁剪 ✓
并把原因写进诊断 ✓(比裁成条带好得多 ✗)。
修:「嵌入版未打开」误报
根因:定位 iframe 用了 src.includes('token=') ✗ —— 而 embed/frame.ts 建的 URL 不含 token
(token 是加载后经 bridge.setToken() 传的 ✓)⇒ 判据永远不成立 ✗ ⇒ 即使嵌入版开着也报"未打开" ✓。
修法:改按本机服务地址识别(127.0.0.1 / localhost ✓)并保留 token 兜底 ✓。
新增(诊断)
- 源码态事件序列记录器:记录
window.focus/blur、visibilitychange、active-leaf-change,
并逐块报出「预览 n/源码 m(共 k)」(判据 = 该块含不含.ijipu-score✓);
结果进「生成完整诊断报告」✓。用途:排查"代码块闪回预览"这类问题 ✓。经你实测判定:该现象属 Obsidian 焦点行为、非插件问题 ⇒ 不改 ✓。
未完成(如实说明)
playback.play/stop未接线:应用侧「播放无头化」第一步(src/playback/headless.ts✓)已完成,
第②③步见应用仓库docs/HANDOVER-CLI-AND-COMMAND-API.md✓;此前capabilities.audio = false✓、不谎报 ✓。- A·P3 桌面端隐藏窗口渲染(CLI 导出 PNG/PDF/WAV)待实现 ✓(需桌面构建 + 图形环境 ✓,
8 项验证清单见应用仓库docs/CLI.md§七之二 ✓)。
验证
npx tsc -noEmit -skipLibCheck0 错;npm run smoke387 passed, 0 failed
(含adj733:嵌入版产物版本 == 应用APP_VERSION✓ —— 本版正是靠它确认"重新 embed"确实生效 ✓);- 发布后终验:CI 产物与本地同提交重建逐字节比对 → 装进用户库 →
gh attestation verify✓。
0.35.0
爱记谱 iJipu 0.35.0
本版是"对外能力"版本(MINOR):新增 公开 JS API、嵌入版 RPC 通道(含安全边界与协议冻结)、
三种导出命令(SVG / PNG / MIDI),以及配套的机器闸门与文档。
0.34.2 → 0.35.0。既有谱面与.jps语法零改动;引擎与应用仓库本周期未改引擎代码。
新增:公开 JS API(任何插件/脚本可用)
- 插件实例暴露
api(Object.freeze过、带apiVersion = 1):
lint(source)/format(source)/renderSvg(source, pageConfig?)/effectiveConfig(source)/renderFull(...)(experimental); - 先看
capabilities再调:未实现的能力一律报false(不谎报); - 配置口径与预览区同源(走插件自己的
resolvePageConfig✓ —— 不许 API 另算一份); - 用法与逐方法说明见
docs/OBSIDIAN-API.md;机器闸门adj800。
新增:嵌入版 RPC(Obsidian ⇄ 嵌入版 iJipu)
两条方向、两组白名单(协议版本 1,信封与错误码已冻结 ✓):
| 方向 | 方法 | 状态 |
|---|---|---|
| 应用 → 插件 | engine.version / capabilities / render.svg |
✓ 已实现 |
| 插件 → 应用 | render.svg / render.png / export.midi |
✓ 已实现(playback.play/stop 留名待后续) |
安全边界(写死在代码里,有闸门守):
- 总开关默认关闭(设置 → iJipu → 嵌入版 → 「开发者:允许嵌入版调用插件能力」✓;仅本会话有效 ✓,关闭时一律回「未启用」);
- 来源校验:只接受"src 含本插件 token 的 iframe"那个窗口发来的消息 ✓,否则直接忽略、不回包(避免被探测);
- 方法白名单 + 参数逐项校验(类型/长度/枚举 ✓,不做"尽力解析");
- 路径规则:只允许 vault 内相对路径,禁绝对路径 / 盘符 /
../ NUL; - 错误码 JSON-RPC 风格:
-32001未启用 |-32601未知方法 |-32602参数非法 |-32603内部错误 |-32000应用侧不支持。
跨仓一致性闸门:断言「应用侧能处理的方法 ⊆ 插件出站白名单」✓ ——
本版正是靠它抓出并修掉了一处真实协议漂移(应用支持 render.svg,插件出站清单漏了它 ⇒ 合法请求发不出去)。
新增:三种导出命令(命令面板搜 "iJipu")
- 导出当前谱面为 SVG 文件(存到同目录;多页写
名字-1.svg…)✓; - 导出当前谱面为 PNG(走嵌入版通道 ⇒ 复用应用侧
svgToCanvas,与 GUI 导出同一套渲染)✓; - 导出当前谱面为 MIDI(走嵌入版通道 ⇒ 与应用导出同一套
buildPlaySequence+eventsToMidi与音色/声部设置)✓; - 另有原有的「格式化 / 校验 / 复制 SVG 源码 / 打开爱记谱」✓;取源优先级:
.jps文件视图 → 光标所在代码块 → 活动.jps文件 → 否则命令置灰 ✓。
工具条与排版(延续 0.34.x 的真机修复)
- 工具条显隐状态机(块不在视界不显示、进视界才起 3 秒倒计时、点击手动开关、手动显示后不自动收起);
- 外侧落位
fixed+ 挂document.body(摆脱祖先裁剪/层叠)、移植上下文标记(尺寸一致)、孤儿清理; - 手机端预览滚动(面板/SVG 层
flex: 0 0 auto+touch-action: pan-y)、谱面四边 2px 留白。
诊断(延续)
- 设置 → iJipu → 诊断 页签:每块点击即复制、一键复制全部;
- 「生成完整诊断报告」:一次取样得到「环境 + 滚动链路 + 工具条实物 + 面板布局 + 最近记录」并自动复制。
验证
npx tsc -noEmit -skipLibCheck0 错;npm run smoke387 passed, 0 failed(含本版新增adj800/807/808/810/812/813/821/822/825);vendor/engine与应用引擎逐文件哈希一致 ✓;adj733嵌入版版本闸门通过(v0.51.2);- 发布后终验:CI 产物与本地同提交重建逐字节比对 → 装进用户库 →
gh attestation verify。
未完成(如实说明)
playback.play/stop未接线:应用侧播放由PlaybackDialog(React,41 KB)持有 ⇒ 前置是"播放无头化"重构;
第一步src/playback/headless.ts(应用仓库)已完成 ✓,后续步骤见应用仓库docs/HANDOVER-CLI-AND-COMMAND-API.md;
在此之前capabilities.audio = false、未实现方法回-32000并写明原因(不谎报)。
0.34.2
爱记谱 iJipu 0.34.2
本版是针对社区审核结果的修复版(PATCH):0.34.1 的审核判定 Failed,
唯一 Error 是本插件自己写的一处内联样式 ✗ —— 本版按审核给的出路改掉,
并把"审核 Error 级规则"落成自动加载的规范 + 机器闸门(见下)。
0.34.1 → 0.34.2。既有谱面与.jps语法零改动;引擎与应用仓库本周期未改动。
审核 Error:obsidianmd/no-static-styles-assignment
- 现象:审核报告 Failed,Source code → Error 指向
src/scorePane.ts:790 / 793 / 794—— 那是 0.34.1 新写的"工具条外侧落位"里
el.style.setProperty('position' | 'left' | 'top' | 'bottom' | 'z-index')✗。 - 修法(按审核原文给的三条出路):
· 定位与层级交给 CSS 类.ijipu-score-toolbar.ijipu-ported
(position: fixed; left: var(--ijipu-port-x); top: var(--ijipu-port-y); bottom: auto; z-index: 40);
· 动态坐标用el.setCssProps({ '--ijipu-port-x': …, '--ijipu-port-y': … })
—— 这是 Obsidian 认可的动态值写法 ✓;
· 收起/搬回容器时removeClass('ijipu-ported')并清空这两个自定义属性 ✓。 - 行为不变:外侧落位、跟随滚动/尺寸变化、进视界显示 + 3 秒倒计时、离开视界隐藏,全部与 0.34.1 一致 ✓。
新增:审核 Error 级规则的规范 + 闸门(用户要求)
用户原话:「这个问题多次出现,请写进 AGENTS,作为一条规则进行规范」⇒ 已写入 ijipu/AGENTS.md §六之四,
按项目"元规则"同时给出 ① 自动加载的规范 与 ② 机器闸门:
- 禁直接写内联样式(
el.style.x = …、el.style.setProperty(…)、style.cssText = …);
只允许 CSS 类(首选)/setCssProps/setCssStyles;removeProperty(摘属性)未被判,但赋值一律禁止;
唯一例外是"循环里的动态键"(for (const [k, v] of Object.entries(style)) el.style.setProperty(k, v),
键是变量、规则判不了"静态"),新增此类写法必须在注释里写明理由; - 同类 Error/Warning 一览表(内联样式 /
!important/innerHTML/console.*/
import 'node:*'(静态导入是刻意的,附原因)/fetch/getSettingDefinitions()/ Build verification); - 发布前"审核预检"三步:
smoke全绿 → 人工过 Error 行 → 结果记docs/ERRORS-LOG.md并把能自动化的落成闸门。
机器闸门:插件 npm run smoke 新增 adj799 —— 扫描 src/**/*.ts
(排除 src/gen/** 生成物与 vendor/**),任何"内联样式赋值"即红灯,并在失败信息里列出文件:行号;
带负对照(去掉类那一行即判假)。
附:审核其余条目的口径(本版未改,均为已知/刻意的)
import 'node:http'/'node:crypto'(Warning):静态导入是刻意的 —— 本插件以 CJS 打包且把
node:*列为 external,动态import('node:http')在渲染进程会退化成浏览器模块请求而直接失败 ✗
(0.34.0 曾因此出现「Failed to fetch dynamically imported module: node:http」);
手机端安全由调用方保证:./embed/server只在Platform.isDesktopApp时被动态加载 ✓。fetch(Warning):已知豁免 —— 音色库下载与嵌入版本地服务(固定端口 47821,仅本机回环)。!important:0 处(闸门adj772)。- Build verification(Warning):表示"审核方重建产物 ≠ Release 产物"。本仓库按同一提交重建后
与 CI 产物逐字节一致(0.34.1 实测FA4E68F2…),差异来自重建环境(Node/依赖版本)。
验证
npx tsc -noEmit -skipLibCheck0 错;npm run smoke384 passed, 0 failed;npm run build正常;node scripts/release-body.mjs命中当版# 爱记谱 iJipu 0.34.2;vendor/engine与应用引擎逐文件哈希一致(46 文件,差异 0);adj733嵌入版版本闸门通过(v0.51.2);- 发布后终验:CI 产物与本地同提交重建逐字节比对,并把 CI 产物装进用户库 +
gh attestation verify。
0.34.1
爱记谱 iJipu 0.34.1
本版是 0.34.0 之后的实测修复批(PATCH):把三处预览的工具条显隐/落位、
手机端滚动、嵌入块编辑、诊断方式这一串"真机才暴露"的问题逐条修掉。
0.34.0 → 0.34.1。既有谱面与.jps语法零改动。
工具条:显隐与落位(本版主要工作,均由真机实测驱动)
- 外侧落位改用
position: fixed+ 挂到document.body:此前"浮在块外上方"会被
相邻 CM6 行盖住(诊断:坐标正确、无裁剪层,但命中测试命中的是div.cm-line)——
z-index/放开overflow都不足以跨出祖先的层叠上下文 ⇒ 移到 body 后彻底摆脱裁剪与层叠约束; - 不再预留空带(推翻 0.34.0 里"块内空带"的做法):按用户口径,块与普通块一样排版、
工具条浮在其它元素之上(允许遮挡); - 取消"悬停显示":改为点击预览区显/隐(唯一手动开关),键盘仍可唤醒;
- 显隐改为"块进视界才显示 + 3 秒倒计时从进视界起算"(单一状态机
syncToolbarVisibility()):
· 块不在视界(或还没尺寸)⇒ 不显示、也不计时;
· 块进入视界 ⇒ 显示并从这一刻倒计时 3 秒;
· 用户点击 ⇒ 手动显/隐,手动显示后不再自动收起;
· 用hiddenByViewport区分"因离开视界隐藏"与"用户主动收起"; - 手机端"显示后马上又隐藏"/"再也显示不出来":触摸会合成鼠标事件 ⇒ 悬停那套自动收起要去掉;
并且手机端 CSS 的"常显"规则需要is-user-hidden才能压过 ⇒ 三处隐藏路径统一补该标记; - 搬到 body 的工具条保留上下文标记(
ijipu-ported-mobile/ijipu-ported-embedded):
否则.is-mobile/.ijipu-embedded两条按祖先匹配的尺寸规则失效 ⇒ "点击显示的"与
"滚动中的"工具条按钮大小不一致; - 孤儿工具条清理:嵌入面板销毁不走
destroy()(实测)⇒ 改为按"容器是否仍在文档里"判定,
并在每次挂载与每次外侧落位时清理(修"工具条卡在原地不消失")。
手机端预览滚动
- 不能上下滚(桌面端正常):诊断显示
.ijipu-file-view[overflow=auto ✓ 但 scroll=1020/1020 无溢出]、
而面板自己被压小(flex: 1 1 auto⇒ 内容在面板内部溢出、不计入父容器可滚高度)✗
⇒ 面板与 SVG 层显式flex: 0 0 auto(按内容高度参与布局)⇒ 父容器得到真实溢出 ⇒ 可滚; - 另加
touch-action: pan-y(预览容器 + 谱面子树)与移动端惯性滚动; - 一并撤销了 0.34.0 里"把滚动交给宿主"的尝试 —— 诊断证明宿主各层全是
overflow-y: hidden
(workspace-leaf-content明明有内容可滚却hidden)⇒ 唯一能滚的就是我们自己那层。
嵌入块与编辑入口
- 手机端嵌入
![[x.jps]]的「编辑」点了没反应:按钮分派在手机端走onToggleSource,
而嵌入宿主没有这个回调 ⇒ 空调用 ✗ ⇒ 改为回退到onEdit⇒ 现在直达源码编辑(用户已确认); - 嵌入/代码块的自动格式化、着色、错误提示与 0.34.0 一致(本版未改这部分口径)。
谱面留白
- 谱面视图四边 2px 留白:裁剪分支原来把 viewBox 设成墨迹紧边界 ⇒ 贴边 ✗
⇒ 裁剪框四边各外扩 2px(与"退回按边距裁剪"那一支同口径)。
诊断方式(用户要求:"不要一直来回交互,手机反馈诊断并不方便")
- 设置新增独立「诊断」页签(不再干扰「说明」里的有用信息),每块点击即复制(标题 + 内容),
另有「一键复制全部诊断」; - 新增 「生成完整诊断报告」:一次取样得到
「环境(版本/平台/视口/DPR)+滚动链路(沿途 overflow/touch-action/contain/scrollHeight÷clientHeight
+"可滚容器 = …"小结)+工具条实物(在 DOM 哪里/是否显示/坐标/内联样式/上下文标记)
+面板布局+最近交互记录」,点一次即自动复制,粘贴即可定位; - 工具条落位诊断改为每次显示都刷新(原来每个元素只判定一次 ⇒ 贴出来的永远是别的实例、
且常是"视口外"的那条 ✗)。
引擎同步
- 本版未改引擎:
vendor/engine与应用引擎仍逐文件哈希一致(有闸门); - 嵌入版仍为 v0.51.2(
adj733闸门断言嵌入版版本 == 应用APP_VERSION)。
验证
npx tsc -noEmit -skipLibCheck0 错;npm run smoke383 passed, 0 failed;npm run build正常;- 新增/改写断言(均带负对照):
adj785、adj791、adj792b、adj794b–794g、adj797/797b/797c、
adj798、adj796(完整诊断报告)等;并保留两道防复发闸门(CSS 结构、类名 ↔ CSS 覆盖); node scripts/release-body.mjs命中当版# 爱记谱 iJipu 0.34.1。
0.34.0
爱记谱 iJipu 0.34.0
本版主题:把"三处预览"的工具条与编辑行为统一到底,并让
```jps代码块也拥有完整的源码编辑体验。
0.33.x → 0.34.0(MINOR:新增"代码块内 iJipu 着色 / 错误提示 / 逐行自动格式化"这一组能力,
以及三处工具条与编辑入口的统一下沉;既有谱面与.jps语法零改动)。
```jps 代码块:与手机端 .jps 源码编辑同一套三项能力(本版核心)
用户原话:「jps 代码块应同时应用自动格式化、脚本颜色高亮和错误提示功能,与手机版 jps 文件的源码编辑模式一致」。
- 脚本着色:围栏内的正文按引擎
tokenizeJpsLine分词上色(与应用、与手机端.jps源码同一份规则、
同一套配色)——不再借用 Markdown 的代码块高亮; - 错误提示:只解析围栏内的正文(不含围栏行),行号偏移回文档行号 ⇒
行级淡红/淡橙底 + 错误块红/橙单线外框 + 鼠标悬停显示「message + 正确写法」; - 逐行自动格式化:光标离开块内正文行时按引擎
formatLine规范化该行(与应用的逐行格式化同一份实现); - 只在围栏内生效:笔记里其它 markdown 文本与其它语言的代码块完全不受影响;
且自动格式化只认已闭合的围栏块 —— 用户忘写收尾围栏时,绝不悄悄改写其正文(数据安全优先)。 - 口径细节:
```与~~~都支持、长度 ≥3、info 串允许jps后带别的词;
未闭合的围栏按 CommonMark 延伸到文末(这样刚敲下```jps就有着色与提示,而不是"什么都没发生")。
三处预览(.jps 文件 / ![[x.jps]] 嵌入 / ```jps 代码块)的工具条统一
- 按钮统一为:试听、排版、设置、视图、编辑(「编辑」固定在最右,用带笔图标);
- 「编辑」的行为分派:PC ⇒ 用嵌入版 iJipu 打开编辑;手机 ⇒ 用 Obsidian 编辑器打开源码(源码模式);
代码块 ⇒ 切换该代码块的源码(桌面与手机端都有 —— 手机端此前没有编辑入口); - 点左侧文件列表的
.jps一律先显示谱面预览(PC 与手机一致;原来桌面端会直接塞进嵌入版); - 块右上角那枚
</>取消(图标指示不明、只在桌面端、且与工具条重复); - 点击预览区显/隐工具条(各端各模式):点一下出现、再点一下收起;
· 触摸交互下禁用"悬停自动收起"(触摸会合成鼠标事件,否则会"刚显示就隐藏");
· 交互式元素(工具条自身、谱面内链接)不参与切换;
· 另附一条诊断(设置 → 说明:「点击预览区显/隐工具条」)—— 记下平台与命中的元素,便于定位。
代码块工具条的位置
- 由"贴块外侧"改为块内预留一条空带(容器
padding-top+ 工具条锚容器顶边):
既不压谱面墨迹、也不会与相邻代码块的工具条互相压住; - 位置纯由 CSS 决定、与阅读/编辑模式无关 ⇒ 两种模式必然一致
(原来由"命中测试"判定落位,两种模式结论不同 ⇒ 位置不一致)。
其他修复
- 手机端排版虚线拖不动:虚线拖拽原来只挂
mousedown(触摸不产生mousemove)⇒ 改用 Pointer Events
(鼠标/触摸/触控笔通吃),并加touch-action: none(否则浏览器把手势当滚动、直接掐断),
触摸端再给一条外扩 12px 的透明命中带(手指不如鼠标精准); - 关闭排版虚线后墨迹四周空白偶发不消除:裁剪的"补量"条件太窄(只补"完全没量到",
而"量到的盒几乎等于整页"也可能是量得太早)⇒ 两种情形都补量一次,并把重试阶梯从 3 档加长到 5 档(最远 3s); - 点「编辑」打不开嵌入版(
Failed to fetch dynamically imported module: node:http):
node:http/node:crypto必须静态导入 —— 插件产物是 CJS,静态导入编译成require("node:http")(渲染进程可用),
而动态import('node:http')会被当成浏览器模块请求、必然失败。手机端安全性由调用侧保证
(./embed/server只在桌面端被动态 import); - 嵌入版打开失败不再留空白:页签给出具体原因 + 「重试」按钮,失败原因并记入
「设置 → iJipu → 说明 → 嵌入版本地服务(诊断信息)」;失败后可重试(不再留下一个永远失败的 promise); - 嵌入版开关关闭时不再打开"死页签":点「编辑」改为退回源码编辑并提示开关位置;
音色库入口则直接送到设置「说明」页(那里有音色库入口); - 设置页与 README 的文案与行为对齐(不再写"点
.jps就用完整编辑器打开")。
引擎同步
- 本版未改引擎:
vendor/engine与应用引擎仍逐文件哈希一致(有闸门); - 嵌入版仍为 v0.51.2(
adj733闸门断言嵌入版版本 == 应用APP_VERSION)。
验证
npx tsc -noEmit -skipLibCheck0 错;npm run smoke377 passed, 0 failed;npm run build正常;- 新增断言(都带负对照):
adj773/773b/773c/773d(工具条统一、</>移除)、
adj774/774b–774f(代码块三能力:围栏扫描含 CRLF/未闭合/两块/引用块负对照、行号偏移回文档行号、
块外框 marks 落点、token 长度和 == 整行、真实示例谱走完整管线)、
adj776/776b(嵌入版开关关闭/失败路径)、adj777/777b(手机端编辑入口与revealSource平台无关性)、
adj778(源码与产物双层:不得残留import("node:*"))、adj779/779b(点击切换、SVG 命中判定)、
adj780/780b(裁剪补量条件与阶梯)、adj781(触摸下不自动收起)、adj782(块内空带)、adj784(不做模式相关落位); - 另有两道防复发闸门:CSS 结构(括号平衡、嵌套不超
@media一层、同层不得"选择器紧跟选择器")
与类名 ↔ CSS 覆盖(代码里发出的每个 jps 类都要有规则,需两套作用域的必须两边都有)——
这两道正是为了封住本版自查中发现过的"断言绿、样式死"盲区; node scripts/release-body.mjs命中当版# 爱记谱 iJipu 0.34.0。