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.

Files changed (319) hide show
  1. data/.autotest +18 -7
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +297 -3
  4. data/CHANGELOG.rdoc +289 -0
  5. data/Manifest.txt +148 -37
  6. data/README.ja.rdoc +20 -20
  7. data/README.rdoc +53 -22
  8. data/Rakefile +127 -211
  9. data/bin/nokogiri +54 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +89 -54
  12. data/ext/nokogiri/html_document.c +34 -27
  13. data/ext/nokogiri/html_document.h +1 -1
  14. data/ext/nokogiri/html_element_description.c +276 -0
  15. data/ext/nokogiri/html_element_description.h +10 -0
  16. data/ext/nokogiri/html_entity_lookup.c +7 -5
  17. data/ext/nokogiri/html_entity_lookup.h +1 -1
  18. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  19. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  20. data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
  21. data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
  22. data/ext/nokogiri/xml_attr.c +20 -9
  23. data/ext/nokogiri/xml_attr.h +1 -1
  24. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  25. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +21 -9
  27. data/ext/nokogiri/xml_cdata.h +1 -1
  28. data/ext/nokogiri/xml_comment.c +18 -6
  29. data/ext/nokogiri/xml_comment.h +1 -1
  30. data/ext/nokogiri/xml_document.c +247 -68
  31. data/ext/nokogiri/xml_document.h +5 -3
  32. data/ext/nokogiri/xml_document_fragment.c +15 -7
  33. data/ext/nokogiri/xml_document_fragment.h +1 -1
  34. data/ext/nokogiri/xml_dtd.c +110 -10
  35. data/ext/nokogiri/xml_dtd.h +3 -1
  36. data/ext/nokogiri/xml_element_content.c +123 -0
  37. data/ext/nokogiri/xml_element_content.h +10 -0
  38. data/ext/nokogiri/xml_element_decl.c +69 -0
  39. data/ext/nokogiri/xml_element_decl.h +9 -0
  40. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  41. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  42. data/ext/nokogiri/xml_entity_decl.c +110 -0
  43. data/ext/nokogiri/xml_entity_decl.h +10 -0
  44. data/ext/nokogiri/xml_entity_reference.c +16 -5
  45. data/ext/nokogiri/xml_entity_reference.h +1 -1
  46. data/ext/nokogiri/xml_io.c +40 -8
  47. data/ext/nokogiri/xml_io.h +2 -1
  48. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  50. data/ext/nokogiri/xml_namespace.c +84 -0
  51. data/ext/nokogiri/xml_namespace.h +13 -0
  52. data/ext/nokogiri/xml_node.c +782 -225
  53. data/ext/nokogiri/xml_node.h +2 -4
  54. data/ext/nokogiri/xml_node_set.c +253 -34
  55. data/ext/nokogiri/xml_node_set.h +2 -2
  56. data/ext/nokogiri/xml_processing_instruction.c +17 -5
  57. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  58. data/ext/nokogiri/xml_reader.c +277 -85
  59. data/ext/nokogiri/xml_reader.h +1 -1
  60. data/ext/nokogiri/xml_relax_ng.c +168 -0
  61. data/ext/nokogiri/xml_relax_ng.h +9 -0
  62. data/ext/nokogiri/xml_sax_parser.c +183 -111
  63. data/ext/nokogiri/xml_sax_parser.h +30 -1
  64. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  65. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  66. data/ext/nokogiri/xml_sax_push_parser.c +42 -12
  67. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  68. data/ext/nokogiri/xml_schema.c +205 -0
  69. data/ext/nokogiri/xml_schema.h +9 -0
  70. data/ext/nokogiri/xml_syntax_error.c +28 -173
  71. data/ext/nokogiri/xml_syntax_error.h +2 -1
  72. data/ext/nokogiri/xml_text.c +16 -6
  73. data/ext/nokogiri/xml_text.h +1 -1
  74. data/ext/nokogiri/xml_xpath_context.c +104 -47
  75. data/ext/nokogiri/xml_xpath_context.h +1 -1
  76. data/ext/nokogiri/xslt_stylesheet.c +161 -19
  77. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  78. data/lib/nokogiri.rb +47 -8
  79. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  80. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  81. data/lib/nokogiri/css.rb +6 -3
  82. data/lib/nokogiri/css/node.rb +14 -12
  83. data/lib/nokogiri/css/parser.rb +665 -62
  84. data/lib/nokogiri/css/parser.y +20 -10
  85. data/lib/nokogiri/css/parser_extras.rb +91 -0
  86. data/lib/nokogiri/css/tokenizer.rb +148 -5
  87. data/lib/nokogiri/css/tokenizer.rex +10 -9
  88. data/lib/nokogiri/css/xpath_visitor.rb +47 -44
  89. data/lib/nokogiri/decorators/slop.rb +8 -4
  90. data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
  91. data/lib/nokogiri/ffi/html/document.rb +28 -0
  92. data/lib/nokogiri/ffi/html/element_description.rb +81 -0
  93. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  94. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  95. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  96. data/lib/nokogiri/ffi/libxml.rb +420 -0
  97. data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
  98. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  99. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  100. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
  102. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  103. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  104. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
  105. data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
  106. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  107. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  108. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  109. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  110. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  111. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  112. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  113. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  114. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  115. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
  117. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  118. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  119. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
  120. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  121. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  122. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  123. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
  124. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  125. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  126. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  127. data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
  128. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  129. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  132. data/lib/nokogiri/ffi/xml/document.rb +174 -0
  133. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  134. data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
  135. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  136. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  137. data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
  138. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  139. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  140. data/lib/nokogiri/ffi/xml/node.rb +559 -0
  141. data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
  142. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  143. data/lib/nokogiri/ffi/xml/reader.rb +236 -0
  144. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  145. data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
  146. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
  147. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
  148. data/lib/nokogiri/ffi/xml/schema.rb +109 -0
  149. data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
  150. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  151. data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
  152. data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
  153. data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
  154. data/lib/nokogiri/html.rb +13 -47
  155. data/lib/nokogiri/html/builder.rb +27 -1
  156. data/lib/nokogiri/html/document.rb +201 -7
  157. data/lib/nokogiri/html/document_fragment.rb +41 -0
  158. data/lib/nokogiri/html/element_description.rb +23 -0
  159. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  160. data/lib/nokogiri/html/sax/parser.rb +34 -3
  161. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  162. data/lib/nokogiri/nokogiri.rb +1 -0
  163. data/lib/nokogiri/version.rb +40 -1
  164. data/lib/nokogiri/version_warning.rb +14 -0
  165. data/lib/nokogiri/xml.rb +32 -53
  166. data/lib/nokogiri/xml/attr.rb +5 -0
  167. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  168. data/lib/nokogiri/xml/builder.rb +349 -29
  169. data/lib/nokogiri/xml/cdata.rb +3 -1
  170. data/lib/nokogiri/xml/character_data.rb +7 -0
  171. data/lib/nokogiri/xml/document.rb +166 -14
  172. data/lib/nokogiri/xml/document_fragment.rb +76 -1
  173. data/lib/nokogiri/xml/dtd.rb +16 -3
  174. data/lib/nokogiri/xml/element_content.rb +36 -0
  175. data/lib/nokogiri/xml/element_decl.rb +13 -0
  176. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  177. data/lib/nokogiri/xml/namespace.rb +13 -0
  178. data/lib/nokogiri/xml/node.rb +561 -166
  179. data/lib/nokogiri/xml/node/save_options.rb +22 -2
  180. data/lib/nokogiri/xml/node_set.rb +202 -40
  181. data/lib/nokogiri/xml/parse_options.rb +93 -0
  182. data/lib/nokogiri/xml/pp.rb +2 -0
  183. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  184. data/lib/nokogiri/xml/pp/node.rb +56 -0
  185. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  186. data/lib/nokogiri/xml/reader.rb +93 -8
  187. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  188. data/lib/nokogiri/xml/sax.rb +1 -7
  189. data/lib/nokogiri/xml/sax/document.rb +107 -2
  190. data/lib/nokogiri/xml/sax/parser.rb +57 -7
  191. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  192. data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
  193. data/lib/nokogiri/xml/schema.rb +63 -0
  194. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  195. data/lib/nokogiri/xml/text.rb +4 -1
  196. data/lib/nokogiri/xml/xpath.rb +1 -1
  197. data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
  198. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  199. data/lib/nokogiri/xslt.rb +26 -2
  200. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  201. data/lib/xsd/xmlparser/nokogiri.rb +45 -9
  202. data/tasks/cross_compile.rb +173 -0
  203. data/tasks/test.rb +25 -69
  204. data/test/css/test_nthiness.rb +3 -4
  205. data/test/css/test_parser.rb +75 -20
  206. data/test/css/test_tokenizer.rb +23 -1
  207. data/test/css/test_xpath_visitor.rb +10 -1
  208. data/test/decorators/test_slop.rb +16 -0
  209. data/test/ffi/test_document.rb +35 -0
  210. data/test/files/2ch.html +108 -0
  211. data/test/files/address_book.rlx +12 -0
  212. data/test/files/address_book.xml +10 -0
  213. data/test/files/bar/bar.xsd +4 -0
  214. data/test/files/encoding.html +82 -0
  215. data/test/files/encoding.xhtml +84 -0
  216. data/test/files/foo/foo.xsd +4 -0
  217. data/test/files/po.xml +32 -0
  218. data/test/files/po.xsd +66 -0
  219. data/test/files/shift_jis.html +10 -0
  220. data/test/files/shift_jis.xml +5 -0
  221. data/test/files/snuggles.xml +3 -0
  222. data/test/files/staff.dtd +10 -0
  223. data/test/files/valid_bar.xml +2 -0
  224. data/test/helper.rb +101 -23
  225. data/test/html/sax/test_parser.rb +81 -2
  226. data/test/html/sax/test_parser_context.rb +48 -0
  227. data/test/html/test_builder.rb +39 -8
  228. data/test/html/test_document.rb +186 -23
  229. data/test/html/test_document_encoding.rb +78 -1
  230. data/test/html/test_document_fragment.rb +253 -0
  231. data/test/html/test_element_description.rb +98 -0
  232. data/test/html/test_named_characters.rb +1 -1
  233. data/test/html/test_node.rb +124 -36
  234. data/test/html/test_node_encoding.rb +27 -0
  235. data/test/test_convert_xpath.rb +1 -52
  236. data/test/test_css_cache.rb +2 -13
  237. data/test/test_encoding_handler.rb +46 -0
  238. data/test/test_memory_leak.rb +88 -19
  239. data/test/test_nokogiri.rb +38 -5
  240. data/test/test_reader.rb +188 -6
  241. data/test/test_soap4r_sax.rb +52 -0
  242. data/test/test_xslt_transforms.rb +183 -83
  243. data/test/xml/node/test_save_options.rb +1 -1
  244. data/test/xml/node/test_subclass.rb +44 -0
  245. data/test/xml/sax/test_parser.rb +175 -4
  246. data/test/xml/sax/test_parser_context.rb +113 -0
  247. data/test/xml/sax/test_push_parser.rb +90 -2
  248. data/test/xml/test_attr.rb +35 -1
  249. data/test/xml/test_attribute_decl.rb +82 -0
  250. data/test/xml/test_builder.rb +186 -1
  251. data/test/xml/test_cdata.rb +32 -1
  252. data/test/xml/test_comment.rb +13 -1
  253. data/test/xml/test_document.rb +415 -43
  254. data/test/xml/test_document_encoding.rb +1 -1
  255. data/test/xml/test_document_fragment.rb +173 -5
  256. data/test/xml/test_dtd.rb +61 -6
  257. data/test/xml/test_dtd_encoding.rb +3 -1
  258. data/test/xml/test_element_content.rb +56 -0
  259. data/test/xml/test_element_decl.rb +73 -0
  260. data/test/xml/test_entity_decl.rb +120 -0
  261. data/test/xml/test_entity_reference.rb +5 -1
  262. data/test/xml/test_namespace.rb +68 -0
  263. data/test/xml/test_node.rb +546 -201
  264. data/test/xml/test_node_attributes.rb +34 -0
  265. data/test/xml/test_node_encoding.rb +33 -3
  266. data/test/xml/test_node_reparenting.rb +321 -0
  267. data/test/xml/test_node_set.rb +538 -2
  268. data/test/xml/test_parse_options.rb +52 -0
  269. data/test/xml/test_processing_instruction.rb +6 -1
  270. data/test/xml/test_reader_encoding.rb +1 -1
  271. data/test/xml/test_relax_ng.rb +60 -0
  272. data/test/xml/test_schema.rb +94 -0
  273. data/test/xml/test_syntax_error.rb +12 -0
  274. data/test/xml/test_text.rb +35 -1
  275. data/test/xml/test_unparented_node.rb +5 -5
  276. data/test/xml/test_xpath.rb +142 -11
  277. data/test/xslt/test_custom_functions.rb +94 -0
  278. metadata +328 -92
  279. data/ext/nokogiri/html_sax_parser.c +0 -57
  280. data/ext/nokogiri/html_sax_parser.h +0 -11
  281. data/ext/nokogiri/iconv.dll +0 -0
  282. data/ext/nokogiri/libexslt.dll +0 -0
  283. data/ext/nokogiri/libxml2.dll +0 -0
  284. data/ext/nokogiri/libxslt.dll +0 -0
  285. data/ext/nokogiri/native.so +0 -0
  286. data/ext/nokogiri/xml_xpath.c +0 -53
  287. data/ext/nokogiri/xml_xpath.h +0 -11
  288. data/ext/nokogiri/zlib1.dll +0 -0
  289. data/lib/action-nokogiri.rb +0 -30
  290. data/lib/nokogiri/css/generated_parser.rb +0 -713
  291. data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
  292. data/lib/nokogiri/decorators.rb +0 -2
  293. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  294. data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
  295. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
  296. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
  297. data/lib/nokogiri/hpricot.rb +0 -51
  298. data/lib/nokogiri/xml/comment.rb +0 -6
  299. data/lib/nokogiri/xml/element.rb +0 -6
  300. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  301. data/lib/nokogiri/xml/fragment_handler.rb +0 -34
  302. data/test/hpricot/files/basic.xhtml +0 -17
  303. data/test/hpricot/files/boingboing.html +0 -2266
  304. data/test/hpricot/files/cy0.html +0 -3653
  305. data/test/hpricot/files/immob.html +0 -400
  306. data/test/hpricot/files/pace_application.html +0 -1320
  307. data/test/hpricot/files/tenderlove.html +0 -16
  308. data/test/hpricot/files/uswebgen.html +0 -220
  309. data/test/hpricot/files/utf8.html +0 -1054
  310. data/test/hpricot/files/week9.html +0 -1723
  311. data/test/hpricot/files/why.xml +0 -19
  312. data/test/hpricot/load_files.rb +0 -11
  313. data/test/hpricot/test_alter.rb +0 -68
  314. data/test/hpricot/test_builder.rb +0 -20
  315. data/test/hpricot/test_parser.rb +0 -426
  316. data/test/hpricot/test_paths.rb +0 -15
  317. data/test/hpricot/test_preserved.rb +0 -77
  318. data/test/hpricot/test_xml.rb +0 -30
  319. data/test/test_gc.rb +0 -15
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XML_XPATH_CONTEXT
2
2
  #define NOKOGIRI_XML_XPATH_CONTEXT
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xml_xpath_context();
7
7
 
