crass 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -5
  3. data/HISTORY.md +8 -0
  4. data/crass.gemspec +1 -2
  5. data/lib/crass/version.rb +1 -1
  6. metadata +4 -65
  7. data/test/css-parsing-tests/An+B.json +0 -156
  8. data/test/css-parsing-tests/LICENSE +0 -8
  9. data/test/css-parsing-tests/README.rst +0 -301
  10. data/test/css-parsing-tests/color3.json +0 -142
  11. data/test/css-parsing-tests/color3_hsl.json +0 -3890
  12. data/test/css-parsing-tests/color3_keywords.json +0 -803
  13. data/test/css-parsing-tests/component_value_list.json +0 -432
  14. data/test/css-parsing-tests/declaration_list.json +0 -44
  15. data/test/css-parsing-tests/make_color3_hsl.py +0 -17
  16. data/test/css-parsing-tests/make_color3_keywords.py +0 -191
  17. data/test/css-parsing-tests/one_component_value.json +0 -27
  18. data/test/css-parsing-tests/one_declaration.json +0 -46
  19. data/test/css-parsing-tests/one_rule.json +0 -36
  20. data/test/css-parsing-tests/rule_list.json +0 -48
  21. data/test/css-parsing-tests/stylesheet.json +0 -44
  22. data/test/css-parsing-tests/stylesheet_bytes.json +0 -146
  23. data/test/shared/parse_rules.rb +0 -463
  24. data/test/support/common.rb +0 -170
  25. data/test/support/serialization/animate.css +0 -3158
  26. data/test/support/serialization/bootstrap-theme.css +0 -384
  27. data/test/support/serialization/bootstrap.css +0 -6805
  28. data/test/support/serialization/html5-boilerplate.css +0 -268
  29. data/test/support/serialization/misc.css +0 -9
  30. data/test/support/serialization/pure.css +0 -1662
  31. data/test/test_crass.rb +0 -31
  32. data/test/test_css_parsing_tests.rb +0 -150
  33. data/test/test_parse_properties.rb +0 -310
  34. data/test/test_parse_rules.rb +0 -17
  35. data/test/test_parse_stylesheet.rb +0 -17
  36. data/test/test_serialization.rb +0 -71
