crass 1.0.4 → 1.0.5

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 (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