libxml-ruby 0.8.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. data/CHANGES +18 -0
  2. data/RAKEFILE +15 -39
  3. data/README +48 -47
  4. data/ext/libxml/libxml.c +847 -22
  5. data/ext/libxml/ruby_libxml.h +71 -95
  6. data/ext/libxml/ruby_xml_attr.c +500 -500
  7. data/ext/libxml/ruby_xml_attributes.c +1 -1
  8. data/ext/libxml/ruby_xml_document.c +1144 -1135
  9. data/ext/libxml/ruby_xml_document.h +4 -11
  10. data/ext/libxml/ruby_xml_dtd.c +27 -0
  11. data/ext/libxml/ruby_xml_encoding.c +164 -0
  12. data/ext/libxml/ruby_xml_encoding.h +13 -0
  13. data/ext/libxml/ruby_xml_error.c +941 -0
  14. data/ext/libxml/ruby_xml_error.h +13 -0
  15. data/ext/libxml/ruby_xml_html_parser.c +71 -387
  16. data/ext/libxml/ruby_xml_html_parser.h +1 -17
  17. data/ext/libxml/ruby_xml_input.c +179 -0
  18. data/ext/libxml/ruby_xml_input.h +18 -0
  19. data/ext/libxml/ruby_xml_input_cbg.c +17 -3
  20. data/ext/libxml/ruby_xml_node.c +1566 -1582
  21. data/ext/libxml/ruby_xml_node.h +1 -4
  22. data/ext/libxml/ruby_xml_ns.c +14 -3
  23. data/ext/libxml/ruby_xml_parser.c +164 -1398
  24. data/ext/libxml/ruby_xml_parser.h +5 -17
  25. data/ext/libxml/ruby_xml_parser_context.c +131 -169
  26. data/ext/libxml/ruby_xml_parser_context.h +2 -9
  27. data/ext/libxml/ruby_xml_reader.c +910 -945
  28. data/ext/libxml/ruby_xml_relaxng.c +32 -3
  29. data/ext/libxml/ruby_xml_sax_parser.c +106 -364
  30. data/ext/libxml/ruby_xml_sax_parser.h +1 -37
  31. data/ext/libxml/ruby_xml_schema.c +174 -145
  32. data/ext/libxml/ruby_xml_xinclude.c +9 -5
  33. data/ext/libxml/ruby_xml_xpath.c +25 -6
  34. data/ext/libxml/ruby_xml_xpath.h +1 -2
  35. data/ext/libxml/ruby_xml_xpath_context.c +17 -19
  36. data/ext/libxml/ruby_xml_xpath_object.c +60 -56
  37. data/ext/libxml/ruby_xml_xpointer.c +11 -5
  38. data/ext/libxml/sax_parser_callbacks.inc +42 -37
  39. data/ext/libxml/version.h +3 -3
  40. data/ext/mingw/Rakefile +20 -27
  41. data/ext/mingw/build.rake +41 -0
  42. data/ext/vc/libxml_ruby.vcproj +23 -15
  43. data/lib/libxml.rb +8 -2
  44. data/lib/libxml/document.rb +16 -4
  45. data/lib/libxml/error.rb +84 -0
  46. data/lib/libxml/hpricot.rb +76 -0
  47. data/lib/libxml/html_parser.rb +61 -0
  48. data/lib/libxml/node.rb +36 -25
  49. data/lib/libxml/parser.rb +312 -33
  50. data/lib/libxml/parser_context.rb +17 -0
  51. data/lib/libxml/properties.rb +15 -2
  52. data/lib/libxml/reader.rb +15 -0
  53. data/lib/libxml/sax_callbacks.rb +179 -0
  54. data/lib/libxml/sax_parser.rb +42 -0
  55. data/lib/libxml/tree.rb +1 -2
  56. data/lib/libxml/xpath_object.rb +12 -0
  57. data/test/model/atom.xml +4 -0
  58. data/test/tc_attributes.rb +43 -19
  59. data/test/tc_document.rb +1 -1
  60. data/test/tc_document_write.rb +15 -8
  61. data/test/tc_dtd.rb +36 -20
  62. data/test/tc_encoding.rb +13 -0
  63. data/test/tc_error.rb +136 -0
  64. data/test/tc_node.rb +2 -3
  65. data/test/tc_node_copy.rb +1 -1
  66. data/test/tc_node_edit.rb +6 -0
  67. data/test/tc_ns.rb +18 -0
  68. data/test/tc_parser.rb +113 -228
  69. data/test/tc_parser_context.rb +1 -2
  70. data/test/tc_reader.rb +24 -14
  71. data/test/tc_relaxng.rb +18 -6
  72. data/test/tc_sax_parser.rb +48 -13
  73. data/test/tc_schema.rb +20 -8
  74. data/test/tc_well_formed.rb +2 -1
  75. data/test/tc_xml.rb +212 -0
  76. data/test/tc_xpath.rb +60 -46
  77. data/test/tc_xpointer.rb +7 -11
  78. data/test/test_suite.rb +4 -3
  79. metadata +26 -109
  80. data/doc/rdoc/classes/LibXML.html +0 -241
  81. data/doc/rdoc/classes/LibXML/XML.html +0 -185
  82. data/doc/rdoc/classes/LibXML/XML/Attr.html +0 -1010
  83. data/doc/rdoc/classes/LibXML/XML/Attributes.html +0 -526
  84. data/doc/rdoc/classes/LibXML/XML/Document.html +0 -1489
  85. data/doc/rdoc/classes/LibXML/XML/Dtd.html +0 -213
  86. data/doc/rdoc/classes/LibXML/XML/Error.html +0 -117
  87. data/doc/rdoc/classes/LibXML/XML/HTMLParser.html +0 -348
  88. data/doc/rdoc/classes/LibXML/XML/InputCallbacks.html +0 -160
  89. data/doc/rdoc/classes/LibXML/XML/NS.html +0 -381
  90. data/doc/rdoc/classes/LibXML/XML/Node.html +0 -3396
  91. data/doc/rdoc/classes/LibXML/XML/Node/FailedModify.html +0 -123
  92. data/doc/rdoc/classes/LibXML/XML/Node/Set.html +0 -440
  93. data/doc/rdoc/classes/LibXML/XML/Node/SetNamespace.html +0 -123
  94. data/doc/rdoc/classes/LibXML/XML/Node/UnknownType.html +0 -123
  95. data/doc/rdoc/classes/LibXML/XML/Parser.html +0 -2239
  96. data/doc/rdoc/classes/LibXML/XML/Parser/Context.html +0 -1255
  97. data/doc/rdoc/classes/LibXML/XML/Parser/ParseError.html +0 -123
  98. data/doc/rdoc/classes/LibXML/XML/Reader.html +0 -2264
  99. data/doc/rdoc/classes/LibXML/XML/RelaxNG.html +0 -237
  100. data/doc/rdoc/classes/LibXML/XML/SaxParser.html +0 -415
  101. data/doc/rdoc/classes/LibXML/XML/Schema.html +0 -308
  102. data/doc/rdoc/classes/LibXML/XML/State.html +0 -124
  103. data/doc/rdoc/classes/LibXML/XML/Tree.html +0 -111
  104. data/doc/rdoc/classes/LibXML/XML/XInclude.html +0 -123
  105. data/doc/rdoc/classes/LibXML/XML/XInclude/Error.html +0 -117
  106. data/doc/rdoc/classes/LibXML/XML/XMLParserOptions.html +0 -198
  107. data/doc/rdoc/classes/LibXML/XML/XPath.html +0 -184
  108. data/doc/rdoc/classes/LibXML/XML/XPath/Context.html +0 -404
  109. data/doc/rdoc/classes/LibXML/XML/XPath/InvalidPath.html +0 -172
  110. data/doc/rdoc/classes/LibXML/XML/XPath/Object.html +0 -627
  111. data/doc/rdoc/classes/LibXML/XML/XPointer.html +0 -170
  112. data/doc/rdoc/classes/LibXML/XML/XPointer/Context.html +0 -123
  113. data/doc/rdoc/classes/LibXML/XML/XPointer/Context/InvalidPath.html +0 -117
  114. data/doc/rdoc/classes/LibXML/XML/XPointer/InvalidExpression.html +0 -124
  115. data/doc/rdoc/classes/singleton.html +0 -114
  116. data/doc/rdoc/created.rid +0 -1
  117. data/doc/rdoc/files/CHANGES.html +0 -442
  118. data/doc/rdoc/files/LICENSE.html +0 -133
  119. data/doc/rdoc/files/README.html +0 -388
  120. data/doc/rdoc/files/VERSION.html +0 -107
  121. data/doc/rdoc/files/ext/libxml/cbg_c.html +0 -101
  122. data/doc/rdoc/files/ext/libxml/libxml_c.html +0 -101
  123. data/doc/rdoc/files/ext/libxml/ruby_xml_attr_c.html +0 -101
  124. data/doc/rdoc/files/ext/libxml/ruby_xml_attributes_c.html +0 -101
  125. data/doc/rdoc/files/ext/libxml/ruby_xml_document_c.html +0 -101
  126. data/doc/rdoc/files/ext/libxml/ruby_xml_dtd_c.html +0 -101
  127. data/doc/rdoc/files/ext/libxml/ruby_xml_html_parser_c.html +0 -101
  128. data/doc/rdoc/files/ext/libxml/ruby_xml_input_cbg_c.html +0 -101
  129. data/doc/rdoc/files/ext/libxml/ruby_xml_node_c.html +0 -101
  130. data/doc/rdoc/files/ext/libxml/ruby_xml_node_set_c.html +0 -101
  131. data/doc/rdoc/files/ext/libxml/ruby_xml_ns_c.html +0 -101
  132. data/doc/rdoc/files/ext/libxml/ruby_xml_parser_c.html +0 -101
  133. data/doc/rdoc/files/ext/libxml/ruby_xml_parser_context_c.html +0 -101
  134. data/doc/rdoc/files/ext/libxml/ruby_xml_reader_c.html +0 -101
  135. data/doc/rdoc/files/ext/libxml/ruby_xml_relaxng_c.html +0 -101
  136. data/doc/rdoc/files/ext/libxml/ruby_xml_sax_parser_c.html +0 -101
  137. data/doc/rdoc/files/ext/libxml/ruby_xml_schema_c.html +0 -101
  138. data/doc/rdoc/files/ext/libxml/ruby_xml_state_c.html +0 -101
  139. data/doc/rdoc/files/ext/libxml/ruby_xml_xinclude_c.html +0 -101
  140. data/doc/rdoc/files/ext/libxml/ruby_xml_xpath_c.html +0 -101
  141. data/doc/rdoc/files/ext/libxml/ruby_xml_xpath_context_c.html +0 -101
  142. data/doc/rdoc/files/ext/libxml/ruby_xml_xpath_object_c.html +0 -101
  143. data/doc/rdoc/files/ext/libxml/ruby_xml_xpointer_c.html +0 -101
  144. data/doc/rdoc/files/ext/libxml/ruby_xml_xpointer_context_c.html +0 -101
  145. data/doc/rdoc/files/lib/libxml/attr_rb.html +0 -108
  146. data/doc/rdoc/files/lib/libxml/attributes_rb.html +0 -108
  147. data/doc/rdoc/files/lib/libxml/document_rb.html +0 -108
  148. data/doc/rdoc/files/lib/libxml/node_rb.html +0 -108
  149. data/doc/rdoc/files/lib/libxml/node_set_rb.html +0 -108
  150. data/doc/rdoc/files/lib/libxml/parser_options_rb.html +0 -107
  151. data/doc/rdoc/files/lib/libxml/parser_rb.html +0 -101
  152. data/doc/rdoc/files/lib/libxml/properties_rb.html +0 -108
  153. data/doc/rdoc/files/lib/libxml/tree_rb.html +0 -107
  154. data/doc/rdoc/files/lib/libxml_rb.html +0 -124
  155. data/doc/rdoc/files/lib/xml/libxml_rb.html +0 -124
  156. data/doc/rdoc/files/lib/xml_rb.html +0 -134
  157. data/doc/rdoc/fr_class_index.html +0 -62
  158. data/doc/rdoc/fr_file_index.html +0 -66
  159. data/doc/rdoc/fr_method_index.html +0 -392
  160. data/doc/rdoc/index.html +0 -24
  161. data/doc/rdoc/rdoc-style.css +0 -208
  162. data/ext/libxml/ruby_xml_node_set.c +0 -172
  163. data/ext/libxml/ruby_xml_node_set.h +0 -20
  164. data/ext/libxml/ruby_xml_xpointer_context.c +0 -22
  165. data/ext/libxml/ruby_xml_xpointer_context.h +0 -18
  166. data/lib/libxml/node_set.rb +0 -27
  167. data/test/tc_node_set.rb +0 -24
  168. data/test/tc_node_set2.rb +0 -37