@@ -1,31 +0,0 @@
1
- # encoding: utf-8
2
- require_relative 'support/common'
3
-
4
- describe 'Crass' do
5
- make_my_diffs_pretty!
6
- parallelize_me!
7
-
8
- it 'parse_properties() should call Crass::Parser.parse_properties' do
9
- assert_equal(
10
- CP.parse_properties("a:b; c:d 42!important;\n"),
11
- Crass.parse_properties("a:b; c:d 42!important;\n")
12
- )
13
-
14
- assert_equal(
15
- CP.parse_properties(";; /**/ ; ;", :preserve_comments => true),
16
- Crass.parse_properties(";; /**/ ; ;", :preserve_comments => true)
17
- )
18
- end
19
-
20
- it 'parse() should call Crass::Parser.parse_stylesheet' do
21
- assert_equal(
22
- CP.parse_stylesheet(" /**/ .foo {} #bar {}"),
23
- Crass.parse(" /**/ .foo {} #bar {}")
24
- )
25
-
26
- assert_equal(
27
- CP.parse_stylesheet(" /**/ .foo {} #bar {}", :preserve_comments => true),
28
- Crass.parse(" /**/ .foo {} #bar {}", :preserve_comments => true)
29
- )
30
- end
31
- end
@@ -1,150 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # This file loads and runs Simon Sapin's CSS parsing tests, which live under the
4
- # test/css-parsing-tests directory. The original test repo can be found at:
5
- #
6
- # https://github.com/SimonSapin/css-parsing-tests/
7
-
8
- require 'json'
9
- require_relative 'support/common'
10
-
11
- def load_css_tests(filename)
12
- JSON.parse(File.read(File.join(File.dirname(__FILE__), "/css-parsing-tests/#{filename}")))
13
- end
14
-
15
- describe 'CSS Parsing Tests' do
16
- describe 'component_value_list' do
17
- make_my_diffs_pretty!
18
- parallelize_me!
19
-
20
- tests = load_css_tests('component_value_list.json')
21
-
22
- tests.each_slice(2) do |test|
23
- css = test[0]
24
- expected = test[1]
25
-
26
- it "should parse: #{css.gsub("\n", "\\n")}" do
27
- parser = Crass::Parser.new(css)
28
- assert_equal(expected, translate_tokens(parser.parse_component_values))
29
- end
30
- end
31
- end
32
-
33
- describe 'declaration_list' do
34
- make_my_diffs_pretty!
35
- parallelize_me!
36
-
37
- tests = load_css_tests('declaration_list.json')
38
-
39
- tests.each_slice(2) do |test|
40
- css = test[0]
41
- expected = test[1]
42
-
43
- it "should parse: #{css.gsub("\n", "\\n")}" do
44
- parser = Crass::Parser.new(css)
45
- assert_equal(expected, translate_tokens(parser.parse_declarations(parser.tokens, {:strict => true})))
46
- end
47
- end
48
- end
49
-
50
- describe 'one_component_value' do
51
- make_my_diffs_pretty!
52
- parallelize_me!
53
-
54
- tests = load_css_tests('one_component_value.json')
55
-
56
- tests.each_slice(2) do |test|
57
- css = test[0]
58
- expected = test[1]
59
-
60
- it "should parse: #{css.gsub("\n", "\\n")}" do
61
- parser = Crass::Parser.new(css)
62
- assert_equal(expected, translate_tokens(parser.parse_component_value)[0])
63
- end
64
- end
65
- end
66
-
67
- describe 'one_declaration' do
68
- make_my_diffs_pretty!
69
- parallelize_me!
70
-
71
- tests = load_css_tests('one_declaration.json')
72
-
73
- tests.each_slice(2) do |test|
74
- css = test[0]
75
- expected = test[1]
76
-
77
- it "should parse: #{css.gsub("\n", "\\n")}" do
78
- parser = Crass::Parser.new(css)
79
- assert_equal(expected, translate_tokens(parser.parse_declaration)[0])
80
- end
81
- end
82
- end
83
-
84
- describe 'one_rule' do
85
- make_my_diffs_pretty!
86
- parallelize_me!
87
-
88
- tests = load_css_tests('one_rule.json')
89
-
90
- tests.each_slice(2) do |test|
91
- css = test[0]
92
- expected = test[1]
93
-
94
- it "should parse: #{css.gsub("\n", "\\n")}" do
95
- parser = Crass::Parser.new(css)
96
- assert_equal(expected, translate_tokens(parser.parse_rule)[0])
97
- end
98
- end
99
- end
100
-
101
- describe 'rule_list' do
102
- make_my_diffs_pretty!
103
- parallelize_me!
104
-
105
- tests = load_css_tests('rule_list.json')
106
-
107
- tests.each_slice(2) do |test|
108
- css = test[0]
109
- expected = test[1]
110
-
111
- it "should parse: #{css.gsub("\n", "\\n")}" do
112
- parser = Crass::Parser.new(css)
113
- rules = parser.consume_rules
114
-
115
- # Remove non-standard whitespace tokens.
116
- rules.reject! do |token|
117
- node = token[:node]
118
- node == :whitespace
119
- end
120
-
121
- assert_equal(expected, translate_tokens(rules))
122
- end
123
- end
124
- end
125
-
126
- describe 'stylesheet' do
127
- make_my_diffs_pretty!
128
- parallelize_me!
129
-
130
- tests = load_css_tests('stylesheet.json')
131
-
132
- tests.each_slice(2) do |test|
133
- css = test[0]
134
- expected = test[1]
135
-
136
- it "should parse: #{css.gsub("\n", "\\n")}" do
137
- parser = Crass::Parser.new(css)
138
- rules = parser.consume_rules(:top_level => true)
139
-
140
- # Remove non-standard whitespace tokens.
141
- rules.reject! do |token|
142
- node = token[:node]
143
- node == :whitespace
144
- end
145
-
146
- assert_equal(expected, translate_tokens(rules))
147
- end
148
- end
149
- end
150
- end
@@ -1,310 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # Includes tests based on Simon Sapin's CSS parsing tests:
4
- # https://github.com/SimonSapin/css-parsing-tests/
5
-
6
- require_relative 'support/common'
7
-
8
- describe 'Crass::Parser' do
9
- make_my_diffs_pretty!
10
- parallelize_me!
11
-
12
- describe '#parse_properties' do
13
- def parse(*args)
14
- CP.parse_properties(*args)
15
- end
16
-
17
- it 'should return an empty tree when given an empty string' do
18
- assert_equal([], parse(""))
19
- end
20
-
21
- # Note: The next two tests verify augmented behavior that isn't defined in
22
- # CSS Syntax Module Level 3.
23
- it 'should include semicolon and whitespace tokens' do
24
- assert_tokens(";; /**/ ; ;", parse(";; /**/ ; ;"))
25
- end
26
-
27
- it 'should include semicolon, whitespace, and comment tokens when :preserve_comments == true' do
28
- tree = parse(";; /**/ ; ;", :preserve_comments => true)
29
- assert_tokens(";; /**/ ; ;", tree, 0, :preserve_comments => true)
30
- end
31
-
32
- it 'should parse at-rules even though they may be invalid in the given context' do
33
- tree = parse("@import 'foo.css'; a:b; @import 'bar.css'")
34
-
35
- assert_equal([
36
- {:node=>:at_rule,
37
- :name=>"import",
38
- :prelude=>
39
- [{:node=>:whitespace, :pos=>7, :raw=>" "},
40
- {:node=>:string, :pos=>8, :raw=>"'foo.css'", :value=>"foo.css"}],
41
- :tokens=>
42
- [{:node=>:at_keyword, :pos=>0, :raw=>"@import", :value=>"import"},
43
- {:node=>:whitespace, :pos=>7, :raw=>" "},
44
- {:node=>:string, :pos=>8, :raw=>"'foo.css'", :value=>"foo.css"},
45
- {:node=>:semicolon, :pos=>17, :raw=>";"}]},
46
- {:node=>:whitespace, :pos=>18, :raw=>" "},
47
- {:node=>:property,
48
- :name=>"a",
49
- :value=>"b",
50
- :children=>[{:node=>:ident, :pos=>21, :raw=>"b", :value=>"b"}],
51
- :important=>false,
52
- :tokens=>
53
- [{:node=>:ident, :pos=>19, :raw=>"a", :value=>"a"},
54
- {:node=>:colon, :pos=>20, :raw=>":"},
55
- {:node=>:ident, :pos=>21, :raw=>"b", :value=>"b"}]},
56
- {:node=>:semicolon, :pos=>22, :raw=>";"},
57
- {:node=>:whitespace, :pos=>23, :raw=>" "},
58
- {:node=>:at_rule,
59
- :name=>"import",
60
- :prelude=>
61
- [{:node=>:whitespace, :pos=>31, :raw=>" "},
62
- {:node=>:string, :pos=>32, :raw=>"'bar.css'", :value=>"bar.css"}],
63
- :tokens=>
64
- [{:node=>:at_keyword, :pos=>24, :raw=>"@import", :value=>"import"},
65
- {:node=>:whitespace, :pos=>31, :raw=>" "},
66
- {:node=>:string, :pos=>32, :raw=>"'bar.css'", :value=>"bar.css"}]}
67
- ], tree)
68
- end
69
-
70
- it 'should parse at-rules with a {} simple block immediately following the prelude' do
71
- tree = parse(%[
72
- @page :right {
73
- @top-center { content: "Preliminary edition" }
74
- @bottom-center { content: counter(page) }
75
- }
76
- ].strip)
77
-
78
- tree = parse(tree.first[:block])
79
-
80
- assert_equal([
81
- {:node=>:whitespace, :pos=>14, :raw=>"\n "},
82
- {:node=>:at_rule,
83
- :name=>"top-center",
84
- :prelude=>[{:node=>:whitespace, :pos=>36, :raw=>" "}],
85
- :block=>
86
- [{:node=>:whitespace, :pos=>38, :raw=>" "},
87
- {:node=>:ident, :pos=>39, :raw=>"content", :value=>"content"},
88
- {:node=>:colon, :pos=>46, :raw=>":"},
89
- {:node=>:whitespace, :pos=>47, :raw=>" "},
90
- {:node=>:string,
91
- :pos=>48,
92
- :raw=>"\"Preliminary edition\"",
93
- :value=>"Preliminary edition"},
94
- {:node=>:whitespace, :pos=>69, :raw=>" "}],
95
- :tokens=>
96
- [{:node=>:at_keyword, :pos=>25, :raw=>"@top-center", :value=>"top-center"},
97
- {:node=>:whitespace, :pos=>36, :raw=>" "},
98
- {:node=>:simple_block,
99
- :start=>"{",
100
- :end=>"}",
101
- :value=>
102
- [{:node=>:whitespace, :pos=>38, :raw=>" "},
103
- {:node=>:ident, :pos=>39, :raw=>"content", :value=>"content"},
104
- {:node=>:colon, :pos=>46, :raw=>":"},
105
- {:node=>:whitespace, :pos=>47, :raw=>" "},
106
- {:node=>:string,
107
- :pos=>48,
108
- :raw=>"\"Preliminary edition\"",
109
- :value=>"Preliminary edition"},
110
- {:node=>:whitespace, :pos=>69, :raw=>" "}],
111
- :tokens=>
112
- [{:node=>:"{", :pos=>37, :raw=>"{"},
113
- {:node=>:whitespace, :pos=>38, :raw=>" "},
114
- {:node=>:ident, :pos=>39, :raw=>"content", :value=>"content"},
115
- {:node=>:colon, :pos=>46, :raw=>":"},
116
- {:node=>:whitespace, :pos=>47, :raw=>" "},
117
- {:node=>:string,
118
- :pos=>48,
119
- :raw=>"\"Preliminary edition\"",
120
- :value=>"Preliminary edition"},
121
- {:node=>:whitespace, :pos=>69, :raw=>" "},
122
- {:node=>:"}", :pos=>70, :raw=>"}"}]}]},
123
- {:node=>:whitespace, :pos=>71, :raw=>"\n "},
124
- {:node=>:at_rule,
125
- :name=>"bottom-center",
126
- :prelude=>[{:node=>:whitespace, :pos=>96, :raw=>" "}],
127
- :block=>
128
- [{:node=>:whitespace, :pos=>98, :raw=>" "},
129
- {:node=>:ident, :pos=>99, :raw=>"content", :value=>"content"},
130
- {:node=>:colon, :pos=>106, :raw=>":"},
131
- {:node=>:whitespace, :pos=>107, :raw=>" "},
132
- {:node=>:function,
133
- :name=>"counter",
134
- :value=>[{:node=>:ident, :pos=>116, :raw=>"page", :value=>"page"}],
135
- :tokens=>
136
- [{:node=>:function, :pos=>108, :raw=>"counter(", :value=>"counter"},
137
- {:node=>:ident, :pos=>116, :raw=>"page", :value=>"page"},
138
- {:node=>:")", :pos=>120, :raw=>")"}]},
139
- {:node=>:whitespace, :pos=>121, :raw=>" "}],
140
- :tokens=>
141
- [{:node=>:at_keyword,
142
- :pos=>82,
143
- :raw=>"@bottom-center",
144
- :value=>"bottom-center"},
145
- {:node=>:whitespace, :pos=>96, :raw=>" "},
146
- {:node=>:simple_block,
147
- :start=>"{",
148
- :end=>"}",
149
- :value=>
150
- [{:node=>:whitespace, :pos=>98, :raw=>" "},
151
- {:node=>:ident, :pos=>99, :raw=>"content", :value=>"content"},
152
- {:node=>:colon, :pos=>106, :raw=>":"},
153
- {:node=>:whitespace, :pos=>107, :raw=>" "},
154
- {:node=>:function,
155
- :name=>"counter",
156
- :value=>[{:node=>:ident, :pos=>116, :raw=>"page", :value=>"page"}],
157
- :tokens=>
158
- [{:node=>:function, :pos=>108, :raw=>"counter(", :value=>"counter"},
159
- {:node=>:ident, :pos=>116, :raw=>"page", :value=>"page"},
160
- {:node=>:")", :pos=>120, :raw=>")"}]},
161
- {:node=>:whitespace, :pos=>121, :raw=>" "}],
162
- :tokens=>
163
- [{:node=>:"{", :pos=>97, :raw=>"{"},
164
- {:node=>:whitespace, :pos=>98, :raw=>" "},
165
- {:node=>:ident, :pos=>99, :raw=>"content", :value=>"content"},
166
- {:node=>:colon, :pos=>106, :raw=>":"},
167
- {:node=>:whitespace, :pos=>107, :raw=>" "},
168
- {:node=>:function, :pos=>108, :raw=>"counter(", :value=>"counter"},
169
- {:node=>:ident, :pos=>116, :raw=>"page", :value=>"page"},
170
- {:node=>:")", :pos=>120, :raw=>")"},
171
- {:node=>:whitespace, :pos=>121, :raw=>" "},
172
- {:node=>:"}", :pos=>122, :raw=>"}"}]}]},
173
- {:node=>:whitespace, :pos=>123, :raw=>"\n "}
174
- ], tree)
175
- end
176
-
177
- it 'should parse values containing functions' do
178
- tree = parse("content: attr(data-foo) \" \";")
179
-
180
- assert_equal([
181
- {:node=>:property,
182
- :name=>"content",
183
- :value=>"attr(data-foo) \" \"",
184
- :children=>
185
- [{:node=>:whitespace, :pos=>8, :raw=>" "},
186
- {:node=>:function,
187
- :name=>"attr",
188
- :value=>[{:node=>:ident, :pos=>14, :raw=>"data-foo", :value=>"data-foo"}],
189
- :tokens=>
190
- [{:node=>:function, :pos=>9, :raw=>"attr(", :value=>"attr"},
191
- {:node=>:ident, :pos=>14, :raw=>"data-foo", :value=>"data-foo"},
192
- {:node=>:")", :pos=>22, :raw=>")"}]},
193
- {:node=>:whitespace, :pos=>23, :raw=>" "},
194
- {:node=>:string, :pos=>24, :raw=>"\" \"", :value=>" "}],
195
- :important=>false,
196
- :tokens=>
197
- [{:node=>:ident, :pos=>0, :raw=>"content", :value=>"content"},
198
- {:node=>:colon, :pos=>7, :raw=>":"},
199
- {:node=>:whitespace, :pos=>8, :raw=>" "},
200
- {:node=>:function,
201
- :name=>"attr",
202
- :value=>[{:node=>:ident, :pos=>14, :raw=>"data-foo", :value=>"data-foo"}],
203
- :tokens=>
204
- [{:node=>:function, :pos=>9, :raw=>"attr(", :value=>"attr"},
205
- {:node=>:ident, :pos=>14, :raw=>"data-foo", :value=>"data-foo"},
206
- {:node=>:")", :pos=>22, :raw=>")"}]},
207
- {:node=>:whitespace, :pos=>23, :raw=>" "},
208
- {:node=>:string, :pos=>24, :raw=>"\" \"", :value=>" "}]},
209
- {:node=>:semicolon, :pos=>27, :raw=>";"}
210
- ], tree)
211
- end
212
-
213
- it 'should parse values containing nested functions' do
214
- tree = parse("width: expression(alert(1));")
215
-
216
- assert_equal([
217
- {:node=>:property,
218
- :name=>"width",
219
- :value=>"expression(alert(1))",
220
- :children=>
221
- [{:node=>:whitespace, :pos=>6, :raw=>" "},
222
- {:node=>:function,
223
- :name=>"expression",
224
- :value=>
225
- [{:node=>:function,
226
- :name=>"alert",
227
- :value=>
228
- [{:node=>:number,
229
- :pos=>24,
230
- :raw=>"1",
231
- :repr=>"1",
232
- :type=>:integer,
233
- :value=>1}],
234
- :tokens=>
235
- [{:node=>:function, :pos=>18, :raw=>"alert(", :value=>"alert"},
236
- {:node=>:number,
237
- :pos=>24,
238
- :raw=>"1",
239
- :repr=>"1",
240
- :type=>:integer,
241
- :value=>1},
242
- {:node=>:")", :pos=>25, :raw=>")"}]}],
243
- :tokens=>
244
- [{:node=>:function, :pos=>7, :raw=>"expression(", :value=>"expression"},
245
- {:node=>:function, :pos=>18, :raw=>"alert(", :value=>"alert"},
246
- {:node=>:number,
247
- :pos=>24,
248
- :raw=>"1",
249
- :repr=>"1",
250
- :type=>:integer,
251
- :value=>1},
252
- {:node=>:")", :pos=>25, :raw=>")"},
253
- {:node=>:")", :pos=>26, :raw=>")"}]}],
254
- :important=>false,
255
- :tokens=>
256
- [{:node=>:ident, :pos=>0, :raw=>"width", :value=>"width"},
257
- {:node=>:colon, :pos=>5, :raw=>":"},
258
- {:node=>:whitespace, :pos=>6, :raw=>" "},
259
- {:node=>:function,
260
- :name=>"expression",
261
- :value=>
262
- [{:node=>:function,
263
- :name=>"alert",
264
- :value=>
265
- [{:node=>:number,
266
- :pos=>24,
267
- :raw=>"1",
268
- :repr=>"1",
269
- :type=>:integer,
270
- :value=>1}],
271
- :tokens=>
272
- [{:node=>:function, :pos=>18, :raw=>"alert(", :value=>"alert"},
273
- {:node=>:number,
274
- :pos=>24,
275
- :raw=>"1",
276
- :repr=>"1",
277
- :type=>:integer,
278
- :value=>1},
279
- {:node=>:")", :pos=>25, :raw=>")"}]}],
280
- :tokens=>
281
- [{:node=>:function, :pos=>7, :raw=>"expression(", :value=>"expression"},
282
- {:node=>:function, :pos=>18, :raw=>"alert(", :value=>"alert"},
283
- {:node=>:number,
284
- :pos=>24,
285
- :raw=>"1",
286
- :repr=>"1",
287
- :type=>:integer,
288
- :value=>1},
289
- {:node=>:")", :pos=>25, :raw=>")"},
290
- {:node=>:")", :pos=>26, :raw=>")"}]}]},
291
- {:node=>:semicolon, :pos=>27, :raw=>";"}
292
- ], tree)
293
- end
294
-
295
- it 'should not choke on a missing property value' do
296
- tree = parse("font-family:")
297
-
298
- assert_equal([
299
- {:node=>:property,
300
- :name=>"font-family",
301
- :value=>"",
302
- :children=>[],
303
- :important=>false,
304
- :tokens=>
305
- [{:node=>:ident, :pos=>0, :raw=>"font-family", :value=>"font-family"},
306
- {:node=>:colon, :pos=>11, :raw=>":"}]}
307
- ], tree)
308
- end
309
- end
310
- end