crass 1.0.4 → 1.0.6

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -5
  3. data/HISTORY.md +15 -0
  4. data/LICENSE +1 -1
  5. data/README.md +0 -22
  6. data/crass.gemspec +8 -2
  7. data/lib/crass/tokenizer.rb +32 -13
  8. data/lib/crass/version.rb +1 -1
  9. metadata +9 -66
  10. data/test/css-parsing-tests/An+B.json +0 -156
  11. data/test/css-parsing-tests/LICENSE +0 -8
  12. data/test/css-parsing-tests/README.rst +0 -301
  13. data/test/css-parsing-tests/color3.json +0 -142
  14. data/test/css-parsing-tests/color3_hsl.json +0 -3890
  15. data/test/css-parsing-tests/color3_keywords.json +0 -803
  16. data/test/css-parsing-tests/component_value_list.json +0 -432
  17. data/test/css-parsing-tests/declaration_list.json +0 -44
  18. data/test/css-parsing-tests/make_color3_hsl.py +0 -17
  19. data/test/css-parsing-tests/make_color3_keywords.py +0 -191
  20. data/test/css-parsing-tests/one_component_value.json +0 -27
  21. data/test/css-parsing-tests/one_declaration.json +0 -46
  22. data/test/css-parsing-tests/one_rule.json +0 -36
  23. data/test/css-parsing-tests/rule_list.json +0 -48
  24. data/test/css-parsing-tests/stylesheet.json +0 -44
  25. data/test/css-parsing-tests/stylesheet_bytes.json +0 -146
  26. data/test/shared/parse_rules.rb +0 -463
  27. data/test/support/common.rb +0 -170
  28. data/test/support/serialization/animate.css +0 -3158
  29. data/test/support/serialization/bootstrap-theme.css +0 -384
  30. data/test/support/serialization/bootstrap.css +0 -6805
  31. data/test/support/serialization/html5-boilerplate.css +0 -268
  32. data/test/support/serialization/misc.css +0 -9
  33. data/test/support/serialization/pure.css +0 -1662
  34. data/test/test_crass.rb +0 -31
  35. data/test/test_css_parsing_tests.rb +0 -150
  36. data/test/test_parse_properties.rb +0 -310
  37. data/test/test_parse_rules.rb +0 -17
  38. data/test/test_parse_stylesheet.rb +0 -17
  39. data/test/test_serialization.rb +0 -71
data/test/test_crass.rb DELETED
@@ -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