csspool 3.0.1 → 3.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.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,13 @@
1
+ == 3.0.2
2
+
3
+ * New Features
4
+
5
+ * Support IE Safe Hacks [stereobooster]
6
+
7
+ * Bugfixes
8
+
9
+ * Fix #23 - set up CSSPool.CSS so it can read files. [Mike Tierney]
10
+
1
11
  == 3.0.1
2
12
 
3
13
  * New Features
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ # -*- ruby -*-
2
+
3
+ # DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake bundler:gemfile`.
4
+
5
+ source :gemcutter
6
+
7
+
8
+ gem "rdoc", "~>3.10", :group => [:development, :test]
9
+ gem "racc", ">=0", :group => [:development, :test]
10
+ gem "rexical", ">=0", :group => [:development, :test]
11
+ gem "hoe-git", ">=0", :group => [:development, :test]
12
+ gem "hoe-gemspec", ">=0", :group => [:development, :test]
13
+ gem "hoe-bundler", ">=0", :group => [:development, :test]
14
+ gem "hoe", "~>3.0", :group => [:development, :test]
15
+
16
+ # vim: syntax=ruby
data/Gemfile.lock ADDED
@@ -0,0 +1,29 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ hoe (3.1.0)
5
+ rake (~> 0.8)
6
+ hoe-bundler (1.2.0)
7
+ hoe (>= 2.2.0)
8
+ hoe-gemspec (1.0.0)
9
+ hoe (>= 2.2.0)
10
+ hoe-git (1.5.0)
11
+ hoe (>= 2.2.0)
12
+ json (1.7.5)
13
+ racc (1.4.9)
14
+ rake (0.9.2.2)
15
+ rdoc (3.12)
16
+ json (~> 1.4)
17
+ rexical (1.0.5)
18
+
19
+ PLATFORMS
20
+ ruby
21
+
22
+ DEPENDENCIES
23
+ hoe (~> 3.0)
24
+ hoe-bundler
25
+ hoe-gemspec
26
+ hoe-git
27
+ racc
28
+ rdoc (~> 3.10)
29
+ rexical
data/Manifest.txt CHANGED
@@ -1,5 +1,7 @@
1
1
  .autotest
2
2
  CHANGELOG.rdoc
3
+ Gemfile
4
+ Gemfile.lock
3
5
  Manifest.txt
4
6
  README.rdoc
5
7
  Rakefile
@@ -49,6 +51,7 @@ test/css/test_document.rb
49
51
  test/css/test_import_rule.rb
50
52
  test/css/test_parser.rb
51
53
  test/css/test_tokenizer.rb
54
+ test/files/test.css
52
55
  test/helper.rb
53
56
  test/sac/test_parser.rb
54
57
  test/sac/test_properties.rb
@@ -2,9 +2,16 @@ module CSSPool
2
2
  module CSS
3
3
  class Document < Node
4
4
  def self.parse string
5
+ # If a File object gets passed in, via functions like File.open
6
+ # or Kernel::open
7
+ if string.respond_to? :read
8
+ string = string.read
9
+ end
10
+
5
11
  unless string && string.length > 0
6
12
  return CSSPool::CSS::Document.new
7
13
  end
14
+
8
15
  handler = CSSPool::CSS::DocumentHandler.new
9
16
  parser = CSSPool::SAC::Parser.new(handler)
10
17
  parser.parse(string)
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # DO NOT MODIFY!!!!
3
- # This file is automatically generated by Racc 1.4.8
3
+ # This file is automatically generated by Racc 1.4.9
4
4
  # from Racc grammer file "".
5
5
  #
6
6
 
@@ -9,7 +9,7 @@ module CSSPool
9
9
  module CSS
10
10
  class Parser < Racc::Parser
11
11
 
12
- module_eval(<<'...end parser.y/module_eval...', 'parser.y', 317)
12
+ module_eval(<<'...end parser.y/module_eval...', 'parser.y', 318)
13
13
 
14
14
  def numeric thing
15
15
  thing = thing.gsub(/[^\d.]/, '')
@@ -50,138 +50,138 @@ end
50
50
  ##### State transition tables begin ###
51
51
 
