English | 简体中文
一个 Obsidian 插件:把 Markdown 笔记的排版规范化或紧凑化,把 JSON 美化成可读结构或压缩成一行。
纯本地运行,零网络请求,零运行时依赖。
四条命令,全部可在「设置 → 快捷键」中搜索 Note to JSON 重新绑定:
| 命令 | 说明 | 默认热键 |
|---|---|---|
| 格式化 | 规范化 Markdown 结构:标题、列表、空行、代码块、表格 | Ctrl+Alt+F |
| 简化 | 去掉多余空行,让笔记更紧凑(绝不合并段落) | Ctrl+Alt+S |
| 格式化 JSON | 用 2 空格缩进重排 JSON | Ctrl+Alt+J |
| 压缩 JSON | 删除全部空白,压成单行 | Ctrl+Alt+M |
editor.transaction,Ctrl+Z 一步回滚。手动安装:
npm install && npm run build 生成 main.js。manifest.json、main.js、versions.json 复制到 <你的仓库>/.obsidian/plugins/note-to-json/。| 规则 | 名称 | 行为 |
|---|---|---|
| F1 | 标题规范化 | # 与文字之间只保留一个空格;#标签 视为 Obsidian 标签,不处理 |
| F2 | 行尾空白清理 | 删除每行末尾的空格与制表符 |
| F3 | 连续空行压缩 | 连续多个空行压缩为一个 |
| F4 | 无序列表符号统一 | * 与 + 开头的列表项统一为 - |
| F5 | 强调符统一 | __粗体__ → **粗体**,_斜体_ → *斜体*,跳过 URL、wikilink、snake_case |
| F6 | 列表缩进统一 | 每级缩进统一为 2 个空格 |
| F7 | 标题层级递进 | 一次只能下降一级,跨级会补齐中间层级 |
| F8 | 标题前后空行 | 标题上下各保留恰好一个空行 |
| F9 | 块级元素间隔 | 代码块与表格前后各保留一个空行 |
| F10 | 表格列对齐 | 按列内最长单元格补齐竖线,保留 :--- 对齐标记 |
| F11 | 补代码块语言 | 围栏未写语言时补上设置中的默认语言(默认关闭) |
| 规则 | 名称 | 行为 |
|---|---|---|
| S1 | 行尾空白清理 | 删除每行末尾的空格与制表符 |
| S2 | 连续空行压缩 | 连续多个空行压缩为一个 |
| S3 | 列表项之间空行删除 | 同一列表块内相邻列表项之间的空行删除 |
| S4 | 标题行后空行删除 | 标题下一行是空行则删除 |
| S5 | 文档首尾空行删除 | 删除文档开头与结尾的空行 |
简化不会合并段落:段落之间的空行保留,避免两段被渲染成一段。
以下内容在任何规则下都逐字节不变:
--- 到闭合 ---)``` / ~~~,按标记长度配对)$$ 数学块[[wikilink]]、![[嵌入]]、、URL选区上方的内容会参与状态分析,因此从代码块中间开始选中也不会误把代码当正文改。
格式化不经过 JSON.stringify(JSON.parse(x), null, 2),而是只重排 token 之间的空白,字面量按原文输出:
| 输入 | 输出 |
|---|---|
1740123456789012345 |
原样保留(stringify 会丢精度) |
1e21 |
原样保留(stringify 会写成 1e+21) |
"a\/b\u4e2d" |
原样保留(stringify 会解密重组) |
空容器 {} / [] 保持一行;CRLF 文档写回仍是 CRLF。
从网页、聊天工具或 Excel 复制来的 JSON 常在缩进里混入全角空格(U+3000)、不换行空格(U+00A0)、EM SPACE(U+2003)、零宽空格或 BOM。JSON 规范只认半角空格、Tab、LF、CR,这些字符会让解析失败,但报错片段看起来完全正常。
插件会在字符串字面量之外把这些字符归一化为半角空格,字符串内部一个字符都不改,成功后提示「已修正 N 处全角/特殊空白」。
注释、尾逗号、单引号、NaN 一律判为非法:弹出提示「JSON 语法错误(第 N 行第 M 列:片段),已保持原样」,文档不做任何写回。片段中的不可见字符会显示为 ⟨U+0001⟩ 形式,便于定位。
| 设置 | 默认值 | 说明 |
|---|---|---|
| 格式化规则开关 | F1–F10 开启,F11 关闭 | 逐条控制 |
| 简化规则开关 | S1–S5 全部开启 | 逐条控制 |
| 代码块默认语言 | 空 | F11 补的语言,留空则不补 |
| 操作提示 | 开启 | 是否弹出 Notice |
| 打开快捷键设置 | — | 跳转到 Obsidian 原生快捷键页 |
> | a | b |)不参与对齐与空行规范。#标签 与 #标题 语法上无法区分,插件选择保守不动。 ```js)不被识别为保护区。npm install # 安装依赖
npm run dev # 监听模式,改动即编译
npm run build # 类型检查 + 生产构建,产出 main.js
main.js 是构建产物,已在 .gitignore 中排除,不随源码提交。
manifest.json # 插件清单(id: note-to-json)
versions.json # 版本 → 最低 Obsidian 版本
esbuild.config.mjs # 打包配置
tsconfig.json
src/
main.ts # 插件入口:命令注册、右键菜单、默认热键
settings.ts # 设置类型与默认值
settingsTab.ts # 设置面板
core/
text.ts # 行工具与行内占位符保护
segment.ts # 保护区状态机
rules.ts # 格式化规则 F1–F11
compact.ts # 简化规则 S1–S5
pipeline.ts # 规则管线
json.ts # JSON 校验与 tokenizer 重排
obsidian 作为 externalISC