maca-fork-csspool 2.0.2

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.
Files changed (71) hide show
  1. data/CHANGELOG.rdoc +72 -0
  2. data/History.txt +4 -0
  3. data/Manifest.txt +70 -0
  4. data/README.rdoc +78 -0
  5. data/Rakefile +35 -0
  6. data/lib/csspool.rb +20 -0
  7. data/lib/csspool/collection.rb +50 -0
  8. data/lib/csspool/css.rb +7 -0
  9. data/lib/csspool/css/charset.rb +7 -0
  10. data/lib/csspool/css/declaration.rb +8 -0
  11. data/lib/csspool/css/document.rb +34 -0
  12. data/lib/csspool/css/document_handler.rb +51 -0
  13. data/lib/csspool/css/import_rule.rb +15 -0
  14. data/lib/csspool/css/media.rb +7 -0
  15. data/lib/csspool/css/rule_set.rb +12 -0
  16. data/lib/csspool/lib_croco.rb +78 -0
  17. data/lib/csspool/lib_croco/cr_additional_sel.rb +46 -0
  18. data/lib/csspool/lib_croco/cr_attr_sel.rb +16 -0
  19. data/lib/csspool/lib_croco/cr_doc_handler.rb +24 -0
  20. data/lib/csspool/lib_croco/cr_num.rb +13 -0
  21. data/lib/csspool/lib_croco/cr_parser.rb +11 -0
  22. data/lib/csspool/lib_croco/cr_parsing_location.rb +17 -0
  23. data/lib/csspool/lib_croco/cr_pseudo.rb +14 -0
  24. data/lib/csspool/lib_croco/cr_rgb.rb +18 -0
  25. data/lib/csspool/lib_croco/cr_selector.rb +33 -0
  26. data/lib/csspool/lib_croco/cr_simple_sel.rb +54 -0
  27. data/lib/csspool/lib_croco/cr_term.rb +97 -0
  28. data/lib/csspool/lib_croco/glist.rb +21 -0
  29. data/lib/csspool/node.rb +5 -0
  30. data/lib/csspool/sac.rb +2 -0
  31. data/lib/csspool/sac/document.rb +35 -0
  32. data/lib/csspool/sac/parser.rb +122 -0
  33. data/lib/csspool/selector.rb +35 -0
  34. data/lib/csspool/selectors.rb +8 -0
  35. data/lib/csspool/selectors/additional.rb +6 -0
  36. data/lib/csspool/selectors/attribute.rb +21 -0
  37. data/lib/csspool/selectors/class.rb +11 -0
  38. data/lib/csspool/selectors/id.rb +11 -0
  39. data/lib/csspool/selectors/pseudo_class.rb +13 -0
  40. data/lib/csspool/selectors/simple.rb +22 -0
  41. data/lib/csspool/selectors/type.rb +6 -0
  42. data/lib/csspool/selectors/universal.rb +6 -0
  43. data/lib/csspool/terms.rb +7 -0
  44. data/lib/csspool/terms/function.rb +17 -0
  45. data/lib/csspool/terms/hash.rb +6 -0
  46. data/lib/csspool/terms/ident.rb +15 -0
  47. data/lib/csspool/terms/number.rb +14 -0
  48. data/lib/csspool/terms/rgb.rb +23 -0
  49. data/lib/csspool/terms/string.rb +6 -0
  50. data/lib/csspool/terms/uri.rb +6 -0
  51. data/lib/csspool/visitable.rb +30 -0
  52. data/lib/csspool/visitors.rb +5 -0
  53. data/lib/csspool/visitors/children.rb +50 -0
  54. data/lib/csspool/visitors/comparable.rb +85 -0
  55. data/lib/csspool/visitors/iterator.rb +80 -0
  56. data/lib/csspool/visitors/to_css.rb +188 -0
  57. data/lib/csspool/visitors/visitor.rb +17 -0
  58. data/test/css/test_document.rb +13 -0
  59. data/test/css/test_import_rule.rb +42 -0
  60. data/test/helper.rb +67 -0
  61. data/test/sac/test_parser.rb +115 -0
  62. data/test/sac/test_properties.rb +43 -0
  63. data/test/sac/test_terms.rb +134 -0
  64. data/test/test_collection.rb +81 -0
  65. data/test/test_parser.rb +91 -0
  66. data/test/test_selector.rb +47 -0
  67. data/test/visitors/test_children.rb +20 -0
  68. data/test/visitors/test_comparable.rb +103 -0
  69. data/test/visitors/test_each.rb +19 -0
  70. data/test/visitors/test_to_css.rb +200 -0
  71. metadata +173 -0
