Class: Dommy::Internal::CSS::RuleIndex
- Inherits:
-
Object
- Object
- Dommy::Internal::CSS::RuleIndex
- Defined in:
- lib/dommy/internal/css/rule_index.rb
Overview
The document-wide "rule -> matched elements" index: every style rule's selector runs through SelectorMatcher exactly once, so per-element cascade work is a Hash lookup. Built lazily per style generation (see Cascade) and thrown away wholesale on invalidation — a viewport resize bumps the generation too, so @media re-evaluates.
Defined Under Namespace
Constant Summary collapse
- EMPTY =
[].freeze
Class Method Summary collapse
Instance Method Summary collapse
-
#author_rules? ⇒ Boolean
True when the document carries any author CSS at all — lets callers (visible? fast path) skip cascade work entirely.
-
#initialize(document) ⇒ RuleIndex
constructor
A new instance of RuleIndex.
-
#layer_count ⇒ Object
The number of explicit cascade layers — also the index of the implicit final layer that holds all unlayered styles.
-
#layer_index_of(layer) ⇒ Object
A match's layer position for cascade sorting: the explicit layer's 0-based order, or #layer_count for unlayered styles (and any layer name that was never declared).
- #matches_for(element, pseudo_element = nil) ⇒ Object
Constructor Details
#initialize(document) ⇒ RuleIndex
Returns a new instance of RuleIndex.
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/dommy/internal/css/rule_index.rb', line 31 def initialize(document) @document = document @index = {}.compare_by_identity @pseudo_index = Hash.new { |h, k| h[k] = {}.compare_by_identity } @order = 0 @imported_urls = {} # Cascade-layer order: full layer name => 0-based index, assigned on # first declaration (statement or block), in source order across all # sheets. Unlayered styles act as a final implicit layer at index # #layer_count (see Cascade#layer_rank). @layer_order = {} @anon_layer_seq = 0 add_rules(UAStylesheet.rules, :ua) .each { |rules| add_rules(rules, :author) } add_shadow_sheets end |
Class Method Details
.build(document) ⇒ Object
27 28 29 |
# File 'lib/dommy/internal/css/rule_index.rb', line 27 def self.build(document) new(document) end |
Instance Method Details
#author_rules? ⇒ Boolean
True when the document carries any author CSS at all — lets callers (visible? fast path) skip cascade work entirely.
64 65 66 |
# File 'lib/dommy/internal/css/rule_index.rb', line 64 def @author_rules ? true : false end |
#layer_count ⇒ Object
The number of explicit cascade layers — also the index of the implicit final layer that holds all unlayered styles.
70 71 72 |
# File 'lib/dommy/internal/css/rule_index.rb', line 70 def layer_count @layer_order.size end |
#layer_index_of(layer) ⇒ Object
A match's layer position for cascade sorting: the explicit layer's 0-based order, or #layer_count for unlayered styles (and any layer name that was never declared). See Cascade#layer_rank.
77 78 79 |
# File 'lib/dommy/internal/css/rule_index.rb', line 77 def layer_index_of(layer) (layer && @layer_order[layer]) || @layer_order.size end |
#matches_for(element, pseudo_element = nil) ⇒ Object
54 55 56 57 58 59 60 |
# File 'lib/dommy/internal/css/rule_index.rb', line 54 def matches_for(element, pseudo_element = nil) if pseudo_element (@pseudo_index[pseudo_name(pseudo_element)] || EMPTY)[element] || EMPTY else @index[element] || EMPTY end end |