Skip to content

Releases: snailhome/obsidian-ijipu

v0.37.0

Choose a tag to compare

@github-actions github-actions released this 13 Oct 00:32

爱记谱 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 -skipLibCheck 0 错;npm run smoke 511 passed, 0 failed
    —— 含 adj733(嵌入版版本)与 adj770(vendor/engine 与应用引擎逐字节一致);
  • npm run build 通过,产物已同步到本地库做实测。

待办(未修,已登记在 docs/TODO.md)

  • 切「整页」视图时 .jps 文件页预览持续抖动(嵌入块不抖):疑为"整页拟合 ⇄ 容器尺寸"反馈回路;
  • 某份谱的"墨迹盒被一个看不见却有 bbox 的元素撑宽"(实测 952 vs 页宽 595)⇒ 该谱谱面视图右侧留白;
    等多份谱都复现再查(现按用户裁定保持原实现,不为个别谱加特判)。

0.36.3

Choose a tag to compare

@github-actions github-actions released this 12 Oct 13:47

爱记谱 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 -skipLibCheck 0 错;npm run smoke 494 passed, 0 failed
    —— 含 adj733(嵌入版版本闸门,本轮转绿)与 adj770(vendor/engine 与应用引擎逐字节一致);
  • vendor/engine 与应用引擎逐文件哈希零差异(49 = 49;本轮同步 layout/index.ts 与 render/index.ts);
  • npm run build 通过。

0.36.2

Choose a tag to compare

@github-actions github-actions released this 12 Oct 04:42

爱记谱 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 -skipLibCheck 0 错;npm run smoke 494 passed, 0 failed
    —— 含 adj887 三条(v= 取值表、v=full 的歧义提示、z/v 共用边界常量)
    与 adj733(嵌入版版本闸门,本轮转绿);
  • vendor/engine 与应用引擎逐文件哈希零差异(49 = 49;本轮应用引擎未改);
  • npm run build 通过。

0.36.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 12:46

爱记谱 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 -skipLibCheck 0 错;npm run smoke 447 passed, 0 failed
    (含 adj733:嵌入版产物版本 == 应用 APP_VERSION(0.53.0));
  • 发布后终验:CI 产物与本地同提交重建逐字节比对 → 装进用户库 → gh attestation verify。

0.35.2

Choose a tag to compare

@github-actions github-actions released this 11 Oct 08:29

爱记谱 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 -skipLibCheck 0 错;npm run smoke 387 passed, 0 failed
    (含 adj733:嵌入版产物版本 == 应用 APP_VERSION ✓ —— 本版正是靠它确认"重新 embed"确实生效 ✓);
  • 发布后终验:CI 产物与本地同提交重建逐字节比对 → 装进用户库 → gh attestation verify ✓。

0.35.1

Choose a tag to compare

@github-actions github-actions released this 11 Oct 07:53

爱记谱 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 -skipLibCheck 0 错;npm run smoke 387 passed, 0 failed
    (含 adj733:嵌入版产物版本 == 应用 APP_VERSION ✓ —— 本版正是靠它确认"重新 embed"确实生效 ✓);
  • 发布后终验:CI 产物与本地同提交重建逐字节比对 → 装进用户库 → gh attestation verify ✓。

0.35.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 05:55

爱记谱 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 留名待后续)

安全边界(写死在代码里,有闸门守):

  1. 总开关默认关闭(设置 → iJipu → 嵌入版 → 「开发者:允许嵌入版调用插件能力」✓;仅本会话有效 ✓,关闭时一律回「未启用」);
  2. 来源校验:只接受"src 含本插件 token 的 iframe"那个窗口发来的消息 ✓,否则直接忽略、不回包(避免被探测);
  3. 方法白名单 + 参数逐项校验(类型/长度/枚举 ✓,不做"尽力解析");
  4. 路径规则:只允许 vault 内相对路径,禁绝对路径 / 盘符 / .. / NUL;
  5. 错误码 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 -skipLibCheck 0 错;npm run smoke 387 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

Choose a tag to compare

@github-actions github-actions released this 11 Oct 05:00

爱记谱 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 §六之四,
按项目"元规则"同时给出 ① 自动加载的规范 与 ② 机器闸门:

  1. 禁直接写内联样式(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),
    键是变量、规则判不了"静态"),新增此类写法必须在注释里写明理由;
  2. 同类 Error/Warning 一览表(内联样式 / !important / innerHTML / console.* /
    import 'node:*'(静态导入是刻意的,附原因)/ fetch / getSettingDefinitions() / Build verification);
  3. 发布前"审核预检"三步: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 -skipLibCheck 0 错;npm run smoke 384 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

Choose a tag to compare

@github-actions github-actions released this 11 Oct 04:12

爱记谱 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 -skipLibCheck 0 错;npm run smoke 383 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

Choose a tag to compare

@github-actions github-actions released this 10 Oct 14:23

爱记谱 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 -skipLibCheck 0 错;npm run smoke 377 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。