csspool-st 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +16 -0
- data/.gemtest +0 -0
- data/CHANGELOG.rdoc +87 -0
- data/Manifest.txt +62 -0
- data/README.rdoc +65 -0
- data/Rakefile +50 -0
- data/lib/csspool/collection.rb +50 -0
- data/lib/csspool/css/charset.rb +13 -0
- data/lib/csspool/css/declaration.rb +19 -0
- data/lib/csspool/css/document.rb +34 -0
- data/lib/csspool/css/document_handler.rb +51 -0
- data/lib/csspool/css/import_rule.rb +27 -0
- data/lib/csspool/css/media.rb +13 -0
- data/lib/csspool/css/parser.rb +1298 -0
- data/lib/csspool/css/parser.y +398 -0
- data/lib/csspool/css/rule_set.rb +17 -0
- data/lib/csspool/css/tokenizer.rb +231 -0
- data/lib/csspool/css/tokenizer.rex +97 -0
- data/lib/csspool/css.rb +8 -0
- data/lib/csspool/node.rb +41 -0
- data/lib/csspool/sac/document.rb +35 -0
- data/lib/csspool/sac/parser.rb +16 -0
- data/lib/csspool/sac.rb +2 -0
- data/lib/csspool/selector.rb +36 -0
- data/lib/csspool/selectors/additional.rb +6 -0
- data/lib/csspool/selectors/attribute.rb +21 -0
- data/lib/csspool/selectors/class.rb +11 -0
- data/lib/csspool/selectors/id.rb +11 -0
- data/lib/csspool/selectors/pseudo_class.rb +13 -0
- data/lib/csspool/selectors/simple.rb +22 -0
- data/lib/csspool/selectors/type.rb +6 -0
- data/lib/csspool/selectors/universal.rb +6 -0
- data/lib/csspool/selectors.rb +9 -0
- data/lib/csspool/terms/function.rb +17 -0
- data/lib/csspool/terms/hash.rb +6 -0
- data/lib/csspool/terms/ident.rb +15 -0
- data/lib/csspool/terms/number.rb +14 -0
- data/lib/csspool/terms/rgb.rb +20 -0
- data/lib/csspool/terms/string.rb +6 -0
- data/lib/csspool/terms/uri.rb +6 -0
- data/lib/csspool/terms.rb +7 -0
- data/lib/csspool/visitors/children.rb +50 -0
- data/lib/csspool/visitors/comparable.rb +84 -0
- data/lib/csspool/visitors/iterator.rb +80 -0
- data/lib/csspool/visitors/to_css.rb +248 -0
- data/lib/csspool/visitors/visitor.rb +17 -0
- data/lib/csspool/visitors.rb +5 -0
- data/lib/csspool.rb +21 -0
- data/test/css/test_document.rb +13 -0
- data/test/css/test_import_rule.rb +42 -0
- data/test/css/test_parser.rb +462 -0
- data/test/css/test_tokenizer.rb +320 -0
- data/test/helper.rb +65 -0
- data/test/sac/test_parser.rb +123 -0
- data/test/sac/test_properties.rb +43 -0
- data/test/sac/test_terms.rb +228 -0
- data/test/test_collection.rb +81 -0
- data/test/test_parser.rb +91 -0
- data/test/test_selector.rb +51 -0
- data/test/visitors/test_children.rb +20 -0
- data/test/visitors/test_comparable.rb +102 -0
- data/test/visitors/test_each.rb +19 -0
- data/test/visitors/test_to_css.rb +309 -0
- metadata +214 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module CSS
|
3
|
+
class Tokenizer < Parser
|
4
|
+
|
5
|
+
macro
|
6
|
+
nl \n|\r\n|\r|\f
|
7
|
+
w [\s]*
|
8
|
+
nonascii [^\0-\177]
|
9
|
+
num ([0-9]*\.[0-9]+|[0-9]+)
|
10
|
+
unicode \\[0-9A-Fa-f]{1,6}(\r\n|[\s])?
|
11
|
+
|
12
|
+
escape {unicode}|\\[^\n\r\f0-9A-Fa-f]
|
13
|
+
nmchar [_A-Za-z0-9-]|{nonascii}|{escape}
|
14
|
+
nmstart [_A-Za-z]|{nonascii}|{escape}
|
15
|
+
ident [-@]?({nmstart})({nmchar})*
|
16
|
+
func [-@]?({nmstart})({nmchar}|[.])*
|
17
|
+
name ({nmchar})+
|
18
|
+
string1 "([^\n\r\f\\"]|\\{nl}|{nonascii}|{escape})*"
|
19
|
+
string2 '([^\n\r\f\\']|\\{nl}|{nonascii}|{escape})*'
|
20
|
+
string ({string1}|{string2})
|
21
|
+
invalid1 "([^\n\r\f\\"]|\\{nl}|{nonascii}|{escape})*
|
22
|
+
invalid2 '([^\n\r\f\\']|\\{nl}|{nonascii}|{escape})*
|
23
|
+
invalid ({invalid1}|{invalid2})
|
24
|
+
comment \/\*(.|{w})*?\*\/
|
25
|
+
|
26
|
+
rule
|
27
|
+
|
28
|
+
# [:state] pattern [actions]
|
29
|
+
|
30
|
+
url\({w}{string}{w}\) { [:URI, st(text)] }
|
31
|
+
url\({w}([!#\$%&*-~]|{nonascii}|{escape})*{w}\) { [:URI, st(text)] }
|
32
|
+
U\+[0-9a-fA-F?]{1,6}(-[0-9a-fA-F]{1,6})? {[:UNICODE_RANGE, st(text)] }
|
33
|
+
{w}{comment}{w} { next_token }
|
34
|
+
|
35
|
+
{func}\(\s* { [:FUNCTION, st(text)] }
|
36
|
+
{w}@import{w} { [:IMPORT_SYM, st(text)] }
|
37
|
+
{w}@page{w} { [:PAGE_SYM, st(text)] }
|
38
|
+
{w}@charset{w} { [:CHARSET_SYM, st(text)] }
|
39
|
+
{w}@media{w} { [:MEDIA_SYM, st(text)] }
|
40
|
+
{w}!({w}|{w}{comment}{w})important{w} { [:IMPORTANT_SYM, st(text)] }
|
41
|
+
{ident} { [:IDENT, st(text)] }
|
42
|
+
\#{name} { [:HASH, st(text)] }
|
43
|
+
{w}~={w} { [:INCLUDES, st(text)] }
|
44
|
+
{w}\|={w} { [:DASHMATCH, st(text)] }
|
45
|
+
{w}\^={w} { [:PREFIXMATCH, st(text)] }
|
46
|
+
{w}\$={w} { [:SUFFIXMATCH, st(text)] }
|
47
|
+
{w}\*={w} { [:SUBSTRINGMATCH, st(text)] }
|
48
|
+
{w}!={w} { [:NOT_EQUAL, st(text)] }
|
49
|
+
{w}={w} { [:EQUAL, st(text)] }
|
50
|
+
{w}\) { [:RPAREN, st(text)] }
|
51
|
+
{w}\({w} { [:LPAREN, st(text)] }
|
52
|
+
\[{w} { [:LSQUARE, st(text)] }
|
53
|
+
{w}\] { [:RSQUARE, st(text)] }
|
54
|
+
{w}\+{w} { [:PLUS, st(text)] }
|
55
|
+
{w}\{{w} { [:LBRACE, st(text)] }
|
56
|
+
{w}\}{w} { [:RBRACE, st(text)] }
|
57
|
+
{w}>{w} { [:GREATER, st(text)] }
|
58
|
+
{w},{w} { [:COMMA, st(',')] }
|
59
|
+
{w};{w} { [:SEMI, st(';')] }
|
60
|
+
\* { [:STAR, st(text)] }
|
61
|
+
{w}~{w} { [:TILDE, st(text)] }
|
62
|
+
\:not\({w} { [:NOT, st(text)] }
|
63
|
+
{w}{num}em{w} { [:EMS, st(text)] }
|
64
|
+
{w}{num}ex{w} { [:EXS, st(text)] }
|
65
|
+
|
66
|
+
{w}{num}(px|cm|mm|in|pt|pc){w} { [:LENGTH, st(text)] }
|
67
|
+
{w}{num}(deg|rad|grad){w} { [:ANGLE, st(text)] }
|
68
|
+
{w}{num}(ms|s){w} { [:TIME, st(text)] }
|
69
|
+
{w}{num}[k]?hz{w} { [:FREQ, st(text)] }
|
70
|
+
|
71
|
+
{w}{num}%{w} { [:PERCENTAGE, st(text)] }
|
72
|
+
{w}{num}{w} { [:NUMBER, st(text)] }
|
73
|
+
{w}\/\/{w} { [:DOUBLESLASH, st(text)] }
|
74
|
+
{w}\/{w} { [:SLASH, st('/')] }
|
75
|
+
<!-- { [:CDO, st(text)] }
|
76
|
+
--> { [:CDC, st(text)] }
|
77
|
+
{w}\-(?!{ident}){w} { [:MINUS, st(text)] }
|
78
|
+
{w}\+{w} { [:PLUS, st(text)] }
|
79
|
+
|
80
|
+
|
81
|
+
[\s]+ { [:S, st(text)] }
|
82
|
+
{string} { [:STRING, st(text)] }
|
83
|
+
{invalid} { [:INVALID, st(text)] }
|
84
|
+
. { [st(text), st(text)] }
|
85
|
+
|
86
|
+
inner
|
87
|
+
|
88
|
+
def st o
|
89
|
+
@st ||= Hash.new { |h,k| h[k] = k }
|
90
|
+
@st[o]
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# vim: syntax=lex
|
data/lib/csspool/css.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'csspool/css/tokenizer'
|
2
|
+
require 'csspool/css/charset'
|
3
|
+
require 'csspool/css/import_rule'
|
4
|
+
require 'csspool/css/media'
|
5
|
+
require 'csspool/css/rule_set'
|
6
|
+
require 'csspool/css/declaration'
|
7
|
+
require 'csspool/css/document'
|
8
|
+
require 'csspool/css/document_handler'
|
data/lib/csspool/node.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
module CSSPool
|
2
|
+
class Node
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def accept target
|
6
|
+
target.accept self
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_css options={}
|
10
|
+
if options[:minify]
|
11
|
+
to_minified_css
|
12
|
+
else
|
13
|
+
accept Visitors::ToCSS.new
|
14
|
+
end
|
15
|
+
end
|
16
|
+
alias :to_s :to_css
|
17
|
+
|
18
|
+
def to_minified_css
|
19
|
+
accept Visitors::ToMinifiedCSS.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def == other
|
23
|
+
return false unless self.class == other.class
|
24
|
+
|
25
|
+
accept Visitors::Comparable.new other
|
26
|
+
end
|
27
|
+
alias :eql? :==
|
28
|
+
|
29
|
+
def each &block
|
30
|
+
Visitors::Iterator.new(block).accept self
|
31
|
+
end
|
32
|
+
|
33
|
+
def children
|
34
|
+
accept Visitors::Children.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def hash
|
38
|
+
@hash ||= children.map { |child| child.hash }.hash
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module SAC
|
3
|
+
class Document
|
4
|
+
def start_document
|
5
|
+
end
|
6
|
+
|
7
|
+
def end_document
|
8
|
+
end
|
9
|
+
|
10
|
+
def charset name, location
|
11
|
+
end
|
12
|
+
|
13
|
+
def import_style media_list, uri, default_ns = nil, location = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def start_selector selector_list
|
17
|
+
end
|
18
|
+
|
19
|
+
def end_selector selector_list
|
20
|
+
end
|
21
|
+
|
22
|
+
def property name, expression, important
|
23
|
+
end
|
24
|
+
|
25
|
+
def comment comment
|
26
|
+
end
|
27
|
+
|
28
|
+
def start_media media_list, parse_location = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def end_media media_list, parse_location = {}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module SAC
|
3
|
+
class Parser < CSSPool::CSS::Tokenizer
|
4
|
+
attr_accessor :handler
|
5
|
+
|
6
|
+
def initialize handler = CSSPool::CSS::DocumentHandler.new
|
7
|
+
@handler = handler
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse string
|
11
|
+
scan_str string
|
12
|
+
@handler.document
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/csspool/sac.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module CSSPool
|
2
|
+
class Selector < CSSPool::Node
|
3
|
+
attr_accessor :simple_selectors
|
4
|
+
attr_accessor :parse_location
|
5
|
+
attr_accessor :rule_set
|
6
|
+
|
7
|
+
def initialize simple_selectors = [], parse_location = {}
|
8
|
+
@simple_selectors = simple_selectors
|
9
|
+
@parse_location = parse_location
|
10
|
+
@rule_set = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def declarations
|
14
|
+
@rule_set.declarations
|
15
|
+
end
|
16
|
+
|
17
|
+
def specificity
|
18
|
+
a = b = c = 0
|
19
|
+
simple_selectors.each do |s|
|
20
|
+
if !s.name.nil?
|
21
|
+
c += 1
|
22
|
+
end
|
23
|
+
s.additional_selectors.each do |additional_selector|
|
24
|
+
if Selectors::Id === additional_selector
|
25
|
+
a += 1
|
26
|
+
elsif Selectors::PseudoElement === additional_selector
|
27
|
+
c += 1
|
28
|
+
else
|
29
|
+
b += 1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
[a, b, c]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Selectors
|
3
|
+
class Attribute < CSSPool::Selectors::Additional
|
4
|
+
attr_accessor :name
|
5
|
+
attr_accessor :value
|
6
|
+
attr_accessor :match_way
|
7
|
+
|
8
|
+
NO_MATCH = 0
|
9
|
+
SET = 1
|
10
|
+
EQUALS = 2
|
11
|
+
INCLUDES = 3
|
12
|
+
DASHMATCH = 4
|
13
|
+
|
14
|
+
def initialize name, value, match_way
|
15
|
+
@name = name
|
16
|
+
@value = value
|
17
|
+
@match_way = match_way
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Selectors
|
3
|
+
class Simple < CSSPool::Node
|
4
|
+
NO_COMBINATOR = 0
|
5
|
+
DESCENDENT = 1
|
6
|
+
PRECEDED_BY = 2
|
7
|
+
CHILD = 3
|
8
|
+
|
9
|
+
attr_accessor :name
|
10
|
+
attr_accessor :parse_location
|
11
|
+
attr_accessor :additional_selectors
|
12
|
+
attr_accessor :combinator
|
13
|
+
|
14
|
+
def initialize name, combinator = nil
|
15
|
+
@name = name
|
16
|
+
@combinator = combinator
|
17
|
+
@parse_location = nil
|
18
|
+
@additional_selectors = []
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'csspool/selectors/simple'
|
2
|
+
require 'csspool/selectors/universal'
|
3
|
+
require 'csspool/selectors/type'
|
4
|
+
require 'csspool/selectors/additional'
|
5
|
+
require 'csspool/selectors/id'
|
6
|
+
require 'csspool/selectors/class'
|
7
|
+
require 'csspool/selectors/pseudo'
|
8
|
+
require 'csspool/selectors/attribute'
|
9
|
+
require 'csspool/selectors/media_expression'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Terms
|
3
|
+
class Function < CSSPool::Node
|
4
|
+
attr_accessor :name
|
5
|
+
attr_accessor :params
|
6
|
+
attr_accessor :parse_location
|
7
|
+
attr_accessor :operator
|
8
|
+
|
9
|
+
def initialize name, params, operator = nil, parse_location = nil
|
10
|
+
@name = name
|
11
|
+
@params = params
|
12
|
+
@operator = operator
|
13
|
+
@parse_location = parse_location
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Terms
|
3
|
+
class Ident < CSSPool::Node
|
4
|
+
attr_accessor :value
|
5
|
+
attr_accessor :operator
|
6
|
+
attr_accessor :parse_location
|
7
|
+
|
8
|
+
def initialize value, operator = nil, parse_location = {}
|
9
|
+
@value = value
|
10
|
+
@operator = operator
|
11
|
+
@parse_location = parse_location
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Terms
|
3
|
+
class Number < Ident
|
4
|
+
attr_accessor :type
|
5
|
+
attr_accessor :unary_operator
|
6
|
+
|
7
|
+
def initialize value, unary_operator = nil, type = nil, operator = nil, parse_location = {}
|
8
|
+
@type = type
|
9
|
+
@unary_operator = unary_operator
|
10
|
+
super(value, operator, parse_location)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Terms
|
3
|
+
class Rgb < CSSPool::Node
|
4
|
+
attr_accessor :red
|
5
|
+
attr_accessor :green
|
6
|
+
attr_accessor :blue
|
7
|
+
attr_accessor :parse_location
|
8
|
+
attr_accessor :operator
|
9
|
+
|
10
|
+
def initialize red, green, blue, operator = nil, parse_location = {}
|
11
|
+
super()
|
12
|
+
@red = red
|
13
|
+
@green = green
|
14
|
+
@blue = blue
|
15
|
+
@operator = operator
|
16
|
+
@parse_location = parse_location
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Visitors
|
3
|
+
class Children < Visitor
|
4
|
+
visitor_for CSS::Document do |target|
|
5
|
+
children = []
|
6
|
+
[:charsets, :import_rules, :rule_sets].each do |member|
|
7
|
+
children += target.send(member)
|
8
|
+
end
|
9
|
+
children
|
10
|
+
end
|
11
|
+
|
12
|
+
visitor_for CSS::ImportRule do |target|
|
13
|
+
target.media
|
14
|
+
end
|
15
|
+
|
16
|
+
visitor_for CSS::Media,
|
17
|
+
CSS::Charset,
|
18
|
+
Selectors::Id,
|
19
|
+
Selectors::Class,
|
20
|
+
Selectors::PseudoClass,
|
21
|
+
Selectors::Attribute,
|
22
|
+
Terms::Ident,
|
23
|
+
Terms::String,
|
24
|
+
Terms::URI,
|
25
|
+
Terms::Number,
|
26
|
+
Terms::Hash,
|
27
|
+
Terms::Function,
|
28
|
+
Terms::Rgb do |target|
|
29
|
+
[]
|
30
|
+
end
|
31
|
+
|
32
|
+
visitor_for CSS::Declaration do |target|
|
33
|
+
target.expressions
|
34
|
+
end
|
35
|
+
|
36
|
+
visitor_for CSS::RuleSet do |target|
|
37
|
+
target.selectors + target.declarations
|
38
|
+
end
|
39
|
+
|
40
|
+
visitor_for Selector do |target|
|
41
|
+
target.simple_selectors
|
42
|
+
end
|
43
|
+
|
44
|
+
visitor_for Selectors::Type, Selectors::Universal, Selectors::Simple do |target|
|
45
|
+
target.additional_selectors
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Visitors
|
3
|
+
class Comparable < Visitor
|
4
|
+
def initialize other
|
5
|
+
super()
|
6
|
+
@other = other
|
7
|
+
end
|
8
|
+
|
9
|
+
visitor_for CSS::Document do |target|
|
10
|
+
[
|
11
|
+
:parent,
|
12
|
+
:charsets,
|
13
|
+
:parent_import_rule,
|
14
|
+
:import_rules,
|
15
|
+
:rule_sets,
|
16
|
+
].all? { |m| target.send(m) == @other.send(m) }
|
17
|
+
end
|
18
|
+
|
19
|
+
visitor_for CSS::RuleSet do |target|
|
20
|
+
[:selectors, :declarations, :media].all? { |m|
|
21
|
+
target.send(m) == @other.send(m)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
visitor_for Selector do |target|
|
26
|
+
target.simple_selectors == @other.simple_selectors
|
27
|
+
end
|
28
|
+
|
29
|
+
visitor_for CSS::ImportRule do |target|
|
30
|
+
[:uri, :namespace, :media].all? { |m|
|
31
|
+
target.send(m) == @other.send(m)
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
visitor_for Selectors::PseudoClass do |target|
|
36
|
+
[:name, :extra].all? { |m|
|
37
|
+
target.send(m) == @other.send(m)
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
visitor_for CSS::Media, Selectors::Id, Selectors::Class do |target|
|
42
|
+
target.name == @other.name
|
43
|
+
end
|
44
|
+
|
45
|
+
visitor_for Selectors::Type, Selectors::Universal,
|
46
|
+
Selectors::Simple do |target|
|
47
|
+
[:name, :combinator, :additional_selectors].all? { |m|
|
48
|
+
target.send(m) == @other.send(m)
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
visitor_for CSS::Declaration do |target|
|
53
|
+
[:property, :expressions, :important].all? { |m|
|
54
|
+
target.send(m) == @other.send(m)
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
visitor_for Terms::Function do |target|
|
59
|
+
[:name, :params, :operator].all? { |m|
|
60
|
+
target.send(m) == @other.send(m)
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
visitor_for Terms::Number do |target|
|
65
|
+
[:type, :unary_operator, :value, :operator].all? { |m|
|
66
|
+
target.send(m) == @other.send(m)
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
visitor_for Terms::URI,Terms::String,Terms::Ident,Terms::Hash do |target|
|
71
|
+
[:value, :operator].all? { |m| target.send(m) == @other.send(m) }
|
72
|
+
end
|
73
|
+
|
74
|
+
visitor_for Terms::Rgb do |target|
|
75
|
+
[
|
76
|
+
:red,
|
77
|
+
:green,
|
78
|
+
:blue,
|
79
|
+
:operator
|
80
|
+
].all? { |m| target.send(m) == @other.send(m) }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module CSSPool
|
2
|
+
module Visitors
|
3
|
+
class Iterator < Visitor
|
4
|
+
def initialize block
|
5
|
+
@block = block
|
6
|
+
end
|
7
|
+
|
8
|
+
visitor_for CSS::Document do |target|
|
9
|
+
[:charsets, :import_rules, :rule_sets].each do |member|
|
10
|
+
target.send(member).each do |node|
|
11
|
+
node.accept self
|
12
|
+
end
|
13
|
+
end
|
14
|
+
@block.call target
|
15
|
+
end
|
16
|
+
|
17
|
+
visitor_for Selectors::Universal, Selectors::Simple do |target|
|
18
|
+
target.children.each do |node|
|
19
|
+
node.accept self
|
20
|
+
end
|
21
|
+
@block.call target
|
22
|
+
end
|
23
|
+
|
24
|
+
visitor_for CSS::Charset do |target|
|
25
|
+
@block.call target
|
26
|
+
end
|
27
|
+
|
28
|
+
visitor_for CSS::ImportRule do |target|
|
29
|
+
target.media.each do |node|
|
30
|
+
node.accept self
|
31
|
+
end
|
32
|
+
@block.call target
|
33
|
+
end
|
34
|
+
|
35
|
+
visitor_for CSS::Media,
|
36
|
+
Selectors::Id,
|
37
|
+
Selectors::Class,
|
38
|
+
Selectors::PseudoClass,
|
39
|
+
Selectors::Attribute,
|
40
|
+
Terms::Ident,
|
41
|
+
Terms::String,
|
42
|
+
Terms::URI,
|
43
|
+
Terms::Number,
|
44
|
+
Terms::Hash,
|
45
|
+
Terms::Function,
|
46
|
+
Terms::Rgb do |target|
|
47
|
+
@block.call target
|
48
|
+
end
|
49
|
+
|
50
|
+
visitor_for CSS::Declaration do |target|
|
51
|
+
target.expressions.each do |node|
|
52
|
+
node.accept self
|
53
|
+
end
|
54
|
+
@block.call target
|
55
|
+
end
|
56
|
+
|
57
|
+
visitor_for CSS::RuleSet do |target|
|
58
|
+
target.selectors.each do |node|
|
59
|
+
node.accept self
|
60
|
+
end
|
61
|
+
target.declarations.each do |node|
|
62
|
+
node.accept self
|
63
|
+
end
|
64
|
+
@block.call target
|
65
|
+
end
|
66
|
+
|
67
|
+
visitor_for Selector do |target|
|
68
|
+
target.simple_selectors.each { |ss| ss.accept self }
|
69
|
+
@block.call target
|
70
|
+
end
|
71
|
+
|
72
|
+
visitor_for Selectors::Type do |target|
|
73
|
+
target.additional_selectors.each do |node|
|
74
|
+
node.accept self
|
75
|
+
end
|
76
|
+
@block.call target
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|