Class: Dommy::Internal::CSS::RuleIndex

Inherits:
Object
  • Object
show all
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

Classes: Match, Scope, Shadow

Constant Summary collapse

EMPTY =
[].freeze

Class Method Summary collapse

Instance Method Summary collapse

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)
  author_sheets.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.

Returns:

  • (Boolean)


64
65
66
# File 'lib/dommy/internal/css/rule_index.rb', line 64

def author_rules?
  @author_rules ? true : false
end

#layer_countObject

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