superfeedr-nokogiri 1.4.0.20091116183308

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.
Files changed (270) hide show
  1. data/.autotest +27 -0
  2. data/CHANGELOG.ja.rdoc +330 -0
  3. data/CHANGELOG.rdoc +314 -0
  4. data/Manifest.txt +269 -0
  5. data/README.ja.rdoc +105 -0
  6. data/README.rdoc +118 -0
  7. data/Rakefile +244 -0
  8. data/bin/nokogiri +49 -0
  9. data/ext/nokogiri/extconf.rb +145 -0
  10. data/ext/nokogiri/html_document.c +145 -0
  11. data/ext/nokogiri/html_document.h +10 -0
  12. data/ext/nokogiri/html_element_description.c +272 -0
  13. data/ext/nokogiri/html_element_description.h +10 -0
  14. data/ext/nokogiri/html_entity_lookup.c +32 -0
  15. data/ext/nokogiri/html_entity_lookup.h +8 -0
  16. data/ext/nokogiri/html_sax_parser_context.c +92 -0
  17. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  18. data/ext/nokogiri/nokogiri.c +89 -0
  19. data/ext/nokogiri/nokogiri.h +145 -0
  20. data/ext/nokogiri/xml_attr.c +92 -0
  21. data/ext/nokogiri/xml_attr.h +9 -0
  22. data/ext/nokogiri/xml_attribute_decl.c +67 -0
  23. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  24. data/ext/nokogiri/xml_cdata.c +54 -0
  25. data/ext/nokogiri/xml_cdata.h +9 -0
  26. data/ext/nokogiri/xml_comment.c +52 -0
  27. data/ext/nokogiri/xml_comment.h +9 -0
  28. data/ext/nokogiri/xml_document.c +388 -0
  29. data/ext/nokogiri/xml_document.h +24 -0
  30. data/ext/nokogiri/xml_document_fragment.c +46 -0
  31. data/ext/nokogiri/xml_document_fragment.h +10 -0
  32. data/ext/nokogiri/xml_dtd.c +192 -0
  33. data/ext/nokogiri/xml_dtd.h +10 -0
  34. data/ext/nokogiri/xml_element_content.c +123 -0
  35. data/ext/nokogiri/xml_element_content.h +10 -0
  36. data/ext/nokogiri/xml_element_decl.c +69 -0
  37. data/ext/nokogiri/xml_element_decl.h +9 -0
  38. data/ext/nokogiri/xml_entity_decl.c +97 -0
  39. data/ext/nokogiri/xml_entity_decl.h +10 -0
  40. data/ext/nokogiri/xml_entity_reference.c +50 -0
  41. data/ext/nokogiri/xml_entity_reference.h +9 -0
  42. data/ext/nokogiri/xml_io.c +31 -0
  43. data/ext/nokogiri/xml_io.h +11 -0
  44. data/ext/nokogiri/xml_namespace.c +74 -0
  45. data/ext/nokogiri/xml_namespace.h +12 -0
  46. data/ext/nokogiri/xml_node.c +1060 -0
  47. data/ext/nokogiri/xml_node.h +13 -0
  48. data/ext/nokogiri/xml_node_set.c +397 -0
  49. data/ext/nokogiri/xml_node_set.h +9 -0
  50. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  51. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  52. data/ext/nokogiri/xml_reader.c +593 -0
  53. data/ext/nokogiri/xml_reader.h +10 -0
  54. data/ext/nokogiri/xml_relax_ng.c +159 -0
  55. data/ext/nokogiri/xml_relax_ng.h +9 -0
  56. data/ext/nokogiri/xml_sax_parser.c +286 -0
  57. data/ext/nokogiri/xml_sax_parser.h +43 -0
  58. data/ext/nokogiri/xml_sax_parser_context.c +155 -0
  59. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  60. data/ext/nokogiri/xml_sax_push_parser.c +114 -0
  61. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  62. data/ext/nokogiri/xml_schema.c +156 -0
  63. data/ext/nokogiri/xml_schema.h +9 -0
  64. data/ext/nokogiri/xml_syntax_error.c +261 -0
  65. data/ext/nokogiri/xml_syntax_error.h +13 -0
  66. data/ext/nokogiri/xml_text.c +48 -0
  67. data/ext/nokogiri/xml_text.h +9 -0
  68. data/ext/nokogiri/xml_xpath.c +53 -0
  69. data/ext/nokogiri/xml_xpath.h +11 -0
  70. data/ext/nokogiri/xml_xpath_context.c +239 -0
  71. data/ext/nokogiri/xml_xpath_context.h +9 -0
  72. data/ext/nokogiri/xslt_stylesheet.c +131 -0
  73. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  74. data/lib/nokogiri.rb +116 -0
  75. data/lib/nokogiri/css.rb +25 -0
  76. data/lib/nokogiri/css/generated_parser.rb +646 -0
  77. data/lib/nokogiri/css/generated_tokenizer.rb +142 -0
  78. data/lib/nokogiri/css/node.rb +99 -0
  79. data/lib/nokogiri/css/parser.rb +82 -0
  80. data/lib/nokogiri/css/parser.y +227 -0
  81. data/lib/nokogiri/css/syntax_error.rb +7 -0
  82. data/lib/nokogiri/css/tokenizer.rb +7 -0
  83. data/lib/nokogiri/css/tokenizer.rex +54 -0
  84. data/lib/nokogiri/css/xpath_visitor.rb +162 -0
  85. data/lib/nokogiri/decorators/slop.rb +33 -0
  86. data/lib/nokogiri/ffi/html/document.rb +28 -0
  87. data/lib/nokogiri/ffi/html/element_description.rb +85 -0
  88. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  89. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  90. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  91. data/lib/nokogiri/ffi/libxml.rb +356 -0
  92. data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
  93. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  94. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  95. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  96. data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
  97. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  98. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  99. data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
  100. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  101. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  102. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  103. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  104. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  105. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  106. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  107. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  108. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  109. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +19 -0
  110. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  111. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  112. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +15 -0
  113. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  114. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  115. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  116. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
  117. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  118. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  119. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  120. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  121. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  122. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  123. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  124. data/lib/nokogiri/ffi/xml/document.rb +135 -0
  125. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  126. data/lib/nokogiri/ffi/xml/dtd.rb +69 -0
  127. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  128. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  129. data/lib/nokogiri/ffi/xml/entity_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  132. data/lib/nokogiri/ffi/xml/node.rb +444 -0
  133. data/lib/nokogiri/ffi/xml/node_set.rb +133 -0
  134. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  135. data/lib/nokogiri/ffi/xml/reader.rb +227 -0
  136. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  137. data/lib/nokogiri/ffi/xml/sax/parser.rb +142 -0
  138. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +67 -0
  139. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +39 -0
  140. data/lib/nokogiri/ffi/xml/schema.rb +92 -0
  141. data/lib/nokogiri/ffi/xml/syntax_error.rb +91 -0
  142. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  143. data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
  144. data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
  145. data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
  146. data/lib/nokogiri/html.rb +35 -0
  147. data/lib/nokogiri/html/builder.rb +35 -0
  148. data/lib/nokogiri/html/document.rb +88 -0
  149. data/lib/nokogiri/html/document_fragment.rb +15 -0
  150. data/lib/nokogiri/html/element_description.rb +23 -0
  151. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  152. data/lib/nokogiri/html/sax/parser.rb +48 -0
  153. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  154. data/lib/nokogiri/syntax_error.rb +4 -0
  155. data/lib/nokogiri/version.rb +33 -0
  156. data/lib/nokogiri/version_warning.rb +11 -0
  157. data/lib/nokogiri/xml.rb +67 -0
  158. data/lib/nokogiri/xml/attr.rb +14 -0
  159. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  160. data/lib/nokogiri/xml/builder.rb +405 -0
  161. data/lib/nokogiri/xml/cdata.rb +11 -0
  162. data/lib/nokogiri/xml/character_data.rb +7 -0
  163. data/lib/nokogiri/xml/document.rb +131 -0
  164. data/lib/nokogiri/xml/document_fragment.rb +69 -0
  165. data/lib/nokogiri/xml/dtd.rb +11 -0
  166. data/lib/nokogiri/xml/element_content.rb +36 -0
  167. data/lib/nokogiri/xml/element_decl.rb +13 -0
  168. data/lib/nokogiri/xml/entity_decl.rb +15 -0
  169. data/lib/nokogiri/xml/fragment_handler.rb +71 -0
  170. data/lib/nokogiri/xml/namespace.rb +13 -0
  171. data/lib/nokogiri/xml/node.rb +665 -0
  172. data/lib/nokogiri/xml/node/save_options.rb +42 -0
  173. data/lib/nokogiri/xml/node_set.rb +307 -0
  174. data/lib/nokogiri/xml/notation.rb +6 -0
  175. data/lib/nokogiri/xml/parse_options.rb +85 -0
  176. data/lib/nokogiri/xml/pp.rb +2 -0
  177. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  178. data/lib/nokogiri/xml/pp/node.rb +56 -0
  179. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  180. data/lib/nokogiri/xml/reader.rb +74 -0
  181. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  182. data/lib/nokogiri/xml/sax.rb +4 -0
  183. data/lib/nokogiri/xml/sax/document.rb +160 -0
  184. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  185. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  186. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  187. data/lib/nokogiri/xml/schema.rb +61 -0
  188. data/lib/nokogiri/xml/syntax_error.rb +38 -0
  189. data/lib/nokogiri/xml/xpath.rb +10 -0
  190. data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
  191. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  192. data/lib/nokogiri/xslt.rb +48 -0
  193. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  194. data/lib/xsd/xmlparser/nokogiri.rb +71 -0
  195. data/tasks/test.rb +100 -0
  196. data/test/css/test_nthiness.rb +159 -0
  197. data/test/css/test_parser.rb +277 -0
  198. data/test/css/test_tokenizer.rb +183 -0
  199. data/test/css/test_xpath_visitor.rb +76 -0
  200. data/test/ffi/test_document.rb +35 -0
  201. data/test/files/2ch.html +108 -0
  202. data/test/files/address_book.rlx +12 -0
  203. data/test/files/address_book.xml +10 -0
  204. data/test/files/bar/bar.xsd +4 -0
  205. data/test/files/dont_hurt_em_why.xml +422 -0
  206. data/test/files/exslt.xml +8 -0
  207. data/test/files/exslt.xslt +35 -0
  208. data/test/files/foo/foo.xsd +4 -0
  209. data/test/files/po.xml +32 -0
  210. data/test/files/po.xsd +66 -0
  211. data/test/files/shift_jis.html +10 -0
  212. data/test/files/shift_jis.xml +5 -0
  213. data/test/files/snuggles.xml +3 -0
  214. data/test/files/staff.dtd +10 -0
  215. data/test/files/staff.xml +59 -0
  216. data/test/files/staff.xslt +32 -0
  217. data/test/files/tlm.html +850 -0
  218. data/test/files/valid_bar.xml +2 -0
  219. data/test/helper.rb +136 -0
  220. data/test/html/sax/test_parser.rb +64 -0
  221. data/test/html/sax/test_parser_context.rb +48 -0
  222. data/test/html/test_builder.rb +164 -0
  223. data/test/html/test_document.rb +390 -0
  224. data/test/html/test_document_encoding.rb +77 -0
  225. data/test/html/test_document_fragment.rb +132 -0
  226. data/test/html/test_element_description.rb +94 -0
  227. data/test/html/test_named_characters.rb +14 -0
  228. data/test/html/test_node.rb +228 -0
  229. data/test/html/test_node_encoding.rb +27 -0
  230. data/test/test_convert_xpath.rb +135 -0
  231. data/test/test_css_cache.rb +45 -0
  232. data/test/test_gc.rb +15 -0
  233. data/test/test_memory_leak.rb +77 -0
  234. data/test/test_nokogiri.rb +134 -0
  235. data/test/test_reader.rb +358 -0
  236. data/test/test_xslt_transforms.rb +131 -0
  237. data/test/xml/node/test_save_options.rb +20 -0
  238. data/test/xml/node/test_subclass.rb +44 -0
  239. data/test/xml/sax/test_parser.rb +307 -0
  240. data/test/xml/sax/test_parser_context.rb +56 -0
  241. data/test/xml/sax/test_push_parser.rb +131 -0
  242. data/test/xml/test_attr.rb +38 -0
  243. data/test/xml/test_attribute_decl.rb +82 -0
  244. data/test/xml/test_builder.rb +167 -0
  245. data/test/xml/test_cdata.rb +38 -0
  246. data/test/xml/test_comment.rb +29 -0
  247. data/test/xml/test_document.rb +607 -0
  248. data/test/xml/test_document_encoding.rb +26 -0
  249. data/test/xml/test_document_fragment.rb +138 -0
  250. data/test/xml/test_dtd.rb +82 -0
  251. data/test/xml/test_dtd_encoding.rb +33 -0
  252. data/test/xml/test_element_content.rb +56 -0
  253. data/test/xml/test_element_decl.rb +73 -0
  254. data/test/xml/test_entity_decl.rb +83 -0
  255. data/test/xml/test_entity_reference.rb +21 -0
  256. data/test/xml/test_namespace.rb +68 -0
  257. data/test/xml/test_node.rb +889 -0
  258. data/test/xml/test_node_attributes.rb +34 -0
  259. data/test/xml/test_node_encoding.rb +107 -0
  260. data/test/xml/test_node_set.rb +531 -0
  261. data/test/xml/test_parse_options.rb +52 -0
  262. data/test/xml/test_processing_instruction.rb +30 -0
  263. data/test/xml/test_reader_encoding.rb +126 -0
  264. data/test/xml/test_relax_ng.rb +60 -0
  265. data/test/xml/test_schema.rb +89 -0
  266. data/test/xml/test_syntax_error.rb +27 -0
  267. data/test/xml/test_text.rb +30 -0
  268. data/test/xml/test_unparented_node.rb +381 -0
  269. data/test/xml/test_xpath.rb +106 -0
  270. metadata +430 -0