@@ -1,95 +1,71 @@
1
- /* Please see the LICENSE file for copyright and distribution information */
2
-
3
- #ifndef __RUBY_LIBXML_H__
4
- #define __RUBY_LIBXML_H__
5
-
6
- #include "version.h"
7
-
8
- #include <ruby.h>
9
- #include <rubyio.h>
10
- #include <util.h>
11
- #include <libxml/parser.h>
12
- #include <libxml/parserInternals.h>
13
- #include <libxml/debugXML.h>
14
- #include <libxml/xmlversion.h>
15
- #include <libxml/xmlmemory.h>
16
- #include <libxml/xpath.h>
17
- #include <libxml/valid.h>
18
- #include <libxml/catalog.h>
19
- #include <libxml/HTMLparser.h>
20
- #include <libxml/xmlreader.h>
21
-
22
- // Maybe not yet defined in ruby
23
- #ifndef RSTRING_LEN
24
- #define RSTRING_LEN(x) RSTRING(x)->len
25
- #endif
26
-
27
- // not in Ruby 1.9
28
- #ifndef GetWriteFile
29
- #define GetWriteFile(fp) rb_io_stdio_file(fp)
30
- #define OpenFile rb_io_t
31
- #endif
32
-
33
- #ifdef LIBXML_DEBUG_ENABLED
34
- #include <libxml/xpathInternals.h>
35
- #endif
36
- #ifdef LIBXML_XINCLUDE_ENABLED
37
- #include <libxml/xinclude.h>
38
- #endif
39
- #ifdef LIBXML_XPTR_ENABLED
40
- #include <libxml/xpointer.h>
41
- #endif
42
-
43
- #define RUBY_LIBXML_SRC_TYPE_NULL 0
44
- #define RUBY_LIBXML_SRC_TYPE_FILE 1
45
- #define RUBY_LIBXML_SRC_TYPE_STRING 2
46
- #define RUBY_LIBXML_SRC_TYPE_IO 3
47
- #define RUBY_LIBXML_SRC_TYPE_XPATH 4
48
-
49
- typedef struct rx_file_data {
50
- VALUE filename; /* Filename/path to self */
51
- } rx_file_data;
52
-
53
- typedef struct rx_io_data {
54
- VALUE io;
55
- } rx_io_data;
56
-
57
- typedef struct rx_string_data {
58
- VALUE str;
59
- } rx_string_data;
60
-
61
- typedef struct rx_xpath_data {
62
- VALUE ctxt;
63
- } rx_xpath_data;
64
-
65
- #include "ruby_xml_state.h"
66
- #include "ruby_xml_attributes.h"
67
- #include "ruby_xml_attr.h"
68
- #include "ruby_xml_document.h"
69
- #include "ruby_xml_node.h"
70
- #include "ruby_xml_node_set.h"
71
- #include "ruby_xml_ns.h"
72
- #include "ruby_xml_parser.h"
73
- #include "ruby_xml_parser_context.h"
74
- #include "ruby_xml_sax_parser.h"
75
- #include "ruby_xml_xinclude.h"
76
- #include "ruby_xml_xpath.h"
77
- #include "ruby_xml_xpath_context.h"
78
- #include "ruby_xml_xpath_object.h"
79
- #include "ruby_xml_xpointer.h"
80
- #include "ruby_xml_xpointer_context.h"
81
- #include "ruby_xml_input_cbg.h"
82
- #include "ruby_xml_dtd.h"
83
- #include "ruby_xml_schema.h"
84
- #include "ruby_xml_relaxng.h"
85
- #include "ruby_xml_html_parser.h"
86
- #include "ruby_xml_reader.h"
87
-
88
- extern VALUE mLibXML;
89
- extern VALUE mXML;
90
- extern VALUE eXMLError;
91
-
92
- void ruby_init_parser(void);
93
- void ruby_xml_parser_free(ruby_xml_parser *rxp);
94
-
95
- #endif
1
+ /* Please see the LICENSE file for copyright and distribution information */
2
+
3
+ #ifndef __RUBY_LIBXML_H__
4
+ #define __RUBY_LIBXML_H__
5
+
6
+ #include "version.h"
7
+
8
+ #include <ruby.h>
9
+ #include <rubyio.h>
10
+ #include <util.h>
11
+ #include <libxml/parser.h>
12
+ #include <libxml/parserInternals.h>
13
+ #include <libxml/debugXML.h>
14
+ #include <libxml/xmlversion.h>
15
+ #include <libxml/xmlmemory.h>
16
+ #include <libxml/xpath.h>
17
+ #include <libxml/valid.h>
18
+ #include <libxml/catalog.h>
19
+ #include <libxml/HTMLparser.h>
20
+ #include <libxml/xmlreader.h>
21
+
22
+ // Maybe not yet defined in ruby
23
+ #ifndef RSTRING_LEN
24
+ #define RSTRING_LEN(x) RSTRING(x)->len
25
+ #endif
26
+
27
+ // not in Ruby 1.9
28
+ #ifndef GetWriteFile
29
+ #define GetWriteFile(fp) rb_io_stdio_file(fp)
30
+ #define OpenFile rb_io_t
31
+ #endif
32
+
33
+ #ifdef LIBXML_DEBUG_ENABLED
34
+ #include <libxml/xpathInternals.h>
35
+ #endif
36
+ #ifdef LIBXML_XINCLUDE_ENABLED
37
+ #include <libxml/xinclude.h>
38
+ #endif
39
+ #ifdef LIBXML_XPTR_ENABLED
40
+ #include <libxml/xpointer.h>
41
+ #endif
42
+
43
+
44
+ #include "ruby_xml_encoding.h"
45
+ #include "ruby_xml_error.h"
46
+ #include "ruby_xml_input.h"
47
+ #include "ruby_xml_state.h"
48
+ #include "ruby_xml_attributes.h"
49
+ #include "ruby_xml_attr.h"
50
+ #include "ruby_xml_document.h"
51
+ #include "ruby_xml_node.h"
52
+ #include "ruby_xml_ns.h"
53
+ #include "ruby_xml_parser.h"
54
+ #include "ruby_xml_parser_context.h"
55
+ #include "ruby_xml_sax_parser.h"
56
+ #include "ruby_xml_xinclude.h"
57
+ #include "ruby_xml_xpath.h"
58
+ #include "ruby_xml_xpath_context.h"
59
+ #include "ruby_xml_xpath_object.h"
60
+ #include "ruby_xml_xpointer.h"
61
+ #include "ruby_xml_input_cbg.h"
62
+ #include "ruby_xml_dtd.h"
63
+ #include "ruby_xml_schema.h"
64
+ #include "ruby_xml_relaxng.h"
65
+ #include "ruby_xml_html_parser.h"
66
+ #include "ruby_xml_reader.h"
67
+
68
+ extern VALUE mLibXML;
69
+ extern VALUE mXML;
70
+
71
+ #endif
@@ -1,500 +1,500 @@
1
- /* $Id: ruby_xml_attr.c 502 2008-07-22 01:45:31Z cfis $ */
2
-
3
- /* Please see the LICENSE file for copyright and distribution information */
4
-
5
- /*
6
- * Document-class: LibXML::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 'xml'
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
-
21
- #include "ruby_libxml.h"
22
- #include "ruby_xml_attr.h"
23
-
24
- VALUE cXMLAttr;
25
-
26
- void ruby_xml_attr_free(xmlAttrPtr xattr) {
27
- if (!xattr) return;
28
-
29
- if (xattr != NULL ) {
30
- xattr->_private=NULL;
31
- if (xattr->parent == NULL && xattr->doc == NULL ) {
32
- #ifdef NODE_DEBUG
33
- fprintf(stderr,"ruby_xfree rxn=0x%x xn=0x%x o=0x%x\n",(long)rxn,(long)rxn->node,(long)rxn->node->_private);
34
- #endif
35
- xmlFreeProp(xattr);
36
- }
37
-
38
- xattr=NULL;
39
- }
40
- }
41
-
42
- void
43
- ruby_xml_attr_mark(xmlAttrPtr xattr) {
44
- if (xattr == NULL) return;
45
-
46
- if (xattr->_private == NULL ) {
47
- rb_warning("XmlAttr is not bound! (%s:%d)",
48
- __FILE__,__LINE__);
49
- return;
50
- }
51
-
52
- ruby_xml_node_mark_common((xmlNodePtr)xattr);
53
- }
54
-
55
- VALUE
56
- ruby_xml_attr_wrap(xmlAttrPtr xattr)
57
- {
58
- VALUE result;
59
- // This node is already wrapped
60
- if (xattr->_private != NULL)
61
- return (VALUE)xattr->_private;
62
-
63
- result = Data_Wrap_Struct(cXMLAttr,
64
- ruby_xml_attr_mark, ruby_xml_attr_free,
65
- xattr);
66
-
67
- xattr->_private=(void*)result;
68
- #ifdef NODE_DEBUG
69
- fprintf(stderr,"wrap rxn=0x%x xn=0x%x o=0x%x\n",(long)rxn,(long)xnode,(long)obj);
70
- #endif
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);
81
- }
82
-
83
- /*
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')
94
- */
95
- VALUE
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 (xnode->type != XML_ELEMENT_NODE)
114
- rb_raise(rb_eArgError, "Attributes can only be created on element nodes.");
115
-
116
- if NIL_P(ns)
117
- {
118
- xattr = xmlNewProp(xnode, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
119
- }
120
- else
121
- {
122
- xmlNsPtr xns;
123
- Data_Get_Struct(ns, xmlNs, xns);
124
- xattr = xmlNewNsProp(xnode, xns, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
125
- }
126
-
127
- if (!xattr)
128
- rb_raise(rb_eRuntimeError, "Could not create attribute.");
129
-
130
- xattr->_private = (void *)self;
131
- DATA_PTR(self) = xattr;
132
- return self;
133
- }
134
-
135
- /*
136
- * call-seq:
137
- * attr.child -> node
138
- *
139
- * Obtain this attribute's child attribute(s).
140
- */
141
- VALUE
142
- ruby_xml_attr_child_get(VALUE self) {
143
- xmlAttrPtr xattr;
144
- Data_Get_Struct(self, xmlAttr, xattr);
145
- if (xattr->children == NULL)
146
- return(Qnil);
147
- else
148
- return(ruby_xml_node2_wrap(cXMLNode, (xmlNodePtr)xattr->children));
149
- }
150
-
151
-
152
- /*
153
- * call-seq:
154
- * attr.child? -> (true|false)
155
- *
156
- * Determine whether this attribute has child attributes.
157
- */
158
- VALUE
159
- ruby_xml_attr_child_q(VALUE self) {
160
- xmlAttrPtr xattr;
161
- Data_Get_Struct(self, xmlAttr, xattr);
162
- if (xattr->children == NULL)
163
- return(Qfalse);
164
- else
165
- return(Qtrue);
166
- }
167
-
168
-
169
- /*
170
- * call-seq:
171
- * attr.doc -> XML::Document
172
- *
173
- * Returns this attribute's document.
174
- *
175
- * doc.root.attributes.get_attribute('name').doc == doc
176
- */
177
- VALUE
178
- ruby_xml_attr_doc_get(VALUE self) {
179
- xmlAttrPtr xattr;
180
- Data_Get_Struct(self, xmlAttr, xattr);
181
- if (xattr->doc == NULL)
182
- return(Qnil);
183
- else
184
- return(ruby_xml_document_wrap(xattr->doc));
185
- }
186
-
187
- /*
188
- * call-seq:
189
- * attr.doc? -> (true|false)
190
- *
191
- * Determine whether this attribute is associated with an
192
- * XML::Document.
193
- */
194
- VALUE
195
- ruby_xml_attr_doc_q(VALUE self) {
196
- xmlAttrPtr xattr;
197
- Data_Get_Struct(self, xmlAttr, xattr);
198
- if (xattr->doc == NULL)
199
- return(Qfalse);
200
- else
201
- return(Qtrue);
202
- }
203
-
204
-
205
- /*
206
- * call-seq:
207
- * attr.last -> node
208
- *
209
- * Obtain the last attribute.
210
- */
211
- VALUE
212
- ruby_xml_attr_last_get(VALUE self) {
213
- xmlAttrPtr xattr;
214
- Data_Get_Struct(self, xmlAttr, xattr);
215
- if (xattr->last == NULL)
216
- return(Qnil);
217
- else
218
- return(ruby_xml_node2_wrap(cXMLNode, xattr->last));
219
- }
220
-
221
-
222
- /*
223
- * call-seq:
224
- * attr.last? -> (true|false)
225
- *
226
- * Determine whether this is the last attribute.
227
- */
228
- VALUE
229
- ruby_xml_attr_last_q(VALUE self) {
230
- xmlAttrPtr xattr;
231
- Data_Get_Struct(self, xmlAttr, xattr);
232
- if (xattr->last == NULL)
233
- return(Qfalse);
234
- else
235
- return(Qtrue);
236
- }
237
-
238
- /*
239
- * call-seq:
240
- * attr.name -> "name"
241
- *
242
- * Obtain this attribute's name.
243
- */
244
- VALUE
245
- ruby_xml_attr_name_get(VALUE self) {
246
- xmlAttrPtr xattr;
247
- Data_Get_Struct(self, xmlAttr, xattr);
248
-
249
- if (xattr->name == NULL)
250
- return(Qnil);
251
- else
252
- return(rb_str_new2((const char*)xattr->name));
253
- }
254
-
255
- /*
256
- * call-seq:
257
- * attr.next -> node
258
- *
259
- * Obtain the next attribute.
260
- */
261
- VALUE
262
- ruby_xml_attr_next_get(VALUE self) {
263
- xmlAttrPtr xattr;
264
- Data_Get_Struct(self, xmlAttr, xattr);
265
- if (xattr->next == NULL)
266
- return(Qnil);
267
- else
268
- return(ruby_xml_attr_wrap(xattr->next));
269
- }
270
-
271
-
272
- /*
273
- * call-seq:
274
- * attr.next? -> (true|false)
275
- *
276
- * Determine whether there is a next attribute.
277
- */
278
- VALUE
279
- ruby_xml_attr_next_q(VALUE self) {
280
- xmlAttrPtr xattr;
281
- Data_Get_Struct(self, xmlAttr, xattr);
282
- if (xattr->next == NULL)
283
- return(Qfalse);
284
- else
285
- return(Qtrue);
286
- }
287
-
288
-
289
- /*
290
- * call-seq:
291
- * attr.type_name -> "attribute"
292
- *
293
- * Obtain this attribute node's type name.
294
- */
295
- VALUE
296
- ruby_xml_attr_node_type_name(VALUE self) {
297
- return(rb_str_new2("attribute"));
298
- }
299
-
300
-
301
- /*
302
- * call-seq:
303
- * attr.ns -> namespace
304
- *
305
- * Obtain this attribute's associated XML::NS, if any.
306
- */
307
- VALUE
308
- ruby_xml_attr_ns_get(VALUE self) {
309
- xmlAttrPtr xattr;
310
- Data_Get_Struct(self, xmlAttr, xattr);
311
- if (xattr->ns == NULL)
312
- return(Qnil);
313
- else
314
- return(ruby_xml_ns_wrap(xattr->ns));
315
- }
316
-
317
-
318
- /*
319
- * call-seq:
320
- * attr.ns? -> (true|false)
321
- *
322
- * Determine whether this attribute has an associated
323
- * namespace.
324
- */
325
- VALUE
326
- ruby_xml_attr_ns_q(VALUE self) {
327
- xmlAttrPtr xattr;
328
- Data_Get_Struct(self, xmlAttr, xattr);
329
- if (xattr->ns == NULL)
330
- return(Qfalse);
331
- else
332
- return(Qtrue);
333
- }
334
-
335
-
336
- /*
337
- * call-seq:
338
- * attr.parent -> node
339
- *
340
- * Obtain this attribute node's parent.
341
- */
342
- VALUE
343
- ruby_xml_attr_parent_get(VALUE self) {
344
- xmlAttrPtr xattr;
345
- Data_Get_Struct(self, xmlAttr, xattr);
346
- if (xattr->parent == NULL)
347
- return(Qnil);
348
- else
349
- return(ruby_xml_node2_wrap(cXMLNode, xattr->parent));
350
- }
351
-
352
-
353
- /*
354
- * call-seq:
355
- * attr.parent? -> (true|false)
356
- *
357
- * Determine whether this attribute has a parent.
358
- */
359
- VALUE
360
- ruby_xml_attr_parent_q(VALUE self) {
361
- xmlAttrPtr xattr;
362
- Data_Get_Struct(self, xmlAttr, xattr);
363
- if (xattr->parent == NULL)
364
- return(Qfalse);
365
- else
366
- return(Qtrue);
367
- }
368
-
369
-
370
- /*
371
- * call-seq:
372
- * attr.prev -> node
373
- *
374
- * Obtain the previous attribute.
375
- */
376
- VALUE
377
- ruby_xml_attr_prev_get(VALUE self) {
378
- xmlAttrPtr xattr;
379
- Data_Get_Struct(self, xmlAttr, xattr);
380
- if (xattr->prev == NULL)
381
- return(Qnil);
382
- else
383
- return(ruby_xml_attr_wrap(xattr->prev));
384
- }
385
-
386
-
387
- /*
388
- * call-seq:
389
- * attr.prev? -> (true|false)
390
- *
391
- * Determine whether there is a previous attribute.
392
- */
393
- VALUE
394
- ruby_xml_attr_prev_q(VALUE self) {
395
- xmlAttrPtr xattr;
396
- Data_Get_Struct(self, xmlAttr, xattr);
397
- if (xattr->prev == NULL)
398
- return(Qfalse);
399
- else
400
- return(Qtrue);
401
- }
402
-
403
-
404
- /*
405
- * call-seq:
406
- * node.remove! -> nil
407
- *
408
- * Removes this attribute from it's parent.
409
- */
410
- VALUE
411
- ruby_xml_attr_remove_ex(VALUE self) {
412
- xmlAttrPtr xattr;
413
- Data_Get_Struct(self, xmlAttr, xattr);
414
-
415
- if (xattr->_private == NULL)
416
- xmlRemoveProp(xattr);
417
- else
418
- xmlUnlinkNode((xmlNodePtr)xattr);
419
-
420
- return(Qnil);
421
- }
422
-
423
- /*
424
- * call-seq:
425
- * attr.value -> "value"
426
- *
427
- * Obtain the value of this attribute.
428
- */
429
- VALUE
430
- ruby_xml_attr_value_get(VALUE self) {
431
- xmlAttrPtr xattr;
432
- xmlChar *value;
433
- VALUE result = Qnil;
434
-
435
- Data_Get_Struct(self, xmlAttr, xattr);
436
- if (ruby_xml_attr_parent_q(self) == Qtrue) {
437
- value = xmlGetProp(xattr->parent, xattr->name);
438
- if (value != NULL)
439
- {
440
- result = rb_str_new2((const char*)value);
441
- xmlFree(value);
442
- }
443
- }
444
- return(result);
445
- }
446
-
447
-
448
- /*
449
- * call-seq:
450
- * attr.value = "value"
451
- *
452
- * Sets the value of this attribute.
453
- */
454
- VALUE
455
- ruby_xml_attr_value_set(VALUE self, VALUE val) {
456
- xmlAttrPtr xattr;
457
-
458
- Check_Type(val, T_STRING);
459
- Data_Get_Struct(self, xmlAttr, xattr);
460
-
461
- if (xattr->ns)
462
- xmlSetNsProp(xattr->parent, xattr->ns, xattr->name, (xmlChar*)StringValuePtr(val));
463
- else
464
- xmlSetProp(xattr->parent, xattr->name, (xmlChar*)StringValuePtr(val));
465
-
466
- return(self);
467
- }
468
-
469
-
470
- // Rdoc needs to know
471
- #ifdef RDOC_NEVER_DEFINED
472
- mLibXML = rb_define_module("LibXML");
473
- mXML = rb_define_module_under(mLibXML, "XML");
474
- #endif
475
-
476
- void
477
- ruby_init_xml_attr(void) {
478
- cXMLAttr = rb_define_class_under(mXML, "Attr", rb_cObject);
479
- rb_define_alloc_func(cXMLAttr, ruby_xml_attr_alloc);
480
- rb_define_method(cXMLAttr, "initialize", ruby_xml_attr_initialize, -1);
481
- rb_define_method(cXMLAttr, "child", ruby_xml_attr_child_get, 0);
482
- rb_define_method(cXMLAttr, "child?", ruby_xml_attr_child_q, 0);
483
- rb_define_method(cXMLAttr, "doc", ruby_xml_attr_doc_get, 0);
484
- rb_define_method(cXMLAttr, "doc?", ruby_xml_attr_doc_q, 0);
485
- rb_define_method(cXMLAttr, "last", ruby_xml_attr_last_get, 0);
486
- rb_define_method(cXMLAttr, "last?", ruby_xml_attr_last_q, 0);
487
- rb_define_method(cXMLAttr, "name", ruby_xml_attr_name_get, 0);
488
- rb_define_method(cXMLAttr, "next", ruby_xml_attr_next_get, 0);
489
- rb_define_method(cXMLAttr, "next?", ruby_xml_attr_next_q, 0);
490
- rb_define_method(cXMLAttr, "node_type_name", ruby_xml_attr_node_type_name, 0);
491
- rb_define_method(cXMLAttr, "ns", ruby_xml_attr_ns_get, 0);
492
- rb_define_method(cXMLAttr, "ns?", ruby_xml_attr_ns_q, 0);
493
- rb_define_method(cXMLAttr, "parent", ruby_xml_attr_parent_get, 0);
494
- rb_define_method(cXMLAttr, "parent?", ruby_xml_attr_parent_q, 0);
495
- rb_define_method(cXMLAttr, "prev", ruby_xml_attr_prev_get, 0);
496
- rb_define_method(cXMLAttr, "prev?", ruby_xml_attr_prev_q, 0);
497
- rb_define_method(cXMLAttr, "remove!", ruby_xml_attr_remove_ex, 0);
498
- rb_define_method(cXMLAttr, "value", ruby_xml_attr_value_get, 0);
499
- rb_define_method(cXMLAttr, "value=", ruby_xml_attr_value_set, 1);
500
- }
1
+ /* $Id: ruby_xml_attr.c 553 2008-11-18 02:34:38Z cfis $ */
2
+
3
+ /* Please see the LICENSE file for copyright and distribution information */
4
+
5
+ /*
6
+ * Document-class: LibXML::XML::Attr
7
+ *
8
+ * Provides access to an single element attribute.
9
+ *
10
+ * Basic Usage:
11
+ *
12
+ * require 'xml'
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
+
21
+ #include "ruby_libxml.h"
22
+ #include "ruby_xml_attr.h"
23
+
24
+ VALUE cXMLAttr;
25
+
26
+ void ruby_xml_attr_free(xmlAttrPtr xattr) {
27
+ if (!xattr) return;
28
+
29
+ if (xattr != NULL ) {
30
+ xattr->_private=NULL;
31
+ if (xattr->parent == NULL && xattr->doc == NULL ) {
32
+ #ifdef NODE_DEBUG
33
+ fprintf(stderr,"ruby_xfree rxn=0x%x xn=0x%x o=0x%x\n",(long)rxn,(long)rxn->node,(long)rxn->node->_private);
34
+ #endif
35
+ xmlFreeProp(xattr);
36
+ }
37
+
38
+ xattr=NULL;
39
+ }
40
+ }
41
+
42
+ void
43
+ ruby_xml_attr_mark(xmlAttrPtr xattr) {
44
+ if (xattr == NULL) return;
45
+
46
+ if (xattr->_private == NULL ) {
47
+ rb_warning("XmlAttr is not bound! (%s:%d)",
48
+ __FILE__,__LINE__);
49
+ return;
50
+ }
51
+
52
+ ruby_xml_node_mark_common((xmlNodePtr)xattr);
53
+ }
54
+
55
+ VALUE
56
+ ruby_xml_attr_wrap(xmlAttrPtr xattr)
57
+ {
58
+ VALUE result;
59
+ // This node is already wrapped
60
+ if (xattr->_private != NULL)
61
+ return (VALUE)xattr->_private;
62
+
63
+ result = Data_Wrap_Struct(cXMLAttr,
64
+ ruby_xml_attr_mark, ruby_xml_attr_free,
65
+ xattr);
66
+
67
+ xattr->_private=(void*)result;
68
+ #ifdef NODE_DEBUG
69
+ fprintf(stderr,"wrap rxn=0x%x xn=0x%x o=0x%x\n",(long)rxn,(long)xnode,(long)obj);
70
+ #endif
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);
81
+ }
82
+
83
+ /*
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')
94
+ */
95
+ VALUE
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 (xnode->type != XML_ELEMENT_NODE)
114
+ rb_raise(rb_eArgError, "Attributes can only be created on element nodes.");
115
+
116
+ if NIL_P(ns)
117
+ {
118
+ xattr = xmlNewProp(xnode, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
119
+ }
120
+ else
121
+ {
122
+ xmlNsPtr xns;
123
+ Data_Get_Struct(ns, xmlNs, xns);
124
+ xattr = xmlNewNsProp(xnode, xns, (xmlChar*)StringValuePtr(name), (xmlChar*)StringValuePtr(value));
125
+ }
126
+
127
+ if (!xattr)
128
+ rb_raise(rb_eRuntimeError, "Could not create attribute.");
129
+
130
+ xattr->_private = (void *)self;
131
+ DATA_PTR(self) = xattr;
132
+ return self;
133
+ }
134
+
135
+ /*
136
+ * call-seq:
137
+ * attr.child -> node
138
+ *
139
+ * Obtain this attribute's child attribute(s).
140
+ */
141
+ VALUE
142
+ ruby_xml_attr_child_get(VALUE self) {
143
+ xmlAttrPtr xattr;
144
+ Data_Get_Struct(self, xmlAttr, xattr);
145
+ if (xattr->children == NULL)
146
+ return(Qnil);
147
+ else
148
+ return(ruby_xml_node2_wrap(cXMLNode, (xmlNodePtr)xattr->children));
149
+ }
150
+
151
+
152
+ /*
153
+ * call-seq:
154
+ * attr.child? -> (true|false)
155
+ *
156
+ * Returns whether this attribute has child attributes.
157
+ */
158
+ VALUE
159
+ ruby_xml_attr_child_q(VALUE self) {
160
+ xmlAttrPtr xattr;
161
+ Data_Get_Struct(self, xmlAttr, xattr);
162
+ if (xattr->children == NULL)
163
+ return(Qfalse);
164
+ else
165
+ return(Qtrue);
166
+ }
167
+
168
+
169
+ /*
170
+ * call-seq:
171
+ * attr.doc -> XML::Document
172
+ *
173
+ * Returns this attribute's document.
174
+ *
175
+ * doc.root.attributes.get_attribute('name').doc == doc
176
+ */
177
+ VALUE
178
+ ruby_xml_attr_doc_get(VALUE self) {
179
+ xmlAttrPtr xattr;
180
+ Data_Get_Struct(self, xmlAttr, xattr);
181
+ if (xattr->doc == NULL)
182
+ return(Qnil);
183
+ else
184
+ return(ruby_xml_document_wrap(xattr->doc));
185
+ }
186
+
187
+ /*
188
+ * call-seq:
189
+ * attr.doc? -> (true|false)
190
+ *
191
+ * Determine whether this attribute is associated with an
192
+ * XML::Document.
193
+ */
194
+ VALUE
195
+ ruby_xml_attr_doc_q(VALUE self) {
196
+ xmlAttrPtr xattr;
197
+ Data_Get_Struct(self, xmlAttr, xattr);
198
+ if (xattr->doc == NULL)
199
+ return(Qfalse);
200
+ else
201
+ return(Qtrue);
202
+ }
203
+
204
+
205
+ /*
206
+ * call-seq:
207
+ * attr.last -> node
208
+ *
209
+ * Obtain the last attribute.
210
+ */
211
+ VALUE
212
+ ruby_xml_attr_last_get(VALUE self) {
213
+ xmlAttrPtr xattr;
214
+ Data_Get_Struct(self, xmlAttr, xattr);
215
+ if (xattr->last == NULL)
216
+ return(Qnil);
217
+ else
218
+ return(ruby_xml_node2_wrap(cXMLNode, xattr->last));
219
+ }
220
+
221
+
222
+ /*
223
+ * call-seq:
224
+ * attr.last? -> (true|false)
225
+ *
226
+ * Determine whether this is the last attribute.
227
+ */
228
+ VALUE
229
+ ruby_xml_attr_last_q(VALUE self) {
230
+ xmlAttrPtr xattr;
231
+ Data_Get_Struct(self, xmlAttr, xattr);
232
+ if (xattr->last == NULL)
233
+ return(Qfalse);
234
+ else
235
+ return(Qtrue);
236
+ }
237
+
238
+ /*
239
+ * call-seq:
240
+ * attr.name -> "name"
241
+ *
242
+ * Obtain this attribute's name.
243
+ */
244
+ VALUE
245
+ ruby_xml_attr_name_get(VALUE self) {
246
+ xmlAttrPtr xattr;
247
+ Data_Get_Struct(self, xmlAttr, xattr);
248
+
249
+ if (xattr->name == NULL)
250
+ return(Qnil);
251
+ else
252
+ return(rb_str_new2((const char*)xattr->name));
253
+ }
254
+
255
+ /*
256
+ * call-seq:
257
+ * attr.next -> node
258
+ *
259
+ * Obtain the next attribute.
260
+ */
261
+ VALUE
262
+ ruby_xml_attr_next_get(VALUE self) {
263
+ xmlAttrPtr xattr;
264
+ Data_Get_Struct(self, xmlAttr, xattr);
265
+ if (xattr->next == NULL)
266
+ return(Qnil);
267
+ else
268
+ return(ruby_xml_attr_wrap(xattr->next));
269
+ }
270
+
271
+
272
+ /*
273
+ * call-seq:
274
+ * attr.next? -> (true|false)
275
+ *
276
+ * Determine whether there is a next attribute.
277
+ */
278
+ VALUE
279
+ ruby_xml_attr_next_q(VALUE self) {
280
+ xmlAttrPtr xattr;
281
+ Data_Get_Struct(self, xmlAttr, xattr);
282
+ if (xattr->next == NULL)
283
+ return(Qfalse);
284
+ else
285
+ return(Qtrue);
286
+ }
287
+
288
+
289
+ /*
290
+ * call-seq:
291
+ * attr.type_name -> "attribute"
292
+ *
293
+ * Obtain this attribute node's type name.
294
+ */
295
+ VALUE
296
+ ruby_xml_attr_node_type_name(VALUE self) {
297
+ return(rb_str_new2("attribute"));
298
+ }
299
+
300
+
301
+ /*
302
+ * call-seq:
303
+ * attr.ns -> namespace
304
+ *
305
+ * Obtain this attribute's associated XML::NS, if any.
306
+ */
307
+ VALUE
308
+ ruby_xml_attr_ns_get(VALUE self) {
309
+ xmlAttrPtr xattr;
310
+ Data_Get_Struct(self, xmlAttr, xattr);
311
+ if (xattr->ns == NULL)
312
+ return(Qnil);
313
+ else
314
+ return(ruby_xml_ns_wrap(xattr->ns));
315
+ }
316
+
317
+
318
+ /*
319
+ * call-seq:
320
+ * attr.ns? -> (true|false)
321
+ *
322
+ * Determine whether this attribute has an associated
323
+ * namespace.
324
+ */
325
+ VALUE
326
+ ruby_xml_attr_ns_q(VALUE self) {
327
+ xmlAttrPtr xattr;
328
+ Data_Get_Struct(self, xmlAttr, xattr);
329
+ if (xattr->ns == NULL)
330
+ return(Qfalse);
331
+ else
332
+ return(Qtrue);
333
+ }
334
+
335
+
336
+ /*
337
+ * call-seq:
338
+ * attr.parent -> node
339
+ *
340
+ * Obtain this attribute node's parent.
341
+ */
342
+ VALUE
343
+ ruby_xml_attr_parent_get(VALUE self) {
344
+ xmlAttrPtr xattr;
345
+ Data_Get_Struct(self, xmlAttr, xattr);
346
+ if (xattr->parent == NULL)
347
+ return(Qnil);
348
+ else
349
+ return(ruby_xml_node2_wrap(cXMLNode, xattr->parent));
350
+ }
351
+
352
+
353
+ /*
354
+ * call-seq:
355
+ * attr.parent? -> (true|false)
356
+ *
357
+ * Determine whether this attribute has a parent.
358
+ */
359
+ VALUE
360
+ ruby_xml_attr_parent_q(VALUE self) {
361
+ xmlAttrPtr xattr;
362
+ Data_Get_Struct(self, xmlAttr, xattr);
363
+ if (xattr->parent == NULL)
364
+ return(Qfalse);
365
+ else
366
+ return(Qtrue);
367
+ }
368
+
369
+
370
+ /*
371
+ * call-seq:
372
+ * attr.prev -> node
373
+ *
374
+ * Obtain the previous attribute.
375
+ */
376
+ VALUE
377
+ ruby_xml_attr_prev_get(VALUE self) {
378
+ xmlAttrPtr xattr;
379
+ Data_Get_Struct(self, xmlAttr, xattr);
380
+ if (xattr->prev == NULL)
381
+ return(Qnil);
382
+ else
383
+ return(ruby_xml_attr_wrap(xattr->prev));
384
+ }
385
+
386
+
387
+ /*
388
+ * call-seq:
389
+ * attr.prev? -> (true|false)
390
+ *
391
+ * Determine whether there is a previous attribute.
392
+ */
393
+ VALUE
394
+ ruby_xml_attr_prev_q(VALUE self) {
395
+ xmlAttrPtr xattr;
396
+ Data_Get_Struct(self, xmlAttr, xattr);
397
+ if (xattr->prev == NULL)
398
+ return(Qfalse);
399
+ else
400
+ return(Qtrue);
401
+ }
402
+
403
+
404
+ /*
405
+ * call-seq:
406
+ * node.remove! -> nil
407
+ *
408
+ * Removes this attribute from it's parent.
409
+ */
410
+ VALUE
411
+ ruby_xml_attr_remove_ex(VALUE self) {
412
+ xmlAttrPtr xattr;
413
+ Data_Get_Struct(self, xmlAttr, xattr);
414
+
415
+ if (xattr->_private == NULL)
416
+ xmlRemoveProp(xattr);
417
+ else
418
+ xmlUnlinkNode((xmlNodePtr)xattr);
419
+
420
+ return(Qnil);
421
+ }
422
+
423
+ /*
424
+ * call-seq:
425
+ * attr.value -> "value"
426
+ *
427
+ * Obtain the value of this attribute.
428
+ */
429
+ VALUE
430
+ ruby_xml_attr_value_get(VALUE self) {
431
+ xmlAttrPtr xattr;
432
+ xmlChar *value;
433
+ VALUE result = Qnil;
434
+
435
+ Data_Get_Struct(self, xmlAttr, xattr);
436
+ if (ruby_xml_attr_parent_q(self) == Qtrue) {
437
+ value = xmlGetProp(xattr->parent, xattr->name);
438
+ if (value != NULL)
439
+ {
440
+ result = rb_str_new2((const char*)value);
441
+ xmlFree(value);
442
+ }
443
+ }
444
+ return(result);
445
+ }
446
+
447
+
448
+ /*
449
+ * call-seq:
450
+ * attr.value = "value"
451
+ *
452
+ * Sets the value of this attribute.
453
+ */
454
+ VALUE
455
+ ruby_xml_attr_value_set(VALUE self, VALUE val) {
456
+ xmlAttrPtr xattr;
457
+
458
+ Check_Type(val, T_STRING);
459
+ Data_Get_Struct(self, xmlAttr, xattr);
460
+
461
+ if (xattr->ns)
462
+ xmlSetNsProp(xattr->parent, xattr->ns, xattr->name, (xmlChar*)StringValuePtr(val));
463
+ else
464
+ xmlSetProp(xattr->parent, xattr->name, (xmlChar*)StringValuePtr(val));
465
+
466
+ return(self);
467
+ }
468
+
469
+
470
+ // Rdoc needs to know
471
+ #ifdef RDOC_NEVER_DEFINED
472
+ mLibXML = rb_define_module("LibXML");
473
+ mXML = rb_define_module_under(mLibXML, "XML");
474
+ #endif
475
+
476
+ void
477
+ ruby_init_xml_attr(void) {
478
+ cXMLAttr = rb_define_class_under(mXML, "Attr", rb_cObject);
479
+ rb_define_alloc_func(cXMLAttr, ruby_xml_attr_alloc);
480
+ rb_define_method(cXMLAttr, "initialize", ruby_xml_attr_initialize, -1);
481
+ rb_define_method(cXMLAttr, "child", ruby_xml_attr_child_get, 0);
482
+ rb_define_method(cXMLAttr, "child?", ruby_xml_attr_child_q, 0);
483
+ rb_define_method(cXMLAttr, "doc", ruby_xml_attr_doc_get, 0);
484
+ rb_define_method(cXMLAttr, "doc?", ruby_xml_attr_doc_q, 0);
485
+ rb_define_method(cXMLAttr, "last", ruby_xml_attr_last_get, 0);
486
+ rb_define_method(cXMLAttr, "last?", ruby_xml_attr_last_q, 0);
487
+ rb_define_method(cXMLAttr, "name", ruby_xml_attr_name_get, 0);
488
+ rb_define_method(cXMLAttr, "next", ruby_xml_attr_next_get, 0);
489
+ rb_define_method(cXMLAttr, "next?", ruby_xml_attr_next_q, 0);
490
+ rb_define_method(cXMLAttr, "node_type_name", ruby_xml_attr_node_type_name, 0);
491
+ rb_define_method(cXMLAttr, "ns", ruby_xml_attr_ns_get, 0);
492
+ rb_define_method(cXMLAttr, "ns?", ruby_xml_attr_ns_q, 0);
493
+ rb_define_method(cXMLAttr, "parent", ruby_xml_attr_parent_get, 0);
494
+ rb_define_method(cXMLAttr, "parent?", ruby_xml_attr_parent_q, 0);
495
+ rb_define_method(cXMLAttr, "prev", ruby_xml_attr_prev_get, 0);
496
+ rb_define_method(cXMLAttr, "prev?", ruby_xml_attr_prev_q, 0);
497
+ rb_define_method(cXMLAttr, "remove!", ruby_xml_attr_remove_ex, 0);
498
+ rb_define_method(cXMLAttr, "value", ruby_xml_attr_value_get, 0);
499
+ rb_define_method(cXMLAttr, "value=", ruby_xml_attr_value_set, 1);
500
+ }