- 昨日の続き
- Wikilink形式を置換処理で実装したときと同様に、特定のパターンを持つ文字列のスパンに分割してから置換処理を適用するほうが楽だと思う
- 結局、以下のようになった
- まず
^idを見つけて、次にその直前の要素に応じて置換え方を変えている
{{- /* 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)+)<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 -}}
{{- /* 該当する要素がなければ、なにもしない */ -}}
{{- $matched | safeHTML -}}
{{- end -}}
- ネストするタグをどう処理すれば良いかは必要になってから考えます
- ネストの深いパターンからに手動でチェックしていけばできそう?