MovableTypeが自動的に入れる改行<br />の仕様を解読して,思い通りに改行を入れる方法を検討する. MovableTypeが自動的に入れる改行カモランドでは,不定期日記にMovable Typeを使っているのだが,最近少し凝ったことをやりたくなった. 具体的には,ソースコードを含めるときに<pre>タグを使って,カモランドと同じデザインが適用されるようにしたい. しかし試しに<pre>タグを使ってみると,勝手にMovableTypeに改行を入れられて異様に間延びしたHTMLになる場合があり,どうも俺の思い通りになってくれない. そこで,MovableTypeが改行を入れるロジックを調べることにした.(Movable Type 2.661) ロジックは,lib/MT/Util.pmにあるhtml_text_transform()関数に記述されていた.これを調べてみると,以下のような結果が得られた.
改行の仕様
前提空行で区切られた単位を,1つの段落として考える.例えば,おはよう →段落1になる こんにちは →段落1になる こんばんは →段落2になる
動作1段落の内容が,<(?:table|ol|ul|pre|select|form|blockquote|div|q)
動作2そうではなく,段落が上記のタグで始まる場合は,<br />変換も<p></p>囲みも行わずにその段落をそのまま出力する
考察つまり,<pre>タグを使って改行を入れられたくない場合は,
というルールを守れば,<pre>〜</pre>の範囲全体が動作2で扱われて,<br />の自動挿入を抑制できる.
ケーススタディ(A) <pre>を単独で使う場合記述法
入力例 こんにちは <pre> 1行目 2行目 </pre> です HTML出力 <p>こんにちは</p> <pre> 1行目 2行目 </pre> です
(B) <pre>〜</pre>内に空行を含む場合記述法
入力例 こんにちは <pre> 1行目 ←半角スペース1個 2行目 </pre> です HTML出力 <p>こんにちは</p> <pre> 1行目 2行目 </pre> です →各行にbrが付かないのでOK
(C) <pre>を<div>の内側で使う場合記述法
入力例 こんにちは <div> <pre> 1行目 2行目 </pre> </div> です HTML出力 <p>こんにちは</p> <div> <pre> 1行目 2行目 </pre> </div> です
(D) <blockquote>を<br />変換付きで使いたい場合記述法
入力例 こんにちは <blockquote> 1行目 2行目 </blockquote> です HTML出力 <p>こんにちは<br /> <blockquote><br /> 1行目<br /> 2行目<br /> </blockquote><br /> です<br /> </p> |