mcpField
J
json-canvas

json-canvas

github.com/kepano生产力50.3k75.1k 次安装6 周前更新
代码仓库

关于 json-canvas

json-canvas 是用于创建、编辑和验证符合 JSON Canvas Spec 1.0 的 `.canvas` 文件的技能,说明节点和边的结构、布局及引用完整性。

主要功能

  1. 01创建和编辑画布节点与边
  2. 02使用文本、文件、链接和分组节点
  3. 03设置位置、尺寸、颜色和标签
  4. 04验证 ID 唯一性及边引用
  5. 05检查 JSON 结构和必需字段

适用场景

  1. 01绘制思维导图或流程图
  2. 02在画布上排列文件和笔记
  3. 03用带标签的边连接画布节点

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kepano/obsidian-skills --skill json-canvas

安装后在 Claude Code 中输入/json-canvas确认已加载。

附带文件references/EXAMPLES.md

详细介绍

JSON Canvas 技能

文件结构

一个 canvas 文件(.canvas)包含两个顶层数组,遵循 JSON Canvas Spec 1.0:

{
  "nodes": [],
  "edges": []
}
  • nodes(可选):节点对象数组
  • edges(可选):连接节点的边对象数组

常见工作流

1. 创建新 Canvas
  1. 创建一个 .canvas 文件,基础结构为 {"nodes": [], "edges": []}
  2. 为每个节点生成唯一的 16 字符十六进制 ID(例如 "6f0ad84f44ce9c17")
  3. 添加节点,并包含必需字段:id、type、x、y、width、height
  4. 添加边,通过 fromNode 和 toNode 引用有效的节点 ID
  5. 验证:解析 JSON 以确认其有效。验证所有 fromNode/toNode 值都存在于 nodes 数组中
2. 向现有 Canvas 添加节点
  1. 读取并解析现有的 .canvas 文件
  2. 生成一个不会与现有节点或边 ID 冲突的唯一 ID
  3. 选择不会与现有节点重叠的位置(x、y)(留出 50-100px 间距)
  4. 将新的节点对象追加到 nodes 数组
  5. 可选:添加连接新节点与现有节点的边
  6. 验证:确认所有 ID 均唯一,且所有边引用都能解析到现有节点
3. 连接两个节点
  1. 确定源节点和目标节点 ID
  2. 生成一个唯一的边 ID
  3. 将 fromNode 和 toNode 设置为源和目标 ID
  4. 可选:设置 fromSide/toSide(top、right、bottom、left)作为锚点
  5. 可选:设置 label 作为边上的描述文本
  6. 将该边追加到 edges 数组
  7. 验证:确认 fromNode 和 toNode 都引用了现有节点 ID
4. 编辑现有 Canvas
  1. 以 JSON 读取并解析 .canvas 文件
  2. 通过 id 定位目标节点或边
  3. 修改所需属性(文本、位置、颜色等)
  4. 将更新后的 JSON 写回文件
  5. 验证:编辑后重新检查所有 ID 唯一性和边引用完整性

节点

节点是放置在 canvas 上的对象。数组顺序决定 z-index:第一个节点 = 最底层,最后一个节点 = 最顶层。

通用节点属性
属性必需类型描述
id是string唯一的 16 字符十六进制标识符
type是stringtext、file、link 或 group
x是integerX 位置(像素)
y是integerY 位置(像素)
width是integer宽度(像素)
height是integer高度(像素)
color否canvasColor预设 "1"-"6" 或十六进制(例如 "#FF0000")
文本节点
属性必需类型描述
text是string使用 Markdown 语法的纯文本
{
  "id": "6f0ad84f44ce9c17",
  "type": "text",
  "x": 0,
  "y": 0,
  "width": 400,
  "height": 200,
  "text": "# Hello World\n\nThis is **Markdown** content."
}

换行陷阱:在 JSON 字符串中使用 \n 表示换行。不要使用字面量 \\n -- Obsidian 会将其渲染为字符 \ 和 n。

文件节点
属性必需类型描述
file是string系统内文件的路径
subpath否string指向标题或块的链接(以 # 开头)
{
  "id": "a1b2c3d4e5f67890",
  "type": "file",
  "x": 500,
  "y": 0,
  "width": 400,
  "height": 300,
  "file": "Attachments/diagram.png"
}
链接节点
属性必需类型描述
url是string外部 URL
{
  "id": "c3d4e5f678901234",
  "type": "link",
  "x": 1000,
  "y": 0,
  "width": 400,
  "height": 200,
  "url": "https://obsidian.md"
}
分组节点

分组是用于组织其他节点的可视化容器。将子节点放置在分组边界内。

属性必需类型描述
label否string分组的文本标签
background否string背景图片的路径
backgroundStyle否stringcover、ratio 或 repeat
{
  "id": "d4e5f6789012345a",
  "type": "group",
  "x": -50,
  "y": -50,
  "width": 1000,
  "height": 600,
  "label": "Project Overview",
  "color": "4"
}

边

边通过 fromNode 和 toNode ID 连接节点。

属性必填类型默认值描述
id是string-唯一标识符
fromNode是string-源节点 ID
fromSide否string-top、right、bottom 或 left
fromEnd否stringnonenone 或 arrow
toNode是string-目标节点 ID
toSide否string-top、right、bottom 或 left
toEnd否stringarrownone 或 arrow
color否canvasColor-线条颜色
label否string-文本标签
{
  "id": "0123456789abcdef",
  "fromNode": "6f0ad84f44ce9c17",
  "fromSide": "right",
  "toNode": "a1b2c3d4e5f67890",
  "toSide": "left",
  "toEnd": "arrow",
  "label": "leads to"
}

颜色

canvasColor 类型接受十六进制字符串或预设编号:

预设颜色
"1"红色
"2"橙色
"3"黄色
"4"绿色
"5"青色
"6"紫色

预设颜色值故意未定义——应用使用自己的品牌颜色。

ID 生成

生成 16 个小写十六进制字符的字符串(64 位随机值):

"6f0ad84f44ce9c17"
"a3b2c1d0e9f8a7b6"

布局指南

  • 坐标可以为负(画布无限延伸)
  • x 向右递增,y 向下递增;位置是左上角
  • 节点之间间隔 50-100px;分组内部留 20-50px 内边距
  • 对齐到网格(10 或 20 的倍数)以获得更整洁的布局
节点类型建议宽度建议高度
小文本200-30080-150
中文本300-450150-300
大文本400-600300-500
文件预览300-500200-400
链接预览250-400100-200

验证清单

创建或编辑画布文件后,请验证:

  1. 所有 id 值在节点和边中均唯一
  2. 每个 fromNode 和 toNode 都引用了现有的节点 ID
  3. 每种节点类型的必填字段均已存在(文本节点为 text,文件节点为 file,链接节点为 url)
  4. type 是以下之一:text、file、link、group
  5. fromSide/toSide 值是以下之一:top、right、bottom、left
  6. fromEnd/toEnd 值是以下之一:none、arrow
  7. 颜色预设是 "1" 到 "6" 或有效的十六进制(例如 "#FF0000")
  8. JSON 有效且可解析

如果验证失败,请检查重复的 ID、悬空的边引用或格式错误的 JSON 字符串(尤其是文本内容中未转义的换行符)。

完整示例

有关完整的画布示例(包括思维导图、项目看板、研究画布和流程图),请参阅 references/EXAMPLES.md。

参考资料

评论

支持 Markdown