csspool 0.2.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. data/.autotest +16 -0
  2. data/{CHANGELOG.txt → CHANGELOG.rdoc} +10 -0
  3. data/Manifest.txt +60 -72
  4. data/README.rdoc +78 -0
  5. data/Rakefile +9 -52
  6. data/lib/csspool/collection.rb +50 -0
  7. data/lib/csspool/css/charset.rb +7 -0
  8. data/lib/csspool/css/declaration.rb +8 -0
  9. data/lib/csspool/css/document.rb +34 -0
  10. data/lib/csspool/css/document_handler.rb +51 -0
  11. data/lib/csspool/css/import_rule.rb +15 -0
  12. data/lib/csspool/css/media.rb +7 -0
  13. data/lib/csspool/css/rule_set.rb +12 -0
  14. data/lib/csspool/css.rb +7 -0
  15. data/lib/csspool/lib_croco/cr_additional_sel.rb +46 -0
  16. data/lib/csspool/lib_croco/cr_attr_sel.rb +16 -0
  17. data/lib/csspool/lib_croco/cr_doc_handler.rb +24 -0
  18. data/lib/csspool/lib_croco/cr_num.rb +13 -0
  19. data/lib/csspool/lib_croco/cr_parser.rb +11 -0
  20. data/lib/csspool/lib_croco/cr_parsing_location.rb +17 -0
  21. data/lib/csspool/lib_croco/cr_pseudo.rb +14 -0
  22. data/lib/csspool/lib_croco/cr_rgb.rb +18 -0
  23. data/lib/csspool/lib_croco/cr_selector.rb +34 -0
  24. data/lib/csspool/lib_croco/cr_simple_sel.rb +54 -0
  25. data/lib/csspool/lib_croco/cr_term.rb +97 -0
  26. data/lib/csspool/lib_croco/glist.rb +21 -0
  27. data/lib/csspool/lib_croco.rb +78 -0
  28. data/lib/csspool/node.rb +5 -0
  29. data/lib/csspool/sac/document.rb +35 -0
  30. data/lib/csspool/sac/parser.rb +122 -0
  31. data/lib/csspool/sac.rb +2 -0
  32. data/lib/csspool/selector.rb +32 -0
  33. data/lib/csspool/selectors/additional.rb +6 -0
  34. data/lib/csspool/selectors/attribute.rb +21 -0
  35. data/lib/csspool/selectors/class.rb +11 -0
  36. data/lib/csspool/selectors/id.rb +11 -0
  37. data/lib/csspool/selectors/pseudo_class.rb +13 -0
  38. data/lib/csspool/selectors/simple.rb +22 -0
  39. data/lib/csspool/selectors/type.rb +6 -0
  40. data/lib/csspool/selectors/universal.rb +6 -0
  41. data/lib/csspool/selectors.rb +8 -0
  42. data/lib/csspool/terms/function.rb +17 -0
  43. data/lib/csspool/terms/hash.rb +6 -0
  44. data/lib/csspool/terms/ident.rb +15 -0
  45. data/lib/csspool/terms/number.rb +14 -0
  46. data/lib/csspool/terms/rgb.rb +23 -0
  47. data/lib/csspool/terms/string.rb +6 -0
  48. data/lib/csspool/terms/uri.rb +6 -0
  49. data/lib/csspool/terms.rb +7 -0
  50. data/lib/csspool/visitable.rb +18 -0
  51. data/lib/csspool/visitors/comparable.rb +78 -0
  52. data/lib/csspool/visitors/to_css.rb +201 -0
  53. data/lib/csspool/visitors/visitor.rb +17 -0
  54. data/lib/csspool/visitors.rb +3 -0
  55. data/lib/csspool.rb +18 -1
  56. data/test/css/test_document.rb +13 -0
  57. data/test/css/test_import_rule.rb +42 -0
  58. data/test/helper.rb +62 -6
  59. data/test/sac/test_parser.rb +115 -0
  60. data/test/sac/test_properties.rb +43 -0
  61. data/test/sac/test_terms.rb +134 -0
  62. data/test/test_collection.rb +81 -0
  63. data/test/test_parser.rb +75 -241
  64. data/test/test_selector.rb +45 -34
  65. data/test/visitors/test_comparable.rb +72 -0
  66. data/test/visitors/test_to_css.rb +141 -0
  67. metadata +98 -85
  68. data/README.txt +0 -79
  69. data/lib/css/sac/conditions/attribute_condition.rb +0 -56
  70. data/lib/css/sac/conditions/begin_hyphen_condition.rb +0 -22
  71. data/lib/css/sac/conditions/class_condition.rb +0 -22
  72. data/lib/css/sac/conditions/combinator_condition.rb +0 -40
  73. data/lib/css/sac/conditions/condition.rb +0 -35
  74. data/lib/css/sac/conditions/id_condition.rb +0 -27
  75. data/lib/css/sac/conditions/one_of_condition.rb +0 -22
  76. data/lib/css/sac/conditions/pseudo_class_condition.rb +0 -24
  77. data/lib/css/sac/conditions.rb +0 -5
  78. data/lib/css/sac/document_handler.rb +0 -67
  79. data/lib/css/sac/error_handler.rb +0 -14
  80. data/lib/css/sac/generated_parser.rb +0 -999
  81. data/lib/css/sac/generated_property_parser.rb +0 -9214
  82. data/lib/css/sac/lexeme.rb +0 -29
  83. data/lib/css/sac/lexical_unit.rb +0 -203
  84. data/lib/css/sac/parse_exception.rb +0 -6
  85. data/lib/css/sac/parser.rb +0 -115
  86. data/lib/css/sac/property_parser.rb +0 -47
  87. data/lib/css/sac/selectors/child_selector.rb +0 -40
  88. data/lib/css/sac/selectors/conditional_selector.rb +0 -49
  89. data/lib/css/sac/selectors/descendant_selector.rb +0 -40
  90. data/lib/css/sac/selectors/element_selector.rb +0 -39
  91. data/lib/css/sac/selectors/selector.rb +0 -31
  92. data/lib/css/sac/selectors/sibling_selector.rb +0 -39
  93. data/lib/css/sac/selectors/simple_selector.rb +0 -25
  94. data/lib/css/sac/selectors.rb +0 -5
  95. data/lib/css/sac/token.rb +0 -27
  96. data/lib/css/sac/tokenizer.rb +0 -187
  97. data/lib/css/sac/visitable.rb +0 -106
  98. data/lib/css/sac.rb +0 -14
  99. data/lib/css/stylesheet/rule.rb +0 -20
  100. data/lib/css/stylesheet/stylesheet.rb +0 -96
  101. data/lib/css/stylesheet.rb +0 -3
  102. data/lib/parser.y +0 -308
  103. data/lib/property_parser.y +0 -2346
  104. data/lib/property_parser.y.erb +0 -1321
  105. data/test/condition_test_case.rb +0 -6
  106. data/test/selector_test_case.rb +0 -20
  107. data/test/test_all.rb +0 -4
  108. data/test/test_attribute_condition.rb +0 -39
  109. data/test/test_begin_hyphen_condition.rb +0 -15
  110. data/test/test_child_selector.rb +0 -60
  111. data/test/test_class_condition.rb +0 -15
  112. data/test/test_combinator_condition.rb +0 -38
  113. data/test/test_condition.rb +0 -31
  114. data/test/test_conditional_selector.rb +0 -44
  115. data/test/test_descendant_selector.rb +0 -64
  116. data/test/test_element_selector.rb +0 -31
  117. data/test/test_error_recovery.rb +0 -28
  118. data/test/test_id_condition.rb +0 -16
  119. data/test/test_lexeme.rb +0 -39
  120. data/test/test_lexical_color.rb +0 -49
  121. data/test/test_lexical_function.rb +0 -31
  122. data/test/test_lexical_ident.rb +0 -30
  123. data/test/test_lexical_number.rb +0 -68
  124. data/test/test_lexical_string.rb +0 -23
  125. data/test/test_lexical_unit.rb +0 -106
  126. data/test/test_lexical_uri.rb +0 -28
  127. data/test/test_one_of_condition.rb +0 -15
  128. data/test/test_parse_error.rb +0 -199
  129. data/test/test_property_parser.rb +0 -593
  130. data/test/test_selector_as_string.rb +0 -94
  131. data/test/test_selector_parser.rb +0 -178
  132. data/test/test_sibling_selector.rb +0 -42
  133. data/test/test_simple_selector.rb +0 -9
  134. data/test/test_specificity.rb +0 -76
  135. data/test/test_stylesheet.rb +0 -95
  136. data/test/test_token.rb +0 -24
  137. data/test/test_tokenizer.rb +0 -127
  138. data/test/test_xpath.rb +0 -105
