libxml-ruby 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/CHANGES +42 -0
  2. data/README +123 -117
  3. data/doc/classes/XML.html +226 -0
  4. data/doc/classes/XML/Attr.html +969 -0
  5. data/doc/classes/XML/Attributes.html +487 -0
  6. data/doc/classes/XML/Document.html +1423 -0
  7. data/doc/classes/XML/Dtd.html +159 -0
  8. data/doc/classes/XML/Error.html +111 -0
  9. data/doc/classes/XML/HTMLParser.html +330 -0
  10. data/doc/classes/XML/InputCallbacks.html +154 -0
  11. data/doc/classes/XML/NS.html +366 -0
  12. data/doc/classes/XML/Node.html +3292 -0
  13. data/doc/classes/XML/Node/FailedModify.html +111 -0
  14. data/doc/classes/XML/Node/Set.html +435 -0
  15. data/doc/classes/XML/Node/SetNamespace.html +111 -0
  16. data/doc/classes/XML/Node/UnknownType.html +111 -0
  17. data/doc/classes/XML/Parser.html +2178 -0
  18. data/doc/classes/XML/Parser/Context.html +1233 -0
  19. data/doc/classes/XML/Parser/ParseError.html +111 -0
  20. data/doc/classes/XML/Reader.html +2173 -0
  21. data/doc/classes/XML/SaxParser.html +396 -0
  22. data/doc/classes/XML/SiblingEnum.html +142 -0
  23. data/doc/classes/XML/State.html +118 -0
  24. data/doc/classes/XML/Tree.html +224 -0
  25. data/doc/classes/XML/XInclude.html +117 -0
  26. data/doc/classes/XML/XInclude/Error.html +111 -0
  27. data/doc/classes/XML/XMLParserOptions.html +198 -0
  28. data/doc/classes/XML/XPath.html +269 -0
  29. data/doc/classes/XML/XPath/Context.html +193 -0
  30. data/doc/classes/XML/XPath/InvalidPath.html +111 -0
  31. data/doc/classes/XML/XPath/Object.html +439 -0
  32. data/doc/classes/XML/XPointer.html +164 -0
  33. data/doc/classes/XML/XPointer/Context.html +117 -0
  34. data/doc/classes/XML/XPointer/Context/InvalidPath.html +111 -0
  35. data/doc/classes/XML/XPointer/InvalidExpression.html +111 -0
  36. data/doc/classes/singleton.html +114 -0
  37. data/doc/created.rid +1 -0
  38. data/doc/files/CHANGES.html +375 -0
  39. data/doc/files/LICENSE.html +133 -0
  40. data/doc/files/README.html +279 -0
  41. data/doc/files/VERSION.html +107 -0
  42. data/doc/files/ext/libxml/cbg_c.html +101 -0
  43. data/doc/files/ext/libxml/libxml_c.html +101 -0
  44. data/doc/files/ext/libxml/ruby_xml_attr_c.html +101 -0
  45. data/doc/files/ext/libxml/ruby_xml_attributes_c.html +101 -0
  46. data/doc/files/ext/libxml/ruby_xml_document_c.html +101 -0
  47. data/doc/files/ext/libxml/ruby_xml_dtd_c.html +101 -0
  48. data/doc/files/ext/libxml/ruby_xml_html_parser_c.html +101 -0
  49. data/doc/files/ext/libxml/ruby_xml_input_cbg_c.html +101 -0
  50. data/doc/files/ext/libxml/ruby_xml_node_c.html +101 -0
  51. data/doc/files/ext/libxml/ruby_xml_node_set_c.html +101 -0
  52. data/doc/files/ext/libxml/ruby_xml_ns_c.html +101 -0
  53. data/doc/files/ext/libxml/ruby_xml_parser_c.html +101 -0
  54. data/doc/files/ext/libxml/ruby_xml_parser_context_c.html +101 -0
  55. data/doc/files/ext/libxml/ruby_xml_reader_c.html +101 -0
  56. data/doc/files/ext/libxml/ruby_xml_sax_parser_c.html +101 -0
  57. data/doc/files/ext/libxml/ruby_xml_schema_c.html +101 -0
  58. data/doc/files/ext/libxml/ruby_xml_state_c.html +101 -0
  59. data/doc/files/ext/libxml/ruby_xml_tree_c.html +101 -0
  60. data/doc/files/ext/libxml/ruby_xml_xinclude_c.html +101 -0
  61. data/doc/files/ext/libxml/ruby_xml_xpath_c.html +101 -0
  62. data/doc/files/ext/libxml/ruby_xml_xpath_context_c.html +101 -0
  63. data/doc/files/ext/libxml/ruby_xml_xpath_object_c.html +101 -0
  64. data/doc/files/ext/libxml/ruby_xml_xpointer_c.html +101 -0
  65. data/doc/files/ext/libxml/ruby_xml_xpointer_context_c.html +101 -0
  66. data/doc/files/lib/libxml_rb.html +115 -0
  67. data/doc/files/lib/xml/libxml_rb.html +114 -0
  68. data/doc/fr_class_index.html +60 -0
  69. data/doc/fr_file_index.html +56 -0
  70. data/doc/fr_method_index.html +373 -0
  71. data/doc/index.html +24 -0
  72. data/doc/rdoc-style.css +208 -0
  73. data/ext/libxml/cbg.c +76 -76
  74. data/ext/libxml/extconf.rb +308 -308
  75. data/ext/libxml/libxml.c +58 -62
  76. data/ext/libxml/ruby_libxml.h +1 -0
  77. data/ext/libxml/ruby_xml_attr.c +201 -113
  78. data/ext/libxml/ruby_xml_attr.h +6 -9
  79. data/ext/libxml/ruby_xml_attributes.c +268 -0
  80. data/ext/libxml/ruby_xml_attributes.h +17 -0
  81. data/ext/libxml/ruby_xml_document.c +80 -66
  82. data/ext/libxml/ruby_xml_dtd.c +2 -2
  83. data/ext/libxml/ruby_xml_dtd.h +17 -17
  84. data/ext/libxml/ruby_xml_html_parser.c +18 -19
  85. data/ext/libxml/ruby_xml_html_parser.h +29 -29
  86. data/ext/libxml/ruby_xml_input_cbg.c +6 -0
  87. data/ext/libxml/ruby_xml_input_cbg.h +20 -20
  88. data/ext/libxml/ruby_xml_node.c +438 -536
  89. data/ext/libxml/ruby_xml_node.h +17 -27
  90. data/ext/libxml/ruby_xml_node_set.c +10 -9
  91. data/ext/libxml/ruby_xml_node_set.h +20 -20
  92. data/ext/libxml/ruby_xml_ns.c +60 -69
  93. data/ext/libxml/ruby_xml_ns.h +12 -21
  94. data/ext/libxml/ruby_xml_parser.c +54 -53
  95. data/ext/libxml/ruby_xml_parser.h +31 -31
  96. data/ext/libxml/ruby_xml_parser_context.c +37 -91
  97. data/ext/libxml/ruby_xml_parser_context.h +20 -22
  98. data/ext/libxml/ruby_xml_reader.h +14 -14
  99. data/ext/libxml/ruby_xml_sax_parser.c +55 -55
  100. data/ext/libxml/ruby_xml_sax_parser.h +56 -56
  101. data/ext/libxml/ruby_xml_schema.c +44 -51
  102. data/ext/libxml/ruby_xml_schema.h +16 -16
  103. data/ext/libxml/ruby_xml_state.c +35 -96
  104. data/ext/libxml/ruby_xml_state.h +2 -3
  105. data/ext/libxml/ruby_xml_tree.h +12 -12
  106. data/ext/libxml/ruby_xml_xinclude.h +13 -13
  107. data/ext/libxml/ruby_xml_xpath.c +57 -18
  108. data/ext/libxml/ruby_xml_xpath.h +23 -23
  109. data/ext/libxml/ruby_xml_xpath_context.c +11 -7
  110. data/ext/libxml/ruby_xml_xpath_context.h +20 -20
  111. data/ext/libxml/ruby_xml_xpath_object.c +9 -16
  112. data/ext/libxml/ruby_xml_xpath_object.h +4 -10
  113. data/ext/libxml/ruby_xml_xpointer.c +11 -11
  114. data/ext/libxml/ruby_xml_xpointer.h +27 -27
  115. data/ext/libxml/ruby_xml_xpointer_context.h +18 -18
  116. data/ext/libxml/version.h +2 -2
  117. data/lib/libxml.rb +134 -125
  118. data/mingw/libiconv-2.dll +0 -0
  119. data/mingw/libxml2-2.dll +0 -0
  120. data/mingw/libxml_ruby.so +0 -0
  121. data/test/ets_copy_bug.rb +1 -1
  122. data/test/ets_copy_bug2.rb +16 -27
  123. data/test/ets_doc_to_s.rb +1 -1
  124. data/test/ets_gpx.rb +1 -1
  125. data/test/ets_node_gc.rb +1 -1
  126. data/test/ets_tsr.rb +1 -1
  127. data/test/tc_well_formed.rb +1 -1
  128. data/test/tc_xml_attributes.rb +106 -0
  129. data/test/tc_xml_document.rb +10 -10
  130. data/test/tc_xml_document_write3.rb +1 -1
  131. data/test/tc_xml_dtd.rb +49 -0
  132. data/test/tc_xml_html_parser.rb +3 -3
  133. data/test/tc_xml_node.rb +69 -33
  134. data/test/tc_xml_node_attr.rb +170 -0
  135. data/test/{tc_xml_node8.rb → tc_xml_node_cdata.rb} +2 -2
  136. data/test/{tc_xml_node9.rb → tc_xml_node_comment.rb} +3 -3
  137. data/test/tc_xml_node_edit.rb +91 -0
  138. data/test/tc_xml_parser.rb +97 -50
  139. data/test/tc_xml_parser_context.rb +61 -23
  140. data/test/tc_xml_schema.rb +39 -0
  141. data/test/tc_xml_xinclude.rb +5 -6
  142. data/test/tc_xml_xpath.rb +51 -27
  143. data/test/test_suite.rb +27 -0
  144. data/vc/{libxml.sln → libxml_ruby.sln} +5 -5
  145. data/vc/{libxml.vcproj → libxml_ruby.vcproj} +9 -1
  146. metadata +106 -54
  147. data/mingw/mingw.rake +0 -36
  148. data/test/dtd-test.rb +0 -24
  149. data/test/merge_bug.rb +0 -55
  150. data/test/schema-test.rb +0 -74
  151. data/test/tc_xml_node2.rb +0 -25
  152. data/test/tc_xml_node3.rb +0 -27
  153. data/test/tc_xml_node4.rb +0 -86
  154. data/test/tc_xml_node5.rb +0 -52
  155. data/test/tc_xml_node6.rb +0 -27
  156. data/test/tc_xml_node7.rb +0 -35
  157. data/test/tc_xml_parser2.rb +0 -16
  158. data/test/tc_xml_parser3.rb +0 -23
  159. data/test/tc_xml_parser4.rb +0 -33
  160. data/test/tc_xml_parser5.rb +0 -27
  161. data/test/tc_xml_parser6.rb +0 -23
  162. data/test/tc_xml_parser7.rb +0 -28
  163. data/test/tc_xml_parser8.rb +0 -32
  164. data/test/tc_xml_parser9.rb +0 -11
  165. data/test/tc_xml_xpath2.rb +0 -14
  166. data/work/vc/debug/libxml.exp +0 -0
  167. data/work/vc/debug/libxml.ilk +0 -0
  168. data/work/vc/debug/libxml.lib +0 -0
  169. data/work/vc/debug/libxml.pdb +0 -0
  170. data/work/vc/debug/libxml.so +0 -0
