リンク作成時のターゲット指定及び<blockquote>タグ対策

 「Movable Type」はとても便利だけど、少し不満に思っていた点が二つほどあった。

  • Entry作成時、右上「URL」ボタンで選択した文字列を<a>タグで囲むことができるが、ターゲットが指定されない。
  • 「Bookmarklet」で<blockquote>タグを挿入するよう改造したが、「改行を自動的に挿入する」機能をオンにしていると<p>タグの内側に<blockquote>タグが入ってしまい、文法的に具合が悪い。

 一つ目は好みの問題。バカバカWindowが開くのは嫌だと言う人もいる。俺もそっち派(必要なら右クリックや長押しだけで別Windowを開けば良い)だったが、タブブラウザの登場により、複数Windowを開いておいてから、順に読んでは閉じていくようにスタイルが変わった。なので自分のサイトもこういう形をとる。
 二つ目については、先の改造を加えていなければ関係ない。また、「HTMLの文法なんて糞食らえ」という人にも関係ない。(<blockquote>タグ以外にも、ブロック要素を<p>タグ内に含めるのは間違い。らしい)

 この為、独自に改造を加えてみた。かなり強引だし、改造と言うより改悪かもしれない。誰にでも適用できるとも思わない。ただ、来るべきバージョンアップに備え、どこをどういじくったのか記しておく。興味のある方は読んで欲しい。

 まず、一つ目に関する改造。いじるファイルは二つ。

■{MT_HOME}/tmpl/cms/bm_entry.tmpl
130行目あたり、「function insertLink () {」下の以下の行、

 document.selection.createRange().text = '<a href="' + my_link + '">' + str + '</a>';

を、

 document.selection.createRange().text = '<a href="' + my_link + '" target="_blank">' + str + '</a>';

と書き換える。同様に、

■{MT_HOME}/tmpl/cms/edit_entry.tmpl
111行目あたり、「function insertLink () {」下の以下の行、

 document.selection.createRange().text = '<a href="' + my_link + '">' + str + '</a>';

を、

 document.selection.createRange().text = '<a href="' + my_link + '" target="_blank">' + str + '</a>';

と書き換える。

 次に、二つ目に関する改造。いじるファイルは一つ。

■{MT_HOME}/lib/MT/Util.pm
183行目あたり、「sub html_text_transform」中の以下の行、
 $p =~ s!\r?\n!<br />\n!g;
 $p = "<p>$p</p>";

を、

 $p =~ s/&/&/g;
 $p =~ s/amp;lt;/lt;/g;
 $p =~ s/amp;gt;/gt;/g;
 if ($p !~ /<ol>/ && $p !~ /<ul>/) {
  $p =~ s!\r?\n!<br />\n!g;
  if ($p !~ /blockquote>/) {
   $p = "<p>$p</p>";
  }
 }

と書き換える。

− 以上 −

 余談だが、本文中にハイパーリンクを埋め込む際、URLに「&」が含まれていたりするとこれまた文法的にエラーが発生することに今気が付いた。これもそのうちなんとかできる、かな?(逆にここまで至れり尽せりのシステムが、どうしてそれくらい対応してないのが謎)
→早速反映した。上記「Util.pm」のとこを修正済み。「&」と、<ol>タグなんかにも対応してみた。つくづく正規表現の使い方が甘い気もするけれど。