prototype.jsを読み解く

第7回 Prototypeライブラリ(2052~2276行目)

この記事を読むのに必要な時間:およそ 10 分

2096:   compileXPathMatcher: function() {
2097:     var e = this.expression, ps = Selector.patterns,
2098:         x = Selector.xpath, le,  m;
2099: 
2100:     if (Selector._cache[e]) {
2101:       this.xpath = Selector._cache[e]; return;
2102:     }
2103: 
2104:     this.matcher = ['.//*'];
2105:     while (e && le != e && (/\S/).test(e)) {
2106:       le = e;
2107:       for (var i in ps) {
2108:         if (m = e.match(ps[i])) {
2109:           this.matcher.push(typeof x[i] == 'function' ? x[i](m) :
2110:             new Template(x[i]).evaluate(m));
2111:           e = e.replace(m[0], '');
2112:           break;
2113:         }
2114:       }
2115:     }
2116: 
2117:     this.xpath = this.matcher.join('');
2118:     Selector._cache[this.expression] = this.xpath;
2119:   },
2120: 

2096行目からはXPath版のマッチ関数を作るcompileXPathMatcher()です。

こちらではSelector.criteria, Selector.handlersの代わりにSelector.xpathに入っているルールを用います。

compileMatcher()と違う所は,Selector.criteriaではなくSelector.xpathを使うことと,最後にthis.matcherに関数を入れるのではなくthis.xpathにXPath式を入れる,というくらいです。

2121:   findElements: function(root) {
2122:     root = root || document;
2123:     if (this.xpath) return document._getElementsByXPath(this.xpath, root);
2124:     return this.matcher(root);
2125:   },
2126: 

ライブラリ内でも使われているfindElements()メソッドです。

コンストラクタでthis.xpathが定義されていれば,document._getElementsByXPath()を使って見つかった要素の配列を返します。

そうでなければthis.matcherに定義した関数を呼び出します。

2127:   match: function(element) {
2128:     return this.findElements(document).include(element);
2129:   },
2130: 

こちらもよく使われるmatch()メソッドです。先ほどのfindElements()を呼び出し,返ってきた配列の中に,elementが含まれているかどうかをbooleanで返します。

2131:   toString: function() {
2132:     return this.expression;
2133:   },
2134: 

toString()メソッドでは,コンストラクタに渡されたCSSフィルタ文字列を返します。

2135:   inspect: function() {
2136:     return "#<Selector:" + this.expression.inspect() + ">";
2137:   }
2138: };
2139: 

inspect()メソッドでは,Selectorクラスだとわかる形で,CSSフィルタ文字列を返します。

2140: Object.extend(Selector, {
2141:   _cache: {},
2142: 

2140行目からは Selectorオブジェクトに対して関数を追加しています。これらはprototype以下ではなくSelector直下なので,インスタンスのメソッドとしては現れず,参照する場合はSelector._cacheなどと記述する形になります。

2141行目の_cacheは,CSSフィルタ文字列からマッチ関数(やXPath式)を取り出す際にキャッシュしておくための場所です。

著者プロフィール

栗山淳(くりやまじゅん)

S2ファクトリー株式会社株式会社イメージソース所属。
本業はWeb制作会社の裏方。得意分野はFreeBSDやPerlのはずだが,必要に迫られるとHTML/CSSやJavaScriptも書く。