使用 dataviewjs 搜索列出 当前文件 在 canvas 内的关系

得以于 canvas 是 json 文件,借助 dataviewjs 将 canvas 的关系提取出来

感觉大家不怎么关注白板的关系整理,相关的插件也很少(只找到一个插件可以显示当前文件所出现的白板),是没有这方面需求吗?

列表样式

```dataviewjs
const targetCanvases = ["B.canvas","A.canvas"] //可以为空[],为空[]时搜索所有canvas
const labels = ["label1","label2"] ////可以为空[],为空[]时搜索所有label

const currentFile = dv.current(); //当前文件

// 依据文件名
let canvasFiles
if (targetCanvases.length === 0){
  // 获取所有 Canvas 文件
  canvasFiles = app.vault.getFiles().filter(file => file.extension === "canvas");
} else {
  canvasFiles = app.vault.getFiles().filter(file => file.extension === "canvas" && targetCanvases.includes(file.name));
}

// 创建一个对象来存储分组结果
let groupedResults = {};

for (let file of canvasFiles) {
  // 读取 Canvas 文件内容
  const content = await app.vault.read(file);
  
  // 解析 JSON 内容
  const canvasData = JSON.parse(content);
  
  // 查找文件名为当前文件的节点
  const targetNode = canvasData.nodes.find(node => 
    node.type === "file" && node.file === currentFile.file.link.path
  );
  
  if (targetNode) {
    // 查找从目标节点出发的边,依据 labels 筛选
    const connectedEdges = canvasData.edges.filter(edge => 
      edge.fromNode === targetNode.id && 
      (labels.length === 0 || (edge.label && labels.includes(edge.label)))
    ); 
    
    // 对于每个连接的边,查找目标节点并提取信息
    connectedEdges.forEach(edge => {
      const connectedNode = canvasData.nodes.find(node => node.id === edge.toNode);
      if (connectedNode) {
        const groupKey = `${file.name} - ${edge.label || 'No Label'}`;
        if (!groupedResults[groupKey]) {
          groupedResults[groupKey] = [];
        }
        if (connectedNode.type === "file") {
          groupedResults[groupKey].push(connectedNode.file);
        } else if (connectedNode.type === "text") {
          groupedResults[groupKey].push(connectedNode.text);
        }
      }
    });
  }
}

// 显示分组结果
for (let groupKey in groupedResults) {
  dv.header(3, groupKey);
  dv.list(groupedResults[groupKey]);
}
```

callout样式,适合多行文本

```dataviewjs
const targetCanvases = ["B.canvas","A.canvas"] //指定canvas,为空时搜索所有canvas
const labels = ["label1","label2"] //可以为空[],为空时搜索所有label

const currentFile = dv.current();//当前文件

// 依据文件名
let canvasFiles
if (targetCanvases.length === 0){
  // 获取所有 Canvas 文件
  canvasFiles = app.vault.getFiles().filter(file => file.extension === "canvas");
} else {
  canvasFiles = app.vault.getFiles().filter(file => file.extension === "canvas" && targetCanvases.includes(file.name));
}

// 创建一个对象来存储分组结果
let groupedResults = {};

for (let file of canvasFiles) {
  // 读取 Canvas 文件内容
  const content = await app.vault.read(file);
  
  // 解析 JSON 内容
  const canvasData = JSON.parse(content);
  
  // 查找文件名为当前文件的节点
  const targetNode = canvasData.nodes.find(node => 
    node.type === "file" && node.file === currentFile.file.link.path
  );
  
  if (targetNode) {
    // 查找从目标节点出发的边,依据 labels 筛选
    const connectedEdges = canvasData.edges.filter(edge => 
      edge.fromNode === targetNode.id && 
      (labels.length === 0 || (edge.label && labels.includes(edge.label)))
    ); 
    
    // 对于每个连接的边,查找目标节点并提取信息
    connectedEdges.forEach(edge => {
      const connectedNode = canvasData.nodes.find(node => node.id === edge.toNode);
      if (connectedNode) {
        const groupKey = `${file.name} - ${edge.label || 'No Label'}`;
        if (!groupedResults[groupKey]) {
          groupedResults[groupKey] = [];
        }
        if (connectedNode.type === "file") {
          groupedResults[groupKey].push(connectedNode.file);
        } else if (connectedNode.type === "text") {
          groupedResults[groupKey].push(connectedNode.text);
        }
      }
    });
  }
}

// 显示分组结果
for (let groupKey in groupedResults) {
  dv.header(3, groupKey);
  const container = dv.el("div", "", {cls: "callout"});
  groupedResults[groupKey].forEach((item, index) => {
    container.appendChild(dv.el("div", item, {cls: "callout"}));
    // 如果不是最后一个元素,添加一个换行
    if (index < groupedResults[groupKey].length - 1) {
      container.appendChild(dv.el("br"));
    }
  });
}
```

关系整理 … 是没有这方面需求吗?

Excalidraw 的作者写过连线图转线性笔记,可看下:

1 个赞