DOMParser ?

multi_requester.js に foks.info ( http://foks.info/about/ ) を追加するときに気付いたんだけど parse 処理なんかおかしい。ので応急処置はした ( http://coderepos.org/share/changeset/25338 ) んだけど原因サッパリわかってない。いや commit した時点では DOCTYPE 指定がないから parse おかしくなってるんだと思ったんだよ。

multi_requester.js で request した document を xml として parse する理由は大まかに以下の 2 つ ( 他にもある ? ) 。

  • liberator.echo では valid な xml 文書しか受け付けないのでそのチェック
  • evaluate での XPath 式の適用前準備

今回は parse した結果 DocumentFragment object が返ってきてた ( 期待するのは xmlDocument ) ので前者の条件は満たされてたみたいなんだけどこいつには evaluate がないのでコケてたという状況。幸い multi_requester.js では parse に失敗したときに代替手段で無理矢理 xmlDocument object に変換する方法をとっていたのでそっちへ switch するようにしたんだけど…。

今検証コード書いてみたら ( 以下の code 流し込んでから []:domtest http://foks.info/translate/?target=%E5%A4%A9%E7%B6%B2%E6%81%A2%E3%80%85[] ) foks.info の検索結果も普通に parse できてるんだけどどういうことなの… ?

commands.addUserCommand(
    ['domtest'],
    'domtest',
    function (args) {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', args[0], false);
        xhr.send(null);
        if (xhr.status === 200) {
            let dom = (new DOMParser()).parseFromString(xhr.responseText, 'application/xml');

            // result: true
            liberator.log(dom instanceof xmlDocument, 0);
            // xml 文書として整形して表示される
            liberator.echo(xhr.responseText, commandline.FORCE_MULTILINE);
        }
    },
    {}
);

取ってきたあとで Range object ( https://developer.mozilla.org/en/DOM/document.createRange ) 使ってこちゃこちゃやってるところがおかしそうなんだけど Range とかいまサパーリなのでとりあえず保留。まぁちょっとさわってみたかったのでいろいろ遊びながらいじってみる予定ではある。てか今回の問題は html を xml に変換する妥当な方法が見つかればいいわけだからそういう方向でも考えてみた方がよさげかなぁ。