指定したパターンにマッチした文字列を処理する 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 タグを生成しています。