@@ -0,0 +1,6 @@
1
+ module CSSPool
2
+ module Terms
3
+ class URI < Ident
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,30 @@
1
+ module CSSPool
2
+ module Visitable
3
+ def accept target
4
+ target.accept self
5
+ end
6
+
7
+ def to_css
8
+ accept Visitors::ToCSS.new
9
+ end
10
+ alias :to_s :to_css
11
+
12
+ def == other
13
+ return false unless self.class == other.class
14
+ accept Visitors::Comparable.new(other)
15
+ end
16
+ alias :eql? :==
17
+
18
+ def each &block
19
+ accept Visitors::Iterator.new(block)
20
+ end
21
+
22
+ def children
23
+ accept Visitors::Children.new
24
+ end
25
+
26
+ def hash
27
+ @hash ||= children.map { |child| child.hash }.hash
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,5 @@
1
+ require 'csspool/visitors/visitor'
2
+ require 'csspool/visitors/to_css'
3
+ require 'csspool/visitors/comparable'
4
+ require 'csspool/visitors/iterator'
5
+ require 'csspool/visitors/children'
@@ -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,85 @@
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
+ :percentage,
80
+ :operator
81
+ ].all? { |m| target.send(m) == @other.send(m) }
82
+ end
83
+ end
84
+ end
85
+ 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
@@ -0,0 +1,188 @@
1
+ module CSSPool
2
+ module Visitors
3
+ class ToCSS < Visitor
4
+ def initialize
5
+ @indent_level = 0
6
+ @indent_space = ' '
7
+ end
8
+
9
+ visitor_for CSS::Document do |target|
10
+ media_hash = {}
11
+
12
+ # Default media list is []
13
+ current_media_type = []
14
+
15
+ tokens = []
16
+
17
+ target.charsets.each do |char_set|
18
+ tokens << char_set.accept(self)
19
+ end
20
+
21
+ target.import_rules.each do |ir|
22
+ tokens << ir.accept(self)
23
+ end
24
+
25
+ target.rule_sets.each { |rs|
26
+ if rs.media != current_media_type
27
+ tokens << "#{indent}@media #{rs.media.map { |x| x.name }.join(", ")} {"
28
+ @indent_level += 1
29
+ end
30
+
31
+ tokens << rs.accept(self)
32
+
33
+ if rs.media != current_media_type
34
+ current_media_type = rs.media
35
+ @indent_level -= 1
36
+ tokens << "#{indent}}"
37
+ end
38
+ }
39
+ tokens.join("\n")
40
+ end
41
+
42
+ visitor_for CSS::Charset do |target|
43
+ "@charset \"#{target.name}\";"
44
+ end
45
+
46
+ visitor_for CSS::ImportRule do |target|
47
+ media = ''
48
+ media = " " + target.media.map { |x|
49
+ x.name
50
+ }.join(', ') if target.media.length > 0
51
+
52
+ "#{indent}@import url(\"#{target.uri}\")#{media};"
53
+ end
54
+
55
+ visitor_for CSS::RuleSet do |target|
56
+ "#{indent}" +
57
+ target.selectors.map { |sel| sel.accept self }.join(", ") + " {\n" +
58
+ target.declarations.map { |decl| decl.accept self }.join("\n") +
59
+ "\n#{indent}}"
60
+ end
61
+
62
+ visitor_for CSS::Declaration do |target|
63
+ important = target.important? ? ' !important' : ''
64
+
65
+ indent {
66
+ "#{indent}#{target.property}: " + target.expressions.map { |exp|
67
+
68
+ op = '/' == exp.operator ? ' /' : exp.operator
69
+
70
+ [
71
+ op,
72
+ exp.accept(self),
73
+ ].join ' '
74
+ }.join.strip + "#{important};"
75
+ }
76
+ end
77
+
78
+ visitor_for Terms::Ident do |target|
79
+ target.value
80
+ end
81
+
82
+ visitor_for Terms::Hash do |target|
83
+ "##{target.value}"
84
+ end
85
+
86
+ visitor_for Selectors::Simple, Selectors::Universal, Selectors::Type do |target|
87
+ "#{ Selector::COMBINATORS[target.combinator] }#{ target.name }" +
88
+ target.additional_selectors.map{ |x| x.accept self }.join
89
+ end
90
+
91
+ visitor_for Terms::URI do |target|
92
+ "url(#{target.value})"
93
+ end
94
+
95
+ visitor_for Terms::Function do |target|
96
+ "#{target.name}(" +
97
+ target.params.map { |x|
98
+ [
99
+ x.operator,
100
+ x.accept(self)
101
+ ].compact.join(' ')
102
+ }.join + ')'
103
+ end
104
+
105
+ visitor_for Terms::Rgb do |target|
106
+ params = [
107
+ target.red,
108
+ target.green,
109
+ target.blue
110
+ ].map { |c| target.percentage? ? "#{c}%" : c }.join(',')
111
+
112
+ %{rgb(#{params})}
113
+ end
114
+
115
+ visitor_for Terms::String do |target|
116
+ "\"#{target.value}\""
117
+ end
118
+
119
+ visitor_for Selector do |target|
120
+ target.simple_selectors.map { |ss| ss.accept self }.join
121
+ end
122
+
123
+ visitor_for Terms::Number do |target|
124
+ units = {
125
+ 2 => 'em',
126
+ 3 => 'ex',
127
+ 4 => 'px',
128
+ 5 => 'in',
129
+ 6 => 'cm',
130
+ 7 => 'mm',
131
+ 8 => 'pt',
132
+ 9 => 'pc',
133
+ 10 => 'deg',
134
+ 11 => 'rad',
135
+ 12 => 'grad',
136
+ 13 => 'ms',
137
+ 14 => 's',
138
+ 15 => 'Hz',
139
+ 16 => 'kHz',
140
+ 17 => '%',
141
+ }[target.type]
142
+ [
143
+ target.unary_operator == :minus ? '-' : nil,
144
+ target.value,
145
+ units
146
+ ].compact.join
147
+ end
148
+
149
+ visitor_for Selectors::Id do |target|
150
+ "##{target.name}"
151
+ end
152
+
153
+ visitor_for Selectors::Class do |target|
154
+ ".#{target.name}"
155
+ end
156
+
157
+ visitor_for Selectors::PseudoClass do |target|
158
+ ":#{target.name}"
159
+ end
160
+
161
+ visitor_for Selectors::Attribute do |target|
162
+ case target.match_way
163
+ when Selectors::Attribute::SET
164
+ "[#{target.name}]"
165
+ when Selectors::Attribute::EQUALS
166
+ "[#{target.name}=\"#{target.value}\"]"
167
+ when Selectors::Attribute::INCLUDES
168
+ "[#{target.name} ~= \"#{target.value}\"]"
169
+ when Selectors::Attribute::DASHMATCH
170
+ "[#{target.name} |= \"#{target.value}\"]"
171
+ else
172
+ raise "no matching matchway"
173
+ end
174
+ end
175
+
176
+ private
177
+ def indent
178
+ if block_given?
179
+ @indent_level += 1
180
+ result = yield
181
+ @indent_level -= 1
182
+ return result
183
+ end
184
+ "#{@indent_space * @indent_level}"
185
+ end
186
+ end
187
+ end
188
+ end