印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType pre 要素を自動改行させたい

<pre>...</pre> に囲まれたスペースや改行はそのまま出力される。これはソースコードなどを表示する時に便利に使える。しかし、自動改行されなくなってしまうため、ブラウザの表示幅を狭くすると右側にはみ出てしまう。何とか自動改行するようにできないか考える。

■ ■ ■

通常のブロック要素内容文字列では、改行、空白、タブという空白文字が連続した場合、半角スペース1つに置換される。また、行頭の空白文字は無視される。<pre>...</pre> で囲む pre 要素は、整形済みテキスト(preformatted text)として解釈され、空白文字は置換されずにそのまま出力される。これはソースコードを表示するのに適している。インデントがそのまま反映されるからである。しかし、これを使うことによる欠点もある。ブラウザが自動的に改行してくれなくなってしまうのである。そのため、1行が長いと右側にはみ出てしまう。はみ出すのを防ぐのに横スクロールバーを出すという実装もあるが、気が進まない。

この pre 要素を何とか自動改行できないかを考える。しかし、自動改行しないのは HTML の仕様であるから、無理な話ではある。そこで、「もともと何がしたかったのか」に立ち戻って考えてみると、次のような要件であることに気がついた。

  • 連続したスペースを、その個数のまま表示させたい

そこで、pre 要素に固執することはやめて、単純なブロック要素で考えることにする。普通のブロック要素であれば自動改行されるからである。

スペースを表示するには、空白文字「 」の他に「&nbsp;」という文字参照が使える。しかし、「&nbsp;」を連続させると、1つの長い文字列として認識されてしまうため自動改行されないのである。

散々考えた揚句、最終的にたどり着いたアイデアは、『「 」と「&nbsp;」を交互に使う』であった。まず、「<pre>」と「</pre>」を「<div>」と「</div>」に置き換え、その内側では次のような表現とする。空白文字である「タブ」は使用しない方がよいとされているので(Another HTML-lint : Explanation: Tab in Pre)、ついでにスペースに変換してしまうことにする。

  1. タブは適当な数のスペースに置換する
  2. スペースが2つ連続する場合は、1つのスペース「 」と1つの文字実体参照「&nbsp;」に置換する
  3. 連続しないスペースはそのままにして、置換は行わない
  4. 行頭のスペースは、文字実体参照「&nbsp;」に置換する

これは HTML での一般的な書式として有効。あまり見かけないが、予想以上に上手くいく。MovableType なら、プラグインを組み込んでサイト全体を再構築すればよい。

2005年10月30日追記:
プラグインで実装し (nlog(n): PRE 要素変換プラグイン 0.9),解説を書きました (nlog(n): PRE 要素変換プラグイン 0.9 解説)。

Posted by n at 2004-10-20 23:42 | Edit | Comments (2) | Trackback(1)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
pre表示指定
pre 要素をこんな方法で表示してみたりして・・・ Trackbacked from: Zakimi::Blog at October 21, 2004 16:14
Comments

こんにちは。

ちょっと違うけど、別なアプローチでどうでしょう。

http://www.zakimi.com/archives/2004/06/25/011142.php

見た目は

http://www.zakimi.com/archives/2004/06/25/005649.php

Posted by: zRyu at October 21, 2004 16:23

情報ありがとうございました。スクロールバーが出る方法ですね。苦手なんです。このサイトの記事はプラグインで再構築しました。
http://nlogn.ath.cx/archives/000309.html
で見た目の確認ができると思います。

Posted by: n at October 21, 2004 21:09
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?