HTML5 とプログラムコード

2012/03/31

個人的なメモ

ニーズ

プログラムコードを見せたい。

プログラムコードの特徴

  1. HTML では特殊扱いされる文字 & < > を含み、そのままでは問題を引き起こす場合がある。
  2. 空白やタブの扱いが HTML と異なる。
  3. 長い行の折り返しが誤解を与える場合がある。折り返しを防ぎたい。
  4. 見せたい内容が、大きな行数になる可能性がある。

空白とタブ

優先順位

  1. 全ての情報にアクセスできる事
  2. 誤解を生まない事
  3. レイアウトが可能な事

検討すべき HTML5 技術要素

  1. element (tag)
  2. attribute
  3. value

Elements

Style Attribure

役に立ちそうな style values:

注:
draft と書いたのは, working draft 2012 のレベルで、サポートレベルが低い。

長さの単位

フォントサイズ

フォントサイズとは何か? 調べてみた。歴史的には次のようである。

In metal type, the point size of the font described the size (height) of the metal body on which the typeface's characters were cast. (Wikipedia: Point (typography))

筆者コメント: これによると、鉛で出来た活字は、文字に係わらず同じフォントでは同じ高さを持っていた。(これは横書きの場合には当然! そうでないと活字を並べるのが困難になる。) その高さを基に point が定義された。この高さは大文字の最大の高さ(ベースラインまでの空白を含む)に等しいか、あるいは、それより、幾分大きいかだったろう。

Knuth の TeX Book には次のように書かれている。

各フォントには、それぞれ固有の em と ex の値が定義されている。以前は、em は M という文字の幅を表していたが、もはや正しくなくなり、em の値は、単にそれぞれのフォントにされている任意の単位を表すだけとなっている

筆者コメント: ここに書かれている「M」はプロポーショナルフォントの M である。

CSS pixel

device pixel
表示デバイスに依存する、物理的な意味での pixel。無単位。
CSS pixel
CSS で使用される、論理的 pixel。CSS では px で単位を表す。96px = 1in

次に4つの単位(インチ、ポイント、論理ピクセル、物理ピクセル)を実際に比較してみる。横幅だけに着目する。

width:3in
width:216pt
width:288px
width:288
4つの単位(インチ、ポイント、論理ピクセル、物理ピクセル)の比較
物理ピクセルでの指定は、表示デバイスによって異なるはずである。

ややこしいのは、ここで言う「物理ピクセル」が本当の物理ピクセルを表していない事である。ディスプレイの解像度がどんどん高くなっていく中で、旧来のソフトとの互換性を保つために、「物理ピクセル」自体が本当の物理ピクセルにマッピングされている。

参考URL

HTML Escape

HTML Escape とは、以下の3つの文字
"&"
"<"
">"
のいずれかが、コードに含まれる場合の前処理の事。前処理の内容は、次の変換である。
"&"  → "&amp;"
"<"  → "&lt;"
">"  → "&gt;"

このような前処理を必要としていない方法が好ましい。

実験環境

Mac/OSX 10.6.8
only a few browsers as listed below

pre

HTML Escape を必要としない、少ない行数のコードの引用に適している。

pre.code {
	text-align:left;
	overflow:auto;
	width:80%;
	background-color:white;
	border-width: 1px 1px 1px 1px;
	border-style:solid;
	border-color: #0cc;
	margin-top: 0.0em;
	margin-bottom:0.5em;
	margin-left:auto;
	margin-right:auto;
	font-family: courier,monospace;
	font-size: 95%;	
}
ここで使われた CSS 記述

問題点

textarea

textarea は
<textarea>
ここにコードを書く
</textarea>
のような使い方をするのだが、「ここにコードを書く」と書いた部分は、textarea に読み取られる時に、何らかの変換を受けるのか否かに関して、どこにも説明が見当たらない。

実験によると、Safari や Google Chrome では、そのまま読み取られていない。& の扱いが微妙である。文字を表す場合には、その文字が textarea に取り込まれる。これは多分仕様であろう。そのようなニーズが存在するから。

pre タグと同様に、HTML Escape を必要としていないケースでしか使えない。
(pre タグは動作の仕様が定められているが、textarea は、不明である。その意味で pre タグよりたちが悪い。)

HTML5 の不思議な仕様

問題点

CSS

textarea.code{
	overflow:auto; /* auto,scroll */
	text-wrap:none; /* no effect */
	font-family: courier,monospace;
	font-size: 95%;
	line-height: 1.3;
	width:80%;
	height:20ex;
}
ここで使われた CSS 記述

iframe

iframe はコードをファイルから読み取るのに使える。

問題点

良い点

CSS

