ああー、疲れた。いったん、ほうりなげよう。
気がむいたら手直しするけど…… って何の話かというと:
これをはじめた動機
「ブラウザ上でXMLプログラミングしようぜ」って話をする予定です(一昨日のエントリーを参照)。
しかし、ブラウザ+テキストエディタだけではさすがにシンドイ。SpiderMonky, WSH, Rhinoなどの対話的環境を併用すれば随分と楽になります。だがしかし、(少なくともRhinoでは)DOMが備わってないのですよ。
そこで、JavaScripでDOMを実装してしまえばいいと思って、やってみました。とりあえず最小限の機能ということで、MiniDOM/JS、ついでにDOMツリーをたどってSAX風イベントを発生させるMiniSAX/JS。
だけど見直す気がしないゾ
まだチャントできてません。テストもしてないし、test firstじゃなくて、test after first releaseってことですか、(チカラ無く)ハハハ。
- MiniDOM:ソースをテキストとして別ウィンドウに表示
- MiniDOM:JavaScriptソースファイル(ダウンロード)
- MiniSAX:ソースをテキストとして別ウィンドウに表示
- MiniSAX:JavaScriptソースファイル(ダウンロード)
いちおう動くので、試してみてください。つっても、どう試すか分からないかな?こんな感じです(jsプロンプトとタグの「<,>」が混じって見にくいけど):
js> load("minidom.js") js> var e1 = document.createElement("greeting") js> var t = document.createTextNode("hello") js> var e2 = document.createElement("smile") js> e1.appendChild(t) hello js> e1.appendChild(e2) <smile ><smile> js> document.appendChild(e1) <greeting >hello<smile ><smile><greeting> js>
明らかにイケテないのは、getElemetByIdで、再帰的に処理しなきゃいけないのを忘れてるから、要素が見つからないことがあります。けど、なんか見直す気になれない。
現在の状況
下の表の記号の意味は:
- ○ : いちおう作った。たぶん動く。
- - : 実装する意味がない(と判断)。
- × : 考えた結果、やらない(または、やれない)。
- △ : 実装する意味はないけど、行きがかり上存在する。
- * : まだできてない。疲れたから中断。
- B : 既知のバグあり。
おしりに「=」が付いたプロパティは書き込み可能、その他はreadonlyです。下の表にないプロパティ/メソッドは、今回は考慮の外。
MiniDOM:ノード型ごとのサポート・プロパティ 一覧
プロパティ名 | ELEMENT | TEXT | ATTR | DOCUMENT | FRAGMENT |
---|---|---|---|---|---|
nodeType | ○ | ○ | ○ | ○ | ○ |
nodeName | ○ | ○ | ○ | ○ | ○ |
ownerDocument | ○ | ○ | ○ | ○ | ○ |
parentNode | ○ | ○ | △ | ○ | ○ |
nodeValue= | - | × | × | - | - |
attributes | ○ | - | - | - | - |
childNodes | ○ | - | - | ○ | ○ |
firstChild | ○ | - | - | ○ | ○ |
lastChild | ○ | - | - | ○ | ○ |
previousSibling | ○ | ○ | - | - | - |
nextSibling | ○ | ○ | - | - | - |
tagName | ○ | - | - | - | - |
name | - | - | ○ | - | - |
value= | - | - | ○ | - | - |
ownerElement | - | - | ○ | - | - |
data= | - | ○ | - | - | - |
length | - | × | - | - | - |
implementation | - | - | - | ○ | - |
documentElement | - | - | - | ○ | - |
MiniDOM:ノード型ごとのサポート・メソッド 一覧
メソッド名 | ELEMENT | DOCUMENT | FRAGMENT |
---|---|---|---|
createDocumentFragment | - | ○ | - |
createElement | - | ○ | - |
createAttribute | - | × | - |
createTextNode | - | ○ | - |
insertBefore | ○ | ○ | ○ |
appendChild | ○ | ○ | ○ |
removeChild | ○ | ○ | ○ |
replaceChild | * | × | * |
hasChildNodes | ○ | ○ | ○ |
hasAttributes | ○ | - | - |
getAttribute | ○ | - | - |
setAttribute | ○ | - | - |
removeAttribute | ○ | - | - |
hasAttribute | ○ | - | - |
getElementById | - | B | - |
getElementsByTagName | * | * | - |
normalize | * | * | * |
MiniSAXは短いから見ればわかるかと。
今後の予定
いま、テストの仕掛けを考えてます。アドバイスとはまた別な、「テストする気がなくてもテストできてしまう」という、夢のような(ウソッ)テストコードが書けたらいいな、っと。
仕様をこれ以上膨らます気はありません(minimumだから)。けど、日頃の言動との整合性の観点から(笑)、名前空間はサポートするつもり。テキスト(キャラクタストリーム)から字句/構文解析する部分(狭義のパーザー)は、どうかな? 気分次第。
ところで、はてな記法で表(table)を作ったとき、最後の縦棒の右に空白があると、その行の前でテーブルが終わってしまう。これ、敏感すぎ!(ほとんどバグじゃん)
([追記] それと、表の見た目がプレビューと本番では違うし。)