🐺
Obsidianでzennのtopics毎のmapを見てみる
モチベーション
Obsidian
の機能にグラフビューやローカルビューという機能があるので
zennで書いてきた記事がどのようなtopicについて書いているのか可視化できると嬉しいなと思ったのでやってみた。
ゴール
各topicに紐づく記事をどれぐらい書いたのか見れる
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コードを実行することもできる。
フォルダーの指定
デフォルトのままだとルートから全てのファイルを参照するので
特定のディレクトリのみ参照するように設定を加えておくと楽です。
設定の項目名としてはTemplate folder location
です。
Templates Shoecase
他にも様々なTemplateがgithub
のdiscussions
で見ることができます。
dataview
Dataview JavaScript APIを使用することで、dataviewのインデックスとクエリーエンジンにアクセスして任意のJavaScriptを実行することができます。
Discussion