- 先日、HugoでルビやWikilinkを扱えるようにしたが、
.Content全体に置換を適用する都合上、不要なところまで置き換わってしまっていた
- エスケープされたものは
.Content上で見分けがつかないので、この方法では対処のしようがない
- コードブロックにあるものは
<code>タグの内外を考えればできそう
post_content.htmlを以下のように変更した
<codeと</code>で.Contentを分割して、コードブロックの外にある文字列だけに置換処理を行う
<code>にも属性が付いたりするので、それを含めるために<codeでsplitしている
- 今回のようにsplitの区切り文字は文字列でも良いらしい
{{- /* コードブロックの外だけに置換処理を適用する。 */ -}}
{{- $s1 := split .Content "<code" -}}
{{- $content := partial "replace-content.html" (index $s1 0) -}}
{{- range after 1 $s1 -}}
{{- $s2 := split . "</code>" -}}
{{- $content = (print $content "<code" (index $s2 0) "</code>" (partial "replace-content.html" (index $s2 1))) | safeHTML -}}
{{- end -}}
{{- $content -}}
replace-content.htmlは以下の内容で作る
{{- . | partial "replace-japanese-novel-ruby.html" | partial "replace-wikilinks.html" -}}
replace-wikilinks.htmlは以下のように修正した
.Pageはpage関数でどこからでも取得できるようなので、引数としてcontentのみを受け取るようにした
- 以前だと
[[1]][[2]]のようにリンクが連続した場合にひとまとまりでマッチしてしまう不具合がでていたので、]を越えないようにした
try関数を使うとエラーを処理できるようになるそうが、relrefでは上手くいかなかったので使っていない
{{- $content := . -}}
{{- range ((findRESubmatch `\[\[(([^#\|\]\n<>]*)(?:#([^\|\]\n]*))?)(?:\|([^\]\n]*))?\]\]` $content) | uniq) -}}
{{- $url := "" -}}
{{- /* リンク先のパスが指定されていれば、それをURLに変換する */ -}}
{{- $name := (index . 2) -}}
{{- if $name -}}
{{- $url = print (relref page $name) -}}
{{- if eq $url "" -}}
{{- /* 指定のリンク先が存在しなければ、リンクを置き換えない */ -}}
{{- continue -}}
{{- end -}}
{{- end -}}
{{- /* リンク先のIDが指定されていれば、それをURLに変換する */ -}}
{{- $id := (index . 3) -}}
{{- if $id -}}
{{- $url = print $url "#" (anchorize $id) -}}
{{- end -}}
{{- $content = replace $content (index . 0) (print "<a href=\"" $url "\">" (or (index . 4) (index . 1)) "</a>") -}}
{{- end -}}
{{- $content | safeHTML -}}
- 最後に、不要な空白や改行がHTMLに現れていたので、全体的に
{{- -}}を使うように修正した