nokogiri-backupify 1.5.0.beta.4
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 +26 -0
- data/CHANGELOG.ja.rdoc +509 -0
- data/CHANGELOG.rdoc +490 -0
- data/Manifest.txt +274 -0
- data/README.ja.rdoc +106 -0
- data/README.rdoc +150 -0
- data/Rakefile +217 -0
- data/bin/nokogiri +54 -0
- data/deps.rip +5 -0
- data/ext/java/nokogiri/EncodingHandler.java +124 -0
- data/ext/java/nokogiri/HtmlDocument.java +146 -0
- data/ext/java/nokogiri/HtmlElementDescription.java +145 -0
- data/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
- data/ext/java/nokogiri/HtmlSaxParserContext.java +256 -0
- data/ext/java/nokogiri/NokogiriService.java +466 -0
- data/ext/java/nokogiri/XmlAttr.java +183 -0
- data/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
- data/ext/java/nokogiri/XmlCdata.java +89 -0
- data/ext/java/nokogiri/XmlComment.java +84 -0
- data/ext/java/nokogiri/XmlDocument.java +514 -0
- data/ext/java/nokogiri/XmlDocumentFragment.java +216 -0
- data/ext/java/nokogiri/XmlDtd.java +464 -0
- data/ext/java/nokogiri/XmlElement.java +221 -0
- data/ext/java/nokogiri/XmlElementContent.java +382 -0
- data/ext/java/nokogiri/XmlElementDecl.java +147 -0
- data/ext/java/nokogiri/XmlEntityDecl.java +161 -0
- data/ext/java/nokogiri/XmlEntityReference.java +75 -0
- data/ext/java/nokogiri/XmlNamespace.java +127 -0
- data/ext/java/nokogiri/XmlNode.java +1392 -0
- data/ext/java/nokogiri/XmlNodeSet.java +284 -0
- data/ext/java/nokogiri/XmlProcessingInstruction.java +103 -0
- data/ext/java/nokogiri/XmlReader.java +409 -0
- data/ext/java/nokogiri/XmlRelaxng.java +199 -0
- data/ext/java/nokogiri/XmlSaxParserContext.java +353 -0
- data/ext/java/nokogiri/XmlSaxPushParser.java +182 -0
- data/ext/java/nokogiri/XmlSchema.java +175 -0
- data/ext/java/nokogiri/XmlSyntaxError.java +114 -0
- data/ext/java/nokogiri/XmlText.java +135 -0
- data/ext/java/nokogiri/XmlXpathContext.java +175 -0
- data/ext/java/nokogiri/XsltStylesheet.java +181 -0
- data/ext/java/nokogiri/internals/HtmlDomParserContext.java +205 -0
- data/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
- data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +80 -0
- data/ext/java/nokogiri/internals/NokogiriHandler.java +326 -0
- data/ext/java/nokogiri/internals/NokogiriHelpers.java +583 -0
- data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +170 -0
- data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +118 -0
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +73 -0
- data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
- data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +78 -0
- data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +120 -0
- data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +56 -0
- data/ext/java/nokogiri/internals/ParserContext.java +278 -0
- data/ext/java/nokogiri/internals/PushInputStream.java +411 -0
- data/ext/java/nokogiri/internals/ReaderNode.java +473 -0
- data/ext/java/nokogiri/internals/SaveContext.java +282 -0
- data/ext/java/nokogiri/internals/SchemaErrorHandler.java +68 -0
- data/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
- data/ext/java/nokogiri/internals/XmlDomParser.java +77 -0
- data/ext/java/nokogiri/internals/XmlDomParserContext.java +233 -0
- data/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
- data/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +124 -0
- data/ext/nokogiri/html_document.c +154 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_element_description.c +276 -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 +94 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/nokogiri.c +92 -0
- data/ext/nokogiri/nokogiri.h +160 -0
- data/ext/nokogiri/xml_attr.c +94 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +56 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_comment.c +54 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +478 -0
- data/ext/nokogiri/xml_document.h +23 -0
- data/ext/nokogiri/xml_document_fragment.c +48 -0
- data/ext/nokogiri/xml_document_fragment.h +10 -0
- data/ext/nokogiri/xml_dtd.c +202 -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_encoding_handler.c +79 -0
- data/ext/nokogiri/xml_encoding_handler.h +8 -0
- data/ext/nokogiri/xml_entity_decl.c +110 -0
- data/ext/nokogiri/xml_entity_decl.h +10 -0
- data/ext/nokogiri/xml_entity_reference.c +52 -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_libxml2_hacks.c +112 -0
- data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
- data/ext/nokogiri/xml_namespace.c +84 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +1384 -0
- data/ext/nokogiri/xml_node.h +13 -0
- data/ext/nokogiri/xml_node_set.c +418 -0
- data/ext/nokogiri/xml_node_set.h +9 -0
- data/ext/nokogiri/xml_processing_instruction.c +56 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +684 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_relax_ng.c +161 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +288 -0
- data/ext/nokogiri/xml_sax_parser.h +39 -0
- data/ext/nokogiri/xml_sax_parser_context.c +199 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +115 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +58 -0
- data/ext/nokogiri/xml_syntax_error.h +13 -0
- data/ext/nokogiri/xml_text.c +50 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath_context.c +309 -0
- data/ext/nokogiri/xml_xpath_context.h +9 -0
- data/ext/nokogiri/xslt_stylesheet.c +258 -0
- data/ext/nokogiri/xslt_stylesheet.h +9 -0
- data/lib/isorelax.jar +0 -0
- data/lib/jing.jar +0 -0
- data/lib/nekodtd.jar +0 -0
- data/lib/nekohtml.jar +0 -0
- data/lib/nokogiri.rb +143 -0
- data/lib/nokogiri/css.rb +23 -0
- data/lib/nokogiri/css/node.rb +99 -0
- data/lib/nokogiri/css/parser.rb +677 -0
- data/lib/nokogiri/css/parser.y +237 -0
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +152 -0
- data/lib/nokogiri/css/tokenizer.rex +55 -0
- data/lib/nokogiri/css/xpath_visitor.rb +171 -0
- data/lib/nokogiri/decorators/slop.rb +35 -0
- data/lib/nokogiri/html.rb +36 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +221 -0
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/element_description_defaults.rb +671 -0
- data/lib/nokogiri/html/entity_lookup.rb +13 -0
- data/lib/nokogiri/html/sax/parser.rb +52 -0
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +35 -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 +418 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +218 -0
- data/lib/nokogiri/xml/document_fragment.rb +84 -0
- data/lib/nokogiri/xml/dtd.rb +22 -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 +19 -0
- data/lib/nokogiri/xml/namespace.rb +13 -0
- data/lib/nokogiri/xml/node.rb +907 -0
- data/lib/nokogiri/xml/node/save_options.rb +45 -0
- data/lib/nokogiri/xml/node_set.rb +350 -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 +112 -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 +164 -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 +57 -0
- data/lib/nokogiri/xml/syntax_error.rb +47 -0
- data/lib/nokogiri/xml/text.rb +9 -0
- data/lib/nokogiri/xml/xpath.rb +10 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xslt.rb +52 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xercesImpl.jar +0 -0
- data/lib/xsd/xmlparser/nokogiri.rb +90 -0
- data/tasks/cross_compile.rb +177 -0
- data/tasks/test.rb +94 -0
- data/test/css/test_nthiness.rb +159 -0
- data/test/css/test_parser.rb +303 -0
- data/test/css/test_tokenizer.rb +198 -0
- data/test/css/test_xpath_visitor.rb +85 -0
- data/test/decorators/test_slop.rb +16 -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 +171 -0
- data/test/html/sax/test_parser.rb +136 -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 +457 -0
- data/test/html/test_document_encoding.rb +123 -0
- data/test/html/test_document_fragment.rb +255 -0
- data/test/html/test_element_description.rb +100 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +190 -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_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +52 -0
- data/test/test_nokogiri.rb +132 -0
- data/test/test_reader.rb +403 -0
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +189 -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 +338 -0
- data/test/xml/sax/test_parser_context.rb +113 -0
- data/test/xml/sax/test_push_parser.rb +156 -0
- data/test/xml/test_attr.rb +65 -0
- data/test/xml/test_attribute_decl.rb +86 -0
- data/test/xml/test_builder.rb +210 -0
- data/test/xml/test_cdata.rb +50 -0
- data/test/xml/test_comment.rb +29 -0
- data/test/xml/test_document.rb +675 -0
- data/test/xml/test_document_encoding.rb +26 -0
- data/test/xml/test_document_fragment.rb +192 -0
- data/test/xml/test_dtd.rb +107 -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 +122 -0
- data/test/xml/test_entity_reference.rb +21 -0
- data/test/xml/test_namespace.rb +70 -0
- data/test/xml/test_node.rb +899 -0
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +107 -0
- data/test/xml/test_node_reparenting.rb +321 -0
- data/test/xml/test_node_set.rb +708 -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 +12 -0
- data/test/xml/test_text.rb +47 -0
- data/test/xml/test_unparented_node.rb +381 -0
- data/test/xml/test_xpath.rb +237 -0
- data/test/xslt/test_custom_functions.rb +94 -0
- metadata +525 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (The MIT License)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2008 - 2010:
|
|
5
|
+
*
|
|
6
|
+
* * {Aaron Patterson}[http://tenderlovemaking.com]
|
|
7
|
+
* * {Mike Dalessio}[http://mike.daless.io]
|
|
8
|
+
* * {Charles Nutter}[http://blog.headius.com]
|
|
9
|
+
* * {Sergio Arbeo}[http://www.serabe.com]
|
|
10
|
+
* * {Patrick Mahoney}[http://polycrystal.org]
|
|
11
|
+
* * {Yoko Harada}[http://yokolet.blogspot.com]
|
|
12
|
+
*
|
|
13
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
|
14
|
+
* a copy of this software and associated documentation files (the
|
|
15
|
+
* 'Software'), to deal in the Software without restriction, including
|
|
16
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
|
17
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
18
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
|
19
|
+
* the following conditions:
|
|
20
|
+
*
|
|
21
|
+
* The above copyright notice and this permission notice shall be
|
|
22
|
+
* included in all copies or substantial portions of the Software.
|
|
23
|
+
*
|
|
24
|
+
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
26
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
27
|
+
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
28
|
+
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
29
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
30
|
+
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
package nokogiri;
|
|
34
|
+
|
|
35
|
+
import static nokogiri.internals.NokogiriHelpers.isXmlEscaped;
|
|
36
|
+
import static nokogiri.internals.NokogiriHelpers.rubyStringToString;
|
|
37
|
+
import static nokogiri.internals.NokogiriHelpers.stringOrNil;
|
|
38
|
+
import nokogiri.internals.NokogiriHelpers;
|
|
39
|
+
import nokogiri.internals.SaveContext;
|
|
40
|
+
|
|
41
|
+
import org.jruby.Ruby;
|
|
42
|
+
import org.jruby.RubyClass;
|
|
43
|
+
import org.jruby.anno.JRubyClass;
|
|
44
|
+
import org.jruby.anno.JRubyMethod;
|
|
45
|
+
import org.jruby.javasupport.JavaUtil;
|
|
46
|
+
import org.jruby.runtime.ThreadContext;
|
|
47
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
|
48
|
+
import org.w3c.dom.Document;
|
|
49
|
+
import org.w3c.dom.Node;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Class for Nokogiri::XML::Text
|
|
53
|
+
*
|
|
54
|
+
*/
|
|
55
|
+
@JRubyClass(name="Nokogiri::XML::Text", parent="Nokogiri::XML::CharacterData")
|
|
56
|
+
public class XmlText extends XmlNode {
|
|
57
|
+
|
|
58
|
+
public XmlText(Ruby runtime, RubyClass rubyClass, Node node) {
|
|
59
|
+
super(runtime, rubyClass, node);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public XmlText(Ruby runtime, RubyClass klass) {
|
|
63
|
+
super(runtime, klass);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@Override
|
|
67
|
+
protected void init(ThreadContext context, IRubyObject[] args) {
|
|
68
|
+
if (args.length < 2) {
|
|
69
|
+
throw getRuntime().newArgumentError(args.length, 2);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
content = args[0];
|
|
73
|
+
IRubyObject xNode = args[1];
|
|
74
|
+
|
|
75
|
+
XmlNode xmlNode = asXmlNode(context, xNode);
|
|
76
|
+
XmlDocument xmlDoc = (XmlDocument)xmlNode.document(context);
|
|
77
|
+
doc = xmlDoc;
|
|
78
|
+
Document document = xmlDoc.getDocument();
|
|
79
|
+
// text node content should not be encoded when it is created by Text node.
|
|
80
|
+
// while content should be encoded when it is created by Element node.
|
|
81
|
+
Node node = document.createTextNode(rubyStringToString(content));
|
|
82
|
+
setNode(context, node);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@Override
|
|
86
|
+
protected IRubyObject getNodeName(ThreadContext context) {
|
|
87
|
+
if (name == null) name = context.getRuntime().newString("text");
|
|
88
|
+
return name;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@Override
|
|
92
|
+
@JRubyMethod(name = {"content", "text", "inner_text"})
|
|
93
|
+
public IRubyObject content(ThreadContext context) {
|
|
94
|
+
if (content == null || content.isNil()) {
|
|
95
|
+
return stringOrNil(context.getRuntime(), node.getTextContent());
|
|
96
|
+
} else {
|
|
97
|
+
return content;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@Override
|
|
102
|
+
public void saveContent(ThreadContext context, SaveContext ctx) {
|
|
103
|
+
String textContent = node.getTextContent();
|
|
104
|
+
|
|
105
|
+
if (!isXmlEscaped(textContent)) {
|
|
106
|
+
textContent = NokogiriHelpers.encodeJavaString(textContent);
|
|
107
|
+
}
|
|
108
|
+
if (getEncoding(context, ctx) == null) {
|
|
109
|
+
textContent = encodeStringToHtmlEntity(textContent);
|
|
110
|
+
}
|
|
111
|
+
ctx.append(textContent);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private String getEncoding(ThreadContext context, SaveContext ctx) {
|
|
115
|
+
String encoding = ctx.getEncoding();
|
|
116
|
+
if (encoding != null) return encoding;
|
|
117
|
+
XmlDocument xmlDocument = (XmlDocument)document(context);
|
|
118
|
+
IRubyObject ruby_encoding = xmlDocument.encoding(context);
|
|
119
|
+
if (!ruby_encoding.isNil()) {
|
|
120
|
+
encoding = rubyStringToString(ruby_encoding);
|
|
121
|
+
}
|
|
122
|
+
return encoding;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private String encodeStringToHtmlEntity(String text) {
|
|
126
|
+
int last = 126; // = U+007E. No need to encode under U+007E.
|
|
127
|
+
StringBuffer sb = new StringBuffer();
|
|
128
|
+
for (int i=0; i<text.length(); i++) {
|
|
129
|
+
int codePoint = text.codePointAt(i);
|
|
130
|
+
if (codePoint > last) sb.append("&#x" + Integer.toHexString(codePoint) + ";");
|
|
131
|
+
else sb.append(text.charAt(i));
|
|
132
|
+
}
|
|
133
|
+
return new String(sb);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (The MIT License)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2008 - 2010:
|
|
5
|
+
*
|
|
6
|
+
* * {Aaron Patterson}[http://tenderlovemaking.com]
|
|
7
|
+
* * {Mike Dalessio}[http://mike.daless.io]
|
|
8
|
+
* * {Charles Nutter}[http://blog.headius.com]
|
|
9
|
+
* * {Sergio Arbeo}[http://www.serabe.com]
|
|
10
|
+
* * {Patrick Mahoney}[http://polycrystal.org]
|
|
11
|
+
* * {Yoko Harada}[http://yokolet.blogspot.com]
|
|
12
|
+
*
|
|
13
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
|
14
|
+
* a copy of this software and associated documentation files (the
|
|
15
|
+
* 'Software'), to deal in the Software without restriction, including
|
|
16
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
|
17
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
18
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
|
19
|
+
* the following conditions:
|
|
20
|
+
*
|
|
21
|
+
* The above copyright notice and this permission notice shall be
|
|
22
|
+
* included in all copies or substantial portions of the Software.
|
|
23
|
+
*
|
|
24
|
+
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
26
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
27
|
+
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
28
|
+
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
29
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
30
|
+
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
package nokogiri;
|
|
34
|
+
|
|
35
|
+
import java.util.Set;
|
|
36
|
+
import java.util.regex.Matcher;
|
|
37
|
+
import java.util.regex.Pattern;
|
|
38
|
+
|
|
39
|
+
import javax.xml.xpath.XPath;
|
|
40
|
+
import javax.xml.xpath.XPathConstants;
|
|
41
|
+
import javax.xml.xpath.XPathExpression;
|
|
42
|
+
import javax.xml.xpath.XPathExpressionException;
|
|
43
|
+
import javax.xml.xpath.XPathFactory;
|
|
44
|
+
|
|
45
|
+
import nokogiri.internals.NokogiriNamespaceContext;
|
|
46
|
+
import nokogiri.internals.NokogiriXPathFunctionResolver;
|
|
47
|
+
import nokogiri.internals.NokogiriXPathVariableResolver;
|
|
48
|
+
|
|
49
|
+
import org.jruby.Ruby;
|
|
50
|
+
import org.jruby.RubyBoolean;
|
|
51
|
+
import org.jruby.RubyClass;
|
|
52
|
+
import org.jruby.RubyException;
|
|
53
|
+
import org.jruby.RubyNumeric;
|
|
54
|
+
import org.jruby.RubyObject;
|
|
55
|
+
import org.jruby.RubyString;
|
|
56
|
+
import org.jruby.anno.JRubyClass;
|
|
57
|
+
import org.jruby.anno.JRubyMethod;
|
|
58
|
+
import org.jruby.exceptions.RaiseException;
|
|
59
|
+
import org.jruby.runtime.ThreadContext;
|
|
60
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
|
61
|
+
import org.w3c.dom.NodeList;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Class for Nokogiri::XML::XpathContext
|
|
65
|
+
*
|
|
66
|
+
*/
|
|
67
|
+
@JRubyClass(name="Nokogiri::XML::XPathContext")
|
|
68
|
+
public class XmlXpathContext extends RubyObject {
|
|
69
|
+
private XmlNode context;
|
|
70
|
+
private XPath xpath;
|
|
71
|
+
|
|
72
|
+
public XmlXpathContext(Ruby ruby, RubyClass rubyClass, XmlNode context) {
|
|
73
|
+
super(ruby, rubyClass);
|
|
74
|
+
this.context = context;
|
|
75
|
+
this.xpath = XPathFactory.newInstance().newXPath();
|
|
76
|
+
this.xpath.setNamespaceContext(new NokogiriNamespaceContext());
|
|
77
|
+
this.xpath.setXPathVariableResolver(new NokogiriXPathVariableResolver());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@JRubyMethod(name = "new", meta = true)
|
|
81
|
+
public static IRubyObject rbNew(ThreadContext context, IRubyObject cls, IRubyObject node) {
|
|
82
|
+
XmlNode xmlNode = (XmlNode)node;
|
|
83
|
+
return new XmlXpathContext(context.getRuntime(), (RubyClass)cls, xmlNode);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@JRubyMethod
|
|
87
|
+
public IRubyObject evaluate(ThreadContext context, IRubyObject expr, IRubyObject handler) {
|
|
88
|
+
String src = expr.convertToString().asJavaString();
|
|
89
|
+
try {
|
|
90
|
+
if(!handler.isNil()) {
|
|
91
|
+
if (!isContainsPrefix(src)) {
|
|
92
|
+
Set<String> methodNames = handler.getMetaClass().getMethods().keySet();
|
|
93
|
+
for (String name : methodNames) {
|
|
94
|
+
src = src.replaceAll(name, NokogiriNamespaceContext.NOKOGIRI_PREFIX+":"+name);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
xpath.setXPathFunctionResolver(new NokogiriXPathFunctionResolver(handler));
|
|
98
|
+
}
|
|
99
|
+
XPathExpression xpathExpression = xpath.compile(src);
|
|
100
|
+
return node_set(context, xpathExpression);
|
|
101
|
+
//return new XmlXpath(context.getRuntime(), (RubyClass)context.getRuntime().getClassFromPath("Nokogiri::XML::XPath"), xpathExpression, this.context);
|
|
102
|
+
} catch (XPathExpressionException xpee) {
|
|
103
|
+
xpee = new XPathExpressionException(src);
|
|
104
|
+
RubyException e =
|
|
105
|
+
XmlSyntaxError.createXPathSyntaxError(getRuntime(), xpee);
|
|
106
|
+
throw new RaiseException(e);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
protected IRubyObject node_set(ThreadContext rbctx, XPathExpression xpathExpression) {
|
|
111
|
+
XmlNodeSet result = null;
|
|
112
|
+
try {
|
|
113
|
+
result = tryGetNodeSet(xpathExpression);
|
|
114
|
+
// result.relink_namespace(context);
|
|
115
|
+
result.setDocument(context.document(rbctx));
|
|
116
|
+
return result;
|
|
117
|
+
} catch (XPathExpressionException xpee) {
|
|
118
|
+
try {
|
|
119
|
+
return tryGetOpaqueValue(xpathExpression);
|
|
120
|
+
} catch (XPathExpressionException xpee_opaque) {
|
|
121
|
+
RubyException e = XmlSyntaxError.createXPathSyntaxError(getRuntime(), xpee_opaque);
|
|
122
|
+
throw new RaiseException(e);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private XmlNodeSet tryGetNodeSet(XPathExpression xpathExpression) throws XPathExpressionException {
|
|
128
|
+
NodeList nodes = (NodeList)xpathExpression.evaluate(context.node, XPathConstants.NODESET);
|
|
129
|
+
return new XmlNodeSet(getRuntime(), nodes);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
private static Pattern number_pattern = Pattern.compile("\\d.*");
|
|
133
|
+
private static Pattern boolean_pattern = Pattern.compile("true|false");
|
|
134
|
+
|
|
135
|
+
private IRubyObject tryGetOpaqueValue(XPathExpression xpathExpression) throws XPathExpressionException {
|
|
136
|
+
String string = (String)xpathExpression.evaluate(context.node, XPathConstants.STRING);
|
|
137
|
+
if (doesMatch(number_pattern, string)) return RubyNumeric.dbl2num(getRuntime(), Double.parseDouble(string));
|
|
138
|
+
if (doesMatch(boolean_pattern, string)) return RubyBoolean.newBoolean(getRuntime(), Boolean.parseBoolean(string));
|
|
139
|
+
return RubyString.newString(getRuntime(), string);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
private boolean doesMatch(Pattern pattern, String string) {
|
|
143
|
+
Matcher m = pattern.matcher(string);
|
|
144
|
+
return m.matches();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
private boolean isContainsPrefix(String str) {
|
|
148
|
+
Set<String> prefixes = ((NokogiriNamespaceContext)xpath.getNamespaceContext()).getAllPrefixes();
|
|
149
|
+
for (String prefix : prefixes) {
|
|
150
|
+
if (str.contains(prefix + ":")) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@JRubyMethod
|
|
159
|
+
public IRubyObject evaluate(ThreadContext context, IRubyObject expr) {
|
|
160
|
+
return this.evaluate(context, expr, context.getRuntime().getNil());
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@JRubyMethod
|
|
164
|
+
public IRubyObject register_ns(ThreadContext context, IRubyObject prefix, IRubyObject uri) {
|
|
165
|
+
((NokogiriNamespaceContext) this.xpath.getNamespaceContext()).registerNamespace(prefix.convertToString().asJavaString(), uri.convertToString().asJavaString());
|
|
166
|
+
return this;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@JRubyMethod
|
|
170
|
+
public IRubyObject register_variable(ThreadContext context, IRubyObject name, IRubyObject value) {
|
|
171
|
+
((NokogiriXPathVariableResolver) this.xpath.getXPathVariableResolver()).
|
|
172
|
+
registerVariable(name.convertToString().asJavaString(), value.convertToString().asJavaString());
|
|
173
|
+
return this;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (The MIT License)
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2008 - 2010:
|
|
5
|
+
*
|
|
6
|
+
* * {Aaron Patterson}[http://tenderlovemaking.com]
|
|
7
|
+
* * {Mike Dalessio}[http://mike.daless.io]
|
|
8
|
+
* * {Charles Nutter}[http://blog.headius.com]
|
|
9
|
+
* * {Sergio Arbeo}[http://www.serabe.com]
|
|
10
|
+
* * {Patrick Mahoney}[http://polycrystal.org]
|
|
11
|
+
* * {Yoko Harada}[http://yokolet.blogspot.com]
|
|
12
|
+
*
|
|
13
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
|
14
|
+
* a copy of this software and associated documentation files (the
|
|
15
|
+
* 'Software'), to deal in the Software without restriction, including
|
|
16
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
|
17
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
18
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
|
19
|
+
* the following conditions:
|
|
20
|
+
*
|
|
21
|
+
* The above copyright notice and this permission notice shall be
|
|
22
|
+
* included in all copies or substantial portions of the Software.
|
|
23
|
+
*
|
|
24
|
+
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
26
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
27
|
+
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
28
|
+
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
29
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
30
|
+
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
package nokogiri;
|
|
34
|
+
|
|
35
|
+
import static nokogiri.internals.NokogiriHelpers.getNokogiriClass;
|
|
36
|
+
|
|
37
|
+
import java.util.HashMap;
|
|
38
|
+
import java.util.Map;
|
|
39
|
+
import java.util.regex.Matcher;
|
|
40
|
+
import java.util.regex.Pattern;
|
|
41
|
+
|
|
42
|
+
import javax.xml.transform.Templates;
|
|
43
|
+
import javax.xml.transform.Transformer;
|
|
44
|
+
import javax.xml.transform.TransformerConfigurationException;
|
|
45
|
+
import javax.xml.transform.TransformerException;
|
|
46
|
+
import javax.xml.transform.TransformerFactory;
|
|
47
|
+
import javax.xml.transform.dom.DOMResult;
|
|
48
|
+
import javax.xml.transform.dom.DOMSource;
|
|
49
|
+
|
|
50
|
+
import org.jruby.Ruby;
|
|
51
|
+
import org.jruby.RubyArray;
|
|
52
|
+
import org.jruby.RubyClass;
|
|
53
|
+
import org.jruby.RubyObject;
|
|
54
|
+
import org.jruby.anno.JRubyClass;
|
|
55
|
+
import org.jruby.anno.JRubyMethod;
|
|
56
|
+
import org.jruby.javasupport.util.RuntimeHelpers;
|
|
57
|
+
import org.jruby.runtime.ThreadContext;
|
|
58
|
+
import org.jruby.runtime.builtin.IRubyObject;
|
|
59
|
+
import org.w3c.dom.Document;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Class for Nokogiri::XSLT::Stylesheet
|
|
63
|
+
*
|
|
64
|
+
*/
|
|
65
|
+
@JRubyClass(name="Nokogiri::XSLT::Stylesheet")
|
|
66
|
+
public class XsltStylesheet extends RubyObject {
|
|
67
|
+
private static Map<String, Object> registry = new HashMap<String, Object>();
|
|
68
|
+
private static TransformerFactory factory = null;
|
|
69
|
+
private Templates sheet;
|
|
70
|
+
|
|
71
|
+
public static Map<String, Object> getRegistry() {
|
|
72
|
+
return registry;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public XsltStylesheet(Ruby ruby, RubyClass rubyClass) {
|
|
76
|
+
super(ruby, rubyClass);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private void addParametersToTransformer(ThreadContext context, Transformer transf, IRubyObject parameters) {
|
|
80
|
+
Ruby ruby = context.getRuntime();
|
|
81
|
+
RubyArray params = parameters.convertToArray();
|
|
82
|
+
int limit = params.getLength();
|
|
83
|
+
if(limit % 2 == 1) limit--;
|
|
84
|
+
|
|
85
|
+
for(int i = 0; i < limit; i+=2) {
|
|
86
|
+
String name = params.aref(ruby.newFixnum(i)).asJavaString();
|
|
87
|
+
String value = params.aref(ruby.newFixnum(i+1)).asJavaString();
|
|
88
|
+
transf.setParameter(name, unparseValue(value));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private Pattern p = Pattern.compile("'.{1,}'");
|
|
93
|
+
|
|
94
|
+
private String unparseValue(String orig) {
|
|
95
|
+
Matcher m = p.matcher(orig);
|
|
96
|
+
if ((orig.startsWith("\"") && orig.endsWith("\"")) || m.matches()) {
|
|
97
|
+
orig = orig.substring(1, orig.length()-1);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return orig;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@JRubyMethod(meta = true)
|
|
104
|
+
public static IRubyObject parse_stylesheet_doc(ThreadContext context, IRubyObject cls, IRubyObject document) {
|
|
105
|
+
|
|
106
|
+
Ruby ruby = context.getRuntime();
|
|
107
|
+
|
|
108
|
+
if(!(document instanceof XmlDocument)) {
|
|
109
|
+
throw ruby.newArgumentError("doc must be a Nokogiri::XML::Document instance");
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
XmlDocument xmlDoc = (XmlDocument) document;
|
|
113
|
+
|
|
114
|
+
RubyArray errors = (RubyArray) xmlDoc.getInstanceVariable("@errors");
|
|
115
|
+
|
|
116
|
+
if(!errors.isEmpty()) {
|
|
117
|
+
throw ruby.newRuntimeError(errors.first().asJavaString());
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
Document doc = ((XmlDocument) xmlDoc.dup_implementation(context, true)).getDocument();
|
|
121
|
+
|
|
122
|
+
XsltStylesheet xslt = new XsltStylesheet(ruby, (RubyClass) cls);
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
if (factory == null) factory = TransformerFactory.newInstance();
|
|
126
|
+
xslt.sheet = factory.newTemplates(new DOMSource(doc));
|
|
127
|
+
} catch (TransformerConfigurationException ex) {
|
|
128
|
+
ruby.newRuntimeError("could not parse xslt stylesheet");
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return xslt;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
@JRubyMethod
|
|
135
|
+
public IRubyObject serialize(ThreadContext context, IRubyObject doc) {
|
|
136
|
+
return RuntimeHelpers.invoke(context,
|
|
137
|
+
RuntimeHelpers.invoke(context, doc, "root"),
|
|
138
|
+
"to_s");
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@JRubyMethod(rest = true, required=1, optional=2)
|
|
142
|
+
public IRubyObject transform(ThreadContext context, IRubyObject[] args) {
|
|
143
|
+
Ruby ruby = context.getRuntime();
|
|
144
|
+
|
|
145
|
+
DOMSource docSource = new DOMSource(((XmlDocument) args[0]).getDocument());
|
|
146
|
+
DOMResult result = new DOMResult();
|
|
147
|
+
|
|
148
|
+
try{
|
|
149
|
+
Transformer transf = this.sheet.newTransformer();
|
|
150
|
+
if(args.length > 1) {
|
|
151
|
+
addParametersToTransformer(context, transf, args[1]);
|
|
152
|
+
}
|
|
153
|
+
transf.transform(docSource, result);
|
|
154
|
+
} catch(TransformerConfigurationException ex) {
|
|
155
|
+
throw ruby.newRuntimeError("Could not transform the document.");
|
|
156
|
+
} catch(TransformerException ex) {
|
|
157
|
+
throw ruby.newRuntimeError("Could not transform the document.");
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if ("html".equals(result.getNode().getFirstChild().getNodeName())) {
|
|
161
|
+
return new HtmlDocument(ruby,
|
|
162
|
+
getNokogiriClass(ruby, "Nokogiri::HTML::Document"),
|
|
163
|
+
(Document) result.getNode());
|
|
164
|
+
} else {
|
|
165
|
+
return new XmlDocument(ruby,
|
|
166
|
+
getNokogiriClass(ruby, "Nokogiri::XML::Document"),
|
|
167
|
+
(Document) result.getNode());
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@JRubyMethod(name = {"registr", "register"}, meta = true)
|
|
172
|
+
public static IRubyObject register(ThreadContext context, IRubyObject cls, IRubyObject uri, IRubyObject receiver) {
|
|
173
|
+
throw context.getRuntime().newNotImplementedError("Nokogiri::XSLT.register method is not implemented");
|
|
174
|
+
/* When API conflict is solved, this method should be below:
|
|
175
|
+
// ThreadContext is used while executing xslt extension function
|
|
176
|
+
registry.put("context", context);
|
|
177
|
+
registry.put("receiver", receiver);
|
|
178
|
+
return context.getRuntime().getNil();
|
|
179
|
+
*/
|
|
180
|
+
}
|
|
181
|
+
}
|