52
52
  racc_action_table = [
53
- 8, 9, 63, 48, 21, 15, 53, 45, 3, 22,
54
- 27, 29, 8, 9, 75, 64, 21, 15, 48, 54,
55
- 55, 22, 27, 29, 36, 84, 8, 9, 70, 83,
56
- 21, 15, 13, 28, 30, 22, 27, 29, 85, 27,
57
- 29, 82, 21, 74, 13, 28, 30, 22, 27, 29,
58
- 21, 15, 37, 70, 71, 22, 27, 29, 13, 28,
59
- 30, 21, 28, 30, 112, 73, 22, 27, 29, 21,
60
- 15, 28, 30, 72, 22, 27, 29, 21, 15, 28,
61
- 30, 69, 22, 27, 29, 27, 29, 21, 15, 119,
62
- 28, 30, 22, 27, 29, 121, 65, 13, 28, 30,
63
- 27, 29, 67, 42, 68, 13, 28, 30, 28, 30,
64
- 99, 42, 111, 62, 43, 13, 28, 30, 97, 27,
65
- 29, 27, 29, 28, 30, 96, 118, 110, 117, 101,
66
- 109, 103, 102, 104, 105, 106, 107, 108, 98, 99,
67
- 128, 111, 28, 30, 28, 30, 129, 97, 81, 78,
68
- 79, 80, 130, 115, 96, 116, 110, 131, 101, 109,
69
- 103, 102, 104, 105, 106, 107, 108, 98, 99, 132,
70
- 111, 136, 114, 61, 113, 51, 97, 50, 137, 138,
71
- 139, 140, 141, 96, 142, 110, 121, 101, 109, 103,
72
- 102, 104, 105, 106, 107, 108, 98, 99, 34, 111,
73
- 145, 123, 121, 31, 121, 97, nil, nil, 125, nil,
74
- nil, nil, 96, nil, 110, 124, 101, 109, 103, 102,
75
- 104, 105, 106, 107, 108, 98, 99, nil, 111, nil,
76
- nil, nil, nil, nil, 97, nil, nil, nil, nil, nil,
77
- nil, 96, nil, 110, nil, 101, 109, 103, 102, 104,
78
- 105, 106, 107, 108, 98, 99, nil, 111, 88, nil,
79
- nil, nil, nil, 97, nil, nil, nil, nil, nil, nil,
80
- 96, nil, 110, nil, 101, 109, 103, 102, 104, 105,
81
- 106, 107, 108, 98, 99, nil, 111, nil, nil, nil,
82
- nil, nil, 97, nil, nil, nil, nil, nil, nil, 96,
83
- nil, 110, nil, 101, 109, 103, 102, 104, 105, 106,
84
- 107, 108, 98, 110, nil, 101, 109, 103, 102, 104,
85
- 105, 106, 107, 108 ]
53
+ 13, 17, 41, 52, 22, 25, 61, 56, 51, 4,
54
+ 6, 9, 13, 17, 83, 42, 22, 25, 3, 62,
55
+ 63, 4, 6, 9, 46, 94, 13, 17, 66, 81,
56
+ 22, 25, 8, 10, 14, 4, 6, 9, 80, 73,
57
+ 6, 9, 22, 82, 8, 10, 14, 4, 6, 9,
58
+ 22, 74, 47, 66, 67, 4, 6, 9, 8, 10,
59
+ 14, 22, 25, 10, 14, 93, 4, 6, 9, 22,
60
+ 25, 10, 14, 79, 4, 6, 9, 22, 25, 10,
61
+ 14, 78, 4, 6, 9, 6, 9, 22, 25, 8,
62
+ 10, 14, 4, 6, 9, 52, 72, 8, 10, 14,
63
+ 51, 34, 121, 105, 35, 109, 10, 14, 10, 14,
64
+ 89, 98, 90, 6, 9, 8, 10, 14, 116, 91,
65
+ 119, 92, 97, 100, 102, 104, 107, 110, 112, 115,
66
+ 118, 120, 105, 122, 109, 143, 10, 14, 123, 87,
67
+ 98, 88, 6, 9, 6, 9, 124, 116, 125, 119,
68
+ 126, 97, 100, 102, 104, 107, 110, 112, 115, 118,
69
+ 120, 105, 127, 109, 114, 10, 14, 10, 14, 98,
70
+ 68, 69, 70, 71, 86, 133, 116, 134, 119, 135,
71
+ 97, 100, 102, 104, 107, 110, 112, 115, 118, 120,
72
+ 105, 136, 109, 76, 34, 77, 137, 59, 98, 57,
73
+ 40, 141, 37, 36, 141, 116, 147, 119, 31, 97,
74
+ 100, 102, 104, 107, 110, 112, 115, 118, 120, 105,
75
+ 141, 109, 141, nil, nil, nil, nil, 98, nil, nil,
76
+ nil, nil, nil, nil, 116, nil, 119, nil, 97, 100,
77
+ 102, 104, 107, 110, 112, 115, 118, 120, 105, nil,
78
+ 109, nil, 131, nil, nil, nil, 98, nil, nil, 129,
79
+ nil, nil, nil, 116, nil, 119, 128, 97, 100, 102,
80
+ 104, 107, 110, 112, 115, 118, 120, 105, nil, 109,
81
+ nil, nil, nil, nil, nil, 98, nil, nil, nil, nil,
82
+ nil, nil, 116, nil, 119, nil, 97, 100, 102, 104,
83
+ 107, 110, 112, 115, 118, 120, 119, nil, 97, 100,
84
+ 102, 104, 107, 110, 112, 115, 118 ]
86
85
 