data/ext/libxml/libxml.c CHANGED
@@ -1,62 +1,58 @@
1
- /* $Id: libxml.c 300 2008-07-01 19:14:15Z cfis $ */
2
-
3
- /* Please see the LICENSE file for copyright and distribution information */
4
-
5
- #include "ruby_libxml.h"
6
-
7
- VALUE mXML;
8
- VALUE eXMLError;
9
-
10
- static xmlFreeFunc freeFunc = NULL;
11
- static xmlMallocFunc mallocFunc = NULL;
12
- static xmlReallocFunc reallocFunc = NULL;
13
- static xmlStrdupFunc strdupFunc = NULL;
14
-
15
- #if defined(_WIN32)
16
- __declspec(dllexport)
17
- #endif
18
-
19
- void
20
- Init_libxml_ruby(void) {
21
- /* Some libxml memory goo that should be done before anything else */
22
- #ifdef NONE
23
- xmlMemGet((xmlFreeFunc *) & freeFunc,
24
- (xmlMallocFunc *) & mallocFunc,
25
- (xmlReallocFunc *) & reallocFunc,
26
- (xmlStrdupFunc *) & strdupFunc);
27
-
28
- if (xmlMemSetup((xmlFreeFunc)RubyMemFree, (xmlMallocFunc)RubyMemMalloc,
29
- (xmlReallocFunc)RubyMemRealloc, (xmlStrdupFunc)RubyMemStrdup) != 0)
30
- rb_fatal("could not install the memory handlers for libxml");
31
- #endif
32
- xmlInitParser();
33
-
34
- mXML = rb_define_module("XML");
35
- eXMLError = rb_define_class_under(mXML, "Error", rb_eRuntimeError);
36
-
37
- rb_define_const(mXML, "XML_NAMESPACE", rb_str_new2((const char*)XML_XML_NAMESPACE));
38
-
39
- ruby_init_state();
40
- ruby_init_parser();
41
- ruby_init_xml_parser_context();
42
- ruby_init_xml_attr();
43
- ruby_init_xml_document();
44
- ruby_init_xml_node();
45
- ruby_init_xml_node_set();
46
- ruby_init_xml_ns();
47
- ruby_init_xml_sax_parser();
48
- ruby_init_xml_tree();
49
- ruby_init_xml_xinclude();
50
- ruby_init_xml_xpath();
51
- ruby_init_xml_xpath_context();
52
- ruby_init_xml_xpointer();
53
- ruby_init_xml_xpointer_context();
54
- ruby_init_html_parser();
55
- ruby_init_input_callbacks();
56
- ruby_init_xml_dtd();
57
- ruby_init_xml_schema();
58
- ruby_init_xml_reader();
59
-
60
- ruby_xml_parser_default_substitute_entities_set(cXMLParser, Qtrue);
61
- ruby_xml_parser_default_load_external_dtd_set(cXMLParser, Qtrue);
62
- }
1
+ /* $Id: libxml.c 323 2008-07-08 22:59:23Z cfis $ */
2
+
3
+ /* Please see the LICENSE file for copyright and distribution information */
4
+
5
+ #include "ruby_libxml.h"
6
+
7
+ VALUE mXML;
8
+ VALUE eXMLError;
9
+
10
+
11
+ #if defined(_WIN32)
12
+ __declspec(dllexport)
13
+ #endif
14
+
15
+ void
16
+ Init_libxml_ruby(void) {
17
+ /* Some libxml memory goo that should be done before anything else */
18
+ #ifdef NONE
19
+ xmlMemGet((xmlFreeFunc *) & freeFunc,
20
+ (xmlMallocFunc *) & mallocFunc,
21
+ (xmlReallocFunc *) & reallocFunc,
22
+ (xmlStrdupFunc *) & strdupFunc);
23
+
24
+ if (xmlMemSetup((xmlFreeFunc)RubyMemFree, (xmlMallocFunc)RubyMemMalloc,
25
+ (xmlReallocFunc)RubyMemRealloc, (xmlStrdupFunc)RubyMemStrdup) != 0)
26
+ rb_fatal("could not install the memory handlers for libxml");
27
+ #endif
28
+
29
+ mXML = rb_define_module("XML");
30
+ eXMLError = rb_define_class_under(mXML, "Error", rb_eRuntimeError);
31
+
32
+ rb_define_const(mXML, "XML_NAMESPACE", rb_str_new2((const char*)XML_XML_NAMESPACE));
33
+
34
+ ruby_init_state();
35
+ ruby_init_parser();
36
+ ruby_init_xml_parser_context();
37
+ ruby_init_xml_attributes();
38
+ ruby_init_xml_attr();
39
+ ruby_init_xml_document();
40
+ ruby_init_xml_node();
41
+ ruby_init_xml_node_set();
42
+ ruby_init_xml_ns();
43
+ ruby_init_xml_sax_parser();
44
+ ruby_init_xml_tree();
45
+ ruby_init_xml_xinclude();
46
+ ruby_init_xml_xpath();
47
+ ruby_init_xml_xpath_context();
48
+ ruby_init_xml_xpointer();
49
+ ruby_init_xml_xpointer_context();
50
+ ruby_init_html_parser();
51
+ ruby_init_input_callbacks();
52
+ ruby_init_xml_dtd();
53
+ ruby_init_xml_schema();
54
+ ruby_init_xml_reader();
55
+
56
+ ruby_xml_parser_default_substitute_entities_set(cXMLParser, Qtrue);
57
+ ruby_xml_parser_default_load_external_dtd_set(cXMLParser, Qtrue);
58
+ }
@@ -63,6 +63,7 @@ typedef struct rx_xpath_data {
63
63
  } rx_xpath_data;
