crass 1.0.3 → 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 (41) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +8 -4
  3. data/HISTORY.md +21 -0
  4. data/LICENSE +1 -1
  5. data/README.md +0 -22
  6. data/Rakefile +5 -4
  7. data/crass.gemspec +8 -2
  8. data/lib/crass/parser.rb +15 -15
  9. data/lib/crass/tokenizer.rb +57 -38
  10. data/lib/crass/version.rb +1 -1
  11. metadata +9 -67
  12. data/test/css-parsing-tests/An+B.json +0 -156
  13. data/test/css-parsing-tests/LICENSE +0 -8
  14. data/test/css-parsing-tests/README.rst +0 -301
  15. data/test/css-parsing-tests/color3.json +0 -142
  16. data/test/css-parsing-tests/color3_hsl.json +0 -3890
  17. data/test/css-parsing-tests/color3_keywords.json +0 -803
  18. data/test/css-parsing-tests/component_value_list.json +0 -432
  19. data/test/css-parsing-tests/declaration_list.json +0 -44
  20. data/test/css-parsing-tests/make_color3_hsl.py +0 -17
  21. data/test/css-parsing-tests/make_color3_keywords.py +0 -191
  22. data/test/css-parsing-tests/one_component_value.json +0 -27
  23. data/test/css-parsing-tests/one_declaration.json +0 -46
  24. data/test/css-parsing-tests/one_rule.json +0 -36
  25. data/test/css-parsing-tests/rule_list.json +0 -48
  26. data/test/css-parsing-tests/stylesheet.json +0 -44
  27. data/test/css-parsing-tests/stylesheet_bytes.json +0 -146
  28. data/test/shared/parse_rules.rb +0 -463
  29. data/test/support/common.rb +0 -170
  30. data/test/support/serialization/animate.css +0 -3158
  31. data/test/support/serialization/bootstrap-theme.css +0 -384
  32. data/test/support/serialization/bootstrap.css +0 -6805
  33. data/test/support/serialization/html5-boilerplate.css +0 -268
  34. data/test/support/serialization/misc.css +0 -9
  35. data/test/support/serialization/pure.css +0 -1662
  36. data/test/test_crass.rb +0 -31
  37. data/test/test_css_parsing_tests.rb +0 -150
  38. data/test/test_parse_properties.rb +0 -310
  39. data/test/test_parse_rules.rb +0 -17
  40. data/test/test_parse_stylesheet.rb +0 -17
  41. 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
@@ -1,17 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require_relative 'support/common'
4
- require_relative 'shared/parse_rules'
5
-
6
- describe 'Crass::Parser' do
7
- make_my_diffs_pretty!
8
- parallelize_me!
9
-
10
- describe '#parse_rules' do
11
- def parse(*args)
12
- CP.parse_rules(*args)
13
- end
14
-
15
- behaves_like 'parsing a list of rules'
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require_relative 'support/common'
4
- require_relative 'shared/parse_rules'
5
-
6
- describe 'Crass::Parser' do
7
- make_my_diffs_pretty!
8
- parallelize_me!
9
-
10
- describe '#parse_stylesheet' do
11
- def parse(*args)
12
- CP.parse_stylesheet(*args)
13
- end
14
-
15
- behaves_like 'parsing a list of rules'
16
- end
17
- end
@@ -1,71 +0,0 @@
1
- # encoding: utf-8
2
- require_relative 'support/common'
3
-
4
- describe 'Serialization' do
5
- make_my_diffs_pretty!
6
- parallelize_me!
7
-
8
- # Parse a bunch of real-world CSS and make sure it's the same when we
9
- # serialize it.
10
- Dir[File.join(File.dirname(__FILE__), 'support/serialization/*.css')].each do |filepath|
11
- it "should parse and serialize #{filepath}" do
12
- input = File.read(filepath)
13
-
14
- tree = Crass.parse(input,
15
- :preserve_comments => true,
16
- :preserve_hacks => true)
17
-
18
- assert_equal(input, CP.stringify(tree))
19
- end
20
- end
21
-
22
- # -- Regression tests --------------------------------------------------------
23
- it "should not omit a trailing semicolon when serializing a `@charset` rule" do
24
- css = '@charset "utf-8";'
25
- tree = Crass.parse(css)
26
-
27
- assert_equal(css, CP.stringify(tree))
28
- end
29
-
30
- it "should reflect modifications made to the block of an `:at_rule`" do
31
- tree = Crass.parse(%[
32
- @media (screen) {
33
- .froggy { color: green; }
34
- .piggy { color: pink; }
35
- }
36
- ].strip)
37
-
38
- tree[0][:block] = Crass::Parser.parse_rules(".piggy { color: pink; }")
39
-
40
- assert_equal(
41
- "@media (screen) {.piggy { color: pink; }}",
42
- Crass::Parser.stringify(tree)
43
- )
44
- end
45
-
46
- it "should serialize a @page rule" do
47
- css = %[
48
- @page { margin: 2cm }
49
-
50
- @page :right {
51
- @top-center { content: "Preliminary edition" }
52
- @bottom-center { content: counter(page) }
53
- }
54
-
55
- @page {
56
- size: 8.5in 11in;
57
- margin: 10%;
58
-
59
- @top-left {
60
- content: "Hamlet";
61
- }
62
- @top-right {
63
- content: "Page " counter(page);
64
- }
65
- }
66
- ].strip
67
-
68
- tree = Crass.parse(css)
69
- assert_equal(css, Crass::Parser.stringify(tree))
70
- end
71
- end