nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- data/.autotest +18 -7
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +297 -3
- data/CHANGELOG.rdoc +289 -0
- data/Manifest.txt +148 -37
- data/README.ja.rdoc +20 -20
- data/README.rdoc +53 -22
- data/Rakefile +127 -211
- data/bin/nokogiri +54 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +89 -54
- data/ext/nokogiri/html_document.c +34 -27
- data/ext/nokogiri/html_document.h +1 -1
- 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 +7 -5
- data/ext/nokogiri/html_entity_lookup.h +1 -1
- data/ext/nokogiri/html_sax_parser_context.c +94 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
- data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
- data/ext/nokogiri/xml_attr.c +20 -9
- data/ext/nokogiri/xml_attr.h +1 -1
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +21 -9
- data/ext/nokogiri/xml_cdata.h +1 -1
- data/ext/nokogiri/xml_comment.c +18 -6
- data/ext/nokogiri/xml_comment.h +1 -1
- data/ext/nokogiri/xml_document.c +247 -68
- data/ext/nokogiri/xml_document.h +5 -3
- data/ext/nokogiri/xml_document_fragment.c +15 -7
- data/ext/nokogiri/xml_document_fragment.h +1 -1
- data/ext/nokogiri/xml_dtd.c +110 -10
- data/ext/nokogiri/xml_dtd.h +3 -1
- 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 +16 -5
- data/ext/nokogiri/xml_entity_reference.h +1 -1
- data/ext/nokogiri/xml_io.c +40 -8
- data/ext/nokogiri/xml_io.h +2 -1
- 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 +782 -225
- data/ext/nokogiri/xml_node.h +2 -4
- data/ext/nokogiri/xml_node_set.c +253 -34
- data/ext/nokogiri/xml_node_set.h +2 -2
- data/ext/nokogiri/xml_processing_instruction.c +17 -5
- data/ext/nokogiri/xml_processing_instruction.h +1 -1
- data/ext/nokogiri/xml_reader.c +277 -85
- data/ext/nokogiri/xml_reader.h +1 -1
- data/ext/nokogiri/xml_relax_ng.c +168 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +183 -111
- data/ext/nokogiri/xml_sax_parser.h +30 -1
- 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 +42 -12
- data/ext/nokogiri/xml_sax_push_parser.h +1 -1
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +28 -173
- data/ext/nokogiri/xml_syntax_error.h +2 -1
- data/ext/nokogiri/xml_text.c +16 -6
- data/ext/nokogiri/xml_text.h +1 -1
- data/ext/nokogiri/xml_xpath_context.c +104 -47
- data/ext/nokogiri/xml_xpath_context.h +1 -1
- data/ext/nokogiri/xslt_stylesheet.c +161 -19
- data/ext/nokogiri/xslt_stylesheet.h +1 -1
- data/lib/nokogiri.rb +47 -8
- data/lib/nokogiri/1.8/nokogiri.so +0 -0
- data/lib/nokogiri/1.9/nokogiri.so +0 -0
- data/lib/nokogiri/css.rb +6 -3
- data/lib/nokogiri/css/node.rb +14 -12
- data/lib/nokogiri/css/parser.rb +665 -62
- data/lib/nokogiri/css/parser.y +20 -10
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/tokenizer.rb +148 -5
- data/lib/nokogiri/css/tokenizer.rex +10 -9
- data/lib/nokogiri/css/xpath_visitor.rb +47 -44
- data/lib/nokogiri/decorators/slop.rb +8 -4
- data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
- data/lib/nokogiri/ffi/html/document.rb +28 -0
- data/lib/nokogiri/ffi/html/element_description.rb +81 -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 +420 -0
- data/lib/nokogiri/ffi/structs/common_node.rb +38 -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 +20 -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_char_encoding_handler.rb +11 -0
- data/lib/nokogiri/ffi/structs/xml_document.rb +117 -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 +20 -0
- data/lib/nokogiri/ffi/structs/xml_parser_input.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 +124 -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 +38 -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/weak_bucket.rb +40 -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 +174 -0
- data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
- data/lib/nokogiri/ffi/xml/dtd.rb +67 -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 +36 -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 +559 -0
- data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
- data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
- data/lib/nokogiri/ffi/xml/reader.rb +236 -0
- data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
- data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
- data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
- data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
- data/lib/nokogiri/ffi/xml/schema.rb +109 -0
- data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
- data/lib/nokogiri/ffi/xml/text.rb +18 -0
- data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
- data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
- data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
- data/lib/nokogiri/html.rb +13 -47
- data/lib/nokogiri/html/builder.rb +27 -1
- data/lib/nokogiri/html/document.rb +201 -7
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/entity_lookup.rb +2 -0
- data/lib/nokogiri/html/sax/parser.rb +34 -3
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/nokogiri.rb +1 -0
- data/lib/nokogiri/version.rb +40 -1
- data/lib/nokogiri/version_warning.rb +14 -0
- data/lib/nokogiri/xml.rb +32 -53
- data/lib/nokogiri/xml/attr.rb +5 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +349 -29
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +166 -14
- data/lib/nokogiri/xml/document_fragment.rb +76 -1
- data/lib/nokogiri/xml/dtd.rb +16 -3
- 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 +561 -166
- data/lib/nokogiri/xml/node/save_options.rb +22 -2
- data/lib/nokogiri/xml/node_set.rb +202 -40
- data/lib/nokogiri/xml/parse_options.rb +93 -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 +2 -0
- data/lib/nokogiri/xml/reader.rb +93 -8
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +1 -7
- data/lib/nokogiri/xml/sax/document.rb +107 -2
- data/lib/nokogiri/xml/sax/parser.rb +57 -7
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/syntax_error.rb +25 -1
- data/lib/nokogiri/xml/text.rb +4 -1
- data/lib/nokogiri/xml/xpath.rb +1 -1
- data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
- data/lib/nokogiri/xml/xpath_context.rb +2 -0
- data/lib/nokogiri/xslt.rb +26 -2
- data/lib/nokogiri/xslt/stylesheet.rb +19 -0
- data/lib/xsd/xmlparser/nokogiri.rb +45 -9
- data/tasks/cross_compile.rb +173 -0
- data/tasks/test.rb +25 -69
- data/test/css/test_nthiness.rb +3 -4
- data/test/css/test_parser.rb +75 -20
- data/test/css/test_tokenizer.rb +23 -1
- data/test/css/test_xpath_visitor.rb +10 -1
- data/test/decorators/test_slop.rb +16 -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/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -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/valid_bar.xml +2 -0
- data/test/helper.rb +101 -23
- data/test/html/sax/test_parser.rb +81 -2
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +39 -8
- data/test/html/test_document.rb +186 -23
- data/test/html/test_document_encoding.rb +78 -1
- data/test/html/test_document_fragment.rb +253 -0
- data/test/html/test_element_description.rb +98 -0
- data/test/html/test_named_characters.rb +1 -1
- data/test/html/test_node.rb +124 -36
- data/test/html/test_node_encoding.rb +27 -0
- data/test/test_convert_xpath.rb +1 -52
- data/test/test_css_cache.rb +2 -13
- data/test/test_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +88 -19
- data/test/test_nokogiri.rb +38 -5
- data/test/test_reader.rb +188 -6
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +183 -83
- data/test/xml/node/test_save_options.rb +1 -1
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +175 -4
- data/test/xml/sax/test_parser_context.rb +113 -0
- data/test/xml/sax/test_push_parser.rb +90 -2
- data/test/xml/test_attr.rb +35 -1
- data/test/xml/test_attribute_decl.rb +82 -0
- data/test/xml/test_builder.rb +186 -1
- data/test/xml/test_cdata.rb +32 -1
- data/test/xml/test_comment.rb +13 -1
- data/test/xml/test_document.rb +415 -43
- data/test/xml/test_document_encoding.rb +1 -1
- data/test/xml/test_document_fragment.rb +173 -5
- data/test/xml/test_dtd.rb +61 -6
- data/test/xml/test_dtd_encoding.rb +3 -1
- 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 +120 -0
- data/test/xml/test_entity_reference.rb +5 -1
- data/test/xml/test_namespace.rb +68 -0
- data/test/xml/test_node.rb +546 -201
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +33 -3
- data/test/xml/test_node_reparenting.rb +321 -0
- data/test/xml/test_node_set.rb +538 -2
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +6 -1
- data/test/xml/test_reader_encoding.rb +1 -1
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +94 -0
- data/test/xml/test_syntax_error.rb +12 -0
- data/test/xml/test_text.rb +35 -1
- data/test/xml/test_unparented_node.rb +5 -5
- data/test/xml/test_xpath.rb +142 -11
- data/test/xslt/test_custom_functions.rb +94 -0
- metadata +328 -92
- data/ext/nokogiri/html_sax_parser.c +0 -57
- data/ext/nokogiri/html_sax_parser.h +0 -11
- data/ext/nokogiri/iconv.dll +0 -0
- data/ext/nokogiri/libexslt.dll +0 -0
- data/ext/nokogiri/libxml2.dll +0 -0
- data/ext/nokogiri/libxslt.dll +0 -0
- data/ext/nokogiri/native.so +0 -0
- data/ext/nokogiri/xml_xpath.c +0 -53
- data/ext/nokogiri/xml_xpath.h +0 -11
- data/ext/nokogiri/zlib1.dll +0 -0
- data/lib/action-nokogiri.rb +0 -30
- data/lib/nokogiri/css/generated_parser.rb +0 -713
- data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
- data/lib/nokogiri/decorators.rb +0 -2
- data/lib/nokogiri/decorators/hpricot.rb +0 -3
- data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
- data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
- data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
- data/lib/nokogiri/hpricot.rb +0 -51
- data/lib/nokogiri/xml/comment.rb +0 -6
- data/lib/nokogiri/xml/element.rb +0 -6
- data/lib/nokogiri/xml/entity_declaration.rb +0 -9
- data/lib/nokogiri/xml/fragment_handler.rb +0 -34
- data/test/hpricot/files/basic.xhtml +0 -17
- data/test/hpricot/files/boingboing.html +0 -2266
- data/test/hpricot/files/cy0.html +0 -3653
- data/test/hpricot/files/immob.html +0 -400
- data/test/hpricot/files/pace_application.html +0 -1320
- data/test/hpricot/files/tenderlove.html +0 -16
- data/test/hpricot/files/uswebgen.html +0 -220
- data/test/hpricot/files/utf8.html +0 -1054
- data/test/hpricot/files/week9.html +0 -1723
- data/test/hpricot/files/why.xml +0 -19
- data/test/hpricot/load_files.rb +0 -11
- data/test/hpricot/test_alter.rb +0 -68
- data/test/hpricot/test_builder.rb +0 -20
- data/test/hpricot/test_parser.rb +0 -426
- data/test/hpricot/test_paths.rb +0 -15
- data/test/hpricot/test_preserved.rb +0 -77
- data/test/hpricot/test_xml.rb +0 -30
- data/test/test_gc.rb +0 -15
@@ -5,13 +5,30 @@
|
|
5
5
|
#include <libxslt/transform.h>
|
6
6
|
#include <libexslt/exslt.h>
|
7
7
|
|
8
|
+
VALUE xslt;
|
9
|
+
|
10
|
+
int vasprintf (char **strp, const char *fmt, va_list ap);
|
11
|
+
|
8
12
|
static void dealloc(xsltStylesheetPtr doc)
|
9
13
|
{
|
10
14
|
NOKOGIRI_DEBUG_START(doc);
|
11
|
-
xsltFreeStylesheet(doc);
|
15
|
+
xsltFreeStylesheet(doc); /* commented out for now. */
|
12
16
|
NOKOGIRI_DEBUG_END(doc);
|
13
17
|
}
|
14
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
|
+
|
15
32
|
/*
|
16
33
|
* call-seq:
|
17
34
|
* parse_stylesheet_doc(document)
|
@@ -24,7 +41,13 @@ static VALUE parse_stylesheet_doc(VALUE klass, VALUE xmldocobj)
|
|
24
41
|
xsltStylesheetPtr ss ;
|
25
42
|
Data_Get_Struct(xmldocobj, xmlDoc, xml);
|
26
43
|
exsltRegisterAll();
|
44
|
+
|
45
|
+
xsltSetGenericErrorFunc(NULL, xslt_generic_error_handler);
|
46
|
+
|
27
47
|
ss = xsltParseStylesheetDoc(xmlCopyDoc(xml, 1)); /* 1 => recursive */
|
48
|
+
|
49
|
+
xsltSetGenericErrorFunc(NULL, NULL);
|
50
|
+
|
28
51
|
return Data_Wrap_Struct(klass, NULL, dealloc, ss);
|
29
52
|
}
|
30
53
|
|
@@ -46,17 +69,25 @@ static VALUE serialize(VALUE self, VALUE xmlobj)
|
|
46
69
|
Data_Get_Struct(xmlobj, xmlDoc, xml);
|
47
70
|
Data_Get_Struct(self, xsltStylesheet, ss);
|
48
71
|
xsltSaveResultToString(&doc_ptr, &doc_len, xml, ss);
|
49
|
-
rval = NOKOGIRI_STR_NEW(doc_ptr, doc_len
|
72
|
+
rval = NOKOGIRI_STR_NEW(doc_ptr, doc_len);
|
50
73
|
xmlFree(doc_ptr);
|
51
74
|
return rval ;
|
52
75
|
}
|
76
|
+
|
53
77
|
/*
|
54
78
|
* call-seq:
|
55
|
-
* transform(document, params)
|
79
|
+
* transform(document, params = [])
|
56
80
|
*
|
57
81
|
* Apply an XSLT stylesheet to an XML::Document.
|
58
82
|
* +params+ is an array of strings used as XSLT parameters.
|
59
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
|
+
*
|
60
91
|
*/
|
61
92
|
static VALUE transform(int argc, VALUE* argv, VALUE self)
|
62
93
|
{
|
@@ -65,15 +96,25 @@ static VALUE transform(int argc, VALUE* argv, VALUE self)
|
|
65
96
|
xmlDocPtr result ;
|
66
97
|
xsltStylesheetPtr ss ;
|
67
98
|
const char** params ;
|
68
|
-
|
99
|
+
long param_len, j ;
|
69
100
|
|
70
101
|
rb_scan_args(argc, argv, "11", &xmldoc, ¶mobj);
|
71
|
-
if (paramobj
|
102
|
+
if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0L) ; }
|
103
|
+
if (!rb_obj_is_kind_of(xmldoc, cNokogiriXmlDocument))
|
104
|
+
rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::Document");
|
105
|
+
|
106
|
+
/* handle hashes as arguments. */
|
107
|
+
if(T_HASH == TYPE(paramobj)) {
|
108
|
+
paramobj = rb_funcall(paramobj, rb_intern("to_a"), 0);
|
109
|
+
paramobj = rb_funcall(paramobj, rb_intern("flatten"), 0);
|
110
|
+
}
|
111
|
+
|
112
|
+
Check_Type(paramobj, T_ARRAY);
|
72
113
|
|
73
114
|
Data_Get_Struct(xmldoc, xmlDoc, xml);
|
74
115
|
Data_Get_Struct(self, xsltStylesheet, ss);
|
75
116
|
|
76
|
-
param_len =
|
117
|
+
param_len = RARRAY_LEN(paramobj);
|
77
118
|
params = calloc((size_t)param_len+1, sizeof(char*));
|
78
119
|
for (j = 0 ; j < param_len ; j++) {
|
79
120
|
VALUE entry = rb_ary_entry(paramobj, j);
|
@@ -85,34 +126,135 @@ static VALUE transform(int argc, VALUE* argv, VALUE self)
|
|
85
126
|
result = xsltApplyStylesheet(ss, xml, params);
|
86
127
|
free(params);
|
87
128
|
|
88
|
-
|
129
|
+
if (!result) rb_raise(rb_eRuntimeError, "could not perform xslt transform on document");
|
130
|
+
|
131
|
+
return Nokogiri_wrap_xml_document((VALUE)0, result) ;
|
132
|
+
}
|
133
|
+
|
134
|
+
static void method_caller(xmlXPathParserContextPtr ctxt, int nargs)
|
135
|
+
{
|
136
|
+
const xmlChar * function;
|
137
|
+
const xmlChar * functionURI;
|
138
|
+
size_t i, count;
|
139
|
+
|
140
|
+
xsltTransformContextPtr transform;
|
141
|
+
xmlXPathObjectPtr xpath;
|
142
|
+
VALUE obj;
|
143
|
+
VALUE *args;
|
144
|
+
VALUE result;
|
145
|
+
|
146
|
+
transform = xsltXPathGetTransformContext(ctxt);
|
147
|
+
|
148
|
+
function = ctxt->context->function;
|
149
|
+
functionURI = ctxt->context->functionURI;
|
150
|
+
obj = (VALUE)xsltGetExtData(transform, functionURI);
|
151
|
+
|
152
|
+
count = (size_t)ctxt->valueNr;
|
153
|
+
args = calloc(count, sizeof(VALUE *));
|
154
|
+
|
155
|
+
for(i = 0; i < count; i++) {
|
156
|
+
VALUE thing;
|
157
|
+
|
158
|
+
xpath = valuePop(ctxt);
|
159
|
+
switch(xpath->type) {
|
160
|
+
case XPATH_STRING:
|
161
|
+
thing = NOKOGIRI_STR_NEW2(xpath->stringval);
|
162
|
+
break;
|
163
|
+
case XPATH_NODESET:
|
164
|
+
if(NULL == xpath->nodesetval) {
|
165
|
+
thing = Nokogiri_wrap_xml_node_set(
|
166
|
+
xmlXPathNodeSetCreate(NULL),
|
167
|
+
DOC_RUBY_OBJECT(ctxt->context->doc));
|
168
|
+
} else {
|
169
|
+
thing = Nokogiri_wrap_xml_node_set(xpath->nodesetval,
|
170
|
+
DOC_RUBY_OBJECT(ctxt->context->doc));
|
171
|
+
}
|
172
|
+
break;
|
173
|
+
default:
|
174
|
+
rb_raise(rb_eRuntimeError, "do not handle type: %d", xpath->type);
|
175
|
+
}
|
176
|
+
args[i] = thing;
|
177
|
+
}
|
178
|
+
result = rb_funcall3(obj, rb_intern((const char *)function), (int)count, args);
|
179
|
+
switch(TYPE(result)) {
|
180
|
+
case T_FLOAT:
|
181
|
+
case T_BIGNUM:
|
182
|
+
case T_FIXNUM:
|
183
|
+
xmlXPathReturnNumber(ctxt, NUM2DBL(result));
|
184
|
+
break;
|
185
|
+
case T_STRING:
|
186
|
+
xmlXPathReturnString(
|
187
|
+
ctxt,
|
188
|
+
xmlStrdup((xmlChar *)StringValuePtr(result))
|
189
|
+
);
|
190
|
+
break;
|
191
|
+
case T_TRUE:
|
192
|
+
xmlXPathReturnTrue(ctxt);
|
193
|
+
break;
|
194
|
+
case T_FALSE:
|
195
|
+
xmlXPathReturnFalse(ctxt);
|
196
|
+
break;
|
197
|
+
case T_NIL:
|
198
|
+
break;
|
199
|
+
default:
|
200
|
+
rb_raise(rb_eRuntimeError, "Invalid return type");
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
static void * initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
|
205
|
+
{
|
206
|
+
VALUE modules = rb_iv_get(xslt, "@modules");
|
207
|
+
VALUE obj = rb_hash_aref(modules, rb_str_new2((const char *)uri));
|
208
|
+
VALUE args = { Qfalse };
|
209
|
+
VALUE methods = rb_funcall(obj, rb_intern("instance_methods"), 1, args);
|
210
|
+
int i;
|
211
|
+
|
212
|
+
for(i = 0; i < RARRAY_LEN(methods); i++) {
|
213
|
+
VALUE method_name = rb_obj_as_string(RARRAY_PTR(methods)[i]);
|
214
|
+
xsltRegisterExtFunction(ctxt,
|
215
|
+
(unsigned char *)StringValuePtr(method_name), uri, method_caller);
|
216
|
+
}
|
217
|
+
|
218
|
+
return (void *)rb_class_new_instance(0, NULL, obj);
|
219
|
+
}
|
220
|
+
|
221
|
+
static void shutdownFunc(xsltTransformContextPtr ctxt,
|
222
|
+
const xmlChar *uri, void *data)
|
223
|
+
{
|
89
224
|
}
|
90
225
|
|
91
226
|
/*
|
92
227
|
* call-seq:
|
93
|
-
*
|
228
|
+
* register(uri, custom_handler_class)
|
94
229
|
*
|
95
|
-
*
|
96
|
-
* +params+ is an array of strings used as XSLT parameters.
|
97
|
-
* returns serialized document
|
230
|
+
* Register a class that implements custom XLST transformation functions.
|
98
231
|
*/
|
99
|
-
static VALUE
|
232
|
+
static VALUE registr(VALUE self, VALUE uri, VALUE obj)
|
100
233
|
{
|
101
|
-
|
102
|
-
|
234
|
+
VALUE modules = rb_iv_get(self, "@modules");
|
235
|
+
if(NIL_P(modules)) rb_raise(rb_eRuntimeError, "wtf! @modules isn't set");
|
236
|
+
|
237
|
+
rb_hash_aset(modules, uri, obj);
|
238
|
+
xsltRegisterExtModule((unsigned char *)StringValuePtr(uri), initFunc, shutdownFunc);
|
239
|
+
return self;
|
103
240
|
}
|
104
241
|
|
105
242
|
VALUE cNokogiriXsltStylesheet ;
|
106
243
|
void init_xslt_stylesheet()
|
107
244
|
{
|
108
|
-
VALUE nokogiri
|
109
|
-
VALUE
|
110
|
-
|
245
|
+
VALUE nokogiri;
|
246
|
+
VALUE klass;
|
247
|
+
|
248
|
+
nokogiri = rb_define_module("Nokogiri");
|
249
|
+
xslt = rb_define_module_under(nokogiri, "XSLT");
|
250
|
+
klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
|
251
|
+
|
252
|
+
rb_iv_set(xslt, "@modules", rb_hash_new());
|
111
253
|
|
112
254
|
cNokogiriXsltStylesheet = klass;
|
113
|
-
|
255
|
+
|
114
256
|
rb_define_singleton_method(klass, "parse_stylesheet_doc", parse_stylesheet_doc, 1);
|
257
|
+
rb_define_singleton_method(xslt, "register", registr, 2);
|
115
258
|
rb_define_method(klass, "serialize", serialize, 1);
|
116
|
-
rb_define_method(klass, "apply_to", apply_to, -1);
|
117
259
|
rb_define_method(klass, "transform", transform, -1);
|
118
260
|
}
|
data/lib/nokogiri.rb
CHANGED
@@ -1,19 +1,44 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
# Modify the PATH on windows so that the external DLLs will get loaded.
|
3
|
+
|
4
|
+
require 'rbconfig'
|
2
5
|
ENV['PATH'] = [File.expand_path(
|
3
6
|
File.join(File.dirname(__FILE__), "..", "ext", "nokogiri")
|
4
|
-
), ENV['PATH']].compact.join(';') if
|
7
|
+
), ENV['PATH']].compact.join(';') if RbConfig::CONFIG['host_os'] =~ /(mswin|mingw)/i
|
8
|
+
|
9
|
+
if ENV['NOKOGIRI_FFI'] || RUBY_PLATFORM =~ /java/
|
10
|
+
require 'ffi'
|
11
|
+
require 'nokogiri/ffi/libxml'
|
12
|
+
else
|
13
|
+
require 'nokogiri/nokogiri'
|
14
|
+
end
|
15
|
+
|
16
|
+
warn(<<-eowarn) if '1.8.6' == RUBY_VERSION && $VERBOSE
|
17
|
+
!!! DEPRECATION WARNING !!!
|
18
|
+
Hey Champ! I see you're using Ruby 1.8.6! While I applaud you for sticking to
|
19
|
+
your guns and using The One True Ruby, I have to let you know that we're going
|
20
|
+
to stop supporting 1.8.6. I know, it's sad. But, we just don't have time to
|
21
|
+
support every version of Ruby out there. Whether we like it or not, time moves
|
22
|
+
forward and so does our software.
|
23
|
+
|
24
|
+
On August 1, 2010, we will no longer support Ruby 1.8.6. If nokogiri happens to
|
25
|
+
work on 1.8.6 after that date, then great! We will hownever, no longer test,
|
26
|
+
use, or endorse 1.8.6 as a supported platform.
|
5
27
|
|
6
|
-
|
28
|
+
Thanks,
|
29
|
+
|
30
|
+
Team Nokogiri
|
31
|
+
eowarn
|
7
32
|
|
8
33
|
require 'nokogiri/version'
|
34
|
+
require 'nokogiri/version_warning'
|
9
35
|
require 'nokogiri/syntax_error'
|
10
36
|
require 'nokogiri/xml'
|
11
37
|
require 'nokogiri/xslt'
|
12
38
|
require 'nokogiri/html'
|
13
|
-
require 'nokogiri/decorators'
|
39
|
+
require 'nokogiri/decorators/slop'
|
14
40
|
require 'nokogiri/css'
|
15
41
|
require 'nokogiri/html/builder'
|
16
|
-
require 'nokogiri/hpricot'
|
17
42
|
|
18
43
|
# Nokogiri parses and searches XML/HTML very quickly, and also has
|
19
44
|
# correctly implemented CSS3 selector support as well as XPath support.
|
@@ -46,15 +71,23 @@ module Nokogiri
|
|
46
71
|
# Parse an HTML or XML document. +string+ contains the document.
|
47
72
|
def parse string, url = nil, encoding = nil, options = nil
|
48
73
|
doc =
|
49
|
-
if string
|
50
|
-
|
74
|
+
if string.respond_to?(:read) ||
|
75
|
+
string =~ /^\s*<[^Hh>]*html/i # Probably html
|
76
|
+
Nokogiri::HTML(
|
77
|
+
string,
|
78
|
+
url,
|
79
|
+
encoding, options || XML::ParseOptions::DEFAULT_HTML
|
80
|
+
)
|
51
81
|
else
|
52
|
-
Nokogiri::XML
|
82
|
+
Nokogiri::XML(string, url, encoding,
|
83
|
+
options || XML::ParseOptions::DEFAULT_XML)
|
53
84
|
end
|
54
85
|
yield doc if block_given?
|
55
86
|
doc
|
56
87
|
end
|
57
88
|
|
89
|
+
###
|
90
|
+
# Create a new Nokogiri::XML::DocumentFragment
|
58
91
|
def make input = nil, opts = {}, &blk
|
59
92
|
if input
|
60
93
|
Nokogiri::HTML.fragment(input).children.first
|
@@ -62,7 +95,7 @@ module Nokogiri
|
|
62
95
|
Nokogiri(&blk)
|
63
96
|
end
|
64
97
|
end
|
65
|
-
|
98
|
+
|
66
99
|
###
|
67
100
|
# Parse a document and add the Slop decorator. The Slop decorator
|
68
101
|
# implements method_missing such that methods may be used instead of CSS
|
@@ -84,6 +117,12 @@ module Nokogiri
|
|
84
117
|
end
|
85
118
|
end
|
86
119
|
|
120
|
+
###
|
121
|
+
# Parser a document contained in +args+. Nokogiri will try to guess what
|
122
|
+
# type of document you are attempting to parse. For more information, see
|
123
|
+
# Nokogiri.parse
|
124
|
+
#
|
125
|
+
# To specify the type of document, use Nokogiri.XML or Nokogiri.HTML.
|
87
126
|
def Nokogiri(*args, &block)
|
88
127
|
if block_given?
|
89
128
|
builder = Nokogiri::HTML::Builder.new(&block)
|
Binary file
|
Binary file
|
data/lib/nokogiri/css.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
require 'nokogiri/css/node'
|
2
2
|
require 'nokogiri/css/xpath_visitor'
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
|
4
|
+
x = $-w
|
5
|
+
$-w = false
|
6
6
|
require 'nokogiri/css/parser'
|
7
|
+
$-w = x
|
8
|
+
|
9
|
+
require 'nokogiri/css/tokenizer'
|
7
10
|
require 'nokogiri/css/syntax_error'
|
8
11
|
|
9
12
|
module Nokogiri
|
data/lib/nokogiri/css/node.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
module Nokogiri
|
2
2
|
module CSS
|
3
3
|
class Node
|
4
|
-
|
4
|
+
# Get the type of this node
|
5
|
+
attr_accessor :type
|
6
|
+
# Get the value of this node
|
7
|
+
attr_accessor :value
|
8
|
+
|
9
|
+
# Create a new Node with +type+ and +value+
|
5
10
|
def initialize type, value
|
6
11
|
@type = type
|
7
12
|
@value = value
|
8
13
|
end
|
9
14
|
|
15
|
+
# Accept +visitor+
|
10
16
|
def accept visitor
|
11
17
|
visitor.send(:"visit_#{type.to_s.downcase}", self)
|
12
18
|
end
|
@@ -18,6 +24,7 @@ module Nokogiri
|
|
18
24
|
prefix + visitor.accept(self)
|
19
25
|
end
|
20
26
|
|
27
|
+
# Preprocess this node tree
|
21
28
|
def preprocess!
|
22
29
|
### Deal with nth-child
|
23
30
|
matches = find_by_type(
|
@@ -29,15 +36,7 @@ module Nokogiri
|
|
29
36
|
]
|
30
37
|
)
|
31
38
|
matches.each do |match|
|
32
|
-
if match.value[1].value[0].value[0] =~ /^nth-child/
|
33
|
-
tag_name = match.value[0].value.first
|
34
|
-
match.value[0].value = ['*']
|
35
|
-
match.value[1] = Node.new(:COMBINATOR, [
|
36
|
-
match.value[1].value[0],
|
37
|
-
Node.new(:FUNCTION, ['self(', tag_name])
|
38
|
-
])
|
39
|
-
end
|
40
|
-
if match.value[1].value[0].value[0] =~ /^nth-last-child/
|
39
|
+
if match.value[1].value[0].value[0] =~ /^nth-(last-)?child/
|
41
40
|
tag_name = match.value[0].value.first
|
42
41
|
match.value[0].value = ['*']
|
43
42
|
match.value[1] = Node.new(:COMBINATOR, [
|
@@ -67,14 +66,15 @@ module Nokogiri
|
|
67
66
|
match.value[1] = Node.new(:COMBINATOR, [
|
68
67
|
Node.new(:FUNCTION, ["#{match.value[1].value.first}("]),
|
69
68
|
Node.new(:FUNCTION, ['self(', tag_name])
|
70
|
-
])
|
69
|
+
])
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
74
73
|
self
|
75
74
|
end
|
76
75
|
|
77
|
-
|
76
|
+
# Find a node by type using +types+
|
77
|
+
def find_by_type types
|
78
78
|
matches = []
|
79
79
|
matches << self if to_type == types
|
80
80
|
@value.each do |v|
|
@@ -83,12 +83,14 @@ module Nokogiri
|
|
83
83
|
matches
|
84
84
|
end
|
85
85
|
|
86
|
+
# Convert to_type
|
86
87
|
def to_type
|
87
88
|
[@type] + @value.map { |n|
|
88
89
|
n.to_type if n.respond_to?(:to_type)
|
89
90
|
}.compact
|
90
91
|
end
|
91
92
|
|
93
|
+
# Convert to array
|
92
94
|
def to_a
|
93
95
|
[@type] + @value.map { |n| n.respond_to?(:to_a) ? n.to_a : [n] }
|
94
96
|
end
|