pre要素によるマーク付けについて

ちょっと気になる記述を見つけたのでメモ:ウェブの作り方・整形済みテキストについて。
要約すると、「pre 要素には欠点が多く正当な使い道も見出せないで、当サイトでは一切用いない」というもの。参照先のサイトでは、サンプル・ソースコードを pre 要素ではなく ol 要素によってマーク付けしている。例えば以下のようにである。

  1. <title>HTMLについて解説。</title>
  2. <h1>HTMLについて。</h1>
  3. <h2>HTMLとは。</h2>
<pre> でマーク付けされると、幅の面で問題が出てくるという点には大いに賛成できる。いくつかの Web ブラウザで pre 要素内で自動的な折り返しが行なわれないため、過度の横スクロールを出さないためにはある程度で改行しなければならず、その際どうしても“特定の解像度のPC”を意識しなければならなくなる。ブラウザ表示画面とにらめっこしながらソースコードに改行を加えていく作業は、ひどく苦痛である。さらに BASIC のインタプリタコンパイラ)では復帰文字を処理の区切り記号として解釈するので、そのまま改行しただけではコピー&ペーストした際にエラーが発生してしまう。そのような表示のためだけのコーディングの変更は、汎用性が無く本質的なものでは無い。
おそらくその解決策として準備されたと思われる非推奨要素の width や NN4 の wrap 属性は、どちらにしろ推奨されていないし IE 等では実装されていない。CSS の white-space プロパティの値にそれを実現できるものが出れば良いのだが、今のところ空白文字は尊重しつつ自動折り返しを有効にするための値は用意されていない。よって現状では妥協して適度に改行を加えるか、横スクロールを無視するか、pre{width:100%;overflow:scroll} という規則を加えるといった方法しか無い。
しかし、このような“欠点”(ここではあえて欠点と呼んでおこう)をもってしても尚、私は pre 要素を便利な要素だと思っている。私の pre 要素の捉え方は、再利用する可能性の高いコードのマーク付けのために用いるものというものである。ソースコードを他の要素(例えばol要素やl要素)によってマーク付けしようとすると、再利用する際の手間が多くなりやすい(例えばDOMでは一つ一つのノードを解析して結合する必要があるかもしれない)。整形済みテキストを用いればプログラムソースを“そのまま”持って来る事が出来るし、再利用する際も実体参照を解決してやるだけで良い。プログラムソースをそのまま例示として提供する要素としては、pre 要素が現状では一番良いのではないかと考えている(もちろん、例文を細かくマーク付けする行為が望ましくないという意味ではない)。
その点では、替わりにtextarea 要素を用いても構わないと思っている。寧ろ再利用のし易さではこちらのほうが上だ。ただ textarea 要素はフォームに値を渡すためのコントロールであるので本来の目的とは異なるし、マーク付けの自由度も低い。
ただ順序リストや行要素を用いることのメリットとして、行番号を振る事が出来るというものがある。たまにプログラムソースに“手動で”行番号を挿入しているケースを見かけるが、コピー&ペーストした際にそれらも一緒にくっ付いてくるため、再利用性に乏しい事この上ない。順序リストや行要素を用いれば、ソースに関係無く自動的に番号を割り振る事も可能である(悲しい事に一部のブラウザでは、これらも文字列選択の対象となってしまうが)。
私は pre 要素を用いる事を今のところさほど問題視していませんが、このサイトの積極的な姿勢には敬意を表させていただきます。

MSXML with WSH で XSLT

最近は専ら Micorsoft Excel でWeb ページを編集する事が多い。もちろんそのまま『Webページとして保存』などという恐ろしい事はやらないが。XLS→CSVXMLXHTML機械的に変換してくので、以前に比べて作業は格段に楽になった。
それはさておき、MSXML 3.0 で XSLT したときに

<META http-equiv="Content-Type" content="text/html; charset=UTF-16">
やら
<?xml version="1.0" encoding="UTF-16"?>
やらを一々付けてくる“おせっかい”ぶりには本当に閉口する。xml 宣言は omit-xml-declaration="yes" で消す事も可能だったが、method="html" で吐き出した時の余計な meta タグのほうはどうしようもない。仕方がないので JScirpt で物理的に文字列置換する事にした。