iframe.code {
	text-align:left;
	wrap:off; /* no effect */
	overflow:auto;
	width:80%;
	height:15em;
	background-color:white;
	border-width: 1px 1px 1px 1px;
	border-style:solid;
	border-color: #0cc;
	margin-top: 0.0em;
	margin-bottom:0.5em;
	margin-left:auto;
	margin-right:auto;
	font-family: courier,monospace;
	font-size: 100%;
	seamless;
}
ここで使われた CSS 記述

div + white-space:pre

bootes 1 0:00 0:05 100K Await init bootes 2 5:33 0:00 0K Wakeme genrandom bootes 3 0:00 0:00 0K Wakeme alarm bootes 5 0:14 1:43 380K Sleep usbd bootes 6 0:00 0:00 380K Pread usbd bootes 7 0:00 0:00 380K Rendez usbd bootes 8 0:00 0:00 380K Rendez usbd bootes 9 0:00 0:00 0K Wakeme rxmitproc bootes 11 1:22 0:00 0K Wakeme etherread4 bootes 12 0:00 0:00 0K Wakeme recvarpproc bootes 13 0:00 0:00 0K Wakeme etherread6 bootes 14 0:00 0:00 188K Sleep ipconfig bootes 16 0:00 0:00 0K Wakeme floppy bootes 17 0:08 0:00 0K Wakeme #I0tcpack bootes 18 0:01 0:03 312K Pread factotum bootes 19 0:00 0:00 0K Idle pager bootes 25 0:00 0:01 172K Pread cs bootes 33 0:00 0:35 104K Sleep timesync bootes 36 0:00 0:00 388K Await dns bootes 37 0:01 0:03 1196K Pread dns none 48 0:00 0:00 168K Sleep listen none 50 0:00 0:00 168K Await listen bootes 51 0:00 0:00 148K Await listen bootes 53 0:00 0:00 148K Open listen none 54 0:00 0:00 168K Open listen none 55 0:00 0:00 168K Open listen
div を使った表現
document にコードを直接埋め込むことになる。小さいコードでは良いが、大きなコードは不便。

blockquote + white-space:pre

bootes 1 0:00 0:05 100K Await init bootes 2 5:33 0:00 0K Wakeme genrandom bootes 3 0:00 0:00 0K Wakeme alarm bootes 5 0:14 1:43 380K Sleep usbd bootes 6 0:00 0:00 380K Pread usbd bootes 7 0:00 0:00 380K Rendez usbd bootes 8 0:00 0:00 380K Rendez usbd bootes 9 0:00 0:00 0K Wakeme rxmitproc bootes 11 1:22 0:00 0K Wakeme etherread4 bootes 12 0:00 0:00 0K Wakeme recvarpproc bootes 13 0:00 0:00 0K Wakeme etherread6 bootes 14 0:00 0:00 188K Sleep ipconfig bootes 16 0:00 0:00 0K Wakeme floppy bootes 17 0:08 0:00 0K Wakeme #I0tcpack bootes 18 0:01 0:03 312K Pread factotum bootes 19 0:00 0:00 0K Idle pager bootes 25 0:00 0:01 172K Pread cs bootes 33 0:00 0:35 104K Sleep timesync bootes 36 0:00 0:00 388K Await dns bootes 37 0:01 0:03 1196K Pread dns none 48 0:00 0:00 168K Sleep listen none 50 0:00 0:00 168K Await listen bootes 51 0:00 0:00 148K Await listen bootes 53 0:00 0:00 148K Open listen none 54 0:00 0:00 168K Open listen none 55 0:00 0:00 168K Open listen
blockquote を使った表現
引用の一種であるから、div よりも blockquote の方が素直であろう。

document にコードを直接埋め込むことになる。小さいコードでは良いが、大きなコードは不便。

blockquote + white-space:pre + javascript

document の中のコメント欄を読み取り、blockquote に表示する。

この方法の利点は、コード内に使える文字列の制限が少ない事。(唯一の制限は、コメントの終了文字列を含まないことである。HTML Escape を javascript で処理できる事。その一例を紹介する。

コードを含むコメント欄は

必要な javascript コードは、
この例のようなコードは、ファイルから読み取らないと、怖い。

この方法の欠点ではないが、例示した javascript コードでは、script の中に、"-->" が含まれていると、コメントの終了だと勘違いされ、働かなくなる。もっと緻密なプログラムにすれば解決するだろうが、その価値があるか?

blockquote + white-space:pre + javascript + ajax

次の javascript 関数を準備しておく。
上のコードは次のように取り込んでいる。
取り込むコードを、(加工せずに)ファイルに保存しておき、それを ajax を使って読み取る。

参考URL