ObsidianでもTOCしたい

作成:
heroimage

VSCodeだとMarkdownファイルのTOC(目次)が簡単に生成できるのでObsidianだけでMarkdownファイルを書くことが完結できない点だったがObsidianプラグインのTemplaterによってそれが実現できたので記録しておく。

まずObsidianのコミュニティプラグインからTemplaterを導入する。これはObsidianのTemplateでjavascriptを動作させるためのものだ。

Templateフォルダ内にTOCという名前で以下の内容のファイルを設置。

<%*
  const slide = [0,2,4,6,8,10];
  s = tp.file.content;
  p = s.split("\n")
        .filter(x => x.match(/^#+\s/))
        .map(x => {
            d = x.split(" ")[0].length;
            s = x.substr(d+1)
            sr = s.toLowerCase().replace(/[!\?\.!?.、。()()**]/g,'').replace(/\s+/g,'-');
            link = "[" + s + "](#" + sr +")";
            return " ".repeat(slide[d-2]) + "- " + link;
        }).join("  \n");
  return "\n" + p + "\n";
%>

生成されるTOCはVSCodeと同じものが生成されるようにした。

ここでVSCodeの挙動を確認していたところ見出しに()や、。などを入れるとリンクが正しく動作しないようなので使わないようにしなければいけないことが分かった。

とりあえず挙動はVSCodeと一緒ではあるもののそれらの記号が見出しに入っているとリンクは正しく動作しない。

Markdownファイルを開いている状態で左のツールバーから <% を押しTOCを選ぶと現在カーソル位置にTOCが挿入される。

Obsidianのfrontmatterの引用符問題

AstroではDateだけは引用符で囲まないとエラーを起こすようでObsidianは各frontmatter要素を引用符で囲まない。

しかしスペースを{date} {time}の行の先頭に一つ挿入すると二重引用符で囲むのでTemplateのfrontmatterを修正した。

根本的な解決方法は分からない。