指定したパターンにマッチした文字列を処理する RegexFor プラグインを利用すると、例えば、ブログ記事内から h* タグを抽出して、目次を自動生成することができます。目的のヘッダにリンクするような目次を生成する場合、アンカー文字列を適切に設定するために、テンプレートにもう一工夫が必要です。このエントリでは、RegexFor プラグインで抽出した目次項目に、リンク可能な目次を生成するためのテンプレートの記述例を解説しています。
テンプレートの前半で無印(?)の h3
タグを抽出し、連番のアンカー付きのリンクで目次を生成しています。また、テンプレートの後半では、ブログ記事に含まれる h3
タグにアンカーを付与しています。
<h1>目次</h1> <mt:SetVar name="header_index" value="1"> <ol><mt:RegexFor tag="mt:EntryMore" regex="<h3>(.+?)</h3>"> <li><a href="#toc-<mt:Var name="header_index">"><mt:Var name="__$1__"></a></li> <mt:SetVar name="header_index" op="++"> </mt:RegexFor></ol> <mt:SetVar name="header_index" value="1"> <mt:RegexReplace tag="mt:EntryMore" regex="<h3>"> <h3 id="toc-<mt:Var name="header_index">"> <mt:SetVar name="header_index" op="++"> </mt:RegexReplace>
tag="mt:EntryMore"
)から、h3
タグを抽出し、タグに挟まれた文字列を __$1__ 変数に取得します。tag="mt:EntryMore"
)から、h3
タグを抽出しています。mt:RegexReplace
ブロックタグを利用して、h3
タグを、ブロックの内容で置き換えます。h3
タグを生成しています。
例-1 では、アンカー文字列は無機質な連番ですが、場合によっては #access
や #topic
といった意味のあるアンカー文字列をユーザが明示したい場合があると思います。
<h1>目次</h1> <ol><mt:RegexFor tag="mt:EntryMore" regex="<h3 id="(.+?)">(.+?)</h3>"> <li><a href="#<mt:Var name="__$1__">"><mt:Var name="__$2__"></a></li> </mt:RegexFor></ol> <mt:EntryMore>
tag="mt:EntryMore"
)から、id プロパティを持った h3
タグを抽出し、id プロパティ値を __$1__ 変数に、タグに挟まれた文字列を __$2__ 変数に取得します。h3
タグには、既にアンカーが設定されているため、そのまま無加工で出力します。この例は、アンカーが明示的に指定されたヘッダと、指定されていないヘッダが混在していても、どちらも処理できるようにしたものです。例-3 のようにユーザが明示的にアンカーを指定している場合には、それをアンカー文字列とし、指定されていない場合には、例-1 のように連番のアンカー文字列を生成します。
<h1>目次</h1> <mt:SetVar name="header_index" value="1"> <ol><mt:RegexFor tag="mt:EntryMore" regex="<h3(?:\s+id="(.+?)")?>(.+?)</h3>"> <mt:If name="__$1__"> <li><a href="#<mt:Var name="__$1__">"><mt:Var name="__$2__"></a></li> <mt:Else> <li><a href="#toc-<mt:Var name="header_index">"><mt:Var name="__$2__"></a></li> <mt:SetVar name="header_index" op="++"> </mt:If> </mt:RegexFor></ol> <mt:SetVar name="header_index" value="1"> <mt:RegexReplace tag="mt:EntryMore" regex="<h3>"> <h3 id="toc-<mt:Var name="header_index">"> <mt:SetVar name="header_index" op="++"> </mt:RegexReplace>
tag="mt:EntryMore"
)から、h3
タグを抽出し、id プロパティが指定されていればその値を __$1__ 変数に、タグに挟まれた文字列を __$2__ 変数に取得します。tag="mt:EntryMore"
)から、id プロパティが指定されていない h3
タグを抽出しています。mt:RegexReplace
ブロックタグを利用して、h3
タグを、ブロックの内容で置き換えます。h3
タグを生成しています。