Skip to content
Go back

Obsidianで見出しが重複したらどうなる?

  • 見出し名が重複してしまった
    • Obsidianでは、見出し名でリンク先を指定するので、遷移先が曖昧になってしまう
    • Hugoでは、見出し名をIDに利用するので、IDも重複してしまうのでは?
  • Obsidianでは、[[#A#B]]のように階層的に書ける
    • 階層全体で重複しているとこの方法は使えない
    • この方法を採用すると、Hugo側で追加の処理が必要になる
  • Hugoでは、idの末尾に-1が付くので、重複しないようになっていた
    • リンク先は変更後のIDで指定しなければならないので、ちょっと面倒
    • Obsidian側でこれをやらせるのは難しそう
  • ブロックへのリンク記法で代用するのが現状では一番簡単そう
    • 見出しにも任意にidを付けられる
    • Hugo側は先日に作った分がある
      • 見出しにはすでにidが付いているので、新たにidを付けるには内側をspanで囲む必要がある
  • とりあえず、以下のような感じになった
{{- /* Obsidianの"ブロックへのリンク"記法をHTML要素のIDに置き換える */ -}}

{{- /* id記法のある段落を探す */ -}}
{{- range findRESubmatch `(?:((?:.|\n)*?)\^([\w-]+)<\/p>)|((?:.|\n)*)` .Content -}}
    {{- $matched := index . 0 -}}
    {{- $content := index . 1 -}}
    {{- $id := index . 2 -}}
    {{- $others := index . 3 -}}

    {{- /* id記法を持つ段落がなければ、なにもしない */ -}}
    {{- with $others -}}
        {{- . | safeHTML  -}}
        {{- continue -}}
    {{- end -}}

    {{- /* 段落の文末にid記法があれば、その段落にid属性を付与する */ -}}
    {{- $m := findRESubmatch `((?:.|\n)*)<p((?:.|\n)+) $` $content 1 -}}
    {{- if gt (len $m) 0 -}}
        {{- with index $m 0 -}}
            {{- index . 1 | safeHTML -}}
            {{- print `<p id="` $id `"` (index . 2) `</p>` | safeHTML -}}
        {{- end -}}
        {{- continue -}}
    {{- end -}}

    {{- /* 段落にid記法だけがあれば、その段落の直前の要素にid属性を付与する */ -}}
    {{- $m := findRESubmatch `((?:.|\n)*)<span class="katex"><math((?:.|\n)+</math></span>\s*)<p>$` $content 1 -}}
    {{- if gt (len $m) 0 -}}
        {{- with index $m 0 -}}
            {{- index . 1 | safeHTML -}}
            {{- print `<span class="katex"><math id="` $id `"` (index . 2) | safeHTML -}}
        {{- end -}}
        {{- continue -}}
    {{- end -}}

    {{- /* 段落にid記法だけがあれば、その段落の直前の要素にid属性を付与する */ -}}
    {{- $m := findRESubmatch `((?:.|\n)*)(<h[1-6] id=".*?">)((?:.|\n)+)(</h[1-6]>\s*)<p>$` $content 1 -}}
    {{- if gt (len $m) 0 -}}
        {{- with index $m 0 -}}
            {{- index . 1 | safeHTML -}}
            {{- print (index . 2) `<span id="` $id `">` (index . 3) `</span>` (index . 4) | safeHTML -}}
        {{- end -}}
        {{- continue -}}
    {{- end -}}

    {{- /* 該当する要素がなければ、なにもしない */ -}}
    {{- $matched | safeHTML -}}
{{- end -}}
  • 数式や見出しに対する処理は統合しても良さそう
    • パフォーマンスが良くなるなら
  • そもそもの話、見出しが重複しないように気をつければ良いだけのような気もする

abc#

#^e77d8a