@@ -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); // commented out for now.
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, xml->encoding);
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
- int param_len, j ;
99
+ long param_len, j ;
69
100
 
70
101
  rb_scan_args(argc, argv, "11", &xmldoc, &paramobj);
71
- if (paramobj == Qnil) { paramobj = rb_ary_new2(0) ; }
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 = NUM2INT(rb_funcall(paramobj, rb_intern("length"), 0));
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
- return Nokogiri_wrap_xml_document(0, result) ;
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
- * apply_to(document, params)
228
+ * register(uri, custom_handler_class)
94
229
  *
95
- * Apply an XSLT stylesheet to an XML::Document.
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 apply_to(int argc, VALUE* argv, VALUE self)
232
+ static VALUE registr(VALUE self, VALUE uri, VALUE obj)
100
233
  {
101
- return rb_funcall(self, rb_intern("serialize"), 1,
102
- transform(argc, argv, self));
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 = rb_define_module("Nokogiri");
109
- VALUE xslt = rb_define_module_under(nokogiri, "XSLT");
110
- VALUE klass = rb_define_class_under(xslt, "Stylesheet", rb_cObject);
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
  }
@@ -1,7 +1,7 @@
1
1
  #ifndef NOKOGIRI_XSLT_STYLESHEET
2
2
  #define NOKOGIRI_XSLT_STYLESHEET
3
3
 
4
- #include <native.h>
4
+ #include <nokogiri.h>
5
5
 
6
6
  void init_xslt_stylesheet();
7
7
 
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 RUBY_PLATFORM =~ /mswin/i
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
- require 'nokogiri/native' unless RUBY_PLATFORM =~ /java/
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 =~ /^\s*<[^Hh>]*html/i # Probably html
50
- Nokogiri::HTML.parse(string, url, encoding, options || 2145)
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.parse(string, url, encoding, options || 2159)
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
- require 'nokogiri/css/generated_parser'
4
- require 'nokogiri/css/generated_tokenizer'
5
- require 'nokogiri/css/tokenizer'
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
@@ -1,12 +1,18 @@
1
1
  module Nokogiri
2
2
  module CSS
3
3
  class Node
4
- attr_accessor :type, :value
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
- def find_by_type(types)
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