長いコードはMovableTypeに負ける - XHTML2.0の話へ飛躍

code2htmltextに長いコード,code2htmltext自身を与えてみると確かに,思い通りに変換をしてくれる.だが,「空行は改段落」というMovableTypeの仕様には太刀打ちできない.本プログラムは<pre class="code"></pre>内にコピペされることを想定している.しかし,

<?php header('Content-type: text/html;charset=Shift_JIS');

/* script_name: code2htmltext
* author: sigma
* author_link: http://sigma.s22.xrea.com/
* license: The GNU General Public License
* exposition:

というコードを表したい場合,改段落が生じる/* script_name: の行からp要素が開始されてしまう.すなわち,1行目でpre要素が終了したと見なされてしまうのだ.MTとして,p要素内の改行コード前にbr要素を付加する.さらにpre要素内であるから,ブラウザが改行表示をする.結果,改行2つが為される.エントリー投稿オプション「テキストフォーマット」を「なし」すれば良いのだが,「空行はブロック要素の区切り」という仕様が大好きであるから,できない.

さて,当初は改行コードがまずいのかと考えていた.そのために改行コードに対し,

<fieldset><legend>改行コード変換</legend>
<input type="radio" name="kaigyo_output" checked value="no">変換しない</input><br>
<input type="radio" name="kaigyo_output" value="del">削除 (from CR or LF or CR+LF)</input><br>
<input type="radio" name="kaigyo_output" value="cr">CR (from LF or CR+LF)</input><br>
<input type="radio" name="kaigyo_output" value="lf">LF (from CR or CR+LF)</input><br>
<input type="radio" name="kaigyo_output" value="crlf">CR+LF (from CR or LF)</input>
</fieldset>

といったオプションを作ってしまった.

本題に戻ると,「MT用の変換オプション」を作らねばならない.先程提示したコードはbr要素を手作業で付加し,空行を落として実現した表示である.br要素を用いるのは些か乱暴であるので,その仕様を考えるのに「Forced Line Break」を検索してみた.そうして発見したhr要素とbr要素について経由で2002年8月 - マーク付けノート記載のline要素が適当かと思われる.このページから飛ぶは「XHTML™ 2.0 W3C Working Draft 5 August 2002」なのであるが,これ幸いなことにLatest versionへのリンクが用意されていた.

そうして今回参照するは,XHTML™ 2.0 XHTML™ 2.0である.2002年8月の文書では8章13節にline要素として記述されていたが,この版では9章7節にl要素として記述されている.

話はさらに発展する.l要素を囲んでいるのはblockcodeなるブロック要素だったのだ.その要素についてのサンプルコードは,Perlクラスを割り当てていた.衝撃的である.preではホワイトスペースをそのまま表示し,改行コードが見つかるまで改行をしない.それを回避できそうでもあり(想像),大変心躍ることである(文体おかしい).

結局何をするかと言えば,「XHTML2.0正式版の発行を心待ちにしながらXHTML1.1でなんとか対応する」ことになる.

最後に,XHTML1.1におけるコードの表現方法を,さっき見たページの影響を受け,<pre><code></code></pre>形式にしようと思う.インラインコードは従来通り<code></code>とする.この思想を反映したオプションをcode2htmltextに設けようと思う.

こっそりl要素の節中にあるコードを保存する.先ず使用例.その後に「スタイルシートにこう記述すると行番号が左に表示されるよ(CSS Style sheet to number each line)」というコード(例によって改段落にbr要素を利用).

<blockcode class="program">
<l>program p(input, output);</l>
<l>begin</l>
<l> writeln("Hello world");</l>
<l>end.</l>
</blockcode>

.program { counter-reset: linenumber }

l:before {
position: relative;
left: -1em;
counter-increment: linenumber;
content: counter(linenumber);
}