nokogiri 1.11.0.rc1-java → 1.11.2-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/Gemfile +3 -0
- data/LICENSE-DEPENDENCIES.md +1015 -947
- data/LICENSE.md +1 -1
- data/README.md +171 -94
- data/ext/java/nokogiri/EncodingHandler.java +78 -59
- data/ext/java/nokogiri/HtmlDocument.java +137 -114
- data/ext/java/nokogiri/HtmlElementDescription.java +104 -87
- data/ext/java/nokogiri/HtmlEntityLookup.java +31 -26
- data/ext/java/nokogiri/HtmlSaxParserContext.java +220 -192
- data/ext/java/nokogiri/HtmlSaxPushParser.java +164 -139
- data/ext/java/nokogiri/NokogiriService.java +597 -526
- data/ext/java/nokogiri/XmlAttr.java +120 -96
- data/ext/java/nokogiri/XmlAttributeDecl.java +97 -76
- data/ext/java/nokogiri/XmlCdata.java +35 -26
- data/ext/java/nokogiri/XmlComment.java +48 -37
- data/ext/java/nokogiri/XmlDocument.java +642 -540
- data/ext/java/nokogiri/XmlDocumentFragment.java +127 -107
- data/ext/java/nokogiri/XmlDtd.java +450 -384
- data/ext/java/nokogiri/XmlElement.java +25 -18
- data/ext/java/nokogiri/XmlElementContent.java +345 -286
- data/ext/java/nokogiri/XmlElementDecl.java +126 -95
- data/ext/java/nokogiri/XmlEntityDecl.java +121 -97
- data/ext/java/nokogiri/XmlEntityReference.java +51 -42
- data/ext/java/nokogiri/XmlNamespace.java +177 -145
- data/ext/java/nokogiri/XmlNode.java +1843 -1590
- data/ext/java/nokogiri/XmlNodeSet.java +361 -299
- data/ext/java/nokogiri/XmlProcessingInstruction.java +49 -39
- data/ext/java/nokogiri/XmlReader.java +513 -418
- data/ext/java/nokogiri/XmlRelaxng.java +92 -72
- data/ext/java/nokogiri/XmlSaxParserContext.java +330 -280
- data/ext/java/nokogiri/XmlSaxPushParser.java +229 -190
- data/ext/java/nokogiri/XmlSchema.java +335 -210
- data/ext/java/nokogiri/XmlSyntaxError.java +113 -87
- data/ext/java/nokogiri/XmlText.java +57 -46
- data/ext/java/nokogiri/XmlXpathContext.java +242 -178
- data/ext/java/nokogiri/XsltStylesheet.java +282 -239
- data/ext/java/nokogiri/internals/ClosedStreamException.java +5 -2
- data/ext/java/nokogiri/internals/HtmlDomParserContext.java +203 -160
- data/ext/java/nokogiri/internals/IgnoreSchemaErrorsErrorHandler.java +17 -10
- data/ext/java/nokogiri/internals/NokogiriBlockingQueueInputStream.java +43 -16
- data/ext/java/nokogiri/internals/NokogiriDomParser.java +65 -50
- data/ext/java/nokogiri/internals/NokogiriEntityResolver.java +107 -88
- data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +25 -18
- data/ext/java/nokogiri/internals/NokogiriHandler.java +316 -254
- data/ext/java/nokogiri/internals/NokogiriHelpers.java +738 -622
- data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +186 -143
- data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +81 -59
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +66 -49
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +86 -69
- data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +44 -29
- data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +121 -48
- data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +34 -22
- data/ext/java/nokogiri/internals/NokogiriXPathVariableResolver.java +25 -17
- data/ext/java/nokogiri/internals/NokogiriXsltErrorListener.java +57 -42
- data/ext/java/nokogiri/internals/ParserContext.java +206 -179
- data/ext/java/nokogiri/internals/ReaderNode.java +478 -371
- data/ext/java/nokogiri/internals/SaveContextVisitor.java +822 -707
- data/ext/java/nokogiri/internals/SchemaErrorHandler.java +28 -19
- data/ext/java/nokogiri/internals/XalanDTMManagerPatch.java +129 -123
- data/ext/java/nokogiri/internals/XmlDeclHandler.java +5 -4
- data/ext/java/nokogiri/internals/XmlDomParserContext.java +208 -177
- data/ext/java/nokogiri/internals/XmlSaxParser.java +24 -17
- data/ext/java/nokogiri/internals/c14n/AttrCompare.java +71 -68
- data/ext/java/nokogiri/internals/c14n/C14nHelper.java +137 -118
- data/ext/java/nokogiri/internals/c14n/CanonicalFilter.java +27 -21
- data/ext/java/nokogiri/internals/c14n/CanonicalizationException.java +74 -61
- data/ext/java/nokogiri/internals/c14n/Canonicalizer.java +230 -205
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11.java +572 -547
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_OmitComments.java +17 -10
- data/ext/java/nokogiri/internals/c14n/Canonicalizer11_WithComments.java +17 -10
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315.java +323 -302
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315Excl.java +232 -219
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclOmitComments.java +22 -15
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315ExclWithComments.java +23 -16
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315OmitComments.java +23 -16
- data/ext/java/nokogiri/internals/c14n/Canonicalizer20010315WithComments.java +22 -15
- data/ext/java/nokogiri/internals/c14n/CanonicalizerBase.java +575 -545
- data/ext/java/nokogiri/internals/c14n/CanonicalizerPhysical.java +141 -120
- data/ext/java/nokogiri/internals/c14n/CanonicalizerSpi.java +39 -38
- data/ext/java/nokogiri/internals/c14n/Constants.java +13 -10
- data/ext/java/nokogiri/internals/c14n/ElementProxy.java +279 -247
- data/ext/java/nokogiri/internals/c14n/HelperNodeList.java +66 -53
- data/ext/java/nokogiri/internals/c14n/IgnoreAllErrorHandler.java +44 -37
- data/ext/java/nokogiri/internals/c14n/InclusiveNamespaces.java +135 -120
- data/ext/java/nokogiri/internals/c14n/InvalidCanonicalizerException.java +59 -48
- data/ext/java/nokogiri/internals/c14n/NameSpaceSymbTable.java +384 -334
- data/ext/java/nokogiri/internals/c14n/NodeFilter.java +25 -24
- data/ext/java/nokogiri/internals/c14n/UtfHelpper.java +151 -140
- data/ext/java/nokogiri/internals/c14n/XMLUtils.java +456 -423
- data/ext/java/nokogiri/internals/dom2dtm/DOM2DTM.java +1466 -1500
- data/ext/java/nokogiri/internals/dom2dtm/DOM2DTMdefaultNamespaceDeclarationNode.java +626 -570
- data/ext/nokogiri/depend +37 -358
- data/ext/nokogiri/extconf.rb +585 -374
- data/ext/nokogiri/html_document.c +78 -82
- data/ext/nokogiri/html_element_description.c +84 -71
- data/ext/nokogiri/html_entity_lookup.c +21 -16
- data/ext/nokogiri/html_sax_parser_context.c +69 -66
- data/ext/nokogiri/html_sax_push_parser.c +42 -34
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +192 -93
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +15 -15
- data/ext/nokogiri/xml_attribute_decl.c +18 -18
- data/ext/nokogiri/xml_cdata.c +13 -18
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +225 -163
- data/ext/nokogiri/xml_document_fragment.c +13 -15
- data/ext/nokogiri/xml_dtd.c +54 -48
- data/ext/nokogiri/xml_element_content.c +30 -27
- data/ext/nokogiri/xml_element_decl.c +22 -22
- data/ext/nokogiri/xml_encoding_handler.c +17 -11
- data/ext/nokogiri/xml_entity_decl.c +32 -30
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +56 -49
- data/ext/nokogiri/xml_node.c +338 -286
- data/ext/nokogiri/xml_node_set.c +168 -156
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +195 -172
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +118 -118
- data/ext/nokogiri/xml_sax_parser_context.c +103 -86
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +111 -34
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +13 -17
- data/ext/nokogiri/xml_xpath_context.c +206 -123
- data/ext/nokogiri/xslt_stylesheet.c +158 -161
- data/lib/nokogiri.rb +4 -8
- data/lib/nokogiri/css/parser.rb +62 -62
- data/lib/nokogiri/css/parser.y +2 -2
- data/lib/nokogiri/css/parser_extras.rb +38 -36
- data/lib/nokogiri/css/xpath_visitor.rb +70 -42
- data/lib/nokogiri/extension.rb +26 -0
- data/lib/nokogiri/html/document.rb +12 -26
- data/lib/nokogiri/html/document_fragment.rb +15 -15
- data/lib/nokogiri/nokogiri.jar +0 -0
- data/lib/nokogiri/version.rb +2 -148
- data/lib/nokogiri/version/constant.rb +5 -0
- data/lib/nokogiri/version/info.rb +205 -0
- data/lib/nokogiri/xml/builder.rb +2 -2
- data/lib/nokogiri/xml/document.rb +48 -18
- data/lib/nokogiri/xml/document_fragment.rb +4 -6
- data/lib/nokogiri/xml/node.rb +599 -279
- data/lib/nokogiri/xml/parse_options.rb +6 -0
- data/lib/nokogiri/xml/reader.rb +2 -9
- data/lib/nokogiri/xml/relax_ng.rb +6 -2
- data/lib/nokogiri/xml/schema.rb +12 -4
- data/lib/nokogiri/xml/searchable.rb +24 -16
- data/lib/nokogiri/xml/xpath.rb +1 -3
- data/lib/nokogiri/xml/xpath/syntax_error.rb +1 -1
- metadata +87 -158
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/nokogiri.h +0 -122
- data/ext/nokogiri/xml_attr.h +0 -9
- data/ext/nokogiri/xml_attribute_decl.h +0 -9
- data/ext/nokogiri/xml_cdata.h +0 -9
- data/ext/nokogiri/xml_comment.h +0 -9
- data/ext/nokogiri/xml_document.h +0 -23
- data/ext/nokogiri/xml_document_fragment.h +0 -10
- data/ext/nokogiri/xml_dtd.h +0 -10
- data/ext/nokogiri/xml_element_content.h +0 -10
- data/ext/nokogiri/xml_element_decl.h +0 -9
- data/ext/nokogiri/xml_encoding_handler.h +0 -8
- data/ext/nokogiri/xml_entity_decl.h +0 -10
- data/ext/nokogiri/xml_entity_reference.h +0 -9
- data/ext/nokogiri/xml_io.c +0 -61
- data/ext/nokogiri/xml_io.h +0 -11
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/ext/nokogiri/xml_namespace.h +0 -14
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -12
- data/ext/nokogiri/xml_processing_instruction.h +0 -9
- data/ext/nokogiri/xml_reader.h +0 -10
- data/ext/nokogiri/xml_relax_ng.h +0 -9
- data/ext/nokogiri/xml_sax_parser.h +0 -39
- data/ext/nokogiri/xml_sax_parser_context.h +0 -10
- data/ext/nokogiri/xml_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_schema.h +0 -9
- data/ext/nokogiri/xml_syntax_error.h +0 -13
- data/ext/nokogiri/xml_text.h +0 -9
- data/ext/nokogiri/xml_xpath_context.h +0 -10
- data/ext/nokogiri/xslt_stylesheet.h +0 -14
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
18
18
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
19
19
|
* the following conditions:
|
|
20
|
-
*
|
|
20
|
+
*
|
|
21
21
|
* The above copyright notice and this permission notice shall be
|
|
22
22
|
* included in all copies or substantial portions of the Software.
|
|
23
|
-
*
|
|
23
|
+
*
|
|
24
24
|
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
25
25
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
26
26
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
@@ -55,124 +55,147 @@ import static nokogiri.internals.NokogiriHelpers.getNokogiriClass;
|
|
|
55
55
|
* @author sergio
|
|
56
56
|
* @author Yoko Harada <yokolet@gmail.com>
|
|
57
57
|
*/
|
|
58
|
-
@JRubyClass(name="Nokogiri::HTML::Document", parent="Nokogiri::XML::Document")
|
|
59
|
-
public class HtmlDocument extends XmlDocument
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
58
|
+
@JRubyClass(name = "Nokogiri::HTML::Document", parent = "Nokogiri::XML::Document")
|
|
59
|
+
public class HtmlDocument extends XmlDocument
|
|
60
|
+
{
|
|
61
|
+
private static final String DEFAULT_CONTENT_TYPE = "html";
|
|
62
|
+
private static final String DEFAULT_PUBLIC_ID = "-//W3C//DTD HTML 4.01//EN";
|
|
63
|
+
private static final String DEFAULT_SYTEM_ID = "http://www.w3.org/TR/html4/strict.dtd";
|
|
64
|
+
|
|
65
|
+
private String parsed_encoding = null;
|
|
66
|
+
|
|
67
|
+
public
|
|
68
|
+
HtmlDocument(Ruby ruby, RubyClass klazz)
|
|
69
|
+
{
|
|
70
|
+
super(ruby, klazz);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public
|
|
74
|
+
HtmlDocument(Ruby runtime, Document document)
|
|
75
|
+
{
|
|
76
|
+
this(runtime, getNokogiriClass(runtime, "Nokogiri::XML::Document"), document);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public
|
|
80
|
+
HtmlDocument(Ruby ruby, RubyClass klazz, Document doc)
|
|
81
|
+
{
|
|
82
|
+
super(ruby, klazz, doc);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@JRubyMethod(name = "new", meta = true, rest = true, required = 0)
|
|
86
|
+
public static IRubyObject
|
|
87
|
+
rbNew(ThreadContext context, IRubyObject klazz, IRubyObject[] args)
|
|
88
|
+
{
|
|
89
|
+
final Ruby runtime = context.runtime;
|
|
90
|
+
HtmlDocument htmlDocument;
|
|
91
|
+
try {
|
|
92
|
+
Document docNode = createNewDocument(runtime);
|
|
93
|
+
htmlDocument = (HtmlDocument) NokogiriService.HTML_DOCUMENT_ALLOCATOR.allocate(runtime, (RubyClass) klazz);
|
|
94
|
+
htmlDocument.setDocumentNode(context.runtime, docNode);
|
|
95
|
+
} catch (Exception ex) {
|
|
96
|
+
throw asRuntimeError(runtime, "couldn't create document: ", ex);
|
|
72
97
|
}
|
|
73
98
|
|
|
74
|
-
|
|
75
|
-
|
|
99
|
+
Helpers.invoke(context, htmlDocument, "initialize", args);
|
|
100
|
+
|
|
101
|
+
return htmlDocument;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public IRubyObject
|
|
105
|
+
getInternalSubset(ThreadContext context)
|
|
106
|
+
{
|
|
107
|
+
IRubyObject internalSubset = super.getInternalSubset(context);
|
|
108
|
+
|
|
109
|
+
// html documents are expected to have a default internal subset
|
|
110
|
+
// the default values are the same ones used when the following
|
|
111
|
+
// feature is turned on
|
|
112
|
+
// "http://cyberneko.org/html/features/insert-doctype"
|
|
113
|
+
// the reason we don't turn it on, is because it overrides the document's
|
|
114
|
+
// declared doctype declaration.
|
|
115
|
+
|
|
116
|
+
if (internalSubset.isNil()) {
|
|
117
|
+
internalSubset = XmlDtd.newEmpty(context.getRuntime(),
|
|
118
|
+
getDocument(),
|
|
119
|
+
context.getRuntime().newString(DEFAULT_CONTENT_TYPE),
|
|
120
|
+
context.getRuntime().newString(DEFAULT_PUBLIC_ID),
|
|
121
|
+
context.getRuntime().newString(DEFAULT_SYTEM_ID));
|
|
122
|
+
setInternalSubset(internalSubset);
|
|
76
123
|
}
|
|
77
124
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
Helpers.invoke(context, htmlDocument, "initialize", args);
|
|
91
|
-
|
|
92
|
-
return htmlDocument;
|
|
125
|
+
return internalSubset;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@Override
|
|
129
|
+
void
|
|
130
|
+
init(Ruby runtime, Document document)
|
|
131
|
+
{
|
|
132
|
+
stabilizeTextContent(document);
|
|
133
|
+
document.normalize();
|
|
134
|
+
setInstanceVariable("@decorators", runtime.getNil());
|
|
135
|
+
if (document.getDocumentElement() != null) {
|
|
136
|
+
stabilizeAttrs(document.getDocumentElement());
|
|
93
137
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (internalSubset.isNil()) {
|
|
106
|
-
internalSubset = XmlDtd.newEmpty(context.getRuntime(),
|
|
107
|
-
getDocument(),
|
|
108
|
-
context.getRuntime().newString(DEFAULT_CONTENT_TYPE),
|
|
109
|
-
context.getRuntime().newString(DEFAULT_PUBLIC_ID),
|
|
110
|
-
context.getRuntime().newString(DEFAULT_SYTEM_ID));
|
|
111
|
-
setInternalSubset(internalSubset);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private static void
|
|
141
|
+
stabilizeAttrs(Node node)
|
|
142
|
+
{
|
|
143
|
+
if (node.hasAttributes()) {
|
|
144
|
+
NamedNodeMap nodeMap = node.getAttributes();
|
|
145
|
+
for (int i = 0; i < nodeMap.getLength(); i++) {
|
|
146
|
+
Node n = nodeMap.item(i);
|
|
147
|
+
if (n instanceof Attr) {
|
|
148
|
+
stabilizeAttr((Attr) n);
|
|
112
149
|
}
|
|
113
|
-
|
|
114
|
-
return internalSubset;
|
|
150
|
+
}
|
|
115
151
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
stabilizeTextContent(document);
|
|
120
|
-
document.normalize();
|
|
121
|
-
setInstanceVariable("@decorators", runtime.getNil());
|
|
122
|
-
if (document.getDocumentElement() != null) {
|
|
123
|
-
stabilizeAttrs(document.getDocumentElement());
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
private static void stabilizeAttrs(Node node) {
|
|
128
|
-
if (node.hasAttributes()) {
|
|
129
|
-
NamedNodeMap nodeMap = node.getAttributes();
|
|
130
|
-
for (int i=0; i<nodeMap.getLength(); i++) {
|
|
131
|
-
Node n = nodeMap.item(i);
|
|
132
|
-
if (n instanceof Attr) {
|
|
133
|
-
stabilizeAttr((Attr) n);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
NodeList children = node.getChildNodes();
|
|
138
|
-
for (int i=0; i<children.getLength(); i++) {
|
|
139
|
-
stabilizeAttrs(children.item(i));
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
public void setParsedEncoding(String encoding) {
|
|
144
|
-
parsed_encoding = encoding;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
public String getPraedEncoding() {
|
|
148
|
-
return parsed_encoding;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/*
|
|
152
|
-
* call-seq:
|
|
153
|
-
* read_io(io, url, encoding, options)
|
|
154
|
-
*
|
|
155
|
-
* Read the HTML document from +io+ with given +url+, +encoding+,
|
|
156
|
-
* and +options+. See Nokogiri::HTML.parse
|
|
157
|
-
*/
|
|
158
|
-
@JRubyMethod(meta = true, required = 4)
|
|
159
|
-
public static IRubyObject read_io(ThreadContext context, IRubyObject klass, IRubyObject[] args) {
|
|
160
|
-
HtmlDomParserContext ctx = new HtmlDomParserContext(context.runtime, args[2], args[3]);
|
|
161
|
-
ctx.setIOInputSource(context, args[0], args[1]);
|
|
162
|
-
return ctx.parse(context, (RubyClass) klass, args[1]);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/*
|
|
166
|
-
* call-seq:
|
|
167
|
-
* read_memory(string, url, encoding, options)
|
|
168
|
-
*
|
|
169
|
-
* Read the HTML document contained in +string+ with given +url+, +encoding+,
|
|
170
|
-
* and +options+. See Nokogiri::HTML.parse
|
|
171
|
-
*/
|
|
172
|
-
@JRubyMethod(meta = true, required = 4)
|
|
173
|
-
public static IRubyObject read_memory(ThreadContext context, IRubyObject klass, IRubyObject[] args) {
|
|
174
|
-
HtmlDomParserContext ctx = new HtmlDomParserContext(context.runtime, args[2], args[3]);
|
|
175
|
-
ctx.setStringInputSource(context, args[0], args[1]);
|
|
176
|
-
return ctx.parse(context, (RubyClass) klass, args[1]);
|
|
152
|
+
NodeList children = node.getChildNodes();
|
|
153
|
+
for (int i = 0; i < children.getLength(); i++) {
|
|
154
|
+
stabilizeAttrs(children.item(i));
|
|
177
155
|
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public void
|
|
159
|
+
setParsedEncoding(String encoding)
|
|
160
|
+
{
|
|
161
|
+
parsed_encoding = encoding;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public String
|
|
165
|
+
getPraedEncoding()
|
|
166
|
+
{
|
|
167
|
+
return parsed_encoding;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/*
|
|
171
|
+
* call-seq:
|
|
172
|
+
* read_io(io, url, encoding, options)
|
|
173
|
+
*
|
|
174
|
+
* Read the HTML document from +io+ with given +url+, +encoding+,
|
|
175
|
+
* and +options+. See Nokogiri::HTML.parse
|
|
176
|
+
*/
|
|
177
|
+
@JRubyMethod(meta = true, required = 4)
|
|
178
|
+
public static IRubyObject
|
|
179
|
+
read_io(ThreadContext context, IRubyObject klass, IRubyObject[] args)
|
|
180
|
+
{
|
|
181
|
+
HtmlDomParserContext ctx = new HtmlDomParserContext(context.runtime, args[2], args[3]);
|
|
182
|
+
ctx.setIOInputSource(context, args[0], args[1]);
|
|
183
|
+
return ctx.parse(context, (RubyClass) klass, args[1]);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/*
|
|
187
|
+
* call-seq:
|
|
188
|
+
* read_memory(string, url, encoding, options)
|
|
189
|
+
*
|
|
190
|
+
* Read the HTML document contained in +string+ with given +url+, +encoding+,
|
|
191
|
+
* and +options+. See Nokogiri::HTML.parse
|
|
192
|
+
*/
|
|
193
|
+
@JRubyMethod(meta = true, required = 4)
|
|
194
|
+
public static IRubyObject
|
|
195
|
+
read_memory(ThreadContext context, IRubyObject klass, IRubyObject[] args)
|
|
196
|
+
{
|
|
197
|
+
HtmlDomParserContext ctx = new HtmlDomParserContext(context.runtime, args[2], args[3]);
|
|
198
|
+
ctx.setStringInputSource(context, args[0], args[1]);
|
|
199
|
+
return ctx.parse(context, (RubyClass) klass, args[1]);
|
|
200
|
+
}
|
|
178
201
|
}
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
18
18
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
19
19
|
* the following conditions:
|
|
20
|
-
*
|
|
20
|
+
*
|
|
21
21
|
* The above copyright notice and this permission notice shall be
|
|
22
22
|
* included in all copies or substantial portions of the Software.
|
|
23
|
-
*
|
|
23
|
+
*
|
|
24
24
|
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
25
25
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
26
26
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
@@ -49,100 +49,117 @@ import org.jruby.runtime.builtin.IRubyObject;
|
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* Class for Nokogiri::HTML::ElementDescription.
|
|
52
|
-
*
|
|
52
|
+
*
|
|
53
53
|
* @author Patrick Mahoney <pat@polycrystal.org>
|
|
54
54
|
*/
|
|
55
|
-
@JRubyClass(name="Nokogiri::HTML::ElementDescription")
|
|
56
|
-
public class HtmlElementDescription extends RubyObject
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
55
|
+
@JRubyClass(name = "Nokogiri::HTML::ElementDescription")
|
|
56
|
+
public class HtmlElementDescription extends RubyObject
|
|
57
|
+
{
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Stores memoized hash of element -> list of valid subelements.
|
|
61
|
+
*/
|
|
62
|
+
static protected Map<Short, List<String>> subElements;
|
|
63
|
+
static
|
|
64
|
+
{
|
|
65
|
+
Map<Short, List<String>> _subElements =
|
|
66
|
+
new HashMap<Short, List<String>>();
|
|
67
|
+
subElements = Collections.synchronizedMap(_subElements);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
protected HTMLElements.Element element;
|
|
71
|
+
|
|
72
|
+
public
|
|
73
|
+
HtmlElementDescription(Ruby runtime, RubyClass rubyClass)
|
|
74
|
+
{
|
|
75
|
+
super(runtime, rubyClass);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Lookup the list of sub elements of <code>code</code>. If not
|
|
80
|
+
* already stored, iterate through all elements to find valid
|
|
81
|
+
* subelements; save this list and return it.
|
|
82
|
+
*/
|
|
83
|
+
protected static List<String>
|
|
84
|
+
findSubElements(HTMLElements.Element elem)
|
|
85
|
+
{
|
|
86
|
+
List<String> subs = subElements.get(elem.code);
|
|
87
|
+
|
|
88
|
+
if (subs == null) {
|
|
89
|
+
subs = new ArrayList<String>();
|
|
90
|
+
|
|
91
|
+
/*
|
|
92
|
+
* A bit of a hack. NekoHtml source code shows that
|
|
93
|
+
* UNKNOWN is the highest value element. We cannot access
|
|
94
|
+
* the list of elements directly because it's protected.
|
|
95
|
+
*/
|
|
96
|
+
for (short c = 0; c < HTMLElements.UNKNOWN; c++) {
|
|
97
|
+
HTMLElements.Element maybe_sub =
|
|
98
|
+
HTMLElements.getElement(c);
|
|
99
|
+
if (maybe_sub.isParent(elem)) {
|
|
100
|
+
subs.add(maybe_sub.name);
|
|
99
101
|
}
|
|
102
|
+
}
|
|
100
103
|
|
|
101
|
-
|
|
104
|
+
subElements.put(elem.code, subs);
|
|
102
105
|
}
|
|
103
106
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
107
|
+
return subs;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@JRubyMethod(name = "[]", meta = true)
|
|
111
|
+
public static IRubyObject
|
|
112
|
+
get(ThreadContext context,
|
|
113
|
+
IRubyObject klazz, IRubyObject name)
|
|
114
|
+
{
|
|
115
|
+
|
|
116
|
+
// nekohtml will return an element even for invalid names, see
|
|
117
|
+
// http://sourceforge.net/p/nekohtml/code/HEAD/tree/trunk/src/org/cyberneko/html/HTMLElements.java#l514
|
|
118
|
+
// which breaks `test_fetch_nonexistent'
|
|
119
|
+
HTMLElements.Element elem = HTMLElements.getElement(name.asJavaString(), HTMLElements.NO_SUCH_ELEMENT);
|
|
120
|
+
if (elem == HTMLElements.NO_SUCH_ELEMENT) {
|
|
121
|
+
return context.nil;
|
|
119
122
|
}
|
|
120
123
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
HtmlElementDescription desc =
|
|
125
|
+
new HtmlElementDescription(context.getRuntime(), (RubyClass)klazz);
|
|
126
|
+
desc.element = elem;
|
|
127
|
+
return desc;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@JRubyMethod()
|
|
131
|
+
public IRubyObject
|
|
132
|
+
name(ThreadContext context)
|
|
133
|
+
{
|
|
134
|
+
return context.getRuntime().newString(element.name.toLowerCase());
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@JRubyMethod(name = "inline?")
|
|
138
|
+
public IRubyObject
|
|
139
|
+
inline_eh(ThreadContext context)
|
|
140
|
+
{
|
|
141
|
+
return context.getRuntime().newBoolean(element.isInline());
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@JRubyMethod(name = "empty?")
|
|
145
|
+
public IRubyObject
|
|
146
|
+
empty_eh(ThreadContext context)
|
|
147
|
+
{
|
|
148
|
+
return context.getRuntime().newBoolean(element.isEmpty());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
@JRubyMethod()
|
|
152
|
+
public IRubyObject
|
|
153
|
+
sub_elements(ThreadContext context)
|
|
154
|
+
{
|
|
155
|
+
Ruby ruby = context.getRuntime();
|
|
156
|
+
List<String> subs = findSubElements(element);
|
|
157
|
+
IRubyObject[] ary = new IRubyObject[subs.size()];
|
|
158
|
+
for (int i = 0; i < subs.size(); ++i) {
|
|
159
|
+
ary[i] = ruby.newString(subs.get(i));
|
|
124
160
|
}
|
|
125
161
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
return context.getRuntime().newBoolean(element.isInline());
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
@JRubyMethod(name="empty?")
|
|
132
|
-
public IRubyObject empty_eh(ThreadContext context) {
|
|
133
|
-
return context.getRuntime().newBoolean(element.isEmpty());
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
@JRubyMethod()
|
|
137
|
-
public IRubyObject sub_elements(ThreadContext context) {
|
|
138
|
-
Ruby ruby = context.getRuntime();
|
|
139
|
-
List<String> subs = findSubElements(element);
|
|
140
|
-
IRubyObject[] ary = new IRubyObject[subs.size()];
|
|
141
|
-
for (int i = 0; i < subs.size(); ++i) {
|
|
142
|
-
ary[i] = ruby.newString(subs.get(i));
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return ruby.newArray(ary);
|
|
146
|
-
}
|
|
162
|
+
return ruby.newArray(ary);
|
|
163
|
+
}
|
|
147
164
|
|
|
148
165
|
}
|