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,258 @@
|
|
|
1
|
+
#include <xslt_stylesheet.h>
|
|
2
|
+
|
|
3
|
+
#include <libxslt/xsltInternals.h>
|
|
4
|
+
#include <libxslt/xsltutils.h>
|
|
5
|
+
#include <libxslt/transform.h>
|
|
6
|
+
#include <libexslt/exslt.h>
|
|
7
|
+
|
|
8
|
+
VALUE xslt;
|
|
9
|
+
|
|
10
|
+
int vasprintf (char **strp, const char *fmt, va_list ap);
|
|
11
|
+
|
|
12
|
+
static void dealloc(xsltStylesheetPtr doc)
|
|
13
|
+
{
|
|
14
|
+
NOKOGIRI_DEBUG_START(doc);
|
|
15
|
+
xsltFreeStylesheet(doc); /* commented out for now. */
|
|
16
|
+
NOKOGIRI_DEBUG_END(doc);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
NORETURN(static void xslt_generic_error_handler(void * ctx, const char *msg, ...));
|
|
20
|
+
static void xslt_generic_error_handler(void * ctx, const char *msg, ...)
|
|
21
|
+
{
|
|
22
|
+
char * message;
|
|
23
|
+
|
|
24
|
+
va_list args;
|
|
25
|
+
va_start(args, msg);
|
|
26
|
+
vasprintf(&message, msg, args);
|
|
27
|
+
va_end(args);
|
|
28
|
+
|
|
29
|
+
rb_exc_raise(rb_exc_new2(rb_eRuntimeError, message));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/*
|
|
33
|
+
* call-seq:
|
|
34
|
+
* parse_stylesheet_doc(document)
|
|
35
|
+
*
|
|
36
|
+
* Parse a stylesheet from +document+.
|
|
37
|
+
*/
|
|
38
|
+
static VALUE parse_stylesheet_doc(VALUE klass, VALUE xmldocobj)
|
|
39
|
+
{
|
|
40
|
+
xmlDocPtr xml ;
|
|
41
|
+
xsltStylesheetPtr ss ;
|
|
42
|
+
Data_Get_Struct(xmldocobj, xmlDoc, xml);
|
|
43
|
+
exsltRegisterAll();
|
|
44
|
+
|
|
45
|
+
xsltSetGenericErrorFunc(NULL, xslt_generic_error_handler);
|
|
46
|
+
|
|
47
|
+
ss = xsltParseStylesheetDoc(xmlCopyDoc(xml, 1)); /* 1 => recursive */
|
|
48
|
+
|
|
49
|
+
xsltSetGenericErrorFunc(NULL, NULL);
|
|
50
|
+
|
|
51
|
+
return Data_Wrap_Struct(klass, NULL, dealloc, ss);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
* call-seq:
|
|
57
|
+
* serialize(document)
|
|
58
|
+
*
|
|
59
|
+
* Serialize +document+ to an xml string.
|
|
60
|
+
*/
|
|
61
|
+
static VALUE serialize(VALUE self, VALUE xmlobj)
|
|
62
|
+
{
|
|
63
|
+
xmlDocPtr xml ;
|
|
64
|
+
xsltStylesheetPtr ss ;
|
|
65
|
+
xmlChar* doc_ptr ;
|
|
66
|
+
int doc_len ;
|
|
67
|
+
VALUE rval ;
|
|
68
|
+
|
|
69
|
+
Data_Get_Struct(xmlobj, xmlDoc, xml);
|
|
70
|
+
Data_Get_Struct(self, xsltStylesheet, ss);
|
|
71
|
+
xsltSaveResultToString(&doc_ptr, &doc_len, xml, ss);
|
|
72
|
+
rval = NOKOGIRI_STR_NEW(doc_ptr, doc_len);
|
|
73
|
+
xmlFree(doc_ptr);
|
|
74
|
+
return rval ;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/*
|
|
78
|
+
* call-seq:
|
|
79
|
+
* transform(document, params = [])
|
|
80
|
+
*
|
|
81
|
+
* Apply an XSLT stylesheet to an XML::Document.
|
|
82
|
+
* +params+ is an array of strings used as XSLT parameters.
|
|
83
|
+
* returns Nokogiri::XML::Document
|
|
84
|
+
*
|
|
85
|
+
* Example:
|
|
86
|
+
*
|
|
87
|
+
* doc = Nokogiri::XML(File.read(ARGV[0]))
|
|
88
|
+
* xslt = Nokogiri::XSLT(File.read(ARGV[1]))
|
|
89
|
+
* puts xslt.transform(doc, ['key', 'value'])
|
|
90
|
+
*
|
|
91
|
+
*/
|
|
92
|
+
static VALUE transform(int argc, VALUE* argv, VALUE self)
|
|
93
|
+
{
|
|
94
|
+
VALUE xmldoc, paramobj ;
|
|
95
|
+
xmlDocPtr xml ;
|
|
96
|
+
xmlDocPtr result ;
|
|
97
|
+
xsltStylesheetPtr ss ;
|
|
98
|
+
const char** params ;
|
|
99
|
+
long param_len, j ;
|
|
100
|
+
|
|
101
|
+
rb_scan_args(argc, argv, "11", &xmldoc, ¶mobj);
|
|
102
|
+
if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0L) ; }
|
|
103
|
+
|
|
104
|
+
/* handle hashes as arguments. */
|
|
105
|
+
if(T_HASH == TYPE(paramobj)) {
|
|
106
|
+
paramobj = rb_funcall(paramobj, rb_intern("to_a"), 0);
|
|
107
|
+
paramobj = rb_funcall(paramobj, rb_intern("flatten"), 0);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
Check_Type(paramobj, T_ARRAY);
|
|
111
|
+
|
|
112
|
+
Data_Get_Struct(xmldoc, xmlDoc, xml);
|
|
113
|
+
Data_Get_Struct(self, xsltStylesheet, ss);
|
|
114
|
+
|
|
115
|
+
param_len = RARRAY_LEN(paramobj);
|
|
116
|
+
params = calloc((size_t)param_len+1, sizeof(char*));
|
|
117
|
+
for (j = 0 ; j < param_len ; j++) {
|
|
118
|
+
VALUE entry = rb_ary_entry(paramobj, j);
|
|
119
|
+
const char * ptr = StringValuePtr(entry);
|
|
120
|
+
params[j] = ptr;
|
|
121
|
+
}
|
|
122
|
+
params[param_len] = 0 ;
|
|
123
|
+
|
|
124
|
+
result = xsltApplyStylesheet(ss, xml, params);
|
|
125
|
+
free(params);
|
|
126
|
+
|
|
127
|
+
if (!result) rb_raise(rb_eRuntimeError, "could not perform xslt transform on document");
|
|
128
|
+
|
|
129
|
+
return Nokogiri_wrap_xml_document((VALUE)0, result) ;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
static void method_caller(xmlXPathParserContextPtr ctxt, int nargs)
|
|
133
|
+
{
|
|
134
|
+
const xmlChar * function;
|
|
135
|
+
const xmlChar * functionURI;
|
|
136
|
+
size_t i, count;
|
|
137
|
+
|
|
138
|
+
xsltTransformContextPtr transform;
|
|
139
|
+
xmlXPathObjectPtr xpath;
|
|
140
|
+
VALUE obj;
|
|
141
|
+
VALUE *args;
|
|
142
|
+
VALUE result;
|
|
143
|
+
|
|
144
|
+
transform = xsltXPathGetTransformContext(ctxt);
|
|
145
|
+
|
|
146
|
+
function = ctxt->context->function;
|
|
147
|
+
functionURI = ctxt->context->functionURI;
|
|
148
|
+
obj = (VALUE)xsltGetExtData(transform, functionURI);
|
|
149
|
+
|
|
150
|
+
count = (size_t)ctxt->valueNr;
|
|
151
|
+
args = calloc(count, sizeof(VALUE *));
|
|
152
|
+
|
|
153
|
+
for(i = 0; i < count; i++) {
|
|
154
|
+
VALUE thing;
|
|
155
|
+
|
|
156
|
+
xpath = valuePop(ctxt);
|
|
157
|
+
switch(xpath->type) {
|
|
158
|
+
case XPATH_STRING:
|
|
159
|
+
thing = NOKOGIRI_STR_NEW2(xpath->stringval);
|
|
160
|
+
break;
|
|
161
|
+
case XPATH_NODESET:
|
|
162
|
+
if(NULL == xpath->nodesetval) {
|
|
163
|
+
thing = Nokogiri_wrap_xml_node_set(
|
|
164
|
+
xmlXPathNodeSetCreate(NULL),
|
|
165
|
+
DOC_RUBY_OBJECT(ctxt->context->doc));
|
|
166
|
+
} else {
|
|
167
|
+
thing = Nokogiri_wrap_xml_node_set(xpath->nodesetval,
|
|
168
|
+
DOC_RUBY_OBJECT(ctxt->context->doc));
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
default:
|
|
172
|
+
rb_raise(rb_eRuntimeError, "do not handle type: %d", xpath->type);
|
|
173
|
+
}
|
|
174
|
+
args[i] = thing;
|
|
175
|
+
}
|
|
176
|
+
result = rb_funcall3(obj, rb_intern((const char *)function), (int)count, args);
|
|
177
|
+
switch(TYPE(result)) {
|
|
178
|
+
case T_FLOAT:
|
|
179
|
+
case T_BIGNUM:
|
|
180
|
+
case T_FIXNUM:
|
|
181
|
+
xmlXPathReturnNumber(ctxt, NUM2DBL(result));
|
|
182
|
+
break;
|
|
183
|
+
case T_STRING:
|
|
184
|
+
xmlXPathReturnString(
|
|
185
|
+
ctxt,
|
|
186
|
+
xmlStrdup((xmlChar *)StringValuePtr(result))
|
|
187
|
+
);
|
|
188
|
+
break;
|
|
189
|
+
case T_TRUE:
|
|
190
|
+
xmlXPathReturnTrue(ctxt);
|
|
191
|
+
break;
|
|
192
|
+
case T_FALSE:
|
|
193
|
+
xmlXPathReturnFalse(ctxt);
|
|
194
|
+
break;
|
|
195
|
+
case T_NIL:
|
|
196
|
+
break;
|
|
197
|
+
default:
|
|
198
|
+
rb_raise(rb_eRuntimeError, "Invalid return type");
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
static void * initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
|
|
203
|
+
{
|
|
204
|
+
VALUE modules = rb_iv_get(xslt, "@modules");
|
|
205
|
+
VALUE obj = rb_hash_aref(modules, rb_str_new2((const char *)uri));
|
|
206
|
+
VALUE args = { Qfalse };
|
|
207
|
+
VALUE methods = rb_funcall(obj, rb_intern("instance_methods"), 1, args);
|
|
208
|
+
int i;
|
|
209
|
+
|
|
210
|
+
for(i = 0; i < RARRAY_LEN(methods); i++) {
|
|
211
|
+
VALUE method_name = rb_obj_as_string(RARRAY_PTR(methods)[i]);
|
|
212
|
+
xsltRegisterExtFunction(ctxt,
|
|
213
|
+
(unsigned char *)StringValuePtr(method_name), uri, method_caller);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return (void *)rb_class_new_instance(0, NULL, obj);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
static void shutdownFunc(xsltTransformContextPtr ctxt,
|
|
220
|
+
const xmlChar *uri, void *data)
|
|
221
|
+
{
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/*
|
|
225
|
+
* call-seq:
|
|
226
|
+
* register(uri, custom_handler_class)
|
|
227
|
+
*
|
|
228
|
+
* Register a class that implements custom XLST transformation functions.
|
|
229
|
+
*/
|
|
230
|
+
static VALUE registr(VALUE self, VALUE uri, VALUE obj)
|
|
231
|
+
{
|
|
232
|
+
VALUE modules = rb_iv_get(self, "@modules");
|
|
233
|
+
if(NIL_P(modules)) rb_raise(rb_eRuntimeError, "wtf! @modules isn't set");
|
|
234
|
+
|
|
235
|
+
rb_hash_aset(modules, uri, obj);
|
|
236
|
+
xsltRegisterExtModule((unsigned char *)StringValuePtr(uri), initFunc, shutdownFunc);
|
|
237
|
+
return self;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
VALUE cNokogiriXsltStylesheet ;
|
|
241
|
+
void init_xslt_stylesheet()
|
|
242
|
+
{
|
|
243
|
+
VALUE nokogiri;
|
|
244
|
+
VALUE klass;
|
|
245
|
+
|
|
246
|
+
nokogiri = rb_define_module("Nokogiri");
|
|
247
|
+
xslt = rb_define_module_under(nokogiri, "XSLT");
|
|
248
|
+
klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
|
|
249
|
+
|
|
250
|
+
rb_iv_set(xslt, "@modules", rb_hash_new());
|
|
251
|
+
|
|
252
|
+
cNokogiriXsltStylesheet = klass;
|
|
253
|
+
|
|
254
|
+
rb_define_singleton_method(klass, "parse_stylesheet_doc", parse_stylesheet_doc, 1);
|
|
255
|
+
rb_define_singleton_method(xslt, "register", registr, 2);
|
|
256
|
+
rb_define_method(klass, "serialize", serialize, 1);
|
|
257
|
+
rb_define_method(klass, "transform", transform, -1);
|
|
258
|
+
}
|
data/lib/isorelax.jar
ADDED
|
Binary file
|
data/lib/jing.jar
ADDED
|
Binary file
|
data/lib/nekodtd.jar
ADDED
|
Binary file
|
data/lib/nekohtml.jar
ADDED
|
Binary file
|
data/lib/nokogiri.rb
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Modify the PATH on windows so that the external DLLs will get loaded.
|
|
3
|
+
|
|
4
|
+
require 'rbconfig'
|
|
5
|
+
ENV['PATH'] = [File.expand_path(
|
|
6
|
+
File.join(File.dirname(__FILE__), "..", "ext", "nokogiri")
|
|
7
|
+
), ENV['PATH']].compact.join(';') if RbConfig::CONFIG['host_os'] =~ /(mswin|mingw)/i
|
|
8
|
+
|
|
9
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
|
10
|
+
# If JRuby::Rack::VERSION is defined, Nokogiri is in a servlet.
|
|
11
|
+
# If AppEngine::ApiProxy is defined, Nokogiri is on Google App Egnine.
|
|
12
|
+
# These two cases don't need to require jar archives because those
|
|
13
|
+
# should be in WEB-INF/lib and already set in the classpath by
|
|
14
|
+
# a servlet container.
|
|
15
|
+
unless defined?(JRuby::Rack::VERSION) || defined?(AppEngine::ApiProxy)
|
|
16
|
+
require 'isorelax.jar'
|
|
17
|
+
require 'jing.jar'
|
|
18
|
+
require 'nekohtml.jar'
|
|
19
|
+
require 'nekodtd.jar'
|
|
20
|
+
require 'xercesImpl.jar'
|
|
21
|
+
end
|
|
22
|
+
require 'nokogiri/nokogiri'
|
|
23
|
+
else
|
|
24
|
+
require 'nokogiri/nokogiri'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
warn(<<-eowarn) if '1.8.6' == RUBY_VERSION && $VERBOSE
|
|
28
|
+
!!! DEPRECATION WARNING !!!
|
|
29
|
+
Hey Champ! I see you're using Ruby 1.8.6! While I applaud you for sticking to
|
|
30
|
+
your guns and using The One True Ruby, I have to let you know that we're going
|
|
31
|
+
to stop supporting 1.8.6. I know, it's sad. But, we just don't have time to
|
|
32
|
+
support every version of Ruby out there. Whether we like it or not, time moves
|
|
33
|
+
forward and so does our software.
|
|
34
|
+
|
|
35
|
+
On August 1, 2010, we will no longer support Ruby 1.8.6. If nokogiri happens to
|
|
36
|
+
work on 1.8.6 after that date, then great! We will hownever, no longer test,
|
|
37
|
+
use, or endorse 1.8.6 as a supported platform.
|
|
38
|
+
|
|
39
|
+
Thanks,
|
|
40
|
+
|
|
41
|
+
Team Nokogiri
|
|
42
|
+
eowarn
|
|
43
|
+
|
|
44
|
+
require 'nokogiri/version'
|
|
45
|
+
require 'nokogiri/syntax_error'
|
|
46
|
+
require 'nokogiri/xml'
|
|
47
|
+
require 'nokogiri/xslt'
|
|
48
|
+
require 'nokogiri/html'
|
|
49
|
+
require 'nokogiri/decorators/slop'
|
|
50
|
+
require 'nokogiri/css'
|
|
51
|
+
require 'nokogiri/html/builder'
|
|
52
|
+
|
|
53
|
+
# Nokogiri parses and searches XML/HTML very quickly, and also has
|
|
54
|
+
# correctly implemented CSS3 selector support as well as XPath support.
|
|
55
|
+
#
|
|
56
|
+
# Parsing a document returns either a Nokogiri::XML::Document, or a
|
|
57
|
+
# Nokogiri::HTML::Document depending on the kind of document you parse.
|
|
58
|
+
#
|
|
59
|
+
# Here is an example:
|
|
60
|
+
#
|
|
61
|
+
# require 'nokogiri'
|
|
62
|
+
# require 'open-uri'
|
|
63
|
+
#
|
|
64
|
+
# # Get a Nokogiri::HTML:Document for the page we’re interested in...
|
|
65
|
+
#
|
|
66
|
+
# doc = Nokogiri::HTML(open('http://www.google.com/search?q=tenderlove'))
|
|
67
|
+
#
|
|
68
|
+
# # Do funky things with it using Nokogiri::XML::Node methods...
|
|
69
|
+
#
|
|
70
|
+
# ####
|
|
71
|
+
# # Search for nodes by css
|
|
72
|
+
# doc.css('h3.r a.l').each do |link|
|
|
73
|
+
# puts link.content
|
|
74
|
+
# end
|
|
75
|
+
#
|
|
76
|
+
# See Nokogiri::XML::Node#css for more information about CSS searching.
|
|
77
|
+
# See Nokogiri::XML::Node#xpath for more information about XPath searching.
|
|
78
|
+
module Nokogiri
|
|
79
|
+
class << self
|
|
80
|
+
###
|
|
81
|
+
# Parse an HTML or XML document. +string+ contains the document.
|
|
82
|
+
def parse string, url = nil, encoding = nil, options = nil
|
|
83
|
+
doc =
|
|
84
|
+
if string.respond_to?(:read) ||
|
|
85
|
+
string =~ /^\s*<[^Hh>]*html/i # Probably html
|
|
86
|
+
Nokogiri::HTML(
|
|
87
|
+
string,
|
|
88
|
+
url,
|
|
89
|
+
encoding, options || XML::ParseOptions::DEFAULT_HTML
|
|
90
|
+
)
|
|
91
|
+
else
|
|
92
|
+
Nokogiri::XML(string, url, encoding,
|
|
93
|
+
options || XML::ParseOptions::DEFAULT_XML)
|
|
94
|
+
end
|
|
95
|
+
yield doc if block_given?
|
|
96
|
+
doc
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
###
|
|
100
|
+
# Create a new Nokogiri::XML::DocumentFragment
|
|
101
|
+
def make input = nil, opts = {}, &blk
|
|
102
|
+
if input
|
|
103
|
+
Nokogiri::HTML.fragment(input).children.first
|
|
104
|
+
else
|
|
105
|
+
Nokogiri(&blk)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
###
|
|
110
|
+
# Parse a document and add the Slop decorator. The Slop decorator
|
|
111
|
+
# implements method_missing such that methods may be used instead of CSS
|
|
112
|
+
# or XPath. For example:
|
|
113
|
+
#
|
|
114
|
+
# doc = Nokogiri::Slop(<<-eohtml)
|
|
115
|
+
# <html>
|
|
116
|
+
# <body>
|
|
117
|
+
# <p>first</p>
|
|
118
|
+
# <p>second</p>
|
|
119
|
+
# </body>
|
|
120
|
+
# </html>
|
|
121
|
+
# eohtml
|
|
122
|
+
# assert_equal('second', doc.html.body.p[1].text)
|
|
123
|
+
#
|
|
124
|
+
def Slop(*args, &block)
|
|
125
|
+
Nokogiri(*args, &block).slop!
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
###
|
|
131
|
+
# Parser a document contained in +args+. Nokogiri will try to guess what
|
|
132
|
+
# type of document you are attempting to parse. For more information, see
|
|
133
|
+
# Nokogiri.parse
|
|
134
|
+
#
|
|
135
|
+
# To specify the type of document, use Nokogiri.XML or Nokogiri.HTML.
|
|
136
|
+
def Nokogiri(*args, &block)
|
|
137
|
+
if block_given?
|
|
138
|
+
builder = Nokogiri::HTML::Builder.new(&block)
|
|
139
|
+
return builder.doc.root
|
|
140
|
+
else
|
|
141
|
+
Nokogiri.parse(*args)
|
|
142
|
+
end
|
|
143
|
+
end
|
data/lib/nokogiri/css.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'nokogiri/css/node'
|
|
2
|
+
require 'nokogiri/css/xpath_visitor'
|
|
3
|
+
require 'nokogiri/css/parser'
|
|
4
|
+
require 'nokogiri/css/tokenizer'
|
|
5
|
+
require 'nokogiri/css/syntax_error'
|
|
6
|
+
|
|
7
|
+
module Nokogiri
|
|
8
|
+
module CSS
|
|
9
|
+
class << self
|
|
10
|
+
###
|
|
11
|
+
# Parse this CSS selector in +selector+. Returns an AST.
|
|
12
|
+
def parse selector
|
|
13
|
+
Parser.new.parse selector
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
###
|
|
17
|
+
# Get the XPath for +selector+.
|
|
18
|
+
def xpath_for selector, options={}
|
|
19
|
+
Parser.new(options[:ns] || {}).xpath_for selector, options
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|