@@ -1,29 +0,0 @@
1
- module CSS
2
- module SAC
3
- class Lexeme
4
- attr_reader :name, :pattern
5
-
6
- def initialize(name, pattern=nil, &block)
7
- raise ArgumentError, "name required" unless name
8
-
9
- @name = name
10
- patterns = []
11
-
12
- patterns << pattern if pattern
13
- yield(patterns) if block_given?
14
-
15
- if patterns.empty?
16
- raise ArgumentError, "at least one pattern required"
17
- end
18
-
19
- patterns.collect! do |pattern|
20
- source = pattern.source
21
- source = "\\A#{source}"
22
- Regexp.new(source, Regexp::IGNORECASE + Regexp::MULTILINE)
23
- end
24
-
25
- @pattern = Regexp.union(*patterns)
26
- end
27
- end
28
- end
29
- end
@@ -1,203 +0,0 @@
1
- module CSS
2
- module SAC
3
- class LexicalUnit
4
- attr_accessor :dimension_unit_text,
5
- :lexical_unit_type,
6
- :float_value,
7
- :integer_value,
8
- :string_value,
9
- :parameters,
10
- :function_name
11
-
12
- def ==(other)
13
- self.class === other && self.lexical_unit_type == other.lexical_unit_type
14
- end
15
-
16
- def eql?(other)
17
- self == other
18
- end
19
-
20
- alias :to_s :string_value
21
- end
22
-
23
- class Function < LexicalUnit
24
- FUNCTIONS = {
25
- 'counter' => :SAC_COUNTER_FUNCTION,
26
- 'counters' => :SAC_COUNTERS_FUNCTION,
27
- 'rect' => :SAC_RECT_FUNCTION,
28
- }
29
- def initialize(name, params)
30
- self.string_value = "#{name}#{params.join(', ')})"
31
- name =~ /^(.*)\(/
32
- self.function_name = $1
33
- self.parameters = params
34
- self.lexical_unit_type = FUNCTIONS[self.function_name] || :SAC_FUNCTION
35
- end
36
-
37
- def ==(other)
38
- super && %w{ function_name parameters }.all? { |x|
39
- self.send(x.to_sym) == other.send(x.to_sym)
40
- }
41
- end
42
-
43
- def hash
44
- ([self.function_name] + parameters).hash
45
- end
46
- end
47
-
48
- class Color < LexicalUnit
49
- def initialize(value)
50
- self.string_value = value
51
- self.lexical_unit_type = :SAC_RGBCOLOR
52
- if value =~ /^#([A-F\d]{1,2})([A-F\d]{1,2})([A-F\d]{1,2})$/
53
- self.parameters = [$1, $2, $3].map { |x|
54
- x.length == 1 ? (x * 2).hex : x.hex
55
- }.map { |x|
56
- Number.new(x, '', :SAC_INTEGER)
57
- }
58
- else
59
- self.parameters = [LexicalIdent.new(value)]
60
- end
61
- end
62
-
63
- def ==(other)
64
- super && self.parameters == other.parameters
65
- end
66
-
67
- def hash
68
- self.parameters.hash
69
- end
70
-
71
- def to_s
72
- if self.parameters.length < 3
73
- super
74
- else
75
- hex = self.parameters.map { |x|
76
- sprintf("%02X", x.integer_value).split('').uniq
77
- }.flatten
78
- hex.length != 3 ? super : "##{hex.join()}"
79
- end
80
- end
81
- end
82
-
83
- class LexicalString < LexicalUnit
84
- def initialize(value)
85
- self.string_value = value
86
- self.lexical_unit_type = :SAC_STRING_VALUE
87
- end
88
-
89
- def ==(other)
90
- super && self.string_value == other.string_value
91
- end
92
-
93
- def hash
94
- self.string_value.hash
95
- end
96
- end
97
-
98
- class LexicalIdent < LexicalUnit
99
- def initialize(value)
100
- self.string_value = value
101
- self.lexical_unit_type = :SAC_IDENT
102
- end
103
-
104
- def ==(other)
105
- super && self.string_value == other.string_value
106
- end
107
-
108
- def hash
109
- self.string_value.hash
110
- end
111
- end
112
-
113
- class LexicalURI < LexicalUnit
114
- def initialize(value)
115
- self.string_value = value.gsub(/^url\(/, '').gsub(/\)$/, '')
116
- self.lexical_unit_type = :SAC_URI
117
- end
118
-
119
- def ==(other)
120
- super && self.string_value == other.string_value
121
- end
122
-
123
- def hash
124
- self.string_value.hash
125
- end
126
-
127
- def to_s
128
- "url(#{string_value})"
129
- end
130
- end
131
-
132
- class Number < LexicalUnit
133
- NON_NEGATIVE_UNITS = [
134
- :SAC_DEGREE,
135
- :SAC_GRADIAN,
136
- :SAC_RADIAN,
137
- :SAC_MILLISECOND,
138
- :SAC_SECOND,
139
- :SAC_HERTZ,
140
- :SAC_KILOHERTZ,
141
- ]
142
- UNITS = {
143
- 'deg' => :SAC_DEGREE,
144
- 'rad' => :SAC_RADIAN,
145
- 'grad' => :SAC_GRADIAN,
146
- 'ms' => :SAC_MILLISECOND,
147
- 's' => :SAC_SECOND,
148
- 'hz' => :SAC_HERTZ,
149
- 'khz' => :SAC_KILOHERTZ,
150
- 'px' => :SAC_PIXEL,
151
- 'cm' => :SAC_CENTIMETER,
152
- 'mm' => :SAC_MILLIMETER,
153
- 'in' => :SAC_INCH,
154
- 'pt' => :SAC_POINT,
155
- 'pc' => :SAC_PICA,
156
- '%' => :SAC_PERCENTAGE,
157
- 'em' => :SAC_EM,
158
- 'ex' => :SAC_EX,
159
- }
160
- def initialize(value, unit = nil, type = nil)
161
- if value.is_a?(String)
162
- value =~ /^(-?[0-9.]*)(.*)$/
163
- value = $1
164
- unit ||= $2
165
- end
166
- type ||= UNITS[self.dimension_unit_text]
167
- self.string_value = "#{value}#{unit}"
168
- self.float_value = value.to_f
169
- self.integer_value = value.to_i
170
- self.dimension_unit_text = unit.downcase
171
- self.lexical_unit_type = UNITS[self.dimension_unit_text] ||
172
- (value =~ /\./ ? :SAC_NUMBER : :SAC_INTEGER)
173
- end
174
-
175
- def ==(other)
176
- return true if self.float_value == 0 && other.float_value == 0
177
- return false unless super
178
-
179
- %w{ float_value integer_value dimension_unit_text }.all? { |x|
180
- self.send(x.to_sym) == other.send(x.to_sym)
181
- }
182
- end
183
-
184
- def hash
185
- if self.float_value == 0
186
- self.float_value.hash
187
- else
188
- %w{ float_value integer_value dimension_unit_text }.map { |x|
189
- self.send(x.to_sym)
190
- }.hash
191
- end
192
- end
193
-
194
- def to_s
195
- if self.float_value == 0
196
- "0"
197
- else
198
- super
199
- end
200
- end
201
- end
202
- end
203
- end
@@ -1,6 +0,0 @@
1
- module CSS
2
- module SAC
3
- class ParseException < RuntimeError
4
- end
5
- end
6
- end
@@ -1,115 +0,0 @@
1
- require "css/sac/visitable"
2
- require "css/sac/document_handler"
3
- require "css/sac/error_handler"
4
- require "css/sac/generated_parser"
5
- require "css/sac/lexical_unit"
6
- require "css/sac/parse_exception"
7
- require "css/sac/tokenizer"
8
- require "css/sac/property_parser"
9
-
10
- require "css/sac/conditions"
11
- require "css/sac/selectors"
12
-
13
- module CSS
14
- module SAC
15
- class Parser < CSS::SAC::GeneratedParser
16
- # The version of CSSPool you're using
17
- VERSION = '0.2.6'
18
-
19
- TOKENIZER = Tokenizer.new
20
-
21
- attr_accessor :document_handler, :error_handler, :logger
22
-
23
- def initialize(document_handler = StyleSheet.new(self))
24
- @error_handler = ErrorHandler.new
25
- @document_handler = document_handler
26
- @property_parser = PropertyParser.new()
27
- @tokenizer = TOKENIZER
28
- @logger = nil
29
- end
30
-
31
- def parse_style_sheet(string)
32
- @yydebug = true
33
- @tokens = TOKENIZER.tokenize(string)
34
- @position = 0
35
-
36
- self.document_handler.start_document(string)
37
- do_parse
38
- self.document_handler.end_document(string)
39
- self.document_handler
40
- end
41
-
42
- alias :parse :parse_style_sheet
43
-
44
- def parse_rule(rule)
45
- returner = Class.new(DocumentHandler) {
46
- attr_accessor :selector
47
- alias :start_selector :selector=
48
- }.new
49
- old_document_handler = self.document_handler
50
- self.document_handler = returner
51
- self.parse("#{rule} { }")
52
- self.document_handler = old_document_handler
53
- returner.selector
54
- end
55
-
56
- # Returns the parser version. We return CSS2, but its actually
57
- # CSS2.1. No font-face tags. Sorry.
58
- def parser_version
59
- "http://www.w3.org/TR/REC-CSS2"
60
- end
61
-
62
- attr_reader :property_parser
63
- attr_reader :tokenizer
64
-
65
- private # Bro.
66
-
67
- # We have to eliminate matching pairs.
68
- # http://www.w3.org/TR/CSS21/syndata.html#parsing-errors
69
- # See the malformed declarations section
70
- def eliminate_pair_matches(error_value)
71
- pairs = {}
72
- pairs['"'] = '"'
73
- pairs["'"] = "'"
74
- pairs['{'] = '}'
75
- pairs['['] = ']'
76
- pairs['('] = ')'
77
-
78
- error_value.strip!
79
- if pairs[error_value]
80
- logger.warn("Eliminating pair for: #{error_value}") if logger
81
- loop {
82
- token = next_token
83
- eliminate_pair_matches(token[1])
84
- logger.warn("Eliminated token: #{token.join(' ')}") if logger
85
- if token[1] == pairs[error_value]
86
- @position -= 1
87
- @tokens[@position] = Token.new(:S, ' ', nil) # super hack
88
- break
89
- end
90
- }
91
- end
92
- end
93
-
94
- def on_error(error_token_id, error_value, value_stack)
95
- if logger
96
- logger.error(token_to_str(error_token_id))
97
- logger.error("error value: #{error_value}")
98
- end
99
- eliminate_pair_matches(error_value)
100
- end
101
-
102
- def next_token
103
- return [false, false] if @position >= @tokens.length
104
-
105
- n_token = @tokens[@position]
106
- @position += 1
107
- if n_token.name == :COMMENT
108
- self.document_handler.comment(n_token.value)
109
- return next_token
110
- end
111
- n_token.to_racc_token
112
- end
113
- end
114
- end
115
- end
@@ -1,47 +0,0 @@
1
- require "css/sac/generated_property_parser"
2
-
3
- module CSS
4
- module SAC
5
- class PropertyParser < CSS::SAC::GeneratedPropertyParser
6
- def initialize
7
- @tokens = []
8
- @token_table = Racc_arg[10]
9
- end
10
-
11
- def parse_tokens(tokens)
12
- negate = false # Nasty hack for unary minus
13
- @tokens = tokens.find_all { |x| x.name != :S }.map { |token|
14
- tok = if @token_table.has_key?(token.value)
15
- [token.value, token.value]
16
- else
17
- if token.name == :delim && !@token_table.has_key?(token.value)
18
- negate = true if token.value == '-'
19
- nil
20
- else
21
- token.to_racc_token
22
- end
23
- end
24
-
25
- if negate && tok
26
- tok[1] = "-#{tok[1]}"
27
- negate = false
28
- end
29
-
30
- tok
31
- }.compact
32
-
33
- begin
34
- return do_parse
35
- rescue ParseError => e
36
- return nil
37
- end
38
- end
39
-
40
- private
41
- def next_token
42
- return [false, false] if @tokens.empty?
43
- @tokens.shift
44
- end
45
- end
46
- end
47
- end
@@ -1,40 +0,0 @@
1
- require "css/sac/selectors"
2
-
3
- module CSS
4
- module SAC
5
- module Selectors
6
- class ChildSelector < SimpleSelector
7
- attr_accessor :ancestor_selector, :simple_selector
8
- alias :parent :ancestor_selector
9
- alias :selector :simple_selector
10
-
11
- def initialize(parent, selector)
12
- super(:SAC_CHILD_SELECTOR)
13
-
14
- @ancestor_selector = parent
15
- @simple_selector = selector
16
- end
17
-
18
- def to_css
19
- "#{parent.to_css} > #{selector.to_css}"
20
- end
21
-
22
- def to_xpath(prefix=true)
23
- "#{parent.to_xpath(prefix)}/#{selector.to_xpath(false)}"
24
- end
25
-
26
- def specificity
27
- parent.specificity.zip(selector.specificity).map { |x,y| x + y }
28
- end
29
-
30
- def ==(other)
31
- super && parent == other.parent && selector == other.selector
32
- end
33
-
34
- def hash
35
- [parent, selector].hash
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,49 +0,0 @@
1
- require "css/sac/selectors"
2
-
3
- module CSS
4
- module SAC
5
- module Selectors
6
- class ConditionalSelector < SimpleSelector
7
- attr_accessor :condition, :simple_selector
8
- alias :selector :simple_selector
9
-
10
- def initialize(selector, condition)
11
- super(:SAC_CONDITIONAL_SELECTOR)
12
-
13
- @condition = condition
14
- @simple_selector = selector
15
- end
16
-
17
- def to_css
18
- [selector, condition].map { |x|
19
- x ? x.to_css : ''
20
- }.join('')
21
- end
22
-
23
- def to_xpath(prefix=true)
24
- atoms = []
25
- atoms << "//" if prefix
26
- atoms << (selector ? selector.to_xpath(false) : "*")
27
- atoms << condition.to_xpath
28
-
29
- atoms.join("")
30
- end
31
-
32
- def specificity
33
- (selector ? selector.specificity : ([0] * 4)).zip(
34
- (condition ? condition.specificity : ([0] * 4))).map { |x,y|
35
- x + y
36
- }
37
- end
38
-
39
- def ==(other)
40
- super && condition == other.condition && selector == other.selector
41
- end
42
-
43
- def hash
44
- [condition, selector].hash
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,40 +0,0 @@
1
- require "css/sac/selectors"
2
-
3
- module CSS
4
- module SAC
5
- module Selectors
6
- class DescendantSelector < SimpleSelector
7
- attr_accessor :ancestor_selector, :simple_selector
8
- alias :ancestor :ancestor_selector
9
- alias :selector :simple_selector
10
-
11
- def initialize(ancestor, selector)
12
- super(:SAC_DESCENDANT_SELECTOR)
13
-
14
- @ancestor_selector = ancestor
15
- @simple_selector = selector
16
- end
17
-
18
- def to_css
19
- "#{ancestor.to_css} #{selector.to_css}"
20
- end
21
-
22
- def to_xpath(prefix=true)
23
- "#{ancestor.to_xpath(prefix)}//#{selector.to_xpath(false)}"
24
- end
25
-
26
- def specificity
27
- ancestor.specificity.zip(selector.specificity).map { |x,y| x + y }
28
- end
29
-
30
- def ==(other)
31
- super && selector == other.selector && ancestor == other.ancestor
32
- end
33
-
34
- def hash
35
- [selector, ancestor].hash
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,39 +0,0 @@
1
- require "css/sac/selectors"
2
-
3
- module CSS
4
- module SAC
5
- module Selectors
6
- class ElementSelector < SimpleSelector
7
- attr_reader :local_name
8
- alias :name :local_name
9
-
10
- def initialize(name)
11
- super(:SAC_ELEMENT_NODE_SELECTOR)
12
- @local_name = name
13
- end
14
-
15
- def to_css
16
- local_name
17
- end
18
-
19
- def to_xpath(prefix=true)
20
- atoms = [local_name]
21
- atoms.unshift("//") if prefix
22
- atoms.join
23
- end
24
-
25
- def specificity
26
- [0, 0, 0, 1]
27
- end
28
-
29
- def ==(other)
30
- super && name == other.name
31
- end
32
-
33
- def hash
34
- name.hash
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,31 +0,0 @@
1
- module CSS
2
- module SAC
3
- module Selectors
4
- class Selector
5
- include CSS::SAC::Visitable
6
-
7
- attr_reader :selector_type
8
-
9
- def initialize(selector_type)
10
- @selector_type = selector_type
11
- end
12
-
13
- def ==(other)
14
- self.class === other && selector_type == other.selector_type
15
- end
16
-
17
- def hash
18
- selector_type.hash
19
- end
20
-
21
- def eql?(other)
22
- self == other
23
- end
24
-
25
- def =~(node)
26
- MatchesVisitor.new(node).accept(self)
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,39 +0,0 @@
1
- require "css/sac/selectors"
2
-
3
- module CSS
4
- module SAC
5
- module Selectors
6
- class SiblingSelector < SimpleSelector
7
- attr_accessor :selector, :sibling_selector
8
- alias :sibling :sibling_selector
9
-
10
- def initialize(selector, sibling)
11
- super(:SAC_DIRECT_ADJACENT_SELECTOR)
12
-
13
- @selector = selector
14
- @sibling_selector = sibling
15
- end
16
-
17
- def to_css
18
- "#{selector.to_css} + #{sibling.to_css}"
19
- end
20
-
21
- def to_xpath(prefix=true)
22
- "#{selector.to_xpath(prefix)}/following-sibling::#{sibling.to_xpath(false)}"
23
- end
24
-
25
- def specificity
26
- selector.specificity.zip(sibling.specificity).map { |x,y| x + y }
27
- end
28
-
29
- def ==(other)
30
- super && selector == other.selector && sibling == other.sibling
31
- end
32
-
33
- def hash
34
- [selector, sibling].hash
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,25 +0,0 @@
1
- require "css/sac/selectors"
2
-
3
- module CSS
4
- module SAC
5
- module Selectors
6
- class SimpleSelector < Selector
7
- def initialize(selector_type=:SAC_ANY_NODE_SELECTOR)
8
- super(selector_type)
9
- end
10
-
11
- def to_css
12
- '*'
13
- end
14
-
15
- def to_xpath
16
- "//*"
17
- end
18
-
19
- def specificity
20
- [0, 0, 0, 0]
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,5 +0,0 @@
1
- require "css/sac/selectors/selector"
2
-
3
- %w(simple child conditional descendant element sibling).each do |type|
4
- require "css/sac/selectors/#{type}_selector"
5
- end
data/lib/css/sac/token.rb DELETED
@@ -1,27 +0,0 @@
1
- module CSS
2
- module SAC
3
- class Token
4
- attr_reader :name, :value, :position
5
-
6
- def initialize(name, value, position)
7
- @name = name
8
- @value = value
9
- @position = position
10
- end
11
-
12
- def to_racc_token
13
- [name, value]
14
- end
15
- end
16
-
17
- class DelimiterToken < Token
18
- def initialize(value, position)
19
- super(:delim, value, position)
20
- end
21
-
22
- def to_racc_token
23
- [value, value]
24
- end
25
- end
26
- end
27
- end