oga 1.2.3-java → 1.3.0-java
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 +4 -4
- data/doc/css_selectors.md +1 -1
- data/lib/liboga.jar +0 -0
- data/lib/oga.rb +6 -1
- data/lib/oga/blacklist.rb +0 -10
- data/lib/oga/css/lexer.rb +530 -255
- data/lib/oga/css/parser.rb +232 -230
- data/lib/oga/entity_decoder.rb +0 -4
- data/lib/oga/html/entities.rb +0 -4
- data/lib/oga/html/parser.rb +0 -4
- data/lib/oga/html/sax_parser.rb +0 -4
- data/lib/oga/lru.rb +0 -26
- data/lib/oga/oga.rb +0 -8
- data/lib/oga/ruby/generator.rb +225 -0
- data/lib/oga/ruby/node.rb +189 -0
- data/lib/oga/version.rb +1 -1
- data/lib/oga/whitelist.rb +0 -6
- data/lib/oga/xml/attribute.rb +13 -20
- data/lib/oga/xml/cdata.rb +0 -4
- data/lib/oga/xml/character_node.rb +0 -8
- data/lib/oga/xml/comment.rb +0 -4
- data/lib/oga/xml/default_namespace.rb +0 -2
- data/lib/oga/xml/doctype.rb +0 -8
- data/lib/oga/xml/document.rb +10 -14
- data/lib/oga/xml/element.rb +1 -52
- data/lib/oga/xml/entities.rb +0 -26
- data/lib/oga/xml/expanded_name.rb +12 -0
- data/lib/oga/xml/html_void_elements.rb +0 -2
- data/lib/oga/xml/lexer.rb +0 -86
- data/lib/oga/xml/namespace.rb +0 -10
- data/lib/oga/xml/node.rb +18 -34
- data/lib/oga/xml/node_set.rb +0 -50
- data/lib/oga/xml/parser.rb +13 -50
- data/lib/oga/xml/processing_instruction.rb +0 -8
- data/lib/oga/xml/pull_parser.rb +0 -18
- data/lib/oga/xml/querying.rb +58 -19
- data/lib/oga/xml/sax_parser.rb +0 -18
- data/lib/oga/xml/text.rb +0 -12
- data/lib/oga/xml/traversal.rb +0 -4
- data/lib/oga/xml/xml_declaration.rb +0 -8
- data/lib/oga/xpath/compiler.rb +1568 -0
- data/lib/oga/xpath/conversion.rb +102 -0
- data/lib/oga/xpath/lexer.rb +1844 -1238
- data/lib/oga/xpath/parser.rb +182 -153
- metadata +7 -3
- data/lib/oga/xpath/evaluator.rb +0 -1800
data/lib/oga/css/parser.rb
CHANGED
@@ -5,7 +5,6 @@ require 'll/setup'
|
|
5
5
|
|
6
6
|
module Oga
|
7
7
|
module CSS
|
8
|
-
##
|
9
8
|
# AST parser for CSS expressions.
|
10
9
|
#
|
11
10
|
# This parser does _not_ build a CSS specific AST, instead it directly produces
|
@@ -53,31 +52,31 @@ class Parser < LL::Driver
|
|
53
52
|
CONFIG.rules = [
|
54
53
|
[3, 0, 0, 1], # 0
|
55
54
|
[3, 1, 2, 0], # 1
|
56
|
-
[3, 2, 4,
|
55
|
+
[3, 2, 4, 30, 6, 0, 0, 3], # 2
|
57
56
|
[3, 3, 0, 3, 1, 26], # 3
|
58
|
-
[3, 4,
|
59
|
-
[3, 5, 0, 5
|
60
|
-
[3, 6, 8, 33, 0,
|
61
|
-
[3, 7,
|
62
|
-
[3, 8, 0,
|
63
|
-
[3, 9, 0,
|
64
|
-
[3, 10, 0,
|
65
|
-
[3, 11, 0,
|
66
|
-
[3, 12,
|
67
|
-
[3, 13, 0,
|
68
|
-
[3, 14, 0,
|
69
|
-
[3, 15, 0,
|
70
|
-
[3, 16,
|
71
|
-
[3, 17,
|
72
|
-
[3, 18,
|
73
|
-
[3, 19,
|
74
|
-
[3, 20, 0,
|
75
|
-
[3, 21, 0,
|
76
|
-
[3, 22, 0,
|
77
|
-
[3, 23, 1, 4, 0,
|
78
|
-
[3, 24, 0,
|
79
|
-
[3, 25, 0,
|
80
|
-
[3, 26, 8,
|
57
|
+
[3, 4, 8, 32, 8, 31, 0, 8], # 4
|
58
|
+
[3, 5, 0, 5], # 5
|
59
|
+
[3, 6, 8, 33, 0, 11], # 6
|
60
|
+
[3, 7, 0, 3, 1, 6], # 7
|
61
|
+
[3, 8, 0, 5], # 8
|
62
|
+
[3, 9, 8, 34, 0, 6, 1, 16], # 9
|
63
|
+
[3, 10, 8, 35, 0, 6, 1, 18], # 10
|
64
|
+
[3, 11, 8, 36, 0, 6, 1, 17], # 11
|
65
|
+
[3, 12, 8, 37, 0, 8], # 12
|
66
|
+
[3, 13, 0, 11], # 13
|
67
|
+
[3, 14, 0, 19], # 14
|
68
|
+
[3, 15, 0, 18], # 15
|
69
|
+
[3, 16, 0, 20], # 16
|
70
|
+
[3, 17, 0, 9], # 17
|
71
|
+
[3, 18, 8, 38, 1, 1], # 18
|
72
|
+
[3, 19, 1, 1, 1, 2], # 19
|
73
|
+
[3, 20, 4, 39, 6, 0, 0, 12], # 20
|
74
|
+
[3, 21, 0, 7], # 21
|
75
|
+
[3, 22, 0, 13], # 22
|
76
|
+
[3, 23, 1, 4, 0, 14, 1, 3], # 23
|
77
|
+
[3, 24, 0, 16], # 24
|
78
|
+
[3, 25, 0, 9], # 25
|
79
|
+
[3, 26, 8, 40, 0, 15], # 26
|
81
80
|
[3, 27, 1, 10], # 27
|
82
81
|
[3, 28, 1, 11], # 28
|
83
82
|
[3, 29, 1, 12], # 29
|
@@ -86,79 +85,86 @@ class Parser < LL::Driver
|
|
86
85
|
[3, 32, 1, 15], # 32
|
87
86
|
[3, 33, 1, 1, 1, 24], # 33
|
88
87
|
[3, 34, 1, 1, 1, 25], # 34
|
89
|
-
[3, 35, 8,
|
88
|
+
[3, 35, 8, 41, 0, 21], # 35
|
90
89
|
[3, 36, 1, 1, 1, 5], # 36
|
91
|
-
[3, 37, 1, 8, 0,
|
92
|
-
[3, 38, 0,
|
93
|
-
[3, 39, 0,
|
94
|
-
[3, 40, 0,
|
95
|
-
[3, 41, 0,
|
90
|
+
[3, 37, 1, 8, 0, 23, 1, 7], # 37
|
91
|
+
[3, 38, 0, 28], # 38
|
92
|
+
[3, 39, 0, 29], # 39
|
93
|
+
[3, 40, 0, 26], # 40
|
94
|
+
[3, 41, 0, 3], # 41
|
96
95
|
[3, 42, 1, 21], # 42
|
97
96
|
[3, 43, 1, 20], # 43
|
98
|
-
[3, 44, 8,
|
99
|
-
[3, 45, 8,
|
100
|
-
[3, 46, 8,
|
97
|
+
[3, 44, 8, 42, 0, 27], # 44
|
98
|
+
[3, 45, 8, 43, 0, 27, 1, 9], # 45
|
99
|
+
[3, 46, 8, 45, 8, 44, 0, 25], # 46
|
101
100
|
[3, 47, 1, 19], # 47
|
102
101
|
[3, 48, 1, 22], # 48
|
103
102
|
[3, 49, 1, 23], # 49
|
104
103
|
[3, 50, 0, 2], # 50
|
105
|
-
[3, 51, 0,
|
106
|
-
[3, 52, 0,
|
107
|
-
[3, 53, 0,
|
108
|
-
[3, 54, 0,
|
109
|
-
[3, 55, 0,
|
110
|
-
[3, 56, 0,
|
111
|
-
[3, 57, 0,
|
112
|
-
[3, 58, 0,
|
113
|
-
[3, 59, 0,
|
114
|
-
[3, 60, 0,
|
115
|
-
[3, 61, 0,
|
104
|
+
[3, 51, 0, 11], # 51
|
105
|
+
[3, 52, 0, 4], # 52
|
106
|
+
[3, 53, 0, 4], # 53
|
107
|
+
[3, 54, 0, 4], # 54
|
108
|
+
[3, 55, 0, 4], # 55
|
109
|
+
[3, 56, 0, 4], # 56
|
110
|
+
[3, 57, 0, 11], # 57
|
111
|
+
[3, 58, 0, 10], # 58
|
112
|
+
[3, 59, 0, 12], # 59
|
113
|
+
[3, 60, 0, 24, 0, 17], # 60
|
114
|
+
[3, 61, 0, 22], # 61
|
115
|
+
[3, 62, 0, 25], # 62
|
116
|
+
[3, 63, 0, 25], # 63
|
117
|
+
[3, 64, 0, 27], # 64
|
118
|
+
[3, 65, 0, 25], # 65
|
116
119
|
].freeze
|
117
120
|
|
118
121
|
CONFIG.table = [
|
119
122
|
[1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1], # 0
|
120
123
|
[-1, 2, -1, 2, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, -1, -1, -1, -1, -1, 2, 2, -1], # 1
|
121
124
|
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3], # 2
|
122
|
-
[-1, 4, -1,
|
123
|
-
[-1, -1, -1, -1, -1, -1,
|
124
|
-
[-1,
|
125
|
-
[-1,
|
126
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
127
|
-
[-1,
|
128
|
-
[-1,
|
129
|
-
[-1,
|
130
|
-
[-1, -1,
|
131
|
-
[-1, -1, -1,
|
132
|
-
[-1, -1, -1,
|
133
|
-
[-1, -1, -1,
|
134
|
-
[-1,
|
135
|
-
[-1,
|
136
|
-
[-1,
|
137
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
138
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
139
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
140
|
-
[-1, -1, -1, -1, -1,
|
141
|
-
[-1, -1, -1, -1, -1,
|
142
|
-
[-1,
|
143
|
-
[-1,
|
144
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
145
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1,
|
146
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1,
|
147
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
148
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
149
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
150
|
-
[-1, -1, -1,
|
151
|
-
[-1, -1, -1, -1, -1, -1,
|
152
|
-
[-1, -1, -1,
|
153
|
-
[-1, -1, -1,
|
154
|
-
[-1, -1,
|
155
|
-
[-1, -1, -1,
|
156
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
157
|
-
[-1, -1, -1, -1, -1, -1, -1,
|
158
|
-
[-1, -1, -1,
|
159
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
160
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
161
|
-
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
125
|
+
[-1, 4, -1, 6, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, -1, -1, -1, -1, -1, 6, 6, -1], # 3
|
126
|
+
[-1, -1, -1, -1, -1, -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 8, 8, -1, -1, -1, -1, -1, -1, -1, -1], # 4
|
127
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1, -1], # 5
|
128
|
+
[-1, 12, -1, 13, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, 13, -1], # 6
|
129
|
+
[-1, -1, -1, -1, -1, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 14, -1], # 7
|
130
|
+
[-1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 8
|
131
|
+
[-1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 9
|
132
|
+
[-1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 10
|
133
|
+
[-1, -1, -1, 20, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 20, -1], # 11
|
134
|
+
[-1, -1, -1, 22, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, 21, -1], # 12
|
135
|
+
[-1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 13
|
136
|
+
[-1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 14
|
137
|
+
[-1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 15
|
138
|
+
[-1, 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 16
|
139
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 17
|
140
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, -1], # 18
|
141
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, -1], # 19
|
142
|
+
[-1, -1, -1, -1, -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 20
|
143
|
+
[-1, -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 21
|
144
|
+
[-1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 22
|
145
|
+
[-1, 41, -1, 41, -1, 41, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, 41, 41, 41, 40, 40, -1, 38, 39, 41, 41, -1], # 23
|
146
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 42, -1, -1, -1, -1, -1], # 24
|
147
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, -1, -1, -1, -1, -1], # 25
|
148
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 46, -1, -1, -1, -1, -1, -1], # 26
|
149
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, -1], # 27
|
150
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 48, -1, -1, -1, -1], # 28
|
151
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 49, -1, -1, -1], # 29
|
152
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50], # 30
|
153
|
+
[-1, -1, -1, 51, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, 51, -1], # 31
|
154
|
+
[-1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, 52, 52, -1, -1, -1, -1, -1, -1, -1, -1], # 32
|
155
|
+
[-1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, 53, 53, -1, -1, -1, -1, -1, -1, -1, -1], # 33
|
156
|
+
[-1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, 54, 54, -1, -1, -1, -1, -1, -1, -1, -1], # 34
|
157
|
+
[-1, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 55, 55, -1, -1, -1, -1, -1, -1, -1, -1], # 35
|
158
|
+
[-1, -1, -1, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, 56, 56, -1, -1, -1, -1, -1, -1, -1, -1], # 36
|
159
|
+
[-1, -1, -1, 57, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, 57, -1], # 37
|
160
|
+
[-1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 38
|
161
|
+
[-1, -1, -1, 59, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, 59, -1], # 39
|
162
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 60, 60, 60, 60, 60, 60, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 40
|
163
|
+
[-1, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], # 41
|
164
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, -1, -1, -1], # 42
|
165
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1], # 43
|
166
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, -1, -1, -1, -1, -1], # 44
|
167
|
+
[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, -1, -1, -1, -1, -1, -1], # 45
|
162
168
|
].freeze
|
163
169
|
|
164
170
|
CONFIG.actions = [
|
@@ -166,23 +172,23 @@ class Parser < LL::Driver
|
|
166
172
|
[:_rule_1, 0], # 1
|
167
173
|
[:_rule_2, 2], # 2
|
168
174
|
[:_rule_3, 2], # 3
|
169
|
-
[:_rule_4,
|
170
|
-
[:_rule_5,
|
175
|
+
[:_rule_4, 3], # 4
|
176
|
+
[:_rule_5, 1], # 5
|
171
177
|
[:_rule_6, 2], # 6
|
172
178
|
[:_rule_7, 2], # 7
|
173
179
|
[:_rule_8, 1], # 8
|
174
|
-
[:_rule_9,
|
175
|
-
[:_rule_10,
|
176
|
-
[:_rule_11,
|
180
|
+
[:_rule_9, 3], # 9
|
181
|
+
[:_rule_10, 3], # 10
|
182
|
+
[:_rule_11, 3], # 11
|
177
183
|
[:_rule_12, 2], # 12
|
178
184
|
[:_rule_13, 1], # 13
|
179
185
|
[:_rule_14, 1], # 14
|
180
186
|
[:_rule_15, 1], # 15
|
181
|
-
[:_rule_16,
|
182
|
-
[:_rule_17,
|
187
|
+
[:_rule_16, 1], # 16
|
188
|
+
[:_rule_17, 1], # 17
|
183
189
|
[:_rule_18, 2], # 18
|
184
|
-
[:_rule_19,
|
185
|
-
[:_rule_20,
|
190
|
+
[:_rule_19, 2], # 19
|
191
|
+
[:_rule_20, 2], # 20
|
186
192
|
[:_rule_21, 1], # 21
|
187
193
|
[:_rule_22, 1], # 22
|
188
194
|
[:_rule_23, 3], # 23
|
@@ -218,55 +224,47 @@ class Parser < LL::Driver
|
|
218
224
|
[:_rule_53, 1], # 53
|
219
225
|
[:_rule_54, 1], # 54
|
220
226
|
[:_rule_55, 1], # 55
|
221
|
-
[:_rule_56,
|
227
|
+
[:_rule_56, 1], # 56
|
222
228
|
[:_rule_57, 1], # 57
|
223
229
|
[:_rule_58, 1], # 58
|
224
230
|
[:_rule_59, 1], # 59
|
225
|
-
[:_rule_60,
|
231
|
+
[:_rule_60, 2], # 60
|
226
232
|
[:_rule_61, 1], # 61
|
233
|
+
[:_rule_62, 1], # 62
|
234
|
+
[:_rule_63, 1], # 63
|
235
|
+
[:_rule_64, 1], # 64
|
236
|
+
[:_rule_65, 1], # 65
|
227
237
|
].freeze
|
228
238
|
|
229
|
-
##
|
230
239
|
# @return [Oga::LRU]
|
231
|
-
#
|
232
240
|
CACHE = LRU.new
|
233
241
|
|
234
|
-
##
|
235
242
|
# @param [String] data
|
236
243
|
# @return [AST::Node]
|
237
|
-
#
|
238
244
|
def self.parse_with_cache(data)
|
239
|
-
|
245
|
+
CACHE.get_or_set(data) { new(data).parse }
|
240
246
|
end
|
241
247
|
|
242
|
-
##
|
243
248
|
# @param [String] data The input to parse.
|
244
|
-
#
|
245
249
|
def initialize(data)
|
246
250
|
@lexer = Lexer.new(data)
|
247
251
|
end
|
248
252
|
|
249
|
-
##
|
250
253
|
# Resets the internal state of the parser.
|
251
|
-
#
|
252
254
|
def reset
|
253
255
|
@current_element = nil
|
254
256
|
end
|
255
257
|
|
256
|
-
##
|
257
258
|
# @param [Symbol] type
|
258
259
|
# @param [Array] children
|
259
260
|
# @return [AST::Node]
|
260
|
-
#
|
261
261
|
def s(type, *children)
|
262
|
-
|
262
|
+
AST::Node.new(type, children)
|
263
263
|
end
|
264
264
|
|
265
|
-
##
|
266
265
|
# Yields the next token from the lexer.
|
267
266
|
#
|
268
267
|
# @yieldparam [Array]
|
269
|
-
#
|
270
268
|
def each_token
|
271
269
|
@lexer.advance do |*args|
|
272
270
|
yield args
|
@@ -275,16 +273,13 @@ class Parser < LL::Driver
|
|
275
273
|
yield [-1, -1]
|
276
274
|
end
|
277
275
|
|
278
|
-
##
|
279
276
|
# Returns the node test for the current element.
|
280
277
|
#
|
281
278
|
# @return [AST::Node]
|
282
|
-
#
|
283
279
|
def current_element
|
284
280
|
@current_element ||= s(:test, nil, '*')
|
285
281
|
end
|
286
282
|
|
287
|
-
##
|
288
283
|
# Parses the input and returns the corresponding AST.
|
289
284
|
#
|
290
285
|
# @example
|
@@ -292,175 +287,158 @@ class Parser < LL::Driver
|
|
292
287
|
# ast = parser.parse
|
293
288
|
#
|
294
289
|
# @return [AST::Node]
|
295
|
-
#
|
296
290
|
def parse
|
297
291
|
reset
|
298
292
|
|
299
293
|
super
|
300
294
|
end
|
301
295
|
|
302
|
-
##
|
303
296
|
# Generates the AST for a node test.
|
304
297
|
#
|
305
298
|
# @param [String] namespace
|
306
299
|
# @param [String] name
|
307
300
|
# @return [AST::Node]
|
308
|
-
#
|
309
301
|
def on_test(namespace, name)
|
310
302
|
@current_element = s(:test, namespace, name)
|
311
303
|
end
|
312
304
|
|
313
|
-
##
|
314
305
|
# @param [String] name
|
315
306
|
# @param [AST::Node] arg
|
316
307
|
# @return [AST::Node]
|
317
|
-
#
|
318
308
|
def on_pseudo_class(name, arg = nil)
|
319
309
|
handler = "on_pseudo_class_#{name.gsub('-', '_')}"
|
320
310
|
|
321
311
|
arg ? send(handler, arg) : send(handler)
|
322
312
|
end
|
323
313
|
|
324
|
-
##
|
325
314
|
# Generates the AST for the `root` pseudo class.
|
326
315
|
#
|
327
316
|
# @return [AST::Node]
|
328
|
-
#
|
329
317
|
def on_pseudo_class_root
|
330
318
|
s(:call, 'not', s(:axis, 'parent', s(:test, nil, '*')))
|
331
319
|
end
|
332
320
|
|
333
|
-
##
|
334
321
|
# Generates the AST for the `nth-child` pseudo class.
|
335
322
|
#
|
336
323
|
# @param [AST::Node] arg
|
337
324
|
# @return [AST::Node]
|
338
|
-
#
|
339
325
|
def on_pseudo_class_nth_child(arg)
|
340
326
|
generate_nth_child('preceding-sibling', arg)
|
341
327
|
end
|
342
328
|
|
343
|
-
##
|
344
329
|
# Generates the AST for the `nth-last-child` pseudo class.
|
345
330
|
#
|
346
331
|
# @param [AST::Node] arg
|
347
332
|
# @return [AST::Node]
|
348
|
-
#
|
349
333
|
def on_pseudo_class_nth_last_child(arg)
|
350
334
|
generate_nth_child('following-sibling', arg)
|
351
335
|
end
|
352
336
|
|
353
|
-
##
|
354
337
|
# Generates the AST for the `nth-of-type` pseudo class.
|
355
338
|
#
|
356
339
|
# @param [AST::Node] arg
|
357
340
|
# @return [AST::Node]
|
358
|
-
#
|
359
341
|
def on_pseudo_class_nth_of_type(arg)
|
360
342
|
generate_nth_child('preceding-sibling', arg, current_element)
|
361
343
|
end
|
362
344
|
|
363
|
-
##
|
364
345
|
# Generates the AST for the `nth-last-of-type` pseudo class.
|
365
346
|
#
|
366
347
|
# @param [AST::Node] arg
|
367
348
|
# @return [AST::Node]
|
368
|
-
#
|
369
349
|
def on_pseudo_class_nth_last_of_type(arg)
|
370
350
|
generate_nth_child('following-sibling', arg, current_element)
|
371
351
|
end
|
372
352
|
|
373
|
-
##
|
374
353
|
# Generates the AST for the `nth` pseudo class.
|
375
354
|
#
|
376
355
|
# @param [AST::Node] arg
|
377
356
|
# @return [AST::Node]
|
378
|
-
#
|
379
357
|
def on_pseudo_class_nth(arg)
|
380
358
|
s(:eq, s(:call, 'position'), arg)
|
381
359
|
end
|
382
360
|
|
383
|
-
##
|
384
361
|
# Generates the AST for the `:first-child` selector.
|
385
362
|
#
|
386
363
|
# @return [AST::Node]
|
387
|
-
#
|
388
364
|
def on_pseudo_class_first_child
|
389
365
|
generate_no_siblings('preceding-sibling')
|
390
366
|
end
|
391
367
|
|
392
|
-
##
|
393
368
|
# Generates the AST for the `:last-child` selector.
|
394
369
|
#
|
395
370
|
# @return [AST::Node]
|
396
|
-
#
|
397
371
|
def on_pseudo_class_last_child
|
398
372
|
generate_no_siblings('following-sibling')
|
399
373
|
end
|
400
374
|
|
401
|
-
##
|
402
375
|
# Generates the AST for the `:first-of-type` selector.
|
403
376
|
#
|
404
377
|
# @return [AST::Node]
|
405
|
-
#
|
406
378
|
def on_pseudo_class_first_of_type
|
407
379
|
generate_no_siblings('preceding-sibling', current_element)
|
408
380
|
end
|
409
381
|
|
410
|
-
##
|
411
382
|
# Generates the AST for the `:last-of-type` selector.
|
412
383
|
#
|
413
384
|
# @return [AST::Node]
|
414
|
-
#
|
415
385
|
def on_pseudo_class_last_of_type
|
416
386
|
generate_no_siblings('following-sibling', current_element)
|
417
387
|
end
|
418
388
|
|
419
|
-
##
|
420
389
|
# Generates the AST for the `:only-child` selector.
|
421
390
|
#
|
422
391
|
# @return [AST::Node]
|
423
|
-
#
|
424
392
|
def on_pseudo_class_only_child
|
425
393
|
s(:and, on_pseudo_class_first_child, on_pseudo_class_last_child)
|
426
394
|
end
|
427
395
|
|
428
|
-
##
|
429
396
|
# Generates the AST for the `:only-of-type` selector.
|
430
397
|
#
|
431
398
|
# @return [AST::Node]
|
432
|
-
#
|
433
399
|
def on_pseudo_class_only_of_type
|
434
400
|
s(:and, on_pseudo_class_first_of_type, on_pseudo_class_last_of_type)
|
435
401
|
end
|
436
402
|
|
437
|
-
##
|
438
403
|
# Generates the AST for the `:empty` selector.
|
439
404
|
#
|
440
405
|
# @return [AST::Node]
|
441
|
-
#
|
442
406
|
def on_pseudo_class_empty
|
443
407
|
s(:call, 'not', s(:axis, 'child', s(:type_test, 'node')))
|
444
408
|
end
|
445
409
|
|
446
|
-
|
410
|
+
# Generates the AST for the `:not` selector.
|
411
|
+
#
|
412
|
+
# @param [AST::Node] arg
|
413
|
+
# @return [AST::Node]
|
414
|
+
def on_pseudo_class_not(arg)
|
415
|
+
# Unpacks (axis "descendant" (test nil "x")) into just (test nil "x") as
|
416
|
+
# in this case we want to wrap the (test) node in a (axis "self") node.
|
417
|
+
if arg.type == :axis
|
418
|
+
arg = s(:axis, 'self', arg.children[1])
|
419
|
+
|
420
|
+
# Unpack (predicate (eq ...)) into just (eq)
|
421
|
+
elsif arg.type == :predicate
|
422
|
+
arg = arg.children[1]
|
423
|
+
end
|
424
|
+
|
425
|
+
s(:call, 'not', arg)
|
426
|
+
end
|
427
|
+
|
447
428
|
# Generates the AST for the `=` operator.
|
448
429
|
#
|
449
430
|
# @param [AST::Node] attr
|
450
431
|
# @param [AST::Node] value
|
451
432
|
# @return [AST::Node]
|
452
|
-
#
|
453
433
|
def on_op_eq(attr, value)
|
454
434
|
s(:eq, attr, value)
|
455
435
|
end
|
456
436
|
|
457
|
-
##
|
458
437
|
# Generates the AST for the `~=` operator.
|
459
438
|
#
|
460
439
|
# @param [AST::Node] attr
|
461
440
|
# @param [AST::Node] value
|
462
441
|
# @return [AST::Node]
|
463
|
-
#
|
464
442
|
def on_op_space_in(attr, value)
|
465
443
|
s(
|
466
444
|
:call,
|
@@ -470,24 +448,20 @@ class Parser < LL::Driver
|
|
470
448
|
)
|
471
449
|
end
|
472
450
|
|
473
|
-
##
|
474
451
|
# Generates the AST for the `^=` operator.
|
475
452
|
#
|
476
453
|
# @param [AST::Node] attr
|
477
454
|
# @param [AST::Node] value
|
478
455
|
# @return [AST::Node]
|
479
|
-
#
|
480
456
|
def on_op_starts_with(attr, value)
|
481
457
|
s(:call, 'starts-with', attr, value)
|
482
458
|
end
|
483
459
|
|
484
|
-
##
|
485
460
|
# Generates the AST for the `$=` operator.
|
486
461
|
#
|
487
462
|
# @param [AST::Node] attr
|
488
463
|
# @param [AST::Node] value
|
489
464
|
# @return [AST::Node]
|
490
|
-
#
|
491
465
|
def on_op_ends_with(attr, value)
|
492
466
|
s(
|
493
467
|
:eq,
|
@@ -510,24 +484,20 @@ class Parser < LL::Driver
|
|
510
484
|
)
|
511
485
|
end
|
512
486
|
|
513
|
-
##
|
514
487
|
# Generates the AST for the `*=` operator.
|
515
488
|
#
|
516
489
|
# @param [AST::Node] attr
|
517
490
|
# @param [AST::Node] value
|
518
491
|
# @return [AST::Node]
|
519
|
-
#
|
520
492
|
def on_op_in(attr, value)
|
521
493
|
s(:call, 'contains', attr, value)
|
522
494
|
end
|
523
495
|
|
524
|
-
##
|
525
496
|
# Generates the AST for the `|=` operator.
|
526
497
|
#
|
527
498
|
# @param [AST::Node] attr
|
528
499
|
# @param [AST::Node] value
|
529
500
|
# @return [AST::Node]
|
530
|
-
#
|
531
501
|
def on_op_hyphen_in(attr, value)
|
532
502
|
s(
|
533
503
|
:or,
|
@@ -543,12 +513,10 @@ class Parser < LL::Driver
|
|
543
513
|
|
544
514
|
private
|
545
515
|
|
546
|
-
##
|
547
516
|
# @param [String] count_axis
|
548
517
|
# @param [AST::Node] arg
|
549
518
|
# @param [AST::Node] count_test
|
550
519
|
# @return [AST::Node]
|
551
|
-
#
|
552
520
|
def generate_nth_child(count_axis, arg, count_test = s(:test, nil, '*'))
|
553
521
|
count_call = s(:call, 'count', s(:axis, count_axis, count_test))
|
554
522
|
|
@@ -575,46 +543,36 @@ class Parser < LL::Driver
|
|
575
543
|
end
|
576
544
|
end
|
577
545
|
|
578
|
-
|
546
|
+
node
|
579
547
|
end
|
580
548
|
|
581
|
-
##
|
582
549
|
# @param [String] axis
|
583
550
|
# @param [AST::Node] test
|
584
551
|
# @return [AST::Node]
|
585
|
-
#
|
586
552
|
def generate_no_siblings(axis, test = s(:test, nil, '*'))
|
587
553
|
s(:eq, s(:call, 'count', s(:axis, axis, test)), s(:int, 0))
|
588
554
|
end
|
589
555
|
|
590
|
-
##
|
591
556
|
# @param [AST::Node] node
|
592
557
|
# @return [TrueClass|FalseClass]
|
593
|
-
#
|
594
558
|
def int_node?(node)
|
595
559
|
node.type.equal?(:int)
|
596
560
|
end
|
597
561
|
|
598
|
-
##
|
599
562
|
# @param [AST::Node] node
|
600
563
|
# @return [TrueClass|FalseClass]
|
601
|
-
#
|
602
564
|
def non_positive_number?(node)
|
603
565
|
node.children[0] <= 0
|
604
566
|
end
|
605
567
|
|
606
|
-
##
|
607
568
|
# @param [AST::Node] node
|
608
569
|
# @return [Symbol]
|
609
|
-
#
|
610
570
|
def step_comparison(node)
|
611
571
|
node.children[0] >= 0 ? :gte : :lte
|
612
572
|
end
|
613
573
|
|
614
|
-
##
|
615
574
|
# @param [AST::Node] step
|
616
575
|
# @return [AST::Node]
|
617
|
-
#
|
618
576
|
def step_modulo_value(step)
|
619
577
|
# -2n
|
620
578
|
if step and non_positive_number?(step)
|
@@ -631,6 +589,34 @@ class Parser < LL::Driver
|
|
631
589
|
mod_val
|
632
590
|
end
|
633
591
|
|
592
|
+
# @param [String] name
|
593
|
+
# @param [AST::Node] test
|
594
|
+
# @param [AST::Node] predicates
|
595
|
+
# @param [AST::Node] more
|
596
|
+
# @return [AST::Node]
|
597
|
+
def generate_axis(name, test = nil, predicates = nil, more = nil)
|
598
|
+
if test
|
599
|
+
node = s(:axis, name, test)
|
600
|
+
else
|
601
|
+
node = s(:axis, name, on_test(nil, '*'))
|
602
|
+
end
|
603
|
+
|
604
|
+
if predicates
|
605
|
+
node = s(:predicate, node, predicates)
|
606
|
+
end
|
607
|
+
|
608
|
+
node = add_child(node, more) if more
|
609
|
+
|
610
|
+
node
|
611
|
+
end
|
612
|
+
|
613
|
+
# @param [AST::Node] node
|
614
|
+
# @param [AST::Node] child
|
615
|
+
# @return [AST::Node]
|
616
|
+
def add_child(node, child)
|
617
|
+
node.updated(nil, node.children + [child])
|
618
|
+
end
|
619
|
+
|
634
620
|
def _rule_0(val)
|
635
621
|
val[0]
|
636
622
|
end
|
@@ -641,13 +627,13 @@ class Parser < LL::Driver
|
|
641
627
|
|
642
628
|
def _rule_2(val)
|
643
629
|
|
644
|
-
|
630
|
+
query = val[0]
|
645
631
|
|
646
632
|
val[1].each do |chunk|
|
647
|
-
|
633
|
+
query = s(:pipe, query, chunk)
|
648
634
|
end
|
649
635
|
|
650
|
-
|
636
|
+
query
|
651
637
|
|
652
638
|
end
|
653
639
|
|
@@ -657,88 +643,88 @@ class Parser < LL::Driver
|
|
657
643
|
|
658
644
|
def _rule_4(val)
|
659
645
|
|
660
|
-
|
661
|
-
|
662
|
-
|
646
|
+
node = s(:axis, 'descendant', val[0])
|
647
|
+
preds = val[1]
|
648
|
+
more = val[2]
|
663
649
|
|
664
|
-
|
665
|
-
|
666
|
-
end
|
667
|
-
|
668
|
-
# Multiple selectors
|
669
|
-
else
|
670
|
-
steps = [val[0]]
|
671
|
-
|
672
|
-
val[1].each do |step|
|
673
|
-
# "+ foo" is broken up into two steps.
|
674
|
-
if step.is_a?(Array)
|
675
|
-
# Using Array#+ or Array#| would require allocating an extra Array
|
676
|
-
step.each { |sub| steps << sub }
|
677
|
-
else
|
678
|
-
steps << step
|
679
|
-
end
|
680
|
-
end
|
681
|
-
|
682
|
-
ret = s(:path, *steps)
|
650
|
+
if preds
|
651
|
+
node = s(:predicate, node, preds)
|
683
652
|
end
|
684
653
|
|
685
|
-
|
654
|
+
node = add_child(node, more) if more
|
655
|
+
|
656
|
+
node
|
686
657
|
|
687
658
|
end
|
688
659
|
|
689
660
|
def _rule_5(val)
|
690
|
-
|
661
|
+
val[0]
|
691
662
|
end
|
692
663
|
|
693
664
|
def _rule_6(val)
|
694
665
|
|
695
|
-
|
666
|
+
node = s(:axis, 'descendant', on_test(nil, '*'))
|
667
|
+
preds = val[0]
|
668
|
+
more = val[1]
|
669
|
+
|
670
|
+
if preds
|
671
|
+
node = s(:predicate, node, preds)
|
672
|
+
else
|
673
|
+
node = s(:predicate, node)
|
674
|
+
end
|
675
|
+
|
676
|
+
node = add_child(node, more) if more
|
677
|
+
|
678
|
+
node
|
696
679
|
|
697
680
|
end
|
698
681
|
|
699
682
|
def _rule_7(val)
|
700
|
-
|
701
|
-
val[1] ? s(:predicate, val[0], val[1]) : val[0]
|
702
|
-
|
683
|
+
val[1]
|
703
684
|
end
|
704
685
|
|
705
686
|
def _rule_8(val)
|
706
|
-
|
707
|
-
s(:predicate, s(:axis, 'descendant', on_test(nil, '*')), val[0])
|
708
|
-
|
687
|
+
val[0]
|
709
688
|
end
|
710
689
|
|
711
690
|
def _rule_9(val)
|
712
|
-
|
691
|
+
|
692
|
+
test, preds = val[1]
|
693
|
+
more = val[2]
|
694
|
+
|
695
|
+
generate_axis('child', test, preds, more)
|
696
|
+
|
713
697
|
end
|
714
698
|
|
715
699
|
def _rule_10(val)
|
716
700
|
|
717
|
-
|
701
|
+
test, preds = val[1]
|
702
|
+
more = val[2]
|
703
|
+
|
704
|
+
s(
|
705
|
+
:predicate,
|
706
|
+
s(:axis, 'following-sibling', on_test(nil, '*')),
|
707
|
+
s(:int, 1),
|
708
|
+
generate_axis('self', test, preds, more)
|
709
|
+
)
|
718
710
|
|
719
711
|
end
|
720
712
|
|
721
713
|
def _rule_11(val)
|
722
714
|
|
723
|
-
|
715
|
+
test, preds = val[1]
|
716
|
+
more = val[2]
|
717
|
+
|
718
|
+
generate_axis('following-sibling', test, preds, more)
|
724
719
|
|
725
720
|
end
|
726
721
|
|
727
722
|
def _rule_12(val)
|
728
|
-
|
729
|
-
[
|
730
|
-
s(
|
731
|
-
:predicate,
|
732
|
-
s(:axis, 'following-sibling', on_test(nil, '*')),
|
733
|
-
s(:int, 1)
|
734
|
-
),
|
735
|
-
s(:axis, 'self', val[1])
|
736
|
-
]
|
737
|
-
|
723
|
+
val
|
738
724
|
end
|
739
725
|
|
740
726
|
def _rule_13(val)
|
741
|
-
|
727
|
+
[nil, val[0]]
|
742
728
|
end
|
743
729
|
|
744
730
|
def _rule_14(val)
|
@@ -746,18 +732,26 @@ class Parser < LL::Driver
|
|
746
732
|
end
|
747
733
|
|
748
734
|
def _rule_15(val)
|
749
|
-
|
735
|
+
val[0]
|
750
736
|
end
|
751
737
|
|
752
738
|
def _rule_16(val)
|
753
|
-
|
739
|
+
val[0]
|
754
740
|
end
|
755
741
|
|
756
742
|
def _rule_17(val)
|
757
|
-
val[
|
743
|
+
on_test(*val[0])
|
758
744
|
end
|
759
745
|
|
760
746
|
def _rule_18(val)
|
747
|
+
val[1] ? [val[0], val[1]] : [nil, val[0]]
|
748
|
+
end
|
749
|
+
|
750
|
+
def _rule_19(val)
|
751
|
+
val[1]
|
752
|
+
end
|
753
|
+
|
754
|
+
def _rule_20(val)
|
761
755
|
|
762
756
|
ret = val[0]
|
763
757
|
|
@@ -769,14 +763,6 @@ class Parser < LL::Driver
|
|
769
763
|
|
770
764
|
end
|
771
765
|
|
772
|
-
def _rule_19(val)
|
773
|
-
val[0]
|
774
|
-
end
|
775
|
-
|
776
|
-
def _rule_20(val)
|
777
|
-
val[0]
|
778
|
-
end
|
779
|
-
|
780
766
|
def _rule_21(val)
|
781
767
|
val[0]
|
782
768
|
end
|
@@ -989,7 +975,7 @@ class Parser < LL::Driver
|
|
989
975
|
end
|
990
976
|
|
991
977
|
def _rule_56(val)
|
992
|
-
val
|
978
|
+
val[0]
|
993
979
|
end
|
994
980
|
|
995
981
|
def _rule_57(val)
|
@@ -1005,12 +991,28 @@ class Parser < LL::Driver
|
|
1005
991
|
end
|
1006
992
|
|
1007
993
|
def _rule_60(val)
|
1008
|
-
val
|
994
|
+
val
|
1009
995
|
end
|
1010
996
|
|
1011
997
|
def _rule_61(val)
|
1012
998
|
val[0]
|
1013
999
|
end
|
1000
|
+
|
1001
|
+
def _rule_62(val)
|
1002
|
+
val[0]
|
1003
|
+
end
|
1004
|
+
|
1005
|
+
def _rule_63(val)
|
1006
|
+
val[0]
|
1007
|
+
end
|
1008
|
+
|
1009
|
+
def _rule_64(val)
|
1010
|
+
val[0]
|
1011
|
+
end
|
1012
|
+
|
1013
|
+
def _rule_65(val)
|
1014
|
+
val[0]
|
1015
|
+
end
|
1014
1016
|
end
|
1015
1017
|
end
|
1016
1018
|
end
|