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
@@ -0,0 +1,189 @@
|
|
1
|
+
module Oga
|
2
|
+
module Ruby
|
3
|
+
# Class representing a single node in a Ruby AST.
|
4
|
+
#
|
5
|
+
# The setup of this class is roughly based on the "ast" Gem. The "ast" Gem
|
6
|
+
# is not used for this class as it provides too many methods that might
|
7
|
+
# conflict with this class' {#method_missing}.
|
8
|
+
#
|
9
|
+
# ASTs can be built by creating a node and then chaining various method
|
10
|
+
# calls together. For example, the following could be used to build an "if"
|
11
|
+
# statement:
|
12
|
+
#
|
13
|
+
# number1 = Node.new(:lit, %w{10})
|
14
|
+
# number2 = Node.new(:lit, %w{20})
|
15
|
+
#
|
16
|
+
# (number2 > number1).if_true do
|
17
|
+
# Node.new(:lit, %w{30})
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# When serialized to Ruby this would roughly lead to the following code:
|
21
|
+
#
|
22
|
+
# if 20 > 10
|
23
|
+
# 30
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# @private
|
27
|
+
class Node < BasicObject
|
28
|
+
undef_method :!, :!=
|
29
|
+
|
30
|
+
# @return [Symbol]
|
31
|
+
attr_reader :type
|
32
|
+
|
33
|
+
# @param [Symbol] type
|
34
|
+
# @param [Array] children
|
35
|
+
def initialize(type, children = [])
|
36
|
+
@type = type.to_sym
|
37
|
+
@children = children
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return [Array]
|
41
|
+
def to_a
|
42
|
+
@children
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_method :to_ary, :to_a
|
46
|
+
|
47
|
+
# Returns a "to_a" call node.
|
48
|
+
#
|
49
|
+
# @return [Oga::Ruby::Node]
|
50
|
+
def to_array
|
51
|
+
Node.new(:send, [self, :to_a])
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns an assignment node.
|
55
|
+
#
|
56
|
+
# This method wraps assigned values in a begin/end block to ensure that
|
57
|
+
# multiple lines of code result in the proper value being assigned.
|
58
|
+
#
|
59
|
+
# @param [Oga::Ruby::Node] other
|
60
|
+
# @return [Oga::Ruby::Node]
|
61
|
+
def assign(other)
|
62
|
+
if other.type == :followed_by
|
63
|
+
other = other.wrap
|
64
|
+
end
|
65
|
+
|
66
|
+
Node.new(:assign, [self, other])
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns an equality expression node.
|
70
|
+
#
|
71
|
+
# @param [Oga::Ruby::Node] other
|
72
|
+
# @return [Oga::Ruby::Node]
|
73
|
+
def eq(other)
|
74
|
+
Node.new(:eq, [self, other])
|
75
|
+
end
|
76
|
+
|
77
|
+
# Returns a boolean "and" node.
|
78
|
+
#
|
79
|
+
# @param [Oga::Ruby::Node] other
|
80
|
+
# @return [Oga::Ruby::Node]
|
81
|
+
def and(other)
|
82
|
+
Node.new(:and, [self, other])
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns a boolean "or" node.
|
86
|
+
#
|
87
|
+
# @param [Oga::Ruby::Node] other
|
88
|
+
# @return [Oga::Ruby::Node]
|
89
|
+
def or(other)
|
90
|
+
Node.new(:or, [self, other])
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns a node that evaluates to its inverse.
|
94
|
+
#
|
95
|
+
# For example, a variable `foo` would be turned into `!foo`.
|
96
|
+
#
|
97
|
+
# @return [Oga::Ruby::Node]
|
98
|
+
def not
|
99
|
+
!self
|
100
|
+
end
|
101
|
+
|
102
|
+
# Returns a node for Ruby's "is_a?" method.
|
103
|
+
#
|
104
|
+
# @param [Class] klass
|
105
|
+
# @return [Oga::Ruby::Node]
|
106
|
+
def is_a?(klass)
|
107
|
+
Node.new(:send, [self, 'is_a?', Node.new(:lit, [klass.to_s])])
|
108
|
+
end
|
109
|
+
|
110
|
+
# Wraps the current node in a block.
|
111
|
+
#
|
112
|
+
# @param [Array] args Arguments (as Node instances) to pass to the block.
|
113
|
+
# @return [Oga::Ruby::Node]
|
114
|
+
def add_block(*args)
|
115
|
+
Node.new(:block, [self, args, yield])
|
116
|
+
end
|
117
|
+
|
118
|
+
# Wraps the current node in a `begin` node.
|
119
|
+
#
|
120
|
+
# @return [Oga::Ruby::Node]
|
121
|
+
def wrap
|
122
|
+
Node.new(:begin, [self])
|
123
|
+
end
|
124
|
+
|
125
|
+
# Wraps the current node in an if statement node.
|
126
|
+
#
|
127
|
+
# The body of this statement is set to the return value of the supplied
|
128
|
+
# block.
|
129
|
+
#
|
130
|
+
# @return [Oga::Ruby::Node]
|
131
|
+
def if_true
|
132
|
+
Node.new(:if, [self, yield])
|
133
|
+
end
|
134
|
+
|
135
|
+
# Wraps the current node in an `if !...` statement.
|
136
|
+
#
|
137
|
+
# @see [#if_true]
|
138
|
+
def if_false
|
139
|
+
self.not.if_true { yield }
|
140
|
+
end
|
141
|
+
|
142
|
+
# Wraps the current node in a `while` statement.
|
143
|
+
#
|
144
|
+
# The body of this statement is set to the return value of the supplied
|
145
|
+
# block.
|
146
|
+
#
|
147
|
+
# @return [Oga::Ruby::Node]
|
148
|
+
def while_true
|
149
|
+
Node.new(:while, [self, yield])
|
150
|
+
end
|
151
|
+
|
152
|
+
# Adds an "else" statement to the current node.
|
153
|
+
#
|
154
|
+
# This method assumes it's being called only on "if" nodes.
|
155
|
+
#
|
156
|
+
# @return [Oga::Ruby::Node]
|
157
|
+
def else
|
158
|
+
Node.new(:if, @children + [yield])
|
159
|
+
end
|
160
|
+
|
161
|
+
# Chains two nodes together.
|
162
|
+
#
|
163
|
+
# @param [Oga::Ruby::Node] other
|
164
|
+
# @return [Oga::Ruby::Node]
|
165
|
+
def followed_by(other = nil)
|
166
|
+
other = yield if ::Kernel.block_given?
|
167
|
+
|
168
|
+
Node.new(:followed_by, [self, other])
|
169
|
+
end
|
170
|
+
|
171
|
+
# Returns a node for a method call.
|
172
|
+
#
|
173
|
+
# @param [Symbol] name The name of the method to call.
|
174
|
+
#
|
175
|
+
# @param [Array] args Any arguments (as Node instances) to pass to the
|
176
|
+
# method.
|
177
|
+
#
|
178
|
+
# @return [Oga::Ruby::Node]
|
179
|
+
def method_missing(name, *args)
|
180
|
+
Node.new(:send, [self, name.to_s, *args])
|
181
|
+
end
|
182
|
+
|
183
|
+
# @return [String]
|
184
|
+
def inspect
|
185
|
+
"(#{type} #{@children.map(&:inspect).join(' ')})"
|
186
|
+
end
|
187
|
+
end # Node
|
188
|
+
end # Ruby
|
189
|
+
end # Oga
|
data/lib/oga/version.rb
CHANGED
data/lib/oga/whitelist.rb
CHANGED
@@ -1,18 +1,12 @@
|
|
1
1
|
module Oga
|
2
|
-
##
|
3
2
|
# @api private
|
4
|
-
#
|
5
3
|
class Whitelist < Blacklist
|
6
|
-
##
|
7
4
|
# @return [TrueClass|FalseClass]
|
8
|
-
#
|
9
5
|
def allow?(name)
|
10
6
|
names.include?(name)
|
11
7
|
end
|
12
8
|
|
13
|
-
##
|
14
9
|
# @return [Oga::Blacklist]
|
15
|
-
#
|
16
10
|
def to_blacklist
|
17
11
|
Blacklist.new(names)
|
18
12
|
end
|
data/lib/oga/xml/attribute.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Oga
|
2
2
|
module XML
|
3
|
-
##
|
4
3
|
# Class for storing information about a single XML attribute.
|
5
|
-
#
|
6
4
|
class Attribute
|
5
|
+
include ExpandedName
|
6
|
+
|
7
7
|
# The name of the attribute.
|
8
8
|
# @return [String]
|
9
9
|
attr_accessor :name
|
@@ -15,25 +15,23 @@ module Oga
|
|
15
15
|
# @return [Oga::XML::Element]
|
16
16
|
attr_accessor :element
|
17
17
|
|
18
|
-
|
18
|
+
alias_method :parent, :element
|
19
|
+
|
19
20
|
# The default namespace available to all attributes. This namespace can
|
20
21
|
# not be modified.
|
21
22
|
#
|
22
23
|
# @return [Oga::XML::Namespace]
|
23
|
-
#
|
24
24
|
DEFAULT_NAMESPACE = Namespace.new(
|
25
25
|
:name => 'xml',
|
26
26
|
:uri => XML::DEFAULT_NAMESPACE.uri
|
27
27
|
).freeze
|
28
28
|
|
29
|
-
##
|
30
29
|
# @param [Hash] options
|
31
30
|
#
|
32
31
|
# @option options [String] :name
|
33
32
|
# @option options [String] :namespace_name
|
34
33
|
# @option options [String] :value
|
35
34
|
# @option options [Oga::XML::Element] :element
|
36
|
-
#
|
37
35
|
def initialize(options = {})
|
38
36
|
@name = options[:name]
|
39
37
|
@value = options[:value]
|
@@ -42,12 +40,10 @@ module Oga
|
|
42
40
|
@namespace_name = options[:namespace_name]
|
43
41
|
end
|
44
42
|
|
45
|
-
##
|
46
43
|
# Returns the {Oga::XML::Namespace} instance for the current namespace
|
47
44
|
# name.
|
48
45
|
#
|
49
46
|
# @return [Oga::XML::Namespace]
|
50
|
-
#
|
51
47
|
def namespace
|
52
48
|
unless @namespace
|
53
49
|
if namespace_name == DEFAULT_NAMESPACE.name
|
@@ -60,19 +56,15 @@ module Oga
|
|
60
56
|
@namespace
|
61
57
|
end
|
62
58
|
|
63
|
-
##
|
64
59
|
# @param [String] value
|
65
|
-
#
|
66
60
|
def value=(value)
|
67
61
|
@value = value
|
68
62
|
@decoded = false
|
69
63
|
end
|
70
64
|
|
71
|
-
##
|
72
65
|
# Returns the value of the attribute or nil if no explicit value was set.
|
73
66
|
#
|
74
67
|
# @return [String|NilClass]
|
75
|
-
#
|
76
68
|
def value
|
77
69
|
if !@decoded and @value
|
78
70
|
@value = EntityDecoder.try_decode(@value, html?)
|
@@ -82,18 +74,14 @@ module Oga
|
|
82
74
|
@value
|
83
75
|
end
|
84
76
|
|
85
|
-
##
|
86
77
|
# @return [String]
|
87
|
-
#
|
88
78
|
def text
|
89
79
|
value.to_s
|
90
80
|
end
|
91
81
|
|
92
82
|
alias_method :to_s, :text
|
93
83
|
|
94
|
-
##
|
95
84
|
# @return [String]
|
96
|
-
#
|
97
85
|
def to_xml
|
98
86
|
if namespace_name
|
99
87
|
full_name = "#{namespace_name}:#{name}"
|
@@ -106,9 +94,7 @@ module Oga
|
|
106
94
|
%Q(#{full_name}="#{enc_value}")
|
107
95
|
end
|
108
96
|
|
109
|
-
##
|
110
97
|
# @return [String]
|
111
|
-
#
|
112
98
|
def inspect
|
113
99
|
segments = []
|
114
100
|
|
@@ -123,11 +109,18 @@ module Oga
|
|
123
109
|
"Attribute(#{segments.join(' ')})"
|
124
110
|
end
|
125
111
|
|
112
|
+
# @see [Oga::XML::Node#each_ancestor]
|
113
|
+
def each_ancestor(&block)
|
114
|
+
return unless element
|
115
|
+
|
116
|
+
yield element
|
117
|
+
|
118
|
+
element.each_ancestor(&block)
|
119
|
+
end
|
120
|
+
|
126
121
|
private
|
127
122
|
|
128
|
-
##
|
129
123
|
# @return [TrueClass|FalseClass]
|
130
|
-
#
|
131
124
|
def html?
|
132
125
|
!!@element && @element.html?
|
133
126
|
end
|
data/lib/oga/xml/cdata.rb
CHANGED
@@ -1,34 +1,26 @@
|
|
1
1
|
module Oga
|
2
2
|
module XML
|
3
|
-
##
|
4
3
|
# Base class for nodes that represent a text-like value such as Text and
|
5
4
|
# Comment nodes.
|
6
|
-
#
|
7
5
|
class CharacterNode < Node
|
8
6
|
# @return [String]
|
9
7
|
attr_accessor :text
|
10
8
|
|
11
|
-
##
|
12
9
|
# @param [Hash] options
|
13
10
|
#
|
14
11
|
# @option options [String] :text The text of the node.
|
15
|
-
#
|
16
12
|
def initialize(options = {})
|
17
13
|
super
|
18
14
|
|
19
15
|
@text = options[:text]
|
20
16
|
end
|
21
17
|
|
22
|
-
##
|
23
18
|
# @return [String]
|
24
|
-
#
|
25
19
|
def to_xml
|
26
20
|
text.to_s
|
27
21
|
end
|
28
22
|
|
29
|
-
##
|
30
23
|
# @return [String]
|
31
|
-
#
|
32
24
|
def inspect
|
33
25
|
"#{self.class.to_s.split('::').last}(#{text.inspect})"
|
34
26
|
end
|
data/lib/oga/xml/comment.rb
CHANGED
data/lib/oga/xml/doctype.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Oga
|
2
2
|
module XML
|
3
|
-
##
|
4
3
|
# Class used for storing information about Doctypes.
|
5
|
-
#
|
6
4
|
class Doctype
|
7
5
|
# The name of the doctype (e.g. "HTML").
|
8
6
|
# @return [String]
|
@@ -24,7 +22,6 @@ module Oga
|
|
24
22
|
# @return [String]
|
25
23
|
attr_accessor :inline_rules
|
26
24
|
|
27
|
-
##
|
28
25
|
# @example
|
29
26
|
# dtd = Doctype.new(:name => 'html', :type => 'PUBLIC')
|
30
27
|
#
|
@@ -34,7 +31,6 @@ module Oga
|
|
34
31
|
# @option options [String] :type
|
35
32
|
# @option options [String] :public_id
|
36
33
|
# @option options [String] :system_id
|
37
|
-
#
|
38
34
|
def initialize(options = {})
|
39
35
|
@name = options[:name]
|
40
36
|
@type = options[:type]
|
@@ -43,11 +39,9 @@ module Oga
|
|
43
39
|
@inline_rules = options[:inline_rules]
|
44
40
|
end
|
45
41
|
|
46
|
-
##
|
47
42
|
# Converts the doctype back to XML.
|
48
43
|
#
|
49
44
|
# @return [String]
|
50
|
-
#
|
51
45
|
def to_xml
|
52
46
|
segments = "<!DOCTYPE #{name}"
|
53
47
|
|
@@ -59,11 +53,9 @@ module Oga
|
|
59
53
|
segments + '>'
|
60
54
|
end
|
61
55
|
|
62
|
-
##
|
63
56
|
# Inspects the doctype.
|
64
57
|
#
|
65
58
|
# @return [String]
|
66
|
-
#
|
67
59
|
def inspect
|
68
60
|
segments = []
|
69
61
|
|