Kanasan.JS Greasemonkey チュートリアル読書会2009年03月22日 19時28分

ちょうど 1 ヶ月前、2 月 22 日に開催された Kanasan.JS Greasemonkey チュートリアル読書会 (参加者ブログ一覧) に私も参加していました。時間がたちすぎて自分のメモからも情報を読み出せなくなりかけているのですが、何とかここに再現してまとめたいと思います。全体のまとめは「Firebugで作るGreasemonkeyスクリプト~入門と実践(From Kanasan.JS) | Blog.37to.net」に詳しいので、自分の気になった点に関してだけです。

HTML の解析

Greasemonkey スクリプトを書くには対象サイトの HTML を解析する必要があります。多くの人は Firebug を使っているようですが、私が使っているのは DOM Inspector です。これは単に昔から DOM Inspector を使っていたという慣れの問題ですが、一応 Firebug に比べて chrome 文書 (ブラウザ画面などを構成する文書) やアクセシブルノードの解析ができるといった利点もあります。

XPath での文字列置換

XPath には translate 関数がありますが、これは Perl の tr 演算子と同じで、ある 1 文字を別の 1 文字に置き換えることしかできません。ある部分文字列を別の部分文字列に置き換えたいときは、JavaScript と組み合わせたほうが早いです。Firefox 3 では EXSLT に対応しているので XSLT 中の XPath では正規表現による置換が行えますが、DOM 3 XPath を通じての拡張関数の利用はできないようです。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="application/xml" href=""?>
<root xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:regexp="http://exslt.org/regular-expressions"
      xsl:version="1.0">
  <xsl:value-of select="regexp:replace('Hello, XPath world!', 'XPath', '', 'RegExp')"/>
</root>

document.evaluate の第 5 引数

document.evaluate メソッドの返り値である XPathResult オブジェクトを、別の evaluate メソッドの呼び出し時に第 5 引数として渡すと、その XPathResult オブジェクトが再利用されます。しかし、「再利用される」とは具体的にどうなることかという説明は DOM 3 XPath 仕様中になく、そもそも may be reused (強調は筆者による) なので確実に再利用されるという保証もありません。Firefox (Gecko) と Opera では第 5 引数に渡したオブジェクトが返り値となりますが、Safari (WebKit) では常に新しいオブジェクトを生成して返すようです。ちなみに Firefox では第 5 引数を指定すると意図しない結果になることがあります。

var result = document.evaluate("'foo'", document, null,
                               XPathResult.STRING_TYPE, null);
document.evaluate("'bar'", document, null,
                  XPathResult.STRING_TYPE, result);
result.stringValue;
// Firefox 3.6a1pre => "foobar" ("bar" を期待していたのに!)
// Opera 9.64       => "bar"
// Safari 3.1.2     => "foo"

順序付きの型と順序なしの型

XPathResult には結果の型として順序付きのもの (ORDERED_NODE_ITERATOR_TYPEORDERED_NODE_SNAPSHOT_TYPEFIRST_ORDERED_NODE_TYPE) と順序なしのもの (UNORDERED_NODE_ITERATOR_TYPEUNORDERED_NODE_SNAPSHOT_TYPEANY_UNORDERED_NODE_TYPE) があります。ソースコードを見る限り、WebKit では順序付きかどうかで処理を分けていますが、Gecko では順序なしでも順序付きと同等に扱っているようです。

雑感

初めての Kanasan さん抜きでの Kanasan.JS でしたが、主催の 37to さんをはじめスタッフの方々のおかげでスムーズな進行だったと思います。テーマのほうも初めてだったせいか初参加の方も多く、懇親会ではいろいろと興味深い話が聞けました。スタッフ、参加者の皆さんありがとうございました。「ブログを書くまでが勉強会です」ということで 1 ヶ月も Kanasan.JS を続けてしまい申し訳ありません m(_ _)m

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
「ハイパーテキストマークアップ言語」をアルファベット4文字でいうと?

コメント:

トラックバック

このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2009/03/22/4197758/tb