crass 1.0.1 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e719270a2f03c8171f158bb974f921f389fead1d
4
- data.tar.gz: 70ec9d659187115cf1804d8df84f15009e753059
3
+ metadata.gz: 3371590f5953c99ef49044bb7866a70568707f5c
4
+ data.tar.gz: 16bab682ee608b24dda34b8181cf1a4733a9d9c5
5
5
  SHA512:
6
- metadata.gz: c3063753119e9925cf7d81b1ee782d0aeb611ce8bbb1c14aa99e9a8421b67496a49966fff96d459945ecbde10f55589b60021dbb7f36ab49c34dab4c1a23c4dc
7
- data.tar.gz: 26f18fe8034d8782c9c1156d4592006b11d097d29a995b843f6a15995c9ad13398fe7f2c086c74b7603828f281262f95bbab1cbb8c652603a67ebca9787bcaa0
6
+ metadata.gz: 77f57cca2304bf549e5ba35281364806634397b88ecdeda3310a1e38c17cff83346ef423db1b719b05c744281e4eedfbe85f5df4b9e5fb6883bf092efead5be2
7
+ data.tar.gz: 43d3a7ee5ae7670fffeb35c8843321a70d65447aea7f2ca8a650c8c772d2f8ad92804c20639137eae05296ad13a920a898f9735385d73d6811fdd026396c57fe
@@ -3,7 +3,6 @@ rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
5
  - 2.0.0
6
- - 2.1.3
7
- - 2.1.4
8
- - 2.1.5
6
+ - 2.1.6
7
+ - 2.2.2
9
8
  - ruby-head
data/HISTORY.md CHANGED
@@ -1,6 +1,14 @@
1
1
  Crass Change History
2
2
  ====================
3
3
 
4
+ 1.0.2 (2015-04-17)
5
+ ------------------
6
+
7
+ * Fixed: An at-rule immediately followed by a `{}` simple block would have the
8
+ block (and subsequent tokens until a semicolon) incorrectly appended to its
9
+ prelude. This was super dumb and made me very sad.
10
+
11
+
4
12
  1.0.1 (2014-11-16)
5
13
  ------------------
6
14
 
@@ -133,7 +133,7 @@ module Crass
133
133
 
134
134
  # Consumes an at-rule and returns it.
135
135
  #
136
- # 5.4.2. http://dev.w3.org/csswg/css-syntax-3/#consume-an-at-rule
136
+ # 5.4.2. http://dev.w3.org/csswg/css-syntax-3/#consume-at-rule
137
137
  def consume_at_rule(input = @tokens)
138
138
  rule = {}
139
139
 
@@ -142,15 +142,15 @@ module Crass
142
142
  rule[:prelude] = []
143
143
 
144
144
  while token = input.consume
145
- case token[:node]
146
- # Non-standard.
147
- when :comment
145
+ node = token[:node]
146
+
147
+ if node == :comment # Non-standard.
148
148
  next
149
149
 
150
- when :semicolon
150
+ elsif node == :semicolon
151
151
  break
152
152
 
153
- when :'{'
153
+ elsif node === :'{'
154
154
  # Note: The spec says the block should _be_ the consumed simple
155
155
  # block, but Simon Sapin's CSS parsing tests and tinycss2 expect
156
156
  # only the _value_ of the consumed simple block here. I assume I'm
@@ -159,7 +159,7 @@ module Crass
159
159
  rule[:block] = consume_simple_block(input)[:value]
160
160
  break
161
161
 
162
- when :simple_block && token[:start] == '{'
162
+ elsif node == :simple_block && token[:start] == '{'
163
163
  # Note: The spec says the block should _be_ the simple block, but
164
164
  # Simon Sapin's CSS parsing tests and tinycss2 expect only the
165
165
  # _value_ of the simple block here. I assume I'm interpreting the
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Crass
4
- VERSION = '1.0.1'
4
+ VERSION = '1.0.2'
5
5
  end
@@ -67,6 +67,113 @@ describe 'Crass::Parser' do
67
67
  ], tree)
68
68
  end
69
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
+
70
177
  it 'should parse values containing functions' do
71
178
  tree = parse("content: attr(data-foo) \" \";")
72
179
 
@@ -42,4 +42,30 @@ describe 'Serialization' do
42
42
  Crass::Parser.stringify(tree)
43
43
  )
44
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
45
71
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crass
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Grove
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-17 00:00:00.000000000 Z
11
+ date: 2015-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
110
  version: '0'
111
111
  requirements: []
112
112
  rubyforge_project:
113
- rubygems_version: 2.2.2
113
+ rubygems_version: 2.4.5
114
114
  signing_key:
115
115
  specification_version: 4
116
116
  summary: CSS parser based on the CSS Syntax Level 3 spec.