このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

100% JavaScriptによる、簡易なDOM/SAXの実装

ああー、疲れた。いったん、ほうりなげよう。

気がむいたら手直しするけど…… って何の話かというと:

これをはじめた動機

「ブラウザ上でXMLプログラミングしようぜ」って話をする予定です(一昨日のエントリーを参照)。

しかし、ブラウザ+テキストエディタだけではさすがにシンドイ。SpiderMonky, WSH, Rhinoなどの対話的環境を併用すれば随分と楽になります。だがしかし、(少なくともRhinoでは)DOMが備わってないのですよ。

そこで、JavaScripでDOMを実装してしまえばいいと思って、やってみました。とりあえず最小限の機能ということで、MiniDOM/JS、ついでにDOMツリーをたどってSAX風イベントを発生させるMiniSAX/JS

だけど見直す気がしないゾ

まだチャントできてません。テストもしてないし、test firstじゃなくて、test after first releaseってことですか、(チカラ無く)ハハハ。

いちおう動くので、試してみてください。つっても、どう試すか分からないかな?こんな感じです(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)を作ったとき、最後の縦棒の右に空白があると、その行の前でテーブルが終わってしまう。これ、敏感すぎ!(ほとんどバグじゃん)
[追記] それと、表の見た目がプレビューと本番では違うし。)