json-canvas

json-canvas

热门

创建和编辑 JSON Canvas 文件(.canvas),支持节点、边、分组和连接。适用于处理 .canvas 文件、创建可视化画布、思维导图、流程图,或当用户提到 Obsidian 中的 Canvas 文件时使用。

3.6万Star
2792Fork
更新于 2026/6/21
SKILL.md
readonly只读
name
json-canvas
description

创建和编辑 JSON Canvas 文件(.canvas),支持节点、边、分组和连接。适用于处理 .canvas 文件、创建可视化画布、思维导图、流程图,或当用户提到 Obsidian 中的 Canvas 文件时使用。

JSON Canvas 技能

文件结构

一个 canvas 文件(.canvas)包含两个顶级数组,遵循 JSON Canvas 规范 1.0

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

常见工作流程

1. 创建新画布

  1. 创建一个 .canvas 文件,包含基础结构 {"nodes": [], "edges": []}
  2. 为每个节点生成唯一的 16 字符十六进制 ID(例如 "6f0ad84f44ce9c17"
  3. 添加节点,包含必填字段:idtypexywidthheight
  4. 添加边,通过 fromNodetoNode 引用有效的节点 ID
  5. 验证:解析 JSON 确认其有效。确认所有 fromNode/toNode 值存在于 nodes 数组中

2. 向现有画布添加节点

  1. 读取并解析现有的 .canvas 文件
  2. 生成一个不与现有节点或边 ID 冲突的唯一 ID
  3. 选择位置(xy),避免与现有节点重叠(留出 50-100px 间距)
  4. 将新节点对象追加到 nodes 数组
  5. 可选地添加边,将新节点连接到现有节点
  6. 验证:确认所有 ID 唯一,且所有边引用都解析到现有节点

3. 连接两个节点

  1. 确定源节点和目标节点 ID
  2. 生成唯一的边 ID
  3. fromNodetoNode 设置为源和目标 ID
  4. 可选地设置 fromSide/toSide(top、right、bottom、left)作为锚点
  5. 可选地设置 label 作为边上的描述文本
  6. 将边追加到 edges 数组
  7. 验证:确认 fromNodetoNode 都引用现有的节点 ID

4. 编辑现有画布

  1. .canvas 文件作为 JSON 读取并解析
  2. 通过 id 定位目标节点或边
  3. 修改所需属性(文本、位置、颜色等)
  4. 将更新后的 JSON 写回文件
  5. 验证:编辑后重新检查所有 ID 唯一性和边引用完整性

节点

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

通用节点属性

属性 必填 类型 描述
id string 唯一的 16 字符十六进制标识符
type string textfilelinkgroup
x integer X 位置(像素)
y integer Y 位置(像素)
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 string coverratiorepeat
{
  "id": "d4e5f6789012345a",
  "type": "group",
  "x": -50,
  "y": -50,
  "width": 1000,
  "height": 600,
  "label": "Project Overview",
  "color": "4"
}

边通过 fromNodetoNode ID 连接节点。

属性 必填 类型 默认值 描述
id string - 唯一标识符
fromNode string - 源节点 ID
fromSide string - toprightbottomleft
fromEnd string none nonearrow
toNode string - 目标节点 ID
toSide string - toprightbottomleft
toEnd string arrow nonearrow
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-300 80-150
中文本 300-450 150-300
大文本 400-600 300-500
文件预览 300-500 200-400
链接预览 250-400 100-200

验证清单

创建或编辑 canvas 文件后,验证:

  1. 所有 id 值在节点和边中唯一
  2. 每个 fromNodetoNode 引用一个存在的节点 ID
  3. 每个节点类型存在必填字段(文本节点有 text,文件节点有 file,链接节点有 url
  4. type 是以下之一:textfilelinkgroup
  5. fromSide/toSide 值是以下之一:toprightbottomleft
  6. fromEnd/toEnd 值是以下之一:nonearrow
  7. 颜色预设为 "1""6" 或有效的十六进制(例如 "#FF0000"
  8. JSON 有效且可解析

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

完整示例

参见 references/EXAMPLES.md 获取完整的画布示例,包括思维导图、项目看板、研究画布和流程图。

参考