var objDoc = new ActiveXObject("Msxml2.DOMDocument");
var objStl = new ActiveXObject("Msxml2.DOMDocument");

var strXmlName = openDialogMenu("xml");
var strXslName = openDialogMenu("xsl");
var strHtmName = openExcelDialog();

objDoc.load(strXmlName);
objStl.load(strXslName);

objSav = objDoc.transformNode(objStl); // XSLTransform

var strCharCode = objStl.getElementsByTagName("xsl:output").item(0).getAttribute("encoding");
strXml = strXml.replace("UTF-16",strCharCode); // “UTF-18”を物理的に置換

saveTextFile(strHtmName,objSav);
WScript.Echo(strHtmName + "として変換結果を出力しました。");

function openDialogMenu(arg1){ // ファイル選択ダイアログ用関数
var ComDlg = WScript.CreateObject("MSComDlg.CommonDialog");
ComDlg.MaxFileSize = 256;
ComDlg.InitDir = ".";
ComDlg.Filter = arg1.toUpperCase() + "(*." + arg1 + ")|*." + arg1;
ComDlg.ShowOpen();
if(ComDlg.FileName.length == 0){WScript.Quit();}
return ComDlg.FileName;
}

function openExcelDialog(){ // ファイル名入力ダイアログ(Excel使用)関数
var objXL = WScript.CreateObject("Excel.Application");
var strRet = objXL.InputBox("XSLT in WHS","出力ファイル名", "output.html");
objXL.Quit();
return strRet;
}

function saveTextFile(arg1,arg2){ // テキストファイル書き出し関数
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var stream = fs.CreateTextFile(arg1);
with(stream){
Write(arg2);
Close();
}
}

これが私が現在わりと利用している XSLTJScriptWSH で動きます。コピー&ペーストしてテキストファイルに拡張子[.js]で保存、作成したファイルをダブルクリックして起動します。
必要な環境を一応述べておくと、

となります。何だか某社の回し者の用な気もしますが、多分気のせいかと。

インラインフレームについて

私はインラインフレーム中に表示するのは「参照」と捉えているけれども、相手がそう思わなければ、避けるほうが無難なのかもしれない。どちらの答えにしろ、現在は大多数が納得する状況にはなっていないので、参照先が拒絶したなら外したほうが良いだろう。
私の意見としては、フレーム内に表示するしないの問題ではなく、それが自分のコンテンツに見えるか否かのほうが重要なのではないかと思う。例えば『リンク集』と銘打ったページ中で他人のトップページを埋め込んだところで、それを勘違いする人は少ないだろう。Googleの画像検索にしてもそうだ。
自分のサイトのように見せ掛けるのだったら、アンカーによるリンクでも出来る。つまり、『手段』では無く『文脈』に依存するのではないかと思う。
どうしても気になるのだったら、訴訟でも何でも起こせばよいだろう。幼稚じみた方法で嫌がらせしたり煽ってみるよりは、きちんとした場所で定めてもらいたいものだ。

名前空間と copy-of

どうやら名前空間について、私はさっぱり理解していなかったらしい。
<xsl:copy-of /> で 名前空間http://www.w3.org/1999/xhtml」を割り当てたノードを引っ張ってこようとするのだけれど、どうにも上手く行かない。試しに名前空間を消してみるととりあえずコピーはされるのだが、名前空間が空な要素になってしまっている。接頭辞を付けたりして色々試みてみたけれども、結局解らず終いだった。(MSXML 3.0)
とりあえず copy-of を使うのを止めて、CDATA セクションで括ったノードから <xsl:value-of disable-output-escaping="yes" /> で引っ張ってくることで辛うじて解決したのだけれど、今一つ釈然としない感じ。
多分何か重要な思い違いをしているような気がするのだけれど、やはり仕様書から掘り起こして読んでみなければ駄目だろうか。所詮見よう見真似では限界がありそうだ。