はてなid記法のMovable Type 5で使える版
需要とかは全く考えていないのですがプラグイン作成の練習ということでちょっと作ってみました。
MT4.xまでで使えるものは、楽:技林ブログさんで公開されているものがあります。
これをMT5で使えるように移植というかアレンジしてみました。オリジナルのほうのライセンスがよくわからなかったのでおそらくperl のArtistic Licenseを採用しているのでないかということで、プラグイン名も変えた形としました。
使い方などは、そのまま同じですが、オプションとしてプラグイン設定で利用できるサーヴィスを以下のものに変更をしました。
- はてなのプロフィール www.hatena.co.jp/{USER}
- はてなダイアリー d.hatena.co.jp/{USER}
- はてなブックマーク b.hatena.co.jp/{USER}
- はてなフォトライフ f.hatena.co.jp/{USER}
- はてなブログ blog.hatena.co.jp/{USER}
はてなブログについては、はてなブログでのメインのブログのURLとなります(はてなの現状の仕様によるもの)。ちなみにはてなブログ用の記法ははてな内で反映されてなかったりします。
以下の機能は、個人的に使わないという理由で削りました。
- アイコン画像を表示する
- 詳細を表示する
- 文字エンコードに関する処理
使用例: (変換前の全角「:」は実際は半角の:です)
- 変換前 → 変換後
- id:maRk → id:maRk
- f:id:maRk → f:id:maRk
- h:id:maRk → h:id:maRk
InitHatenaIDnotation プラグイン
MTOS 5.13において動作を確認しています。
Download
InitHatenaIDnotation_0.1.zip利用
導入は展開後のフォルダをpluginsディレクトリにアップロードするのみです。
使用する時は<mt:EntryBody initHatenaIDnotation="1">
のようにはてなid記法を反映したいMTタグにモディファイアを追加します。
設定はブログごとで、ツール>プラグインでこのプラグインの設定よりおこなうことができます。ブログサービスにチェックされたものが、id:userの記法のときに反映されます。初期設定では、www.hatena.ne.jp/{USER}のプロフィールページへのリンクとしてあります。
「リンクを新規ウィンドウ(新規タブ)で開く」にチェックを入れた場合は、_target="_blank"がリンクターゲットとして付与されます
演習:特定カテゴリ下のサブカテゴリのリストを指定数でグループ化して出力する
Movable Typeのコミュニティサイト、MTQで質問のあったケースの演習をおこないました。
すでに模範解答がでているようですので、詳細はそちらに譲ります。このような場合は剰余演算を使って行なうのが通例のようです。
__counter__、__last__ といった特殊な変数が利用できないケースでは、変数をセットして自前のカウンターを用意する必要があるのでこれがプログラミング的要素がでてきて厄介なのであります。
ここでは、余りを求めないでおこなうというやり方でやってみるという課題にしておきます。
考えたこと
- ループの4回目の先頭に</ul> がつくというルールにすればいい(わりとこういう考え方がポイント)。
- カウント数は変数なので使い回していく
- リストを出力させるごとに、カウンターを 0・1・ 2 ...という具合に振っていく
- カウンターが 3(つぎのグループの先頭) になったら </ul>をつけて カウンター0 からスタートさせる
作成したテンプレートサンプル
- ※テスト環境用のモノなので実際の運用のための最適化をしていません。
- ※先の命題のとおりで、ある親カテゴリ下に属する子カテゴリのみをリスト表示するためだけのテンプレートです。
- ※ 条件判断のMT:Unlessは好みでそうしているだけなので、MT:Ifでnot equal な判断でも同じです
<h3>サブカテゴリのリスト</h3> <mt:Setvar name="cont" value="0"> <MTSubCategories category="サブカテゴリの親のカテゴリ"> <mt:If name="cont" eq="0"> <ul class="group"> </mt:If> <li><$mt:CategoryLabel$> ($contの値=<$mt:Var name="cont"$>)</li> <mt:Unless name="cont" eq="3"><mt:SetVar name="cont" value="1" op="+"></mt:Unless> <mt:If name="cont" eq="3"> <mt:SetVar name="cont" value="0"> </ul> </mt:If> <mt:SubCatIsLast></ul></mt:SubCatIsLast> </MTSubCategories>
処理の流れを文章化してみた
カウンターを 0 にセットしておく ==ここからループ開始 == カウンターが 0 であるか ? Yes -> </ul> をつける ↓ No -> カテゴリラベルを表示 ↓ カウンターが 3 ではない ? Yes -> カウンターに1を足す ↓ カウンターは 3 である(== 4番目のリストである ) ? Yes -> カウンターを 0 にもどす </ul> をつける ↓ No ↓ サブカテゴリリストの最後か? No -> ループのはじめに戻る ==> ↓ Yes -> </ul> をつける。ループの終了
一見、子カテゴリがちょうど3の倍数であったときに、リストの閉じタグ(</ul>)が重複するのでないか、という風に見えますけれども、先にいったとおりに、次のグループの先頭に</ul> を入れるというルールにしてあるので、ループが子カテゴリの最後になったときは次のグループが存在しないために</ul>は振られません。その代わりとしてmt:SubCatIsLast
の条件において</ul>を振るということにしてあります。
但し。。
この方法だと、セットした変数にリセットをかけていますから、カウントの変数の値を使ってユニークなIDを振るといった処理には適用できません。
そのような時は、普通にカウントをインクリメントにして剰余を求めたほうがいいです。
Google Blog検索のフィードから関連記事を取り出すテンプレート
Googleのブログ検索の結果のフィードを用いて、Google Ajax feedによる関連記事リスト出力するMTMLテンプレートです。
ここで使ったコードをそのままでのせておきます。自分の環境に応じて改変するなどしてみてください。Google API keyの取得は各自ですませておいてもらえばよいかと思います。
<MTEntryIfTagged> <MTSetVarBlock name="AddFeeds"> <MTEntryTags> feedControl.addFeed("https://www.google.co.jp/search?q=<$MTTagName normalize="1" encode_js="1" encode_url="1"$>&tbm=blg&output=atom", "<$MTTagName normalize="1" encode_js="1"$>"); </MTEntryTags></MTSetVarBlock> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("feeds", "1"); function feedInit() { // create a feed control var feedControl = new google.feeds.FeedControl(); <mt:Ignore> feedControl.addFeed("https://www.google.co.jp/search?q=(keywords)&tbm=blg&output=atom" , "keywords"); </mt:Ignore> <$MTGetVar name="AddFeeds"$> feedControl.draw( document.getElementById("feed-ctrl"), { drawMode : google.feeds.FeedControl.DRAW_MODE_TABBED }); } google.setOnLoadCallback(feedInit); // --> </script> <h3>関連するブログ記事</h3> <div id="feed-ctrl">読み込んでいます...</div> </MTEntryIfTagged>
ブログ記事につけられている「タグ」をもとにして、JavaScriptの配列におさめて、それをキーワードにしてaddFeed()の値に渡しています。
その部分のテンプレートはわかりにくい解説が以下の記事にあります。
追記: addFeed()が個別に記述しないといけないようなので、MTEntryTagsのループ内でfeedControl.addFeed()を作成するように変更しました。
エントリの続き位置へのリンクに続き記事の一部をtitle属性に表示する
エントリが長くなるとか、記事作成ポリシーとかで、entrymoreの部分をメインに使うことも多くあるかとおもいます。
続き部分の書き出しだけでもすこし分かれば、続いて読んでみたいと思う閲覧側の心理もあるということで、以下のようなテンプレートを組むことで可能となりました。
<mt:If name="archive_class" like="main_index|category|monthly"> <$MTEntryMore setvar="moreentry" words="40" encode_html="1"$> </mt:if> <mt:If tag="EntryMore"> <p><a href="<$MTEntryPermalink>#more" title="<$MTEntryTitle encode_html="1"$>: <$MTGetVar name="moreentry"$>">このエントリー続き</a></p> </mt:If>
なお、EntryMoreとかEntryBodyとかを扱ってなにかおこなうようなときは、意図していない箇所に反映されないように(MTInclude templateとかを使っているようなときは特に)、テンプレートタイプなどで振り分けて使うのがこつだったりします。
MTタグの結果をJavaScriptのArrayオブジェクトに渡すためのテンプレート
あれこれとやっていて頓挫してしまったので、テンプレートの一部分だけを公開してみます。
以下は、エントリーにつけられたタグ名をもとにしてArrayオブジェクトに使用できるようにする出力を得るためのテンプレートです。
<MTEntryIfTagged> <MTSetVarBlock name="TagName"> <MTEntryTags glue=','> <$MTTagName normalize="1" encode_js="1" regex_replace='/(.*)/','"$1"'$> </MTEntryTags> </MTSetVarBlock> </MTEntryIfTagged>
MTMLでglueモディファイアのように任意文字で結合するというのはありますが、任意の文字でラッピングするといったものはグローバルモディファイアを組んだりしないといけないので、regex_replace
で対応することにします。
後は、以下の通りにnew ArrayにgetVarすれば、そのままJavaScriptの配列として扱えるようになりました。
var words = new Array(<$MTGetVar name="TagName"$>);