Skip to main content

Module rule_index

Module rule_index 

Source
Expand description

セレクタ右端キーによるルールインデックス(カスケード高速化)。

§背景

カスケードは「全ルール × 全ノード」を総当たりで matches_selector に掛けていた。 実サイト(www.sugi-lab.net)では Font Awesome を含めて 2403 ルールあり、 ノード数 365 との組み合わせで 1 回のレイアウトに約 50 秒かかっていた。 JS タイマーが毎フレーム DOM を dirty にするため、この 50 秒が延々と繰り返され、 ページが一度も描画完了しない状態になっていた。

§手法

ブラウザ実装と同じく、セレクタの右端コンパウンドから絞り込みキーを 1 つ取り、 #id / .class / tag のバケットへ振り分けておく。ある要素に対しては 「その要素の id / class / タグ名に対応するバケット」+「ユニバーサルバケット」 だけを照合すればよく、.fa-xxx のような数千件のアイコンルールは 対象要素がそのクラスを持たない限り一切触らない。

キーの選択は右端コンパウンド内で id > class > tag > universal の順。 右端が :hover[attr] だけで id/class/tag を持たない場合は 必ず universal 扱いにする(絞り込みで取りこぼすと描画が壊れるため、 判断がつかないものは常に照合する側へ倒す)。

本モジュールはグローバル状態にもハードウェアにも依存しない純粋ロジックのみで構成し、 ホスト側の単体試験で契約を固定する。

Structs§

RuleIndex
スタイルシート内のルールを右端キーで振り分けた索引。 保持するのは元の rules スライスに対する添字のみで、ルール本体は複製しない。

Enums§

IndexError
インデックス操作の引数が不正だった場合のエラー。
RuleKey
ルールを振り分けるバケットの種類。

Constants§

STATE_ACTIVE
STATE_FOCUS
STATE_HOVER
state_masks のビット位置。

Functions§

key_from_simple 🔒
右端コンパウンドから絞り込みキーを決める。
push_unique 🔒
既に末尾にある添字は積まない(同一ルールが複数セレクタで同じバケットへ来る場合)。
rightmost_key
セレクタ 1 本の絞り込みキーを返す。チェーンなら右端のステップを見る。