64
64
 
65
65
  #include "ruby_xml_state.h"
66
+ #include "ruby_xml_attributes.h"
66
67
  #include "ruby_xml_attr.h"
67
68
  #include "ruby_xml_document.h"
68
69
  #include "ruby_xml_node.h"
@@ -1,103 +1,159 @@
1
- /* $Id: ruby_xml_attr.c 300 2008-07-01 19:14:15Z cfis $ */
1
+ /* $Id: ruby_xml_attr.c 351 2008-07-09 19:55:21Z cfis $ */
2
2
 
3
3
  /* Please see the LICENSE file for copyright and distribution information */
4
4
 
5
+ /*
6
+ * Document-class: XML::Attr
7
+ *
8
+ * Provides access to an single element attribute. Accessed by
9
+ * calling XML::Node#attributes method.
10
+ *
11
+ * Basic Usage:
12
+ * require 'libxml'
13
+ *
14
+ * doc = XML::Document.new(<some_file>)
15
+ * attribute = doc.root.attributes.get_attribute_ns('http://www.w3.org/1999/xlink', 'href')
16
+ * attribute.name == 'href'
17
+ * attribute.value == 'http://www.mydocument.com'
18
+ * attribute.remove!
19
+ */
20
+
5
21
  #include "ruby_libxml.h"
