csspool-st 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|