87
86
  racc_action_check = [
88
- 6, 6, 30, 14, 6, 6, 18, 14, 1, 6,
89
- 6, 6, 2, 2, 47, 30, 2, 2, 73, 18,
90
- 18, 2, 2, 2, 9, 66, 5, 5, 66, 64,
91
- 5, 5, 6, 6, 6, 5, 5, 5, 70, 23,
92
- 23, 64, 52, 47, 2, 2, 2, 52, 52, 52,
93
- 15, 15, 9, 41, 41, 15, 15, 15, 5, 5,
94
- 5, 51, 23, 23, 75, 46, 51, 51, 51, 12,
95
- 12, 52, 52, 44, 12, 12, 12, 10, 10, 15,
96
- 15, 40, 10, 10, 10, 25, 25, 11, 11, 83,
97
- 51, 51, 11, 11, 11, 87, 34, 12, 12, 12,
98
- 26, 26, 35, 35, 35, 10, 10, 10, 25, 25,
99
- 126, 13, 126, 29, 13, 11, 11, 11, 126, 19,
100
- 19, 24, 24, 26, 26, 126, 80, 126, 80, 126,
101
- 126, 126, 126, 126, 126, 126, 126, 126, 126, 136,
102
- 90, 136, 19, 19, 24, 24, 92, 136, 62, 62,
103
- 62, 62, 93, 79, 136, 79, 136, 94, 136, 136,
104
- 136, 136, 136, 136, 136, 136, 136, 136, 112, 95,
105
- 112, 112, 78, 28, 78, 17, 112, 16, 113, 114,
106
- 115, 116, 117, 112, 118, 112, 122, 112, 112, 112,
107
- 112, 112, 112, 112, 112, 112, 112, 89, 8, 89,
108
- 133, 89, 135, 3, 147, 89, nil, nil, 89, nil,
109
- nil, nil, 89, nil, 89, 89, 89, 89, 89, 89,
110
- 89, 89, 89, 89, 89, 89, 88, nil, 88, nil,
111
- nil, nil, nil, nil, 88, nil, nil, nil, nil, nil,
112
- nil, 88, nil, 88, nil, 88, 88, 88, 88, 88,
113
- 88, 88, 88, 88, 88, 74, nil, 74, 74, nil,
114
- nil, nil, nil, 74, nil, nil, nil, nil, nil, nil,
115
- 74, nil, 74, nil, 74, 74, 74, 74, 74, 74,
116
- 74, 74, 74, 74, 96, nil, 96, nil, nil, nil,
117
- nil, nil, 96, nil, nil, nil, nil, nil, nil, 96,
118
- nil, 96, nil, 96, 96, 96, 96, 96, 96, 96,
119
- 96, 96, 96, 100, nil, 100, 100, 100, 100, 100,
120
- 100, 100, 100, 100 ]
87
+ 29, 29, 14, 21, 29, 29, 28, 21, 21, 29,
88
+ 29, 29, 2, 2, 55, 14, 2, 2, 1, 28,
89
+ 28, 2, 2, 2, 17, 75, 27, 27, 75, 54,
90
+ 27, 27, 29, 29, 29, 27, 27, 27, 53, 42,
91
+ 15, 15, 59, 55, 2, 2, 2, 59, 59, 59,
92
+ 64, 42, 17, 33, 33, 64, 64, 64, 27, 27,
93
+ 27, 19, 19, 15, 15, 73, 19, 19, 19, 16,
94
+ 16, 59, 59, 51, 16, 16, 16, 25, 25, 64,
95
+ 64, 49, 25, 25, 25, 20, 20, 12, 12, 19,
96
+ 19, 19, 12, 12, 12, 80, 40, 16, 16, 16,
97
+ 80, 8, 83, 116, 8, 116, 25, 25, 20, 20,
98
+ 70, 116, 70, 11, 11, 12, 12, 12, 116, 71,
99
+ 116, 71, 116, 116, 116, 116, 116, 116, 116, 116,
100
+ 116, 116, 121, 87, 121, 121, 11, 11, 88, 69,
101
+ 121, 69, 5, 5, 18, 18, 89, 121, 90, 121,
102
+ 91, 121, 121, 121, 121, 121, 121, 121, 121, 121,
103
+ 121, 82, 92, 82, 82, 5, 5, 18, 18, 82,
104
+ 36, 36, 36, 36, 66, 99, 82, 103, 82, 106,
105
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
106
+ 132, 108, 132, 45, 45, 45, 111, 26, 132, 24,
107
+ 13, 117, 10, 9, 139, 132, 140, 132, 3, 132,
108
+ 132, 132, 132, 132, 132, 132, 132, 132, 132, 143,
109
+ 144, 143, 148, nil, nil, nil, nil, 143, nil, nil,
110
+ nil, nil, nil, nil, 143, nil, 143, nil, 143, 143,
111
+ 143, 143, 143, 143, 143, 143, 143, 143, 96, nil,
112
+ 96, nil, 96, nil, nil, nil, 96, nil, nil, 96,
113
+ nil, nil, nil, 96, nil, 96, 96, 96, 96, 96,
114
+ 96, 96, 96, 96, 96, 96, 96, 114, nil, 114,
115
+ nil, nil, nil, nil, nil, 114, nil, nil, nil, nil,
116
+ nil, nil, 114, nil, 114, nil, 114, 114, 114, 114,
117
+ 114, 114, 114, 114, 114, 114, 113, nil, 113, 113,
118
+ 113, 113, 113, 113, 113, 113, 113 ]
121
119
 
122
120
  racc_action_pointer = [
123
- nil, 8, 10, 203, nil, 24, -2, nil, 194, 20,
124
- 71, 81, 63, 105, -3, 44, 168, 167, -1, 107,
125
- nil, nil, nil, 27, 109, 73, 88, nil, 167, 107,
126
- -4, nil, nil, nil, 91, 97, nil, nil, nil, nil,
127
- 71, 45, nil, nil, 63, nil, 60, 7, nil, nil,
128
- nil, 55, 36, nil, nil, nil, nil, nil, nil, nil,
129
- nil, nil, 134, nil, 23, nil, 20, nil, nil, nil,
130
- 32, nil, nil, 12, 251, 28, nil, nil, 168, 149,
131
- 122, nil, nil, 71, nil, nil, nil, 62, 222, 193,
132
- 133, nil, 139, 145, 150, 162, 280, nil, nil, nil,
133
- 292, nil, nil, nil, nil, nil, nil, nil, nil, nil,
134
- nil, nil, 164, 164, 165, 166, 167, 168, 170, nil,
135
- nil, nil, 153, nil, nil, nil, 106, nil, nil, nil,
136
- nil, nil, nil, 182, nil, 169, 135, nil, nil, nil,
137
- nil, nil, nil, nil, nil, nil, nil, 171, nil ]
121
+ nil, 18, 10, 208, nil, 130, nil, nil, 95, 197,
122
+ 196, 101, 81, 196, -4, 28, 63, 20, 132, 55,
123
+ 73, -3, nil, nil, 190, 71, 189, 24, -1, -2,
124
+ nil, nil, nil, 45, nil, nil, 156, nil, nil, nil,
125
+ 91, nil, 33, nil, nil, 188, nil, nil, nil, 71,
126
+ nil, 67, nil, 33, 19, 7, nil, nil, nil, 36,
127
+ nil, nil, nil, nil, 44, nil, 168, nil, nil, 135,
128
+ 106, 115, nil, 47, nil, 20, nil, nil, nil, nil,
129
+ 89, nil, 157, 66, nil, nil, nil, 119, 124, 132,
130
+ 134, 136, 148, nil, nil, nil, 244, nil, nil, 168,
131
+ nil, nil, nil, 170, nil, nil, 172, nil, 184, nil,
132
+ nil, 189, nil, 285, 273, nil, 99, 168, nil, nil,
133
+ nil, 128, nil, nil, nil, nil, nil, nil, nil, nil,
134
+ nil, nil, 186, nil, nil, nil, nil, nil, nil, 171,
135
+ 188, nil, nil, 215, 187, nil, nil, nil, 189, nil,
136
+ nil ]
138
137
 