6
22
  #include "ruby_xml_attr.h"
7
23
 
8
24
  VALUE cXMLAttr;
9
25
 
10
- void ruby_xml_attr_free(ruby_xml_attr_t *rx) {
11
- if (rx == NULL ) return;
26
+ void ruby_xml_attr_free(xmlAttrPtr xattr) {
27
+ if (!xattr) return;
12
28
 
13
- if (rx->attr != NULL ) {
14
- rx->attr->_private=NULL;
15
- if (rx->attr->parent == NULL && rx->attr->doc == NULL ) {
29
+ if (xattr != NULL ) {
30
+ xattr->_private=NULL;
31
+ if (xattr->parent == NULL && xattr->doc == NULL ) {
16
32
  #ifdef NODE_DEBUG
17
33
  fprintf(stderr,"ruby_xfree rxn=0x%x xn=0x%x o=0x%x\n",(long)rxn,(long)rxn->node,(long)rxn->node->_private);
18
34
  #endif
19
- xmlFreeProp(rx->attr);
35
+ xmlFreeProp(xattr);
20
36
  }
21
37
 
22
- rx->attr=NULL;
38
+ xattr=NULL;
23
39
  }
24
-
25
- ruby_xfree(rx);
26
40
  }
27
41
 
28
42
  void
29
- ruby_xml_attr_mark(ruby_xml_attr_t *rx) {
30
- if ( rx == NULL ) return;
31
- if ( rx->attr == NULL ) return;
43
+ ruby_xml_attr_mark(xmlAttrPtr xattr) {
44
+ if (xattr == NULL) return;
32
45
 
33
- if (rx->attr->_private == NULL ) {
46
+ if (xattr->_private == NULL ) {
34
47
  rb_warning("XmlAttr is not bound! (%s:%d)",
35
48
  __FILE__,__LINE__);
36
49
  return;
37
50
  }
38
51
 
39
- ruby_xml_node_mark_common((xmlNodePtr)rx->attr);
52
+ ruby_xml_node_mark_common((xmlNodePtr)xattr);
40
53
  }
41
54
 
42
55
  VALUE
43
- ruby_xml_attr_wrap(VALUE class, xmlAttrPtr xnode)
56
+ ruby_xml_attr_wrap(xmlAttrPtr xattr)
44
57
  {
45
- VALUE obj;
46
- ruby_xml_attr_t *rx;
47
-
58
+ VALUE result;
48
59
  // This node is already wrapped
49
- if (xnode->_private != NULL)
50
- return (VALUE)xnode->_private;
60
+ if (xattr->_private != NULL)
61
+ return (VALUE)xattr->_private;
51
62
 
52
- obj=Data_Make_Struct(class,ruby_xml_attr_t,ruby_xml_attr_mark,
53
- ruby_xml_attr_free,rx);
63
+ result = Data_Wrap_Struct(cXMLAttr,
64
+ ruby_xml_attr_mark, ruby_xml_attr_free,
65
+ xattr);
54
66
 
55
- rx->attr=xnode;
56
- xnode->_private=(void*)obj;
67
+ xattr->_private=(void*)result;
57
68
  #ifdef NODE_DEBUG
58
69
  fprintf(stderr,"wrap rxn=0x%x xn=0x%x o=0x%x\n",(long)rxn,(long)xnode,(long)obj);
59
70
  #endif
60
- return obj;
71
+ return result;
72
+ }
73
+
74
+
75
+ VALUE
76
+ ruby_xml_attr_alloc(VALUE klass)
77
+ {
78
+ return Data_Wrap_Struct(cXMLAttr,
79
+ ruby_xml_attr_mark, ruby_xml_attr_free,
80
+ NULL);
61
81
  }
62
82
 
63
83
  /*
64
- * Only use this when a xmlAttr has just been created since
65
- * oblitterates the _private. Not exposed to ruby interp.
84
+ * call-seq:
85
+ * attr.initialize(node, "name", "value")
86
+ *
87
+ * Creates a new attribute for the node.
88
+ *
89
+ * node: The XML::Node that will contain the attribute
90
+ * name: The name of the attribute
91
+ * value: The value of the attribute
92
+ *
93
+ * attr = XML::Attr.new(doc.root, 'name', 'libxml')
66
94
  */
67
95
  VALUE
68
- ruby_xml_attr_new(VALUE class, xmlAttrPtr xnode)
69
- {
70
- xnode->_private=NULL;
71
- return ruby_xml_attr_wrap(class,xnode);
96
+ ruby_xml_attr_initialize(int argc, VALUE *argv, VALUE self) {
97
+ VALUE node = argv[0];
98
+ VALUE name = argv[1];
99
+ VALUE value = argv[2];
100
+ VALUE ns = (argc == 4 ? argv[3] : Qnil);
101
+
102
+ xmlNodePtr xnode;
103
+ xmlAttrPtr xattr;
104
+
105
+ if ( argc < 3 || argc > 4 )
106
+ rb_raise(rb_eArgError, "wrong number of arguments (3 or 4)");
107
+
108
+ Check_Type(name, T_STRING);
109
+ Check_Type(value, T_STRING);
110
+
111
+ Data_Get_Struct(node, xmlNode, xnode);
112
+
113
+ if NIL_P(ns)
114
+ {
115
+ xattr = xmlNewProp(xnode, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
116
+ }
117
+ else
118
+ {
119
+ xmlNsPtr xns;
120
+ Data_Get_Struct(ns, xmlNs, xns);
121
+ xattr = xmlNewNsProp(xnode, xns, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
122
+ }
123
+
124
+ xattr->_private = (void *)self;
125
+ DATA_PTR(self) = xattr;
126
+ return self;
72
127
  }
128
+
73
129
  /*
74
130
  * call-seq:
75
- * attr.child => node
131
+ * attr.child -> node
76
132
  *
77
133
  * Obtain this attribute's child attribute(s).
78
134
  */
79
135
  VALUE
80
136
  ruby_xml_attr_child_get(VALUE self) {
81
- ruby_xml_attr_t *rxa;
82
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
83
- if (rxa->attr->children == NULL)
137
+ xmlAttrPtr xattr;
138
+ Data_Get_Struct(self, xmlAttr, xattr);
139
+ if (xattr->children == NULL)
84
140
  return(Qnil);
85
141
  else
86
- return(ruby_xml_node2_wrap(cXMLNode, rxa->attr->children));
142
+ return(ruby_xml_node2_wrap(cXMLNode, (xmlNodePtr)xattr->children));
87
143
  }
88
144
 
89
145
 
90
146
  /*
91
147
  * call-seq:
92
- * attr.child? => (true|false)
148
+ * attr.child? -> (true|false)
93
149
  *
94
150
  * Determine whether this attribute has child attributes.
95
151
  */
96
152
  VALUE
97
153
  ruby_xml_attr_child_q(VALUE self) {
98
- ruby_xml_attr_t *rxa;
99
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
100
- if (rxa->attr->children == NULL)
154
+ xmlAttrPtr xattr;
155
+ Data_Get_Struct(self, xmlAttr, xattr);
156
+ if (xattr->children == NULL)
101
157
  return(Qfalse);
102
158
  else
103
159
  return(Qtrue);
@@ -106,33 +162,34 @@ ruby_xml_attr_child_q(VALUE self) {
106
162
 
107
163
  /*
108
164
  * call-seq:
109
- * attr.doc => document
165
+ * attr.doc -> XML::Document
110
166
  *
111
- * Obtain the XML::Document this attribute is associated with,
112
- * if any.
167
+ * Returns this attribute's document.
168
+ *
169
+ * doc.root.attributes.get_attribute('name').doc == doc
113
170
  */
114
171
  VALUE
115
172
  ruby_xml_attr_doc_get(VALUE self) {
116
- ruby_xml_attr_t *rxa;
117
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
118
- if (rxa->attr->doc == NULL)
173
+ xmlAttrPtr xattr;
174
+ Data_Get_Struct(self, xmlAttr, xattr);
175
+ if (xattr->doc == NULL)
119
176
  return(Qnil);
120
177
  else
121
- return(ruby_xml_document_wrap(rxa->attr->doc));
178
+ return(ruby_xml_document_wrap(xattr->doc));
122
179
  }
123
180
 
124
181
  /*
125
182
  * call-seq:
126
- * attr.doc? => (true|false)
183
+ * attr.doc? -> (true|false)
127
184
  *
128
185
  * Determine whether this attribute is associated with an
129
186
  * XML::Document.
130
187
  */
131
188
  VALUE
132
189
  ruby_xml_attr_doc_q(VALUE self) {
133
- ruby_xml_attr_t *rxa;
134
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
135
- if (rxa->attr->doc == NULL)
190
+ xmlAttrPtr xattr;
191
+ Data_Get_Struct(self, xmlAttr, xattr);
192
+ if (xattr->doc == NULL)
136
193
  return(Qfalse);
137
194
  else
138
195
  return(Qtrue);
@@ -141,32 +198,32 @@ ruby_xml_attr_doc_q(VALUE self) {
141
198
 
142
199
  /*
143
200
  * call-seq:
144
- * attr.last => node
201
+ * attr.last -> node
145
202
  *
146
203
  * Obtain the last attribute.
147
204
  */
148
205
  VALUE
149
206
  ruby_xml_attr_last_get(VALUE self) {
150
- ruby_xml_attr_t *rxa;
151
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
152
- if (rxa->attr->last == NULL)
207
+ xmlAttrPtr xattr;
208
+ Data_Get_Struct(self, xmlAttr, xattr);
209
+ if (xattr->last == NULL)
153
210
  return(Qnil);
154
211
  else
155
- return(ruby_xml_node2_wrap(cXMLNode, rxa->attr->last));
212
+ return(ruby_xml_node2_wrap(cXMLNode, xattr->last));
156
213
  }
157
214
 
158
215
 
159
216
  /*
160
217
  * call-seq:
161
- * attr.last? => (true|false)
218
+ * attr.last? -> (true|false)
162
219
  *
163
220
  * Determine whether this is the last attribute.
164
221
  */
165
222
  VALUE
166
223
  ruby_xml_attr_last_q(VALUE self) {
167
- ruby_xml_attr_t *rxa;
168
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
169
- if (rxa->attr->last == NULL)
224
+ xmlAttrPtr xattr;
225
+ Data_Get_Struct(self, xmlAttr, xattr);
226
+ if (xattr->last == NULL)
170
227
  return(Qfalse);
171
228
  else
172
229
  return(Qtrue);
@@ -174,49 +231,49 @@ ruby_xml_attr_last_q(VALUE self) {
174
231
 
175
232
  /*
176
233
  * call-seq:
177
- * attr.name => "name"
234
+ * attr.name -> "name"
178
235
  *
179
236
  * Obtain this attribute's name.
180
237
  */
181
238
  VALUE
182
239
  ruby_xml_attr_name_get(VALUE self) {
183
- ruby_xml_attr_t *rxa;
184
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
240
+ xmlAttrPtr xattr;
241
+ Data_Get_Struct(self, xmlAttr, xattr);
185
242
 
186
- if (rxa->attr->name == NULL)
243
+ if (xattr->name == NULL)
187
244
  return(Qnil);
188
245
  else
189
- return(rb_str_new2((const char*)rxa->attr->name));
246
+ return(rb_str_new2((const char*)xattr->name));
190
247
  }
191
248
 
192
249
  /*
193
250
  * call-seq:
194
- * attr.next => node
251
+ * attr.next -> node
195
252
  *
196
253
  * Obtain the next attribute.
197
254
  */
198
255
  VALUE
199
256
  ruby_xml_attr_next_get(VALUE self) {
200
- ruby_xml_attr_t *rxa;
201
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
202
- if (rxa->attr->next == NULL)
257
+ xmlAttrPtr xattr;
258
+ Data_Get_Struct(self, xmlAttr, xattr);
259
+ if (xattr->next == NULL)
203
260
  return(Qnil);
204
261
  else
205
- return(ruby_xml_attr_wrap(cXMLAttr, rxa->attr->next));
262
+ return(ruby_xml_attr_wrap(xattr->next));
206
263
  }
207
264
 
208
265
 
209
266
  /*
210
267
  * call-seq:
211
- * attr.next? => (true|false)
268
+ * attr.next? -> (true|false)
212
269
  *
213
270
  * Determine whether there is a next attribute.
214
271
  */
215
272
  VALUE
216
273
  ruby_xml_attr_next_q(VALUE self) {
217
- ruby_xml_attr_t *rxa;
218
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
219
- if (rxa->attr->next == NULL)
274
+ xmlAttrPtr xattr;
275
+ Data_Get_Struct(self, xmlAttr, xattr);
276
+ if (xattr->next == NULL)
220
277
  return(Qfalse);
221
278
  else
222
279
  return(Qtrue);
@@ -225,7 +282,7 @@ ruby_xml_attr_next_q(VALUE self) {
225
282
 
226
283
  /*
227
284
  * call-seq:
228
- * attr.type_name => "attribute"
285
+ * attr.type_name -> "attribute"
229
286
  *
230
287
  * Obtain this attribute node's type name.
231
288
  */
@@ -237,33 +294,33 @@ ruby_xml_attr_node_type_name(VALUE self) {
237
294
 
238
295
  /*
239
296
  * call-seq:
240
- * attr.ns => namespace
297
+ * attr.ns -> namespace
241
298
  *
242
299
  * Obtain this attribute's associated XML::NS, if any.
243
300
  */
244
301
  VALUE
245
302
  ruby_xml_attr_ns_get(VALUE self) {
246
- ruby_xml_attr_t *rxa;
247
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
248
- if (rxa->attr->ns == NULL)
303
+ xmlAttrPtr xattr;
304
+ Data_Get_Struct(self, xmlAttr, xattr);
305
+ if (xattr->ns == NULL)
249
306
  return(Qnil);
250
307
  else
251
- return(ruby_xml_ns_new2(cXMLNS, Qnil, rxa->attr->ns));
308
+ return(ruby_xml_ns_wrap(xattr->ns));
252
309
  }
253
310
 
254
311
 
255
312
  /*
256
313
  * call-seq:
257
- * attr.ns? => (true|false)
314
+ * attr.ns? -> (true|false)
258
315
  *
259
316
  * Determine whether this attribute has an associated
260
317
  * namespace.
261
318
  */
262
319
  VALUE
263
320
  ruby_xml_attr_ns_q(VALUE self) {
264
- ruby_xml_attr_t *rxa;
265
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
266
- if (rxa->attr->ns == NULL)
321
+ xmlAttrPtr xattr;
322
+ Data_Get_Struct(self, xmlAttr, xattr);
323
+ if (xattr->ns == NULL)
267
324
  return(Qfalse);
268
325
  else
269
326
  return(Qtrue);
@@ -272,32 +329,32 @@ ruby_xml_attr_ns_q(VALUE self) {
272
329
 
273
330
  /*
274
331
  * call-seq:
275
- * attr.parent => node
332
+ * attr.parent -> node
276
333
  *
277
334
  * Obtain this attribute node's parent.
278
335
  */
279
336
  VALUE
280
337
  ruby_xml_attr_parent_get(VALUE self) {
281
- ruby_xml_attr_t *rxa;
282
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
283
- if (rxa->attr->parent == NULL)
338
+ xmlAttrPtr xattr;
339
+ Data_Get_Struct(self, xmlAttr, xattr);
340
+ if (xattr->parent == NULL)
284
341
  return(Qnil);
285
342
  else
286
- return(ruby_xml_node2_wrap(cXMLNode, rxa->attr->parent));
343
+ return(ruby_xml_node2_wrap(cXMLNode, xattr->parent));
287
344
  }
288
345
 
289
346
 
290
347
  /*
291
348
  * call-seq:
292
- * attr.parent? => (true|false)
349
+ * attr.parent? -> (true|false)
293
350
  *
294
351
  * Determine whether this attribute has a parent.
295
352
  */
296
353
  VALUE
297
354
  ruby_xml_attr_parent_q(VALUE self) {
298
- ruby_xml_attr_t *rxa;
299
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
300
- if (rxa->attr->parent == NULL)
355
+ xmlAttrPtr xattr;
356
+ Data_Get_Struct(self, xmlAttr, xattr);
357
+ if (xattr->parent == NULL)
301
358
  return(Qfalse);
302
359
  else
303
360
  return(Qtrue);
@@ -306,32 +363,32 @@ ruby_xml_attr_parent_q(VALUE self) {
306
363
 
307
364
  /*
308
365
  * call-seq:
309
- * attr.prev => node
366
+ * attr.prev -> node
310
367
  *
311
368
  * Obtain the previous attribute.
312
369
  */
313
370
  VALUE
314
371
  ruby_xml_attr_prev_get(VALUE self) {
315
- ruby_xml_attr_t *rxa;
316
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
317
- if (rxa->attr->prev == NULL)
372
+ xmlAttrPtr xattr;
373
+ Data_Get_Struct(self, xmlAttr, xattr);
374
+ if (xattr->prev == NULL)
318
375
  return(Qnil);
319
376
  else
320
- return(ruby_xml_attr_wrap(cXMLAttr, rxa->attr->prev));
377
+ return(ruby_xml_attr_wrap(xattr->prev));
321
378
  }
322
379
 
323
380
 
324
381
  /*
325
382
  * call-seq:
326
- * attr.prev? => (true|false)
383
+ * attr.prev? -> (true|false)
327
384
  *
328
385
  * Determine whether there is a previous attribute.
329
386
  */
330
387
  VALUE
331
388
  ruby_xml_attr_prev_q(VALUE self) {
332
- ruby_xml_attr_t *rxa;
333
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
334
- if (rxa->attr->prev == NULL)
389
+ xmlAttrPtr xattr;
390
+ Data_Get_Struct(self, xmlAttr, xattr);
391
+ if (xattr->prev == NULL)
335
392
  return(Qfalse);
336
393
  else
337
394
  return(Qtrue);
@@ -340,33 +397,38 @@ ruby_xml_attr_prev_q(VALUE self) {
340
397
 
341
398
  /*
342
399
  * call-seq:
343
- * node.remove! => nil
400
+ * node.remove! -> nil
344
401
  *
345
402
  * Removes this attribute from it's parent.
346
403
  */
347
404
  VALUE
348
405
  ruby_xml_attr_remove_ex(VALUE self) {
349
- ruby_xml_attr_t *rxa;
350
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
351
- xmlUnlinkNode(rxa->attr);
406
+ xmlAttrPtr xattr;
407
+ Data_Get_Struct(self, xmlAttr, xattr);
408
+
409
+ if (xattr->_private == NULL)
410
+ xmlRemoveProp(xattr);
411
+ else
412
+ xmlUnlinkNode((xmlNodePtr)xattr);
413
+
352
414
  return(Qnil);
353
415
  }
354
416
 
355
417
  /*
356
418
  * call-seq:
357
- * attr.value => "value"
419
+ * attr.value -> "value"
358
420
  *
359
421
  * Obtain the value of this attribute.
360
422
  */
361
423
  VALUE
362
- ruby_xml_attr_value(VALUE self) {
363
- ruby_xml_attr_t *rxa;
424
+ ruby_xml_attr_value_get(VALUE self) {
425
+ xmlAttrPtr xattr;
364
426
  xmlChar *value;
365
427
  VALUE result = Qnil;
366
428
 
367
- Data_Get_Struct(self, ruby_xml_attr_t, rxa);
429
+ Data_Get_Struct(self, xmlAttr, xattr);
368
430
  if (ruby_xml_attr_parent_q(self) == Qtrue) {
369
- value = xmlGetProp(rxa->attr->parent, rxa->attr->name);
431
+ value = xmlGetProp(xattr->parent, xattr->name);
370
432
  if (value != NULL)
371
433
  {
372
434
  result = rb_str_new2((const char*)value);
@@ -376,6 +438,29 @@ ruby_xml_attr_value(VALUE self) {
376
438
  return(result);
377
439
  }
378
440
 
441
+
442
+ /*
443
+ * call-seq:
444
+ * attr.value = "value"
445
+ *
446
+ * Sets the value of this attribute.
447
+ */
448
+ VALUE
449
+ ruby_xml_attr_value_set(VALUE self, VALUE val) {
450
+ xmlAttrPtr xattr;
451
+
452
+ Check_Type(val, T_STRING);
453
+ Data_Get_Struct(self, xmlAttr, xattr);
454
+
455
+ if (xattr->ns)
456
+ xmlSetNsProp(xattr->parent, xattr->ns, xattr->name, (xmlChar*)StringValuePtr(val));
457
+ else
458
+ xmlSetProp(xattr->parent, xattr->name, (xmlChar*)StringValuePtr(val));
459
+
460
+ return(self);
461
+ }
462
+
463
+
379
464
  // Rdoc needs to know
380
465
  #ifdef RDOC_NEVER_DEFINED
381
466
  mXML = rb_define_module("XML");
@@ -384,6 +469,8 @@ ruby_xml_attr_value(VALUE self) {
384
469
  void
385
470
  ruby_init_xml_attr(void) {
386
471
  cXMLAttr = rb_define_class_under(mXML, "Attr", rb_cObject);
472
+ rb_define_alloc_func(cXMLAttr, ruby_xml_attr_alloc);
473
+ rb_define_method(cXMLAttr, "initialize", ruby_xml_attr_initialize, -1);
387
474
  rb_define_method(cXMLAttr, "child", ruby_xml_attr_child_get, 0);
388
475
  rb_define_method(cXMLAttr, "child?", ruby_xml_attr_child_q, 0);
389
476
  rb_define_method(cXMLAttr, "doc", ruby_xml_attr_doc_get, 0);
@@ -401,5 +488,6 @@ ruby_init_xml_attr(void) {
401
488
  rb_define_method(cXMLAttr, "prev", ruby_xml_attr_prev_get, 0);
402
489
  rb_define_method(cXMLAttr, "prev?", ruby_xml_attr_prev_q, 0);
403
490
  rb_define_method(cXMLAttr, "remove!", ruby_xml_attr_remove_ex, 0);
404
- rb_define_method(cXMLAttr, "value", ruby_xml_attr_value, 0);
491
+ rb_define_method(cXMLAttr, "value", ruby_xml_attr_value_get, 0);
492
+ rb_define_method(cXMLAttr, "value=", ruby_xml_attr_value_set, 1);
405
493
  }