Skip to content

Commit 95bf50d

Browse files
author
Riley Martinez-Lynch
committed
Don't wrap arbitrary nodes as elements, fixes libxmljs#226
* Added `type()` to namespaces
1 parent 6dd5848 commit 95bf50d

File tree

7 files changed

+43
-11
lines changed

7 files changed

+43
-11
lines changed

index.js

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ module.exports.features = bindings.features;
2424
module.exports.Comment = require('./lib/comment');
2525
module.exports.Document = Document;
2626
module.exports.Element = require('./lib/element');
27+
module.exports.Namespace = require('./lib/namespace');
2728
module.exports.Text = require('./lib/text');
2829

2930
// Compatibility synonyms

lib/comment.js

+4
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,9 @@ var Comment = function(doc, content) {
1919

2020
Comment.prototype = bindings.Comment.prototype;
2121

22+
Comment.prototype.name = function() {
23+
return "comment";
24+
};
25+
2226
module.exports = Comment;
2327

lib/namespace.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
var bindings = require('./bindings');
2+
3+
var Namespace = function() {
4+
throw new Error('cannot be directly instantiated');
5+
};
6+
7+
Namespace.prototype = bindings.Namespace.prototype;
8+
9+
Namespace.prototype.type = function() {
10+
return "namespace_decl";
11+
};
12+
13+
module.exports = Namespace;
14+

lib/text.js

+4
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,8 @@ function Text(doc, content) {
2525

2626
Text.prototype = bindings.Text.prototype;
2727

28+
Text.prototype.name = function() {
29+
return "text";
30+
};
31+
2832
module.exports = Text;

src/xml_element.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ XmlElement::get_child(int32_t idx) {
275275
if (!child)
276276
return scope.Escape(Nan::Null());
277277

278-
return scope.Escape(XmlElement::New(child));
278+
return scope.Escape(XmlNode::New(child));
279279
}
280280

281281
v8::Local<v8::Value>

src/xml_node.cc

+19-5
Original file line numberDiff line numberDiff line change
@@ -218,14 +218,28 @@ XmlNode::New(xmlNode* node)
218218
{
219219
Nan::EscapableHandleScope scope;
220220
switch (node->type) {
221+
221222
case XML_ATTRIBUTE_NODE:
222223
return scope.Escape(XmlAttribute::New(reinterpret_cast<xmlAttr *>(node)));
223224

225+
case XML_TEXT_NODE:
226+
return scope.Escape(XmlText::New(node));
227+
228+
case XML_COMMENT_NODE:
229+
return scope.Escape(XmlComment::New(node));
230+
231+
case XML_DOCUMENT_NODE:
232+
case XML_HTML_DOCUMENT_NODE:
233+
#ifdef LIBXML_DOCB_ENABLED
234+
case XML_DOCB_DOCUMENT_NODE:
235+
#endif
236+
return scope.Escape(XmlDocument::New(reinterpret_cast<xmlDoc *>(node)));
237+
238+
case XML_NAMESPACE_DECL:
239+
return scope.Escape(XmlNamespace::New(reinterpret_cast<xmlNs *>(node)));
240+
241+
case XML_ELEMENT_NODE:
224242
default:
225-
// if we don't know how to convert to specific libxmljs wrapper,
226-
// wrap in an XmlElement. There should probably be specific
227-
// wrapper types for text nodes etc., but this is what existing
228-
// code expects.
229243
return scope.Escape(XmlElement::New(node));
230244
}
231245
}
@@ -360,7 +374,7 @@ XmlNode::get_parent() {
360374
Nan::EscapableHandleScope scope;
361375

362376
if (xml_obj->parent) {
363-
return scope.Escape(XmlElement::New(xml_obj->parent));
377+
return scope.Escape(XmlNode::New(xml_obj->parent));
364378
}
365379

366380
return scope.Escape(XmlDocument::New(xml_obj->doc));

test/text.js

-5
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@ module.exports.setters = function(assert) {
3737
module.exports.getters = function(assert) {
3838
var doc = libxml.Document();
3939
var elem = libxml.Text(doc, 'getters');
40-
41-
assert.throws(function() {
42-
elem.name();
43-
}, "text nodes should NOT expose a name");
44-
4540
assert.equal('text', elem.type());
4641
assert.done();
4742
};

0 commit comments

Comments
 (0)