Movable Type ユーザーコミュニティであった、本文から目次を生成できないか?という質問がきっかけです。正規表現の global match でマッチした文字列について、テンプレートタグでゴニョゴニョできれば便利かも? と思って作ってみました。
記事本文の HTML から、JavaScript を利用してクライアント サイドで目次を生成することも可能ですが、Google など一部の検索エンジンでは、検索結果にページ内の目次セクションのレベルでリンクやスニペットを表示してくれるものがあります*1。そのため、サーバ サイドで目次を生成しておく方が、SEO の観点からも好ましいと思われます。
次の例は、ブログ記事の追記フィールドの内容から、<h2>
タグでマークアップされたヘッダを目次として抽出・整形・表示します。
<ol><mt:RegexFor tag="mt:EntryMore" regex="<h2.*?>(.+?)</h2>"> <li><mt:var name="__$1__"></li> </mt:RegexFor></ol>
単純な文字列置換であれば regex_replace
モディファイアを使えばよいのですが、置換する文字列をマッチした内容に応じて条件分岐などの制御構文で切り替えるなど、複雑な処理を書けるようにします*2。
<mt:SetVar name="string" value="The quick brown fox jumps over the lazy dog."> <mt:RegexReplace name="string" regex="(\w+ (fox|dog))"> crazy <mt:if name="__$2__" eq="dog"> cat <mt:else> <mt:var name="__$2__"> </mt:if> </mt:RegexReplace>
mt:RegexFor
と mt:RegexReplace
の動作はほとんど同じに見えます。大きな違いは、テンプレート タグの出力として、mt:RegexFor
はパターン マッチした部分を取り出して、マッチしなかった部分は捨てられます。mt:RegexReplace
ではパターン マッチした部分を取り出して処理しつつ、マッチしなかった部分はそのまま出力されるという点です。
v0.10.386
) ... 公式リリースされた最新版で、バグ報告やサポートの対象になります。通常はこちらをご利用ください。master
) ... バグ修正や機能追加など開発途中のバージョンです。開発中の新機能などをいち早く利用できますが、新しいバグが生まれていたり、テストが不十分な場合があります。
plugins
フォルダに配置してください。データベースのアップグレード工程はありません。
プラグインに関する設定はありません。
寄せられたコメント (全 5 件中、最新 5 件まで表示しています)
http://www.magicvox.net/archive/2014/10301938/
気づいたら、目次は表示されていますが、リンクが張られていません。どこかいじってしまったのか…と思いつつ、該当する点を見つけられずにいます。
<mt:If tag="mt:EntryMore">~</mt:If> で「続き」なしの短い記事には目次なし、長い記事には目次あり…もできました。
http://careerup.biz/fashion/brand/crocs/colorlite.html
<mt:If tag="mt:EntryMore">~</mt:If> で、何か入力されているか確認した上で呼び出して頂ければ回避できますが、半分プラグイン側の手落ちでもおりますので修正いたしました。
v0.10.386 修正版を公開いたしましたのでご利用ください。お手数をおかけします。
http://lab.magicvox.net/trac/mt-plugins/changeset/390
MT5.2.10のMTのpluginフォルダに、RegexForフォルダ配下のtagsフォルダ配下のv0.10フォルダ配下のpluginsフォルダ配下のRegexForフォルダをアップロードしました。
テンプレートのブログ記事の<$mt:EntryBody$>と<$mt:EntryMore$>の間に以下を書きました。
---------------------------------------------------------------------------------------------
<ol><mt:RegexFor tag="mt:EntryMore" regex="<h3.*?>(.+?)</h3>">
<li><mt:var name="__$1__"></li>
</mt:RegexFor></ol>
---------------------------------------------------------------------------------------------
保存と再構築を行ったところ、以下のエラーが出ました。
---------------------------------------------------------------------------------------------
テンプレート「ブログ記事」の再構築中にエラーが発生しました: <mtRegexFor>タグでエラーがありました: 不明なタグです: EntryMore
---------------------------------------------------------------------------------------------
原因が思い当たったらお教えいただければ幸いです。