superfeedr-nokogiri 1.4.0.20091116183308
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/.autotest +27 -0
- data/CHANGELOG.ja.rdoc +330 -0
- data/CHANGELOG.rdoc +314 -0
- data/Manifest.txt +269 -0
- data/README.ja.rdoc +105 -0
- data/README.rdoc +118 -0
- data/Rakefile +244 -0
- data/bin/nokogiri +49 -0
- data/ext/nokogiri/extconf.rb +145 -0
- data/ext/nokogiri/html_document.c +145 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_element_description.c +272 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +32 -0
- data/ext/nokogiri/html_entity_lookup.h +8 -0
- data/ext/nokogiri/html_sax_parser_context.c +92 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/nokogiri.c +89 -0
- data/ext/nokogiri/nokogiri.h +145 -0
- data/ext/nokogiri/xml_attr.c +92 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_attribute_decl.c +67 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +54 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_comment.c +52 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +388 -0
- data/ext/nokogiri/xml_document.h +24 -0
- data/ext/nokogiri/xml_document_fragment.c +46 -0
- data/ext/nokogiri/xml_document_fragment.h +10 -0
- data/ext/nokogiri/xml_dtd.c +192 -0
- data/ext/nokogiri/xml_dtd.h +10 -0
- data/ext/nokogiri/xml_element_content.c +123 -0
- data/ext/nokogiri/xml_element_content.h +10 -0
- data/ext/nokogiri/xml_element_decl.c +69 -0
- data/ext/nokogiri/xml_element_decl.h +9 -0
- data/ext/nokogiri/xml_entity_decl.c +97 -0
- data/ext/nokogiri/xml_entity_decl.h +10 -0
- data/ext/nokogiri/xml_entity_reference.c +50 -0
- data/ext/nokogiri/xml_entity_reference.h +9 -0
- data/ext/nokogiri/xml_io.c +31 -0
- data/ext/nokogiri/xml_io.h +11 -0
- data/ext/nokogiri/xml_namespace.c +74 -0
- data/ext/nokogiri/xml_namespace.h +12 -0
- data/ext/nokogiri/xml_node.c +1060 -0
- data/ext/nokogiri/xml_node.h +13 -0
- data/ext/nokogiri/xml_node_set.c +397 -0
- data/ext/nokogiri/xml_node_set.h +9 -0
- data/ext/nokogiri/xml_processing_instruction.c +54 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +593 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_relax_ng.c +159 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +286 -0
- data/ext/nokogiri/xml_sax_parser.h +43 -0
- data/ext/nokogiri/xml_sax_parser_context.c +155 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +114 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +156 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +261 -0
- data/ext/nokogiri/xml_syntax_error.h +13 -0
- data/ext/nokogiri/xml_text.c +48 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath.c +53 -0
- data/ext/nokogiri/xml_xpath.h +11 -0
- data/ext/nokogiri/xml_xpath_context.c +239 -0
- data/ext/nokogiri/xml_xpath_context.h +9 -0
- data/ext/nokogiri/xslt_stylesheet.c +131 -0
- data/ext/nokogiri/xslt_stylesheet.h +9 -0
- data/lib/nokogiri.rb +116 -0
- data/lib/nokogiri/css.rb +25 -0
- data/lib/nokogiri/css/generated_parser.rb +646 -0
- data/lib/nokogiri/css/generated_tokenizer.rb +142 -0
- data/lib/nokogiri/css/node.rb +99 -0
- data/lib/nokogiri/css/parser.rb +82 -0
- data/lib/nokogiri/css/parser.y +227 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rex +54 -0
- data/lib/nokogiri/css/xpath_visitor.rb +162 -0
- data/lib/nokogiri/decorators/slop.rb +33 -0
- data/lib/nokogiri/ffi/html/document.rb +28 -0
- data/lib/nokogiri/ffi/html/element_description.rb +85 -0
- data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
- data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
- data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
- data/lib/nokogiri/ffi/libxml.rb +356 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
- data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
- data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
- data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
- data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
- data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
- data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
- data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
- data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
- data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
- data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
- data/lib/nokogiri/ffi/structs/xml_parser_context.rb +19 -0
- data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
- data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
- data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +15 -0
- data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
- data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
- data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
- data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
- data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
- data/lib/nokogiri/ffi/xml/attr.rb +41 -0
- data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
- data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
- data/lib/nokogiri/ffi/xml/comment.rb +18 -0
- data/lib/nokogiri/ffi/xml/document.rb +135 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +69 -0
- data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
- data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
- data/lib/nokogiri/ffi/xml/entity_decl.rb +27 -0
- data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
- data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
- data/lib/nokogiri/ffi/xml/node.rb +444 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +133 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +227 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +142 -0
- data/lib/nokogiri/ffi/xml/sax/parser_context.rb +67 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +39 -0
- data/lib/nokogiri/ffi/xml/schema.rb +92 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +91 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
- data/lib/nokogiri/html.rb +35 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +88 -0
- data/lib/nokogiri/html/document_fragment.rb +15 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +13 -0
- data/lib/nokogiri/html/sax/parser.rb +48 -0
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +33 -0
- data/lib/nokogiri/version_warning.rb +11 -0
- data/lib/nokogiri/xml.rb +67 -0
- data/lib/nokogiri/xml/attr.rb +14 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +405 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +131 -0
- data/lib/nokogiri/xml/document_fragment.rb +69 -0
- data/lib/nokogiri/xml/dtd.rb +11 -0
- data/lib/nokogiri/xml/element_content.rb +36 -0
- data/lib/nokogiri/xml/element_decl.rb +13 -0
- data/lib/nokogiri/xml/entity_decl.rb +15 -0
- data/lib/nokogiri/xml/fragment_handler.rb +71 -0
- data/lib/nokogiri/xml/namespace.rb +13 -0
- data/lib/nokogiri/xml/node.rb +665 -0
- data/lib/nokogiri/xml/node/save_options.rb +42 -0
- data/lib/nokogiri/xml/node_set.rb +307 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- data/lib/nokogiri/xml/parse_options.rb +85 -0
- data/lib/nokogiri/xml/pp.rb +2 -0
- data/lib/nokogiri/xml/pp/character_data.rb +18 -0
- data/lib/nokogiri/xml/pp/node.rb +56 -0
- data/lib/nokogiri/xml/processing_instruction.rb +8 -0
- data/lib/nokogiri/xml/reader.rb +74 -0
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +4 -0
- data/lib/nokogiri/xml/sax/document.rb +160 -0
- data/lib/nokogiri/xml/sax/parser.rb +115 -0
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
- data/lib/nokogiri/xml/schema.rb +61 -0
- data/lib/nokogiri/xml/syntax_error.rb +38 -0
- data/lib/nokogiri/xml/xpath.rb +10 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xslt.rb +48 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xsd/xmlparser/nokogiri.rb +71 -0
- data/tasks/test.rb +100 -0
- data/test/css/test_nthiness.rb +159 -0
- data/test/css/test_parser.rb +277 -0
- data/test/css/test_tokenizer.rb +183 -0
- data/test/css/test_xpath_visitor.rb +76 -0
- data/test/ffi/test_document.rb +35 -0
- data/test/files/2ch.html +108 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/bar/bar.xsd +4 -0
- data/test/files/dont_hurt_em_why.xml +422 -0
- data/test/files/exslt.xml +8 -0
- data/test/files/exslt.xslt +35 -0
- data/test/files/foo/foo.xsd +4 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -0
- data/test/files/snuggles.xml +3 -0
- data/test/files/staff.dtd +10 -0
- data/test/files/staff.xml +59 -0
- data/test/files/staff.xslt +32 -0
- data/test/files/tlm.html +850 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/helper.rb +136 -0
- data/test/html/sax/test_parser.rb +64 -0
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +164 -0
- data/test/html/test_document.rb +390 -0
- data/test/html/test_document_encoding.rb +77 -0
- data/test/html/test_document_fragment.rb +132 -0
- data/test/html/test_element_description.rb +94 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +228 -0
- data/test/html/test_node_encoding.rb +27 -0
- data/test/test_convert_xpath.rb +135 -0
- data/test/test_css_cache.rb +45 -0
- data/test/test_gc.rb +15 -0
- data/test/test_memory_leak.rb +77 -0
- data/test/test_nokogiri.rb +134 -0
- data/test/test_reader.rb +358 -0
- data/test/test_xslt_transforms.rb +131 -0
- data/test/xml/node/test_save_options.rb +20 -0
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +307 -0
- data/test/xml/sax/test_parser_context.rb +56 -0
- data/test/xml/sax/test_push_parser.rb +131 -0
- data/test/xml/test_attr.rb +38 -0
- data/test/xml/test_attribute_decl.rb +82 -0
- data/test/xml/test_builder.rb +167 -0
- data/test/xml/test_cdata.rb +38 -0
- data/test/xml/test_comment.rb +29 -0
- data/test/xml/test_document.rb +607 -0
- data/test/xml/test_document_encoding.rb +26 -0
- data/test/xml/test_document_fragment.rb +138 -0
- data/test/xml/test_dtd.rb +82 -0
- data/test/xml/test_dtd_encoding.rb +33 -0
- data/test/xml/test_element_content.rb +56 -0
- data/test/xml/test_element_decl.rb +73 -0
- data/test/xml/test_entity_decl.rb +83 -0
- data/test/xml/test_entity_reference.rb +21 -0
- data/test/xml/test_namespace.rb +68 -0
- data/test/xml/test_node.rb +889 -0
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +107 -0
- data/test/xml/test_node_set.rb +531 -0
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +30 -0
- data/test/xml/test_reader_encoding.rb +126 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +89 -0
- data/test/xml/test_syntax_error.rb +27 -0
- data/test/xml/test_text.rb +30 -0
- data/test/xml/test_unparented_node.rb +381 -0
- data/test/xml/test_xpath.rb +106 -0
- metadata +430 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
class Node
|
4
|
+
###
|
5
|
+
# Save options for serializing nodes
|
6
|
+
class SaveOptions
|
7
|
+
# Format serialized xml
|
8
|
+
FORMAT = 1
|
9
|
+
# Do not include delcarations
|
10
|
+
NO_DECLARATION = 2
|
11
|
+
# Do not include empty tags
|
12
|
+
NO_EMPTY_TAGS = 4
|
13
|
+
# Do not save XHTML
|
14
|
+
NO_XHTML = 8
|
15
|
+
# Save as XHTML
|
16
|
+
AS_XHTML = 16
|
17
|
+
# Save as XML
|
18
|
+
AS_XML = 32
|
19
|
+
# Save as HTML
|
20
|
+
AS_HTML = 64
|
21
|
+
|
22
|
+
# Integer representation of the SaveOptions
|
23
|
+
attr_reader :options
|
24
|
+
|
25
|
+
# Create a new SaveOptions object with +options+
|
26
|
+
def initialize options = 0; @options = options; end
|
27
|
+
constants.each do |constant|
|
28
|
+
class_eval %{
|
29
|
+
def #{constant.downcase}
|
30
|
+
@options |= #{constant}
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def #{constant.downcase}?
|
35
|
+
#{constant} & @options == #{constant}
|
36
|
+
end
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,307 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
####
|
4
|
+
# A NodeSet contains a list of Nokogiri::XML::Node objects. Typically
|
5
|
+
# a NodeSet is return as a result of searching a Document via
|
6
|
+
# Nokogiri::XML::Node#css or Nokogiri::XML::Node#xpath
|
7
|
+
class NodeSet
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
# The Document this NodeSet is associated with
|
11
|
+
attr_accessor :document
|
12
|
+
|
13
|
+
# Create a NodeSet with +document+ defaulting to +list+
|
14
|
+
def initialize document, list = []
|
15
|
+
@document = document
|
16
|
+
list.each { |x| self << x }
|
17
|
+
yield self if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
###
|
21
|
+
# Get the first element of the NodeSet.
|
22
|
+
def first n = nil
|
23
|
+
return self[0] unless n
|
24
|
+
list = []
|
25
|
+
0.upto(n - 1) do |i|
|
26
|
+
list << self[i]
|
27
|
+
end
|
28
|
+
list
|
29
|
+
end
|
30
|
+
|
31
|
+
###
|
32
|
+
# Get the last element of the NodeSet.
|
33
|
+
def last
|
34
|
+
self[length - 1]
|
35
|
+
end
|
36
|
+
|
37
|
+
###
|
38
|
+
# Is this NodeSet empty?
|
39
|
+
def empty?
|
40
|
+
length == 0
|
41
|
+
end
|
42
|
+
|
43
|
+
###
|
44
|
+
# Returns the index of the first node in self that is == to +node+. Returns nil if no match is found.
|
45
|
+
def index(node)
|
46
|
+
each_with_index { |member, j| return j if member == node }
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
|
50
|
+
###
|
51
|
+
# Insert +datum+ before the first Node in this NodeSet
|
52
|
+
def before datum
|
53
|
+
first.before datum
|
54
|
+
end
|
55
|
+
|
56
|
+
###
|
57
|
+
# Insert +datum+ after the last Node in this NodeSet
|
58
|
+
def after datum
|
59
|
+
last.after datum
|
60
|
+
end
|
61
|
+
|
62
|
+
alias :<< :push
|
63
|
+
alias :remove :unlink
|
64
|
+
|
65
|
+
###
|
66
|
+
# Search this document for +paths+
|
67
|
+
#
|
68
|
+
# For more information see Nokogiri::XML::Node#css and
|
69
|
+
# Nokogiri::XML::Node#xpath
|
70
|
+
def search *paths
|
71
|
+
handler = ![
|
72
|
+
Hash, String, Symbol
|
73
|
+
].include?(paths.last.class) ? paths.pop : nil
|
74
|
+
|
75
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
76
|
+
|
77
|
+
sub_set = NodeSet.new(document)
|
78
|
+
|
79
|
+
paths.each do |path|
|
80
|
+
sub_set += send(
|
81
|
+
path =~ /^(\.\/|\/)/ ? :xpath : :css,
|
82
|
+
*(paths + [ns, handler]).compact
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
document.decorate(sub_set)
|
87
|
+
sub_set
|
88
|
+
end
|
89
|
+
alias :/ :search
|
90
|
+
|
91
|
+
###
|
92
|
+
# Search this NodeSet for css +paths+
|
93
|
+
#
|
94
|
+
# For more information see Nokogiri::XML::Node#css
|
95
|
+
def css *paths
|
96
|
+
handler = ![
|
97
|
+
Hash, String, Symbol
|
98
|
+
].include?(paths.last.class) ? paths.pop : nil
|
99
|
+
|
100
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
101
|
+
|
102
|
+
sub_set = NodeSet.new(document)
|
103
|
+
|
104
|
+
each do |node|
|
105
|
+
doc = node.document
|
106
|
+
search_ns = ns || doc.root ? doc.root.namespaces : {}
|
107
|
+
|
108
|
+
xpaths = paths.map { |rule|
|
109
|
+
[
|
110
|
+
CSS.xpath_for(rule.to_s, :prefix => ".//", :ns => search_ns),
|
111
|
+
CSS.xpath_for(rule.to_s, :prefix => "self::", :ns => search_ns)
|
112
|
+
].join(' | ')
|
113
|
+
}
|
114
|
+
|
115
|
+
sub_set += node.xpath(*(xpaths + [search_ns, handler].compact))
|
116
|
+
end
|
117
|
+
document.decorate(sub_set)
|
118
|
+
sub_set
|
119
|
+
end
|
120
|
+
|
121
|
+
###
|
122
|
+
# Search this NodeSet for XPath +paths+
|
123
|
+
#
|
124
|
+
# For more information see Nokogiri::XML::Node#xpath
|
125
|
+
def xpath *paths
|
126
|
+
handler = ![
|
127
|
+
Hash, String, Symbol
|
128
|
+
].include?(paths.last.class) ? paths.pop : nil
|
129
|
+
|
130
|
+
ns = paths.last.is_a?(Hash) ? paths.pop : nil
|
131
|
+
|
132
|
+
sub_set = NodeSet.new(document)
|
133
|
+
each do |node|
|
134
|
+
sub_set += node.xpath(*(paths + [ns, handler].compact))
|
135
|
+
end
|
136
|
+
document.decorate(sub_set)
|
137
|
+
sub_set
|
138
|
+
end
|
139
|
+
|
140
|
+
###
|
141
|
+
# If path is a string, search this document for +path+ returning the
|
142
|
+
# first Node. Otherwise, index in to the array with +path+.
|
143
|
+
def at path, ns = document.root ? document.root.namespaces : {}
|
144
|
+
return self[path] if path.is_a?(Numeric)
|
145
|
+
search(path, ns).first
|
146
|
+
end
|
147
|
+
alias :% :at
|
148
|
+
|
149
|
+
###
|
150
|
+
# Append the class attribute +name+ to all Node objects in the NodeSet.
|
151
|
+
def add_class name
|
152
|
+
each do |el|
|
153
|
+
classes = el['class'].to_s.split(/\s+/)
|
154
|
+
el['class'] = classes.push(name).uniq.join " "
|
155
|
+
end
|
156
|
+
self
|
157
|
+
end
|
158
|
+
|
159
|
+
###
|
160
|
+
# Remove the class attribute +name+ from all Node objects in the NodeSet.
|
161
|
+
# If +name+ is nil, remove the class attribute from all Nodes in the
|
162
|
+
# NodeSet.
|
163
|
+
def remove_class name = nil
|
164
|
+
each do |el|
|
165
|
+
if name
|
166
|
+
classes = el['class'].to_s.split(/\s+/)
|
167
|
+
if classes.empty?
|
168
|
+
el.delete 'class'
|
169
|
+
else
|
170
|
+
el['class'] = (classes - [name]).uniq.join " "
|
171
|
+
end
|
172
|
+
else
|
173
|
+
el.delete "class"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
self
|
177
|
+
end
|
178
|
+
|
179
|
+
###
|
180
|
+
# Set the attribute +key+ to +value+ or the return value of +blk+
|
181
|
+
# on all Node objects in the NodeSet.
|
182
|
+
def attr key, value = nil, &blk
|
183
|
+
unless Hash === key || key && (value || blk)
|
184
|
+
return first.attribute(key)
|
185
|
+
end
|
186
|
+
|
187
|
+
hash = key.is_a?(Hash) ? key : { key => value }
|
188
|
+
|
189
|
+
hash.each { |k,v| each { |el| el[k] = v || blk[el] } }
|
190
|
+
|
191
|
+
self
|
192
|
+
end
|
193
|
+
alias :set :attr
|
194
|
+
alias :attribute :attr
|
195
|
+
|
196
|
+
###
|
197
|
+
# Remove the attributed named +name+ from all Node objects in the NodeSet
|
198
|
+
def remove_attr name
|
199
|
+
each { |el| el.delete name }
|
200
|
+
self
|
201
|
+
end
|
202
|
+
|
203
|
+
###
|
204
|
+
# Iterate over each node, yielding to +block+
|
205
|
+
def each(&block)
|
206
|
+
0.upto(length - 1) do |x|
|
207
|
+
yield self[x]
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
###
|
212
|
+
# Get the inner text of all contained Node objects
|
213
|
+
def inner_text
|
214
|
+
collect{|j| j.inner_text}.join('')
|
215
|
+
end
|
216
|
+
alias :text :inner_text
|
217
|
+
|
218
|
+
###
|
219
|
+
# Get the inner html of all contained Node objects
|
220
|
+
def inner_html
|
221
|
+
collect{|j| j.inner_html}.join('')
|
222
|
+
end
|
223
|
+
|
224
|
+
###
|
225
|
+
# Wrap this NodeSet with +html+ or the results of the builder in +blk+
|
226
|
+
def wrap(html, &blk)
|
227
|
+
each do |j|
|
228
|
+
new_parent = Nokogiri.make(html, &blk)
|
229
|
+
j.add_next_sibling(new_parent)
|
230
|
+
new_parent.add_child(j)
|
231
|
+
end
|
232
|
+
self
|
233
|
+
end
|
234
|
+
|
235
|
+
###
|
236
|
+
# Convert this NodeSet to a string.
|
237
|
+
def to_s
|
238
|
+
map { |x| x.to_s }.join
|
239
|
+
end
|
240
|
+
|
241
|
+
###
|
242
|
+
# Convert this NodeSet to HTML
|
243
|
+
def to_html *args
|
244
|
+
map { |x| x.to_html(*args) }.join
|
245
|
+
end
|
246
|
+
|
247
|
+
###
|
248
|
+
# Convert this NodeSet to XHTML
|
249
|
+
def to_xhtml *args
|
250
|
+
map { |x| x.to_xhtml(*args) }.join
|
251
|
+
end
|
252
|
+
|
253
|
+
###
|
254
|
+
# Convert this NodeSet to XML
|
255
|
+
def to_xml *args
|
256
|
+
map { |x| x.to_xml(*args) }.join
|
257
|
+
end
|
258
|
+
|
259
|
+
alias :size :length
|
260
|
+
alias :to_ary :to_a
|
261
|
+
|
262
|
+
###
|
263
|
+
# Removes the last element from set and returns it, or +nil+ if
|
264
|
+
# the set is empty
|
265
|
+
def pop
|
266
|
+
return nil if length == 0
|
267
|
+
delete last
|
268
|
+
end
|
269
|
+
|
270
|
+
###
|
271
|
+
# Returns the first element of the NodeSet and removes it. Returns
|
272
|
+
# +nil+ if the set is empty.
|
273
|
+
def shift
|
274
|
+
return nil if length == 0
|
275
|
+
delete first
|
276
|
+
end
|
277
|
+
|
278
|
+
###
|
279
|
+
# Equality -- Two NodeSets are equal if the contain the same number
|
280
|
+
# of elements and if each element is equal to the corresponding
|
281
|
+
# element in the other NodeSet
|
282
|
+
def == other
|
283
|
+
return false unless other.is_a?(Nokogiri::XML::NodeSet)
|
284
|
+
return false unless length == other.length
|
285
|
+
each_with_index do |node, i|
|
286
|
+
return false unless node == other[i]
|
287
|
+
end
|
288
|
+
true
|
289
|
+
end
|
290
|
+
|
291
|
+
###
|
292
|
+
# Returns a new NodeSet containing all the children of all the nodes in
|
293
|
+
# the NodeSet
|
294
|
+
def children
|
295
|
+
inject(NodeSet.new(document)) { |set, node| set += node.children }
|
296
|
+
end
|
297
|
+
|
298
|
+
###
|
299
|
+
# Return a nicely formated string representation
|
300
|
+
def inspect
|
301
|
+
"[#{map { |c| c.inspect }.join ', '}]"
|
302
|
+
end
|
303
|
+
|
304
|
+
alias :+ :|
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
###
|
4
|
+
# Parse options for passing to Nokogiri.XML or Nokogiri.HTML
|
5
|
+
class ParseOptions
|
6
|
+
# Strict parsing
|
7
|
+
STRICT = 0
|
8
|
+
# Recover from errors
|
9
|
+
RECOVER = 1 << 0
|
10
|
+
# Substitute entities
|
11
|
+
NOENT = 1 << 1
|
12
|
+
# Load external subsets
|
13
|
+
DTDLOAD = 1 << 2
|
14
|
+
# Default DTD attributes
|
15
|
+
DTDATTR = 1 << 3
|
16
|
+
# validate with the DTD
|
17
|
+
DTDVALID = 1 << 4
|
18
|
+
# suppress error reports
|
19
|
+
NOERROR = 1 << 5
|
20
|
+
# suppress warning reports
|
21
|
+
NOWARNING = 1 << 6
|
22
|
+
# pedantic error reporting
|
23
|
+
PEDANTIC = 1 << 7
|
24
|
+
# remove blank nodes
|
25
|
+
NOBLANKS = 1 << 8
|
26
|
+
# use the SAX1 interface internally
|
27
|
+
SAX1 = 1 << 9
|
28
|
+
# Implement XInclude substitition
|
29
|
+
XINCLUDE = 1 << 10
|
30
|
+
# Forbid network access
|
31
|
+
NONET = 1 << 11
|
32
|
+
# Do not reuse the context dictionnary
|
33
|
+
NODICT = 1 << 12
|
34
|
+
# remove redundant namespaces declarations
|
35
|
+
NSCLEAN = 1 << 13
|
36
|
+
# merge CDATA as text nodes
|
37
|
+
NOCDATA = 1 << 14
|
38
|
+
# do not generate XINCLUDE START/END nodes
|
39
|
+
NOXINCNODE = 1 << 15
|
40
|
+
|
41
|
+
# the default options used for parsing XML documents
|
42
|
+
DEFAULT_XML = RECOVER
|
43
|
+
# the default options used for parsing HTML documents
|
44
|
+
DEFAULT_HTML = RECOVER | NOERROR | NOWARNING | NONET
|
45
|
+
|
46
|
+
attr_accessor :options
|
47
|
+
def initialize options = STRICT
|
48
|
+
@options = options
|
49
|
+
end
|
50
|
+
|
51
|
+
constants.each do |constant|
|
52
|
+
next if constant.to_sym == :STRICT
|
53
|
+
class_eval %{
|
54
|
+
def #{constant.downcase}
|
55
|
+
@options |= #{constant}
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
def #{constant.downcase}?
|
60
|
+
#{constant} & @options == #{constant}
|
61
|
+
end
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def strict
|
66
|
+
@options &= ~RECOVER
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
def strict?
|
71
|
+
@options & RECOVER == STRICT
|
72
|
+
end
|
73
|
+
|
74
|
+
alias :to_i :options
|
75
|
+
|
76
|
+
def inspect
|
77
|
+
options = []
|
78
|
+
self.class.constants.each do |k|
|
79
|
+
options << k.downcase if send(:"#{k.downcase}?")
|
80
|
+
end
|
81
|
+
super.sub(/>$/, " " + options.join(', ') + ">")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Nokogiri
|
2
|
+
module XML
|
3
|
+
module PP
|
4
|
+
module CharacterData
|
5
|
+
def pretty_print pp # :nodoc:
|
6
|
+
nice_name = self.class.name.split('::').last
|
7
|
+
pp.group(2, "#(#{nice_name} ", ')') do
|
8
|
+
pp.pp text
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def inspect # :nodoc:
|
13
|
+
"#<#{self.class.name}:#{sprintf("0x%x",object_id)} #{text.inspect}>"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|