139
138
  racc_action_default = [
140
- -1, -102, -102, -102, -2, -5, -6, -7, -102, -102,
141
- -18, -19, -102, -102, -102, -102, -102, -28, -30, -35,
142
- -36, -37, -38, -39, -40, -41, -42, -47, -102, -102,
143
- -102, 149, -3, -4, -102, -102, -12, -13, -16, -17,
144
- -102, -102, -15, -22, -102, -24, -61, -102, -68, -25,
145
- -26, -102, -102, -31, -32, -33, -34, -43, -44, -45,
146
- -46, -48, -102, -56, -102, -8, -102, -10, -11, -20,
147
- -102, -21, -23, -60, -102, -102, -27, -29, -102, -102,
148
- -102, -55, -57, -102, -9, -14, -59, -67, -102, -74,
149
- -75, -76, -77, -78, -79, -80, -102, -84, -86, -88,
150
- -102, -90, -91, -92, -93, -94, -95, -96, -97, -98,
151
- -99, -101, -102, -102, -102, -102, -102, -102, -102, -58,
152
- -62, -66, -67, -69, -70, -71, -102, -73, -100, -87,
153
- -85, -83, -81, -102, -89, -67, -102, -49, -50, -51,
154
- -52, -53, -54, -63, -72, -82, -64, -67, -65 ]
139
+ -1, -103, -103, -103, -38, -35, -47, -36, -103, -103,
140
+ -103, -39, -18, -103, -103, -40, -19, -103, -41, -103,
141
+ -42, -103, -37, -2, -103, -103, -28, -5, -30, -6,
142
+ -7, 151, -34, -103, -15, -22, -103, -48, -43, -16,
143
+ -103, -56, -103, -44, -17, -103, -12, -13, -45, -103,
144
+ -46, -103, -68, -61, -103, -103, -24, -26, -25, -103,
145
+ -3, -31, -32, -33, -103, -4, -103, -21, -55, -103,
146
+ -103, -103, -8, -103, -57, -103, -10, -11, -20, -69,
147
+ -60, -23, -103, -103, -27, -29, -14, -103, -103, -103,
148
+ -103, -103, -103, -58, -9, -59, -75, -91, -85, -76,
149
+ -99, -77, -93, -78, -92, -89, -79, -94, -80, -102,
150
+ -95, -81, -96, -103, -103, -97, -103, -67, -98, -100,
151
+ -87, -103, -50, -49, -51, -52, -54, -53, -71, -72,
152
+ -74, -70, -103, -101, -88, -86, -84, -82, -90, -67,
153
+ -103, -66, -62, -103, -67, -73, -63, -83, -67, -64,
154
+ -65 ]
155
155
 
156
156
  racc_goto_table = [
157
- 87, 120, 41, 56, 44, 76, 49, 57, 58, 59,
158
- 60, 77, 52, 4, 122, 127, 32, 33, 38, 39,
159
- 40, 35, 133, 2, 66, 1, 126, 134, nil, nil,
160
- nil, nil, nil, nil, nil, nil, 143, nil, 135, nil,
161
- nil, nil, nil, nil, nil, nil, nil, nil, nil, 146,
162
- nil, nil, 144, nil, nil, nil, nil, nil, nil, nil,
163
- nil, 148, 147, 86 ]
157
+ 117, 54, 142, 33, 84, 32, 58, 85, 64, 39,
158
+ 23, 38, 45, 44, 130, 43, 49, 2, 48, 1,
159
+ 50, 132, 138, nil, 146, nil, nil, nil, nil, 149,
160
+ nil, nil, 139, 150, 140, 60, nil, 65, nil, 144,
161
+ 75, nil, nil, nil, nil, nil, nil, nil, nil, nil,
162
+ 145, nil, nil, nil, nil, nil, nil, nil, nil, nil,
163
+ 95, 148 ]
164
164
 
165
165
  racc_goto_check = [
166
- 26, 27, 8, 19, 13, 14, 12, 19, 19, 19,
167
- 19, 15, 17, 2, 26, 26, 2, 2, 6, 6,
168
- 6, 7, 26, 3, 8, 1, 28, 31, nil, nil,
169
- nil, nil, nil, nil, nil, nil, 27, nil, 26, nil,
170
- nil, nil, nil, nil, nil, nil, nil, nil, nil, 27,
171
- nil, nil, 26, nil, nil, nil, nil, nil, nil, nil,
172
- nil, 27, 26, 13 ]
166
+ 26, 13, 27, 8, 14, 19, 12, 15, 17, 6,
167
+ 2, 19, 7, 6, 26, 19, 6, 3, 19, 1,
168
+ 19, 28, 31, nil, 27, nil, nil, nil, nil, 27,
169
+ nil, nil, 26, 27, 26, 2, nil, 2, nil, 26,
170
+ 8, nil, nil, nil, nil, nil, nil, nil, nil, nil,
171
+ 26, nil, nil, nil, nil, nil, nil, nil, nil, nil,
172
+ 13, 26 ]
173
173
 
174
174
  racc_goto_pointer = [
175
- nil, 25, 11, 23, nil, nil, 8, 12, -11, nil,
176
- nil, nil, -9, -10, -46, -41, nil, -6, nil, -16,
177
- nil, nil, nil, nil, nil, nil, -74, -86, -63, nil,
178
- nil, -73, nil, nil, nil, nil, nil ]
175
+ nil, 19, 8, 17, nil, nil, -3, -5, -5, nil,
176
+ nil, nil, -19, -20, -55, -57, nil, -20, nil, 0,
177
+ nil, nil, nil, nil, nil, nil, -82, -115, -75, nil,
178
+ nil, -91, nil, nil, nil, nil, nil ]
179
179
 
180
180
  racc_goto_default = [
181
- nil, nil, nil, nil, 5, 6, 7, nil, nil, 10,
182
- 11, 12, 14, nil, 16, 17, 18, nil, 19, 20,
183
- 23, 24, 25, 26, 46, 47, nil, nil, nil, 89,
184
- 90, 91, 92, 93, 94, 95, 100 ]
181
+ nil, nil, nil, nil, 27, 29, 30, nil, nil, 12,
182
+ 16, 19, 21, nil, 24, 26, 28, nil, 5, 7,
183
+ 11, 15, 18, 20, 53, 55, nil, nil, nil, 96,
184
+ 99, 101, 103, 106, 108, 111, 113 ]
185
185
 