@@ -0,0 +1,9 @@
1
+ #ifndef NOKOGIRI_XML_SCHEMA
2
+ #define NOKOGIRI_XML_SCHEMA
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_schema();
7
+
8
+ extern VALUE cNokogiriXmlSchema;
9
+ #endif
@@ -0,0 +1,261 @@
1
+ #include <xml_syntax_error.h>
2
+
3
+ static void dealloc(xmlErrorPtr ptr)
4
+ {
5
+ NOKOGIRI_DEBUG_START(ptr);
6
+ xmlResetError(ptr);
7
+ xmlFree(ptr);
8
+ NOKOGIRI_DEBUG_END(ptr);
9
+ }
10
+
11
+ static VALUE allocate(VALUE klass)
12
+ {
13
+ xmlErrorPtr error = xmlMalloc(sizeof(xmlError));
14
+ memset(error, 0, sizeof(xmlError));
15
+ return Data_Wrap_Struct(klass, NULL, dealloc, error);
16
+ }
17
+
18
+ /*
19
+ * call-seq:
20
+ * column
21
+ *
22
+ * Column number or 0 if not available
23
+ */
24
+ static VALUE column(VALUE self)
25
+ {
26
+ xmlErrorPtr error;
27
+ Data_Get_Struct(self, xmlError, error);
28
+ return INT2NUM(error->int2);
29
+ }
30
+
31
+ /*
32
+ * call-seq:
33
+ * int1
34
+ *
35
+ * Extra number information
36
+ */
37
+ static VALUE int1(VALUE self)
38
+ {
39
+ xmlErrorPtr error;
40
+ Data_Get_Struct(self, xmlError, error);
41
+ return INT2NUM(error->int1);
42
+ }
43
+
44
+ /*
45
+ * call-seq:
46
+ * str3
47
+ *
48
+ * Extra string information
49
+ */
50
+ static VALUE str3(VALUE self)
51
+ {
52
+ xmlErrorPtr error;
53
+ Data_Get_Struct(self, xmlError, error);
54
+ if(error->str3) return NOKOGIRI_STR_NEW2(error->str3);
55
+ return Qnil;
56
+ }
57
+
58
+ /*
59
+ * call-seq:
60
+ * str2
61
+ *
62
+ * Extra string information
63
+ */
64
+ static VALUE str2(VALUE self)
65
+ {
66
+ xmlErrorPtr error;
67
+ Data_Get_Struct(self, xmlError, error);
68
+ if(error->str2) return NOKOGIRI_STR_NEW2(error->str2);
69
+ return Qnil;
70
+ }
71
+
72
+ /*
73
+ * call-seq:
74
+ * str1
75
+ *
76
+ * Extra string information
77
+ */
78
+ static VALUE str1(VALUE self)
79
+ {
80
+ xmlErrorPtr error;
81
+ Data_Get_Struct(self, xmlError, error);
82
+ if(error->str1) return NOKOGIRI_STR_NEW2(error->str1);
83
+ return Qnil;
84
+ }
85
+
86
+ /*
87
+ * call-seq:
88
+ * line
89
+ *
90
+ * Get the line number of the error
91
+ */
92
+ static VALUE line(VALUE self)
93
+ {
94
+ xmlErrorPtr error;
95
+ Data_Get_Struct(self, xmlError, error);
96
+ return INT2NUM(error->line);
97
+ }
98
+
99
+ /*
100
+ * call-seq:
101
+ * file
102
+ *
103
+ * Get the filename for the error
104
+ */
105
+ static VALUE file(VALUE self)
106
+ {
107
+ xmlErrorPtr error;
108
+ Data_Get_Struct(self, xmlError, error);
109
+ if(error->file) return NOKOGIRI_STR_NEW2(error->file);
110
+
111
+ return Qnil;
112
+ }
113
+
114
+ /*
115
+ * call-seq:
116
+ * level
117
+ *
118
+ * Get the error level
119
+ */
120
+ static VALUE level(VALUE self)
121
+ {
122
+ xmlErrorPtr error;
123
+ Data_Get_Struct(self, xmlError, error);
124
+ return INT2NUM((short)error->level);
125
+ }
126
+
127
+ /*
128
+ * call-seq:
129
+ * code
130
+ *
131
+ * Get the error code
132
+ */
133
+ static VALUE code(VALUE self)
134
+ {
135
+ xmlErrorPtr error;
136
+ Data_Get_Struct(self, xmlError, error);
137
+ return INT2NUM(error->code);
138
+ }
139
+
140
+ /*
141
+ * call-seq:
142
+ * domain
143
+ *
144
+ * Get the part of the library that raised this exception
145
+ */
146
+ static VALUE domain(VALUE self)
147
+ {
148
+ xmlErrorPtr error;
149
+ Data_Get_Struct(self, xmlError, error);
150
+ return INT2NUM(error->domain);
151
+ }
152
+
153
+ /*
154
+ * call-seq:
155
+ * message
156
+ *
157
+ * Get the human readable message.
158
+ */
159
+ static VALUE message(VALUE self)
160
+ {
161
+ xmlErrorPtr error;
162
+ Data_Get_Struct(self, xmlError, error);
163
+ if(error->message) return NOKOGIRI_STR_NEW2(error->message);
164
+ return Qnil;
165
+ }
166
+
167
+ /*
168
+ * call-seq:
169
+ * message=
170
+ *
171
+ * Set the human readable message.
172
+ */
173
+ static VALUE set_message(VALUE self, VALUE _message)
174
+ {
175
+ xmlErrorPtr error;
176
+ Data_Get_Struct(self, xmlError, error);
177
+
178
+ if(error->message) {
179
+ xmlFree(error->message);
180
+ error->message = 0;
181
+ }
182
+
183
+ if(RTEST(_message)) {
184
+ error->message = xmlMalloc(RSTRING_LEN(_message) + 1);
185
+ memset(error->message, 0, RSTRING_LEN(_message) + 1);
186
+ memcpy(error->message, StringValuePtr(_message), RSTRING_LEN(_message));
187
+ }
188
+
189
+ return message;
190
+ }
191
+
192
+ /*
193
+ * call-seq:
194
+ * initialize_copy(old_copy)
195
+ *
196
+ * Initialize a copy of the +old_copy+
197
+ */
198
+ static VALUE initialize_copy(VALUE self, VALUE _old_copy)
199
+ {
200
+ if(!rb_obj_is_kind_of(_old_copy, cNokogiriXmlSyntaxError))
201
+ rb_raise(rb_eArgError, "node must be a Nokogiri::XML::SyntaxError");
202
+
203
+ xmlErrorPtr error, old_error;
204
+ Data_Get_Struct(self, xmlError, error);
205
+ Data_Get_Struct(_old_copy, xmlError, old_error);
206
+
207
+ xmlCopyError(old_error, error);
208
+
209
+ return message;
210
+ }
211
+
212
+ void Nokogiri_error_array_pusher(void * ctx, xmlErrorPtr error)
213
+ {
214
+ VALUE list = (VALUE)ctx;
215
+ rb_ary_push(list, Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
216
+ }
217
+
218
+ void Nokogiri_error_raise(void * ctx, xmlErrorPtr error)
219
+ {
220
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
221
+ }
222
+
223
+ VALUE Nokogiri_wrap_xml_syntax_error(VALUE klass, xmlErrorPtr error)
224
+ {
225
+ if(!klass) klass = cNokogiriXmlSyntaxError;
226
+
227
+ xmlErrorPtr ptr = calloc(1, sizeof(xmlError));
228
+ xmlCopyError(error, ptr);
229
+
230
+ return Data_Wrap_Struct(klass, NULL, dealloc, ptr);
231
+ }
232
+
233
+ VALUE cNokogiriXmlSyntaxError;
234
+ void init_xml_syntax_error()
235
+ {
236
+ VALUE nokogiri = rb_define_module("Nokogiri");
237
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
238
+
239
+ /*
240
+ * The XML::SyntaxError is raised on parse errors
241
+ */
242
+ VALUE syntax_error_mommy = rb_define_class_under(nokogiri, "SyntaxError", rb_eStandardError);
243
+ VALUE klass = rb_define_class_under(xml, "SyntaxError", syntax_error_mommy);
244
+ cNokogiriXmlSyntaxError = klass;
245
+
246
+ rb_define_alloc_func(klass, allocate);
247
+
248
+ rb_define_method(klass, "message", message, 0);
249
+ rb_define_method(klass, "message=", set_message, 1);
250
+ rb_define_method(klass, "initialize_copy", initialize_copy, 1);
251
+ rb_define_method(klass, "domain", domain, 0);
252
+ rb_define_method(klass, "code", code, 0);
253
+ rb_define_method(klass, "level", level, 0);
254
+ rb_define_method(klass, "file", file, 0);
255
+ rb_define_method(klass, "line", line, 0);
256
+ rb_define_method(klass, "str1", str1, 0);
257
+ rb_define_method(klass, "str2", str2, 0);
258
+ rb_define_method(klass, "str3", str3, 0);
259
+ rb_define_method(klass, "int1", int1, 0);
260
+ rb_define_method(klass, "column", column, 0);
261
+ }
@@ -0,0 +1,13 @@
1
+ #ifndef NOKOGIRI_XML_SYNTAX_ERROR
2
+ #define NOKOGIRI_XML_SYNTAX_ERROR
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_syntax_error();
7
+ VALUE Nokogiri_wrap_xml_syntax_error(VALUE klass, xmlErrorPtr error);
8
+ void Nokogiri_error_array_pusher(void * ctx, xmlErrorPtr error);
9
+ void Nokogiri_error_raise(void * ctx, xmlErrorPtr error);
10
+
11
+ extern VALUE cNokogiriXmlSyntaxError;
12
+ #endif
13
+
@@ -0,0 +1,48 @@
1
+ #include <xml_text.h>
2
+
3
+ /*
4
+ * call-seq:
5
+ * new(content, document)
6
+ *
7
+ * Create a new Text element on the +document+ with +content+
8
+ */
9
+ static VALUE new(int argc, VALUE *argv, VALUE klass)
10
+ {
11
+ xmlDocPtr doc;
12
+ VALUE string;
13
+ VALUE document;
14
+ VALUE rest;
15
+
16
+ rb_scan_args(argc, argv, "2*", &string, &document, &rest);
17
+
18
+ Data_Get_Struct(document, xmlDoc, doc);
19
+
20
+ xmlNodePtr node = xmlNewText((xmlChar *)StringValuePtr(string));
21
+ node->doc = doc->doc;
22
+
23
+ VALUE rb_node = Nokogiri_wrap_xml_node(klass, node) ;
24
+ rb_obj_call_init(rb_node, argc, argv);
25
+
26
+ if(rb_block_given_p()) rb_yield(rb_node);
27
+
28
+ return rb_node;
29
+ }
30
+
31
+ VALUE cNokogiriXmlText ;
32
+ void init_xml_text()
33
+ {
34
+ VALUE nokogiri = rb_define_module("Nokogiri");
35
+ VALUE xml = rb_define_module_under(nokogiri, "XML");
36
+ /* */
37
+ VALUE node = rb_define_class_under(xml, "Node", rb_cObject);
38
+ VALUE char_data = rb_define_class_under(xml, "CharacterData", node);
39
+
40
+ /*
41
+ * Wraps Text nodes.
42
+ */
43
+ VALUE klass = rb_define_class_under(xml, "Text", char_data);
44
+
45
+ cNokogiriXmlText = klass;
46
+
47
+ rb_define_singleton_method(klass, "new", new, -1);
48
+ }
@@ -0,0 +1,9 @@
1
+ #ifndef NOKOGIRI_XML_TEXT
2
+ #define NOKOGIRI_XML_TEXT
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_text();
7
+
8
+ extern VALUE cNokogiriXmlText ;
9
+ #endif
@@ -0,0 +1,53 @@
1
+ #include <xml_xpath.h>
2
+
3
+ static void deallocate(xmlXPathObjectPtr xpath)
4
+ {
5
+ NOKOGIRI_DEBUG_START(xpath);
6
+ xmlXPathFreeNodeSetList(xpath); // despite the name, this frees the xpath but not the contained node set
7
+ NOKOGIRI_DEBUG_END(xpath);
8
+ }
9
+
10
+ VALUE Nokogiri_wrap_xml_xpath(xmlXPathObjectPtr xpath)
11
+ {
12
+ return Data_Wrap_Struct(cNokogiriXmlXpath, 0, deallocate, xpath);
13
+ }
14
+
15
+ /*
16
+ * call-seq:
17
+ * node_set
18
+ *
19
+ * Fetch the node set associated with this xpath context.
20
+ */
21
+ static VALUE node_set(VALUE self)
22
+ {
23
+ xmlXPathObjectPtr xpath;
24
+ Data_Get_Struct(self, xmlXPathObject, xpath);
25
+
26
+ VALUE node_set = Qnil;
27
+
28
+ if (xpath->nodesetval)
29
+ node_set = Nokogiri_wrap_xml_node_set(xpath->nodesetval);
30
+
31
+ if(NIL_P(node_set))
32
+ node_set = Nokogiri_wrap_xml_node_set(xmlXPathNodeSetCreate(NULL));
33
+
34
+ rb_funcall(node_set, rb_intern("document="), 1, rb_iv_get(self, "@document"));
35
+
36
+ return node_set;
37
+ }
38
+
39
+ VALUE cNokogiriXmlXpath;
40
+ void init_xml_xpath(void)
41
+ {
42
+ VALUE module = rb_define_module("Nokogiri");
43
+ VALUE xml = rb_define_module_under(module, "XML");
44
+
45
+ /*
46
+ * This class wraps an XPath object and should only be instantiated from
47
+ * XPathContext.
48
+ */
49
+ VALUE klass = rb_define_class_under(xml, "XPath", rb_cObject);
50
+
51
+ cNokogiriXmlXpath = klass;
52
+ rb_define_method(klass, "node_set", node_set, 0);
53
+ }
@@ -0,0 +1,11 @@
1
+ #ifndef NOKOGIRI_XML_XPATH
2
+ #define NOKOGIRI_XML_XPATH
3
+
4
+ #include <nokogiri.h>
5
+
6
+ void init_xml_xpath();
7
+ VALUE Nokogiri_wrap_xml_xpath(xmlXPathObjectPtr xpath);
8
+
9
+ extern VALUE cNokogiriXmlXpath;
10
+ #endif
11
+
@@ -0,0 +1,239 @@
1
+ #include <xml_xpath_context.h>
2
+
3
+ static void deallocate(xmlXPathContextPtr ctx)
4
+ {
5
+ NOKOGIRI_DEBUG_START(ctx);
6
+ xmlXPathFreeContext(ctx);
7
+ NOKOGIRI_DEBUG_END(ctx);
8
+ }
9
+
10
+ /*
11
+ * call-seq:
12
+ * register_ns(prefix, uri)
13
+ *
14
+ * Register the namespace with +prefix+ and +uri+.
15
+ */
16
+ static VALUE register_ns(VALUE self, VALUE prefix, VALUE uri)
17
+ {
18
+ xmlXPathContextPtr ctx;
19
+ Data_Get_Struct(self, xmlXPathContext, ctx);
20
+
21
+ xmlXPathRegisterNs( ctx,
22
+ (const xmlChar *)StringValuePtr(prefix),
23
+ (const xmlChar *)StringValuePtr(uri)
24
+ );
25
+ return self;
26
+ }
27
+
28
+ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
29
+ {
30
+ VALUE xpath_handler = Qnil;
31
+ xmlXPathObjectPtr obj;
32
+
33
+ assert(ctx);
34
+ assert(ctx->context);
35
+ assert(ctx->context->userData);
36
+ assert(ctx->context->doc);
37
+ assert(DOC_RUBY_OBJECT_TEST(ctx->context->doc));
38
+
39
+ xpath_handler = (VALUE)(ctx->context->userData);
40
+
41
+ VALUE * argv = (VALUE *)calloc((unsigned int)nargs, sizeof(VALUE));
42
+ VALUE doc = DOC_RUBY_OBJECT(ctx->context->doc);
43
+
44
+ int i = nargs - 1;
45
+ do {
46
+ obj = valuePop(ctx);
47
+ switch(obj->type) {
48
+ case XPATH_STRING:
49
+ argv[i] = NOKOGIRI_STR_NEW2(obj->stringval);
50
+ break;
51
+ case XPATH_BOOLEAN:
52
+ argv[i] = obj->boolval == 1 ? Qtrue : Qfalse;
53
+ break;
54
+ case XPATH_NUMBER:
55
+ argv[i] = rb_float_new(obj->floatval);
56
+ break;
57
+ case XPATH_NODESET:
58
+ argv[i] = Nokogiri_wrap_xml_node_set(obj->nodesetval);
59
+ break;
60
+ default:
61
+ argv[i] = NOKOGIRI_STR_NEW2(xmlXPathCastToString(obj));
62
+ }
63
+ xmlXPathFreeNodeSetList(obj);
64
+ } while(i-- > 0);
65
+
66
+ VALUE result = rb_funcall2(
67
+ xpath_handler,
68
+ rb_intern((const char *)ctx->context->function),
69
+ nargs,
70
+ argv
71
+ );
72
+ free(argv);
73
+
74
+ VALUE node_set = Qnil;
75
+ xmlNodeSetPtr xml_node_set = NULL;
76
+
77
+ switch(TYPE(result)) {
78
+ case T_FLOAT:
79
+ case T_BIGNUM:
80
+ case T_FIXNUM:
81
+ xmlXPathReturnNumber(ctx, NUM2DBL(result));
82
+ break;
83
+ case T_STRING:
84
+ xmlXPathReturnString(
85
+ ctx,
86
+ (xmlChar *)xmlXPathWrapCString(StringValuePtr(result))
87
+ );
88
+ break;
89
+ case T_TRUE:
90
+ xmlXPathReturnTrue(ctx);
91
+ break;
92
+ case T_FALSE:
93
+ xmlXPathReturnFalse(ctx);
94
+ break;
95
+ case T_NIL:
96
+ break;
97
+ case T_ARRAY:
98
+ {
99
+ VALUE args[2] = {doc, result};
100
+ node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet);
101
+ Data_Get_Struct(node_set, xmlNodeSet, xml_node_set);
102
+ xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
103
+ }
104
+ break;
105
+ case T_DATA:
106
+ if(rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) {
107
+ Data_Get_Struct(result, xmlNodeSet, xml_node_set);
108
+ // Copy the node set, otherwise it will get GC'd.
109
+ xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
110
+ break;
111
+ }
112
+ default:
113
+ rb_raise(rb_eRuntimeError, "Invalid return type");
114
+ }
115
+ }
116
+
117
+ static xmlXPathFunction lookup( void *ctx,
118
+ const xmlChar * name,
119
+ const xmlChar* ns_uri )
120
+ {
121
+ VALUE xpath_handler = (VALUE)ctx;
122
+ if(rb_respond_to(xpath_handler, rb_intern((const char *)name)))
123
+ return ruby_funcall;
124
+
125
+ return NULL;
126
+ }
127
+
128
+ static void xpath_exception_handler(void * ctx, xmlErrorPtr error)
129
+ {
130
+ VALUE xpath = rb_const_get(mNokogiriXml, rb_intern("XPath"));
131
+ VALUE klass = rb_const_get(xpath, rb_intern("SyntaxError"));
132
+
133
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(klass, error));
134
+ }
135
+
136
+ static void xpath_generic_exception_handler(void * ctx, const char *msg, ...)
137
+ {
138
+ char * message;
139
+
140
+ va_list args;
141
+ va_start(args, msg);
142
+ vasprintf(&message, msg, args);
143
+ va_end(args);
144
+
145
+ rb_raise(rb_eRuntimeError, message);
146
+ }
147
+
148
+ /*
149
+ * call-seq:
150
+ * evaluate(search_path)
151
+ *
152
+ * Evaluate the +search_path+ returning an XML::XPath object.
153
+ */
154
+ static VALUE evaluate(int argc, VALUE *argv, VALUE self)
155
+ {
156
+ VALUE search_path, xpath_handler;
157
+ xmlXPathContextPtr ctx;
158
+ Data_Get_Struct(self, xmlXPathContext, ctx);
159
+
160
+ if(rb_scan_args(argc, argv, "11", &search_path, &xpath_handler) == 1)
161
+ xpath_handler = Qnil;
162
+
163
+ xmlChar* query = (xmlChar *)StringValuePtr(search_path);
164
+
165
+ if(Qnil != xpath_handler) {
166
+ // FIXME: not sure if this is the correct place to shove private data.
167
+ ctx->userData = (void *)xpath_handler;
168
+ xmlXPathRegisterFuncLookup(ctx, lookup, (void *)xpath_handler);
169
+ }
170
+
171
+ xmlResetLastError();
172
+ xmlSetStructuredErrorFunc(NULL, xpath_exception_handler);
173
+
174
+ // For some reason, xmlXPathEvalExpression will blow up with a generic error
175
+ // when there is a non existent function.
176
+ xmlSetGenericErrorFunc(NULL, xpath_generic_exception_handler);
177
+
178
+ xmlXPathObjectPtr xpath = xmlXPathEvalExpression(query, ctx);
179
+ xmlSetStructuredErrorFunc(NULL, NULL);
180
+ xmlSetGenericErrorFunc(NULL, NULL);
181
+
182
+ if(xpath == NULL) {
183
+ VALUE xpath = rb_const_get(mNokogiriXml, rb_intern("XPath"));
184
+ VALUE klass = rb_const_get(xpath, rb_intern("SyntaxError"));
185
+
186
+ xmlErrorPtr error = xmlGetLastError();
187
+ rb_exc_raise(Nokogiri_wrap_xml_syntax_error(klass, error));
188
+ }
189
+
190
+ VALUE xpath_object = Nokogiri_wrap_xml_xpath(xpath);
191
+
192
+ assert(ctx->doc);
193
+ assert(DOC_RUBY_OBJECT_TEST(ctx->doc));
194
+
195
+ rb_iv_set(xpath_object, "@document", DOC_RUBY_OBJECT(ctx->doc));
196
+ return xpath_object;
197
+ }
198
+
199
+ /*
200
+ * call-seq:
201
+ * new(node)
202
+ *
203
+ * Create a new XPathContext with +node+ as the reference point.
204
+ */
205
+ static VALUE new(VALUE klass, VALUE nodeobj)
206
+ {
207
+ xmlXPathInit();
208
+
209
+ xmlNodePtr node ;
210
+ Data_Get_Struct(nodeobj, xmlNode, node);
211
+
212
+ xmlXPathContextPtr ctx = xmlXPathNewContext(node->doc);
213
+ ctx->node = node;
214
+ VALUE self = Data_Wrap_Struct(klass, 0, deallocate, ctx);
215
+ //rb_iv_set(self, "@xpath_handler", Qnil);
216
+ return self;
217
+ }
218
+
219
+ VALUE cNokogiriXmlXpathContext;
220
+ void init_xml_xpath_context(void)
221
+ {
222
+ VALUE module = rb_define_module("Nokogiri");
223
+
224
+ /*
225
+ * Nokogiri::XML
226
+ */
227
+ VALUE xml = rb_define_module_under(module, "XML");
228
+
229
+ /*
230
+ * XPathContext is the entry point for searching a Document by using XPath.
231
+ */
232
+ VALUE klass = rb_define_class_under(xml, "XPathContext", rb_cObject);
233
+
234
+ cNokogiriXmlXpathContext = klass;
235
+
236
+ rb_define_singleton_method(klass, "new", new, 1);
237
+ rb_define_method(klass, "evaluate", evaluate, -1);
238
+ rb_define_method(klass, "register_ns", register_ns, 2);
239
+ }