🐺

Obsidianでzennのtopics毎のmapを見てみる

2024/12/08に公開

モチベーション

Obsidianの機能にグラフビューやローカルビューという機能があるので
zennで書いてきた記事がどのようなtopicについて書いているのか可視化できると嬉しいなと思ったのでやってみた。

ゴール

各topicに紐づく記事をどれぐらい書いたのか見れる

e2e_with_article
e2eというトピックに紐づく記事をどれぐらい書いたのか見れる

方法

Templater pluginでスクリプトを書く

実装

今回スクリプトを作成するにあたり下記プラグインを使用しています。

  • Templater
  • dataview
<%*
const dv = this.app.plugins.plugins["dataview"].api;
const topicsMap = new Map();
const topicsFolder = "topics/";

// ファイル名のエスケープ関数
function escapeFileName(name) {
  return name.replace(/[\/\\?%*:|"<>]/g, '_'); // 禁止文字をアンダースコアに置き換え
}

// トピックフォルダの既存ファイルを削除
const existingFiles = await this.app.vault.adapter.list(topicsFolder);
if (existingFiles?.files) {
  for (const file of existingFiles.files) {
    await this.app.vault.adapter.remove(file);
  }
}

// 全ノートを取得
const pages = dv.pages().where(p => p.topics);

// トピックごとにノートを分類
for (const page of pages) {
  if (Array.isArray(page.topics)) {
    for (const topic of page.topics) {
      if (!topicsMap.has(topic)) {
        topicsMap.set(topic, []);
      }
      topicsMap.get(topic).push(page.file.name);
    }
  }
}

// トピックごとに索引ページを作成
for (const [topic, files] of topicsMap.entries()) {
  const escapedTopic = escapeFileName(topic); // トピック名をエスケープ
  const topicFilePath = `${topicsFolder}${escapedTopic}.md`;
  let content = `# ${topic}\n\n## 関連ノート\n`;
  for (const file of files) {
    content += `- [[${file}]]\n`;
  }
  await this.app.vault.adapter.write(topicFilePath, content);
}

%>

流れ

  • ファイル名のエスケープ関数
  • トピックフォルダの既存ファイルを削除
  • 全ノートを取得
  • トピックごとにノートを分類
  • トピックごとに索引ページを作成

実行

作成したら対象のファイルをTemplaterから実行します。

Templaterをinstallすると、画面の左側にアイコンに追加されるので
アイコンをクリックすることで実行したいファイルを選択できます。

補足

本記事で出てきた文献やらリファレンスやら

Templater

Templaterは、変数や関数の結果をノートに挿入できるテンプレート言語です。
変数や関数を操作するJavaScriptコードを実行することもできる。

https://github.com/SilentVoid13/Templater

フォルダーの指定

デフォルトのままだとルートから全てのファイルを参照するので
特定のディレクトリのみ参照するように設定を加えておくと楽です。

設定の項目名としてはTemplate folder locationです。

https://silentvoid13.github.io/Templater/settings.html#folder-templates

Templates Shoecase

他にも様々なTemplateがgithubdiscussionsで見ることができます。

https://github.com/SilentVoid13/Templater/discussions/categories/templates-showcase

dataview

Dataview JavaScript APIを使用することで、dataviewのインデックスとクエリーエンジンにアクセスして任意のJavaScriptを実行することができます。

https://blacksmithgu.github.io/obsidian-dataview/api/code-reference/

Discussion