186
186
  racc_reduce_table = [
187
187
  0, 0, :racc_error,
@@ -253,28 +253,28 @@ racc_reduce_table = [
253
253
  1, 64, :_reduce_66,
254
254
  0, 64, :_reduce_67,
255
255
  1, 62, :_reduce_68,
256
+ 2, 62, :_reduce_69,
256
257
  1, 65, :_reduce_none,
257
258
  1, 65, :_reduce_none,
258
259
  1, 65, :_reduce_none,
259
- 3, 63, :_reduce_72,
260
- 2, 63, :_reduce_73,
261
- 1, 63, :_reduce_74,
260
+ 3, 63, :_reduce_73,
261
+ 2, 63, :_reduce_74,
262
+ 1, 63, :_reduce_75,
262
263
  1, 66, :_reduce_none,
263
264
  1, 66, :_reduce_none,
264
265
  1, 66, :_reduce_none,
265
266
  1, 66, :_reduce_none,
266
267
  1, 66, :_reduce_none,
267
268
  1, 66, :_reduce_none,
268
- 2, 72, :_reduce_81,
269
- 3, 72, :_reduce_82,
270
- 2, 71, :_reduce_83,
271
- 1, 71, :_reduce_84,
272
- 2, 70, :_reduce_85,
273
- 1, 70, :_reduce_86,
274
- 2, 69, :_reduce_87,
275
- 1, 69, :_reduce_88,
276
- 2, 68, :_reduce_89,
277
- 1, 68, :_reduce_90,
269
+ 2, 72, :_reduce_82,
270
+ 3, 72, :_reduce_83,
271
+ 2, 71, :_reduce_84,
272
+ 1, 71, :_reduce_85,
273
+ 2, 70, :_reduce_86,
274
+ 1, 70, :_reduce_87,
275
+ 2, 69, :_reduce_88,
276
+ 1, 69, :_reduce_89,
277
+ 2, 68, :_reduce_90,
278
278
  1, 68, :_reduce_91,
279
279
  1, 68, :_reduce_92,
280
280
  1, 68, :_reduce_93,
@@ -282,14 +282,15 @@ racc_reduce_table = [
282
282
  1, 68, :_reduce_95,
283
283
  1, 68, :_reduce_96,
284
284
  1, 68, :_reduce_97,
285
- 1, 73, :_reduce_98,
285
+ 1, 68, :_reduce_98,
286
286
  1, 73, :_reduce_99,
287
- 2, 67, :_reduce_100,
288
- 1, 67, :_reduce_101 ]
287
+ 1, 73, :_reduce_100,
288
+ 2, 67, :_reduce_101,
289
+ 1, 67, :_reduce_102 ]
289
290
 
290
- racc_reduce_n = 102
291
+ racc_reduce_n = 103
291
292
 
292
- racc_shift_n = 149
293
+ racc_shift_n = 151
293
294
 
294
295
  racc_token_table = {
295
296
  false => 0,
@@ -908,14 +909,21 @@ module_eval(<<'.,.,', 'parser.y', 227)
908
909
  end
909
910
  .,.,
910
911
 
911
- # reduce 69 omitted
912
+ module_eval(<<'.,.,', 'parser.y', 228)
913
+ def _reduce_69(val, _values, result)
914
+ result = interpret_identifier val.join
915
+ result
916
+ end
917
+ .,.,
912
918
 
913
919
  # reduce 70 omitted
914
920
 
915
921
  # reduce 71 omitted
916
922
 
917
- module_eval(<<'.,.,', 'parser.y', 236)
918
- def _reduce_72(val, _values, result)
923
+ # reduce 72 omitted
924
+
925
+ module_eval(<<'.,.,', 'parser.y', 237)
926
+ def _reduce_73(val, _values, result)
919
927
  result = [val.first, val.last].flatten
920
928
  val.last.first.operator = val[1]
921
929
 
@@ -923,22 +931,20 @@ module_eval(<<'.,.,', 'parser.y', 236)
923
931
  end
924
932
  .,.,
925
933
 
926
- module_eval(<<'.,.,', 'parser.y', 239)
927
- def _reduce_73(val, _values, result)
934
+ module_eval(<<'.,.,', 'parser.y', 240)
935
+ def _reduce_74(val, _values, result)
928
936
  result = val.flatten
929
937
  result
930
938
  end
931
939
  .,.,
932
940
 
933
- module_eval(<<'.,.,', 'parser.y', 240)
934
- def _reduce_74(val, _values, result)
941
+ module_eval(<<'.,.,', 'parser.y', 241)
942
+ def _reduce_75(val, _values, result)
935
943
  result = val
936
944
  result
937
945
  end
938
946
  .,.,
939
947
 
940
- # reduce 75 omitted
941
-
942
948
  # reduce 76 omitted
943
949
 
944
950
  # reduce 77 omitted
@@ -949,15 +955,17 @@ module_eval(<<'.,.,', 'parser.y', 240)
949
955
 
950
956
  # reduce 80 omitted
951
957
 
952
- module_eval(<<'.,.,', 'parser.y', 251)
953
- def _reduce_81(val, _values, result)
958
+ # reduce 81 omitted
959
+
960
+ module_eval(<<'.,.,', 'parser.y', 252)
961
+ def _reduce_82(val, _values, result)
954
962
  result = val.first
955
963
  result
956
964
  end
957
965
  .,.,
958
966
 
959
- module_eval(<<'.,.,', 'parser.y', 253)
960
- def _reduce_82(val, _values, result)
967
+ module_eval(<<'.,.,', 'parser.y', 254)
968
+ def _reduce_83(val, _values, result)
961
969
  name = interpret_identifier val.first.sub(/\($/, '')
962
970
  if name == 'rgb'
963
971
  result = Terms::Rgb.new(*val[1])
@@ -969,50 +977,50 @@ module_eval(<<'.,.,', 'parser.y', 253)
969
977
  end
970
978
  .,.,
971
979
 
972
- module_eval(<<'.,.,', 'parser.y', 262)
973
- def _reduce_83(val, _values, result)
980
+ module_eval(<<'.,.,', 'parser.y', 263)
981
+ def _reduce_84(val, _values, result)
974
982
  result = val.first
975
983
  result
976
984
  end
977
985
  .,.,
978
986
 
979
- module_eval(<<'.,.,', 'parser.y', 263)
980
- def _reduce_84(val, _values, result)
987
+ module_eval(<<'.,.,', 'parser.y', 264)
988
+ def _reduce_85(val, _values, result)
981
989
  result = Terms::Hash.new val.first.sub(/^#/, '')
982
990
  result
983
991
  end
984
992
  .,.,
985
993
 
986
- module_eval(<<'.,.,', 'parser.y', 266)
987
- def _reduce_85(val, _values, result)
994
+ module_eval(<<'.,.,', 'parser.y', 267)
995
+ def _reduce_86(val, _values, result)
988
996
  result = val.first
989
997
  result
990
998
  end
991
999
  .,.,
992
1000
 
993
- module_eval(<<'.,.,', 'parser.y', 267)
994
- def _reduce_86(val, _values, result)
1001
+ module_eval(<<'.,.,', 'parser.y', 268)
1002
+ def _reduce_87(val, _values, result)
995
1003
  result = Terms::URI.new interpret_uri val.first
996
1004
  result
997
1005
  end
998
1006
  .,.,
999
1007
 
1000
- module_eval(<<'.,.,', 'parser.y', 269)
1001
- def _reduce_87(val, _values, result)
1008
+ module_eval(<<'.,.,', 'parser.y', 270)
1009
+ def _reduce_88(val, _values, result)
1002
1010
  result = val.first
1003
1011
  result
1004
1012
  end
1005
1013
  .,.,
1006
1014
 
1007
- module_eval(<<'.,.,', 'parser.y', 270)
1008
- def _reduce_88(val, _values, result)
1015
+ module_eval(<<'.,.,', 'parser.y', 271)
1016
+ def _reduce_89(val, _values, result)
1009
1017
  result = Terms::String.new interpret_string val.first
1010
1018
  result
1011
1019
  end
1012
1020
  .,.,
1013
1021
 
1014
- module_eval(<<'.,.,', 'parser.y', 274)
1015
- def _reduce_89(val, _values, result)
1022
+ module_eval(<<'.,.,', 'parser.y', 275)
1023
+ def _reduce_90(val, _values, result)
1016
1024
  result = val[1]
1017
1025
  val[1].unary_operator = val.first
1018
1026
 
@@ -1020,24 +1028,24 @@ module_eval(<<'.,.,', 'parser.y', 274)
1020
1028
  end
1021
1029
  .,.,
1022
1030
 
1023
- module_eval(<<'.,.,', 'parser.y', 278)
1024
- def _reduce_90(val, _values, result)
1031
+ module_eval(<<'.,.,', 'parser.y', 279)
1032
+ def _reduce_91(val, _values, result)
1025
1033
  result = Terms::Number.new numeric val.first
1026
1034
 
1027
1035
  result
1028
1036
  end
1029
1037
  .,.,
1030
1038
 
1031
- module_eval(<<'.,.,', 'parser.y', 281)
1032
- def _reduce_91(val, _values, result)
1039
+ module_eval(<<'.,.,', 'parser.y', 282)
1040
+ def _reduce_92(val, _values, result)
1033
1041
  result = Terms::Number.new numeric(val.first), nil, '%'
1034
1042
 
1035
1043
  result
1036
1044
  end
1037
1045
  .,.,
1038
1046
 
1039
- module_eval(<<'.,.,', 'parser.y', 284)
1040
- def _reduce_92(val, _values, result)
1047
+ module_eval(<<'.,.,', 'parser.y', 285)
1048
+ def _reduce_93(val, _values, result)
1041
1049
  unit = val.first.gsub(/[\s\d.]/, '')
1042
1050
  result = Terms::Number.new numeric(val.first), nil, unit
1043
1051
 
@@ -1045,24 +1053,24 @@ module_eval(<<'.,.,', 'parser.y', 284)
1045
1053
  end
1046
1054
  .,.,
1047
1055
 
1048
- module_eval(<<'.,.,', 'parser.y', 288)
1049
- def _reduce_93(val, _values, result)
1056
+ module_eval(<<'.,.,', 'parser.y', 289)
1057
+ def _reduce_94(val, _values, result)
1050
1058
  result = Terms::Number.new numeric(val.first), nil, 'em'
1051
1059
 
1052
1060
  result
1053
1061
  end
1054
1062
  .,.,
1055
1063
 
1056
- module_eval(<<'.,.,', 'parser.y', 291)
1057
- def _reduce_94(val, _values, result)
1064
+ module_eval(<<'.,.,', 'parser.y', 292)
1065
+ def _reduce_95(val, _values, result)
1058
1066
  result = Terms::Number.new numeric(val.first), nil, 'ex'
1059
1067
 
1060
1068
  result
1061
1069
  end
1062
1070
  .,.,
1063
1071
 
1064
- module_eval(<<'.,.,', 'parser.y', 294)
1065
- def _reduce_95(val, _values, result)
1072
+ module_eval(<<'.,.,', 'parser.y', 295)
1073
+ def _reduce_96(val, _values, result)
1066
1074
  unit = val.first.gsub(/[\s\d.]/, '')
1067
1075
  result = Terms::Number.new numeric(val.first), nil, unit
1068
1076
 
@@ -1070,8 +1078,8 @@ module_eval(<<'.,.,', 'parser.y', 294)
1070
1078
  end
1071
1079
  .,.,
1072
1080
 
1073
- module_eval(<<'.,.,', 'parser.y', 298)
1074
- def _reduce_96(val, _values, result)
1081
+ module_eval(<<'.,.,', 'parser.y', 299)
1082
+ def _reduce_97(val, _values, result)
1075
1083
  unit = val.first.gsub(/[\s\d.]/, '')
1076
1084
  result = Terms::Number.new numeric(val.first), nil, unit
1077
1085
 
@@ -1079,8 +1087,8 @@ module_eval(<<'.,.,', 'parser.y', 298)
1079
1087
  end
1080
1088
  .,.,
1081
1089
 
1082
- module_eval(<<'.,.,', 'parser.y', 302)
1083
- def _reduce_97(val, _values, result)
1090
+ module_eval(<<'.,.,', 'parser.y', 303)
1091
+ def _reduce_98(val, _values, result)
1084
1092
  unit = val.first.gsub(/[\s\d.]/, '')
1085
1093
  result = Terms::Number.new numeric(val.first), nil, unit
1086
1094
 
@@ -1088,29 +1096,29 @@ module_eval(<<'.,.,', 'parser.y', 302)
1088
1096
  end
1089
1097
  .,.,
1090
1098
 
1091
- module_eval(<<'.,.,', 'parser.y', 307)
1092
- def _reduce_98(val, _values, result)
1099
+ module_eval(<<'.,.,', 'parser.y', 308)
1100
+ def _reduce_99(val, _values, result)
1093
1101
  result = :minus
1094
1102
  result
1095
1103
  end
1096
1104
  .,.,
1097
1105
 
1098
- module_eval(<<'.,.,', 'parser.y', 308)
1099
- def _reduce_99(val, _values, result)
1106
+ module_eval(<<'.,.,', 'parser.y', 309)
1107
+ def _reduce_100(val, _values, result)
1100
1108
  result = :plus
1101
1109
  result
1102
1110
  end
1103
1111
  .,.,
1104
1112
 
1105
- module_eval(<<'.,.,', 'parser.y', 311)
1106
- def _reduce_100(val, _values, result)
1113
+ module_eval(<<'.,.,', 'parser.y', 312)
1114
+ def _reduce_101(val, _values, result)
1107
1115
  result = val.first
1108
1116
  result
1109
1117
  end
1110
1118
  .,.,
1111
1119
 
1112
- module_eval(<<'.,.,', 'parser.y', 312)
1113
- def _reduce_101(val, _values, result)
1120
+ module_eval(<<'.,.,', 'parser.y', 313)
1121
+ def _reduce_102(val, _values, result)
1114
1122
  result = Terms::Ident.new interpret_identifier val.first
1115
1123
  result
1116
1124
  end
@@ -226,6 +226,7 @@ rule
226
226
  ;
227
227
  property
228
228
  : IDENT { result = interpret_identifier val[0] }
229
+ | STAR IDENT { result = interpret_identifier val.join }
229
230
  ;
230
231
  operator
231
232
  : COMMA
data/lib/csspool.rb CHANGED
@@ -13,7 +13,7 @@ require 'csspool/visitors'
13
13
  require 'csspool/collection'
14
14
 
15
15
  module CSSPool
16
- VERSION = "3.0.1"
16
+ VERSION = "3.0.2"
17
17
 
18
18
  def self.CSS doc
19
19
  CSSPool::CSS::Document.parse doc
@@ -1,10 +1,17 @@
1
1
  require 'helper'
2
-
3
2
  module CSSPool
4
3
  module CSS
5
4
  class TestDocument < CSSPool::TestCase
5
+ def test_file_open
6
+ doc = File.open("#{ASSET_DIR}/test.css") do |f|
7
+ CSSPool.CSS f
8
+ end
9
+
10
+ assert_equal 1, doc['.test'].length
11
+ end
12
+
6
13
  def test_search
7
- doc = CSSPool.CSS('div > p { background: red; }')
14
+ doc = CSSPool.CSS("div > p { background: red; }\n")
8
15
  assert_equal 1, doc['div > p'].length
9
16
  assert_equal 1, doc['div > p'].first.declarations.length
10
17
  end
@@ -163,6 +163,25 @@ module CSSPool
163
163
  assert_equal %w{ background padding }, names
164
164
  end
165
165
 
166
+ def test_ie_safe_hack
167
+ # http://mathiasbynens.be/notes/safe-css-hacks
168
+ @parser.scan_str <<-eocss
169
+ .foo {
170
+ color: black;
171
+ color: green\\9; /* IE8 and older, but there's more... */
172
+ *color: blue; /* IE7 and older */
173
+ _color: red; /* IE6 and older */
174
+ }
175
+ eocss
176
+ declarations = @parser.handler.calls.find_all { |x|
177
+ x.first == :property
178
+ }
179
+ names = declarations.map { |y| y[1].first }
180
+ assert_equal %w{color color *color _color}, names
181
+ # values = declarations.map { |y| y[1][1].first.to_s }
182
+ # assert_equal %w{black green\\9 blue red}, values
183
+ end
184
+
166
185
  def test_star_attribute
167
186
  assert_attribute '*:foo { }'
168
187
  assert_attribute 'a *.foo { }'
@@ -0,0 +1,7 @@
1
+ div > p {
2
+ background-color: #f00;
3
+ }
4
+
5
+ .test {
6
+ box-shadow: 20px;
7
+ }
metadata CHANGED
@@ -1,110 +1,142 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: csspool
3
- version: !ruby/object:Gem::Version
4
- version: 3.0.1
3
+ version: !ruby/object:Gem::Version
4
+ hash: 3
5
5
  prerelease:
6
+ segments:
7
+ - 3
8
+ - 0
9
+ - 2
10
+ version: 3.0.2
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Aaron Patterson
9
14
  - John Barnette
10
15
  autorequire:
11
16
  bindir: bin
12
17
  cert_chain: []
13
- date: 2012-05-18 00:00:00.000000000 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
18
+
19
+ date: 2012-10-09 00:00:00 Z
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
16
22
  name: rdoc
17
- requirement: &70178736571580 !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
18
25
  none: false
19
- requirements:
26
+ requirements:
20
27
  - - ~>
21
- - !ruby/object:Gem::Version
22
- version: '3.10'
28
+ - !ruby/object:Gem::Version
29
+ hash: 19
30
+ segments:
31
+ - 3
32
+ - 10
33
+ version: "3.10"
23
34
  type: :development
24
- prerelease: false
25
- version_requirements: *70178736571580
26
- - !ruby/object:Gem::Dependency
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
27
37
  name: racc
28
- requirement: &70178736571000 !ruby/object:Gem::Requirement
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
29
40
  none: false
30
- requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
34
48
  type: :development
35
- prerelease: false
36
- version_requirements: *70178736571000
37
- - !ruby/object:Gem::Dependency
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
38
51
  name: rexical
39
- requirement: &70178736570560 !ruby/object:Gem::Requirement
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
40
54
  none: false
41
- requirements:
42
- - - ! '>='
43
- - !ruby/object:Gem::Version
44
- version: '0'
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
45
62
  type: :development
46
- prerelease: false
47
- version_requirements: *70178736570560
48
- - !ruby/object:Gem::Dependency
63
+ version_requirements: *id003
64
+ - !ruby/object:Gem::Dependency
49
65
  name: hoe-git
50
- requirement: &70178736586440 !ruby/object:Gem::Requirement
66
+ prerelease: false
67
+ requirement: &id004 !ruby/object:Gem::Requirement
51
68
  none: false
52
- requirements:
53
- - - ! '>='
54
- - !ruby/object:Gem::Version
55
- version: '0'
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
56
76
  type: :development
57
- prerelease: false
58
- version_requirements: *70178736586440
59
- - !ruby/object:Gem::Dependency
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
60
79
  name: hoe-gemspec
61
- requirement: &70178736585440 !ruby/object:Gem::Requirement
80
+ prerelease: false
81
+ requirement: &id005 !ruby/object:Gem::Requirement
62
82
  none: false
63
- requirements:
64
- - - ! '>='
65
- - !ruby/object:Gem::Version
66
- version: '0'
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
67
90
  type: :development
68
- prerelease: false
69
- version_requirements: *70178736585440
70
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *id005
92
+ - !ruby/object:Gem::Dependency
71
93
  name: hoe-bundler
72
- requirement: &70178736584560 !ruby/object:Gem::Requirement
94
+ prerelease: false
95
+ requirement: &id006 !ruby/object:Gem::Requirement
73
96
  none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ hash: 3
101
+ segments:
102
+ - 0
103
+ version: "0"
78
104
  type: :development
79
- prerelease: false
80
- version_requirements: *70178736584560
81
- - !ruby/object:Gem::Dependency
105
+ version_requirements: *id006
106
+ - !ruby/object:Gem::Dependency
82
107
  name: hoe
83
- requirement: &70178736583940 !ruby/object:Gem::Requirement
108
+ prerelease: false
109
+ requirement: &id007 !ruby/object:Gem::Requirement
84
110
  none: false
85
- requirements:
111
+ requirements:
86
112
  - - ~>
87
- - !ruby/object:Gem::Version
88
- version: '3.0'
113
+ - !ruby/object:Gem::Version
114
+ hash: 5
115
+ segments:
116
+ - 3
117
+ - 1
118
+ version: "3.1"
89
119
  type: :development
90
- prerelease: false
91
- version_requirements: *70178736583940
92
- description: ! 'CSSPool is a CSS parser. CSSPool provides a SAC interface for parsing
93
- CSS as
94
-
95
- well as a document oriented interface for parsing CSS.'
96
- email:
120
+ version_requirements: *id007
121
+ description: |-
122
+ CSSPool is a CSS parser. CSSPool provides a SAC interface for parsing CSS as
123
+ well as a document oriented interface for parsing CSS.
124
+ email:
97
125
  - aaronp@rubyforge.org
98
126
  - jbarnette@rubyforge.org
99
127
  executables: []
128
+
100
129
  extensions: []
101
- extra_rdoc_files:
130
+
131
+ extra_rdoc_files:
102
132
  - CHANGELOG.rdoc
103
133
  - Manifest.txt
104
134
  - README.rdoc
105
- files:
135
+ files:
106
136
  - .autotest
107
137
  - CHANGELOG.rdoc
138
+ - Gemfile
139
+ - Gemfile.lock
108
140
  - Manifest.txt
109
141
  - README.rdoc
110
142
  - Rakefile
@@ -154,6 +186,7 @@ files:
154
186
  - test/css/test_import_rule.rb
155
187
  - test/css/test_parser.rb
156
188
  - test/css/test_tokenizer.rb
189
+ - test/files/test.css
157
190
  - test/helper.rb
158
191
  - test/sac/test_parser.rb
159
192
  - test/sac/test_properties.rb
@@ -168,31 +201,39 @@ files:
168
201
  - .gemtest
169
202
  homepage: http://csspool.rubyforge.org
170
203
  licenses: []
204
+
171
205
  post_install_message:
172
- rdoc_options:
206
+ rdoc_options:
173
207
  - --main
174
208
  - README.rdoc
175
- require_paths:
209
+ require_paths:
176
210
  - lib
177
- required_ruby_version: !ruby/object:Gem::Requirement
211
+ required_ruby_version: !ruby/object:Gem::Requirement
178
212
  none: false
179
- requirements:
180
- - - ! '>='
181
- - !ruby/object:Gem::Version
182
- version: '0'
183
- required_rubygems_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ hash: 3
217
+ segments:
218
+ - 0
219
+ version: "0"
220
+ required_rubygems_version: !ruby/object:Gem::Requirement
184
221
  none: false
185
- requirements:
186
- - - ! '>='
187
- - !ruby/object:Gem::Version
188
- version: '0'
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ hash: 3
226
+ segments:
227
+ - 0
228
+ version: "0"
189
229
  requirements: []
230
+
190
231
  rubyforge_project: csspool
191
232
  rubygems_version: 1.8.17
192
233
  signing_key:
193
234
  specification_version: 3
194
235
  summary: CSSPool is a CSS parser
195
- test_files:
236
+ test_files:
196
237
  - test/css/test_document.rb
197
238
  - test/css/test_import_rule.rb
198
239
  - test/css/test_parser.rb