pocxxeci 0.30.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of pocxxeci might be problematic. Click here for more details.
- package/LICENSE +19 -0
- package/Makefile +18 -0
- package/README.md +52 -0
- package/binding.gyp +81 -0
- package/index.d.ts +273 -0
- package/index.js +45 -0
- package/lib/bindings.js +1 -0
- package/lib/document.js +122 -0
- package/lib/element.js +82 -0
- package/lib/sax_parser.js +38 -0
- package/package.json +70 -0
- package/src/html_document.cc +7 -0
- package/src/html_document.h +18 -0
- package/src/libxmljs.cc +252 -0
- package/src/libxmljs.h +53 -0
- package/src/xml_attribute.cc +173 -0
- package/src/xml_attribute.h +40 -0
- package/src/xml_comment.cc +117 -0
- package/src/xml_comment.h +30 -0
- package/src/xml_document.cc +810 -0
- package/src/xml_document.h +67 -0
- package/src/xml_element.cc +565 -0
- package/src/xml_element.h +61 -0
- package/src/xml_namespace.cc +158 -0
- package/src/xml_namespace.h +39 -0
- package/src/xml_node.cc +761 -0
- package/src/xml_node.h +73 -0
- package/src/xml_pi.cc +161 -0
- package/src/xml_pi.h +34 -0
- package/src/xml_sax_parser.cc +424 -0
- package/src/xml_sax_parser.h +73 -0
- package/src/xml_syntax_error.cc +66 -0
- package/src/xml_syntax_error.h +25 -0
- package/src/xml_text.cc +320 -0
- package/src/xml_text.h +48 -0
- package/src/xml_textwriter.cc +315 -0
- package/src/xml_textwriter.h +62 -0
- package/src/xml_xpath_context.cc +70 -0
- package/src/xml_xpath_context.h +23 -0
- package/vendor/libxml/Copyright +23 -0
- package/vendor/libxml/DOCBparser.c +305 -0
- package/vendor/libxml/HTMLparser.c +7287 -0
- package/vendor/libxml/HTMLtree.c +1200 -0
- package/vendor/libxml/Makefile +2983 -0
- package/vendor/libxml/SAX.c +180 -0
- package/vendor/libxml/SAX2.c +3036 -0
- package/vendor/libxml/buf.c +1351 -0
- package/vendor/libxml/buf.h +72 -0
- package/vendor/libxml/c14n.c +2234 -0
- package/vendor/libxml/catalog.c +3828 -0
- package/vendor/libxml/chvalid.c +336 -0
- package/vendor/libxml/config.h +294 -0
- package/vendor/libxml/config.h.gch +0 -0
- package/vendor/libxml/debugXML.c +3423 -0
- package/vendor/libxml/dict.c +1298 -0
- package/vendor/libxml/elfgcchack.h +17818 -0
- package/vendor/libxml/enc.h +32 -0
- package/vendor/libxml/encoding.c +3975 -0
- package/vendor/libxml/entities.c +1163 -0
- package/vendor/libxml/error.c +998 -0
- package/vendor/libxml/globals.c +1126 -0
- package/vendor/libxml/hash.c +1146 -0
- package/vendor/libxml/include/libxml/DOCBparser.h +96 -0
- package/vendor/libxml/include/libxml/HTMLparser.h +306 -0
- package/vendor/libxml/include/libxml/HTMLtree.h +147 -0
- package/vendor/libxml/include/libxml/Makefile +725 -0
- package/vendor/libxml/include/libxml/Makefile.am +54 -0
- package/vendor/libxml/include/libxml/Makefile.in +725 -0
- package/vendor/libxml/include/libxml/SAX.h +173 -0
- package/vendor/libxml/include/libxml/SAX2.h +178 -0
- package/vendor/libxml/include/libxml/c14n.h +128 -0
- package/vendor/libxml/include/libxml/catalog.h +182 -0
- package/vendor/libxml/include/libxml/chvalid.h +230 -0
- package/vendor/libxml/include/libxml/debugXML.h +217 -0
- package/vendor/libxml/include/libxml/dict.h +79 -0
- package/vendor/libxml/include/libxml/encoding.h +245 -0
- package/vendor/libxml/include/libxml/entities.h +151 -0
- package/vendor/libxml/include/libxml/globals.h +508 -0
- package/vendor/libxml/include/libxml/hash.h +236 -0
- package/vendor/libxml/include/libxml/list.h +137 -0
- package/vendor/libxml/include/libxml/nanoftp.h +163 -0
- package/vendor/libxml/include/libxml/nanohttp.h +81 -0
- package/vendor/libxml/include/libxml/parser.h +1243 -0
- package/vendor/libxml/include/libxml/parserInternals.h +644 -0
- package/vendor/libxml/include/libxml/pattern.h +100 -0
- package/vendor/libxml/include/libxml/relaxng.h +217 -0
- package/vendor/libxml/include/libxml/schemasInternals.h +958 -0
- package/vendor/libxml/include/libxml/schematron.h +142 -0
- package/vendor/libxml/include/libxml/threads.h +89 -0
- package/vendor/libxml/include/libxml/tree.h +1311 -0
- package/vendor/libxml/include/libxml/uri.h +94 -0
- package/vendor/libxml/include/libxml/valid.h +458 -0
- package/vendor/libxml/include/libxml/xinclude.h +129 -0
- package/vendor/libxml/include/libxml/xlink.h +189 -0
- package/vendor/libxml/include/libxml/xmlIO.h +368 -0
- package/vendor/libxml/include/libxml/xmlautomata.h +146 -0
- package/vendor/libxml/include/libxml/xmlerror.h +945 -0
- package/vendor/libxml/include/libxml/xmlexports.h +77 -0
- package/vendor/libxml/include/libxml/xmlmemory.h +224 -0
- package/vendor/libxml/include/libxml/xmlmodule.h +57 -0
- package/vendor/libxml/include/libxml/xmlreader.h +428 -0
- package/vendor/libxml/include/libxml/xmlregexp.h +222 -0
- package/vendor/libxml/include/libxml/xmlsave.h +88 -0
- package/vendor/libxml/include/libxml/xmlschemas.h +246 -0
- package/vendor/libxml/include/libxml/xmlschemastypes.h +151 -0
- package/vendor/libxml/include/libxml/xmlstring.h +140 -0
- package/vendor/libxml/include/libxml/xmlunicode.h +202 -0
- package/vendor/libxml/include/libxml/xmlversion.h +484 -0
- package/vendor/libxml/include/libxml/xmlwin32version.h +239 -0
- package/vendor/libxml/include/libxml/xmlwriter.h +488 -0
- package/vendor/libxml/include/libxml/xpath.h +564 -0
- package/vendor/libxml/include/libxml/xpathInternals.h +632 -0
- package/vendor/libxml/include/libxml/xpointer.h +114 -0
- package/vendor/libxml/include/win32config.h +122 -0
- package/vendor/libxml/include/wsockcompat.h +54 -0
- package/vendor/libxml/legacy.c +1343 -0
- package/vendor/libxml/libxml.h +134 -0
- package/vendor/libxml/list.c +779 -0
- package/vendor/libxml/nanoftp.c +2118 -0
- package/vendor/libxml/nanohttp.c +1899 -0
- package/vendor/libxml/parser.c +15553 -0
- package/vendor/libxml/parserInternals.c +2164 -0
- package/vendor/libxml/pattern.c +2621 -0
- package/vendor/libxml/relaxng.c +11101 -0
- package/vendor/libxml/rngparser.c +1595 -0
- package/vendor/libxml/runsuite.c +1157 -0
- package/vendor/libxml/save.h +36 -0
- package/vendor/libxml/schematron.c +1787 -0
- package/vendor/libxml/threads.c +1049 -0
- package/vendor/libxml/timsort.h +601 -0
- package/vendor/libxml/tree.c +10183 -0
- package/vendor/libxml/trio.c +6895 -0
- package/vendor/libxml/trio.h +230 -0
- package/vendor/libxml/triodef.h +228 -0
- package/vendor/libxml/trionan.c +914 -0
- package/vendor/libxml/trionan.h +84 -0
- package/vendor/libxml/triop.h +150 -0
- package/vendor/libxml/triostr.c +2112 -0
- package/vendor/libxml/triostr.h +144 -0
- package/vendor/libxml/uri.c +2561 -0
- package/vendor/libxml/valid.c +7138 -0
- package/vendor/libxml/xinclude.c +2657 -0
- package/vendor/libxml/xlink.c +183 -0
- package/vendor/libxml/xmlIO.c +4135 -0
- package/vendor/libxml/xmlcatalog.c +624 -0
- package/vendor/libxml/xmllint.c +3796 -0
- package/vendor/libxml/xmlmemory.c +1163 -0
- package/vendor/libxml/xmlmodule.c +468 -0
- package/vendor/libxml/xmlreader.c +6033 -0
- package/vendor/libxml/xmlregexp.c +8271 -0
- package/vendor/libxml/xmlsave.c +2735 -0
- package/vendor/libxml/xmlschemas.c +29173 -0
- package/vendor/libxml/xmlschemastypes.c +6276 -0
- package/vendor/libxml/xmlstring.c +1050 -0
- package/vendor/libxml/xmlunicode.c +3179 -0
- package/vendor/libxml/xmlwriter.c +4738 -0
- package/vendor/libxml/xpath.c +14734 -0
- package/vendor/libxml/xpointer.c +2969 -0
- package/vendor/libxml/xzlib.c +815 -0
- package/vendor/libxml/xzlib.h +19 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
// Copyright 2009, Squish Tech, LLC.
|
2
|
+
#ifndef SRC_XML_SAX_PARSER_H_
|
3
|
+
#define SRC_XML_SAX_PARSER_H_
|
4
|
+
|
5
|
+
#include <node.h>
|
6
|
+
|
7
|
+
namespace libxmljs {
|
8
|
+
|
9
|
+
class XmlSaxParser : public Nan::ObjectWrap {
|
10
|
+
public:
|
11
|
+
XmlSaxParser();
|
12
|
+
virtual ~XmlSaxParser();
|
13
|
+
|
14
|
+
static void Initialize(v8::Local<v8::Object> target);
|
15
|
+
|
16
|
+
static NAN_METHOD(NewParser);
|
17
|
+
|
18
|
+
static NAN_METHOD(NewPushParser);
|
19
|
+
|
20
|
+
static NAN_METHOD(ParseString);
|
21
|
+
static NAN_METHOD(Push);
|
22
|
+
|
23
|
+
void Callback(const char *what, int argc = 0,
|
24
|
+
v8::Local<v8::Value> argv[] = NULL);
|
25
|
+
|
26
|
+
void parse_string(const char *str, unsigned int size);
|
27
|
+
|
28
|
+
void initialize_push_parser();
|
29
|
+
|
30
|
+
void push(const char *str, unsigned int size, bool terminate);
|
31
|
+
|
32
|
+
/// callbacks
|
33
|
+
|
34
|
+
static void start_document(void *context);
|
35
|
+
|
36
|
+
static void end_document(void *context);
|
37
|
+
|
38
|
+
static void start_element(void *context, const xmlChar *name,
|
39
|
+
const xmlChar **p);
|
40
|
+
|
41
|
+
static void end_element(void *context, const xmlChar *name);
|
42
|
+
|
43
|
+
static void start_element_ns(void *context, const xmlChar *localname,
|
44
|
+
const xmlChar *prefix, const xmlChar *uri,
|
45
|
+
int nb_namespaces, const xmlChar **namespaces,
|
46
|
+
int nb_attributes, int nb_defaulted,
|
47
|
+
const xmlChar **attributes);
|
48
|
+
|
49
|
+
static void end_element_ns(void *context, const xmlChar *localname,
|
50
|
+
const xmlChar *prefix, const xmlChar *uri);
|
51
|
+
|
52
|
+
static void characters(void *context, const xmlChar *ch, int len);
|
53
|
+
|
54
|
+
static void comment(void *context, const xmlChar *value);
|
55
|
+
|
56
|
+
static void cdata_block(void *context, const xmlChar *value, int len);
|
57
|
+
|
58
|
+
static void warning(void *context, const char *msg, ...);
|
59
|
+
|
60
|
+
static void error(void *context, const char *msg, ...);
|
61
|
+
|
62
|
+
protected:
|
63
|
+
void initializeContext();
|
64
|
+
void releaseContext();
|
65
|
+
|
66
|
+
xmlParserCtxt *context_;
|
67
|
+
|
68
|
+
xmlSAXHandler sax_handler_;
|
69
|
+
};
|
70
|
+
|
71
|
+
} // namespace libxmljs
|
72
|
+
|
73
|
+
#endif // SRC_XML_SAX_PARSER_H_
|
@@ -0,0 +1,66 @@
|
|
1
|
+
// Copyright 2009, Squish Tech, LLC.
|
2
|
+
|
3
|
+
#include <cstring>
|
4
|
+
|
5
|
+
#include "xml_syntax_error.h"
|
6
|
+
|
7
|
+
using namespace v8;
|
8
|
+
namespace {
|
9
|
+
|
10
|
+
void set_string_field(Local<Object> obj, const char *name, const char *value) {
|
11
|
+
Nan::HandleScope scope;
|
12
|
+
if (!value) {
|
13
|
+
return;
|
14
|
+
}
|
15
|
+
Nan::Set(obj, Nan::New<String>(name).ToLocalChecked(),
|
16
|
+
Nan::New<String>(value, strlen(value)).ToLocalChecked());
|
17
|
+
}
|
18
|
+
|
19
|
+
void set_numeric_field(Local<Object> obj, const char *name, const int value) {
|
20
|
+
Nan::HandleScope scope;
|
21
|
+
Nan::Set(obj, Nan::New<String>(name).ToLocalChecked(),
|
22
|
+
Nan::New<Int32>(value));
|
23
|
+
}
|
24
|
+
|
25
|
+
} // anonymous namespace
|
26
|
+
|
27
|
+
namespace libxmljs {
|
28
|
+
|
29
|
+
Local<Value> XmlSyntaxError::BuildSyntaxError(xmlError *error) {
|
30
|
+
Nan::EscapableHandleScope scope;
|
31
|
+
|
32
|
+
Local<Value> err =
|
33
|
+
Exception::Error(Nan::New<String>(error->message).ToLocalChecked());
|
34
|
+
Local<Object> out = Local<Object>::Cast(err);
|
35
|
+
|
36
|
+
set_numeric_field(out, "domain", error->domain);
|
37
|
+
set_numeric_field(out, "code", error->code);
|
38
|
+
set_string_field(out, "message", error->message);
|
39
|
+
set_numeric_field(out, "level", error->level);
|
40
|
+
set_numeric_field(out, "column", error->int2);
|
41
|
+
set_string_field(out, "file", error->file);
|
42
|
+
set_numeric_field(out, "line", error->line);
|
43
|
+
set_string_field(out, "str1", error->str1);
|
44
|
+
set_string_field(out, "str2", error->str2);
|
45
|
+
set_string_field(out, "str3", error->str3);
|
46
|
+
|
47
|
+
// only add if we have something interesting
|
48
|
+
if (error->int1) {
|
49
|
+
set_numeric_field(out, "int1", error->int1);
|
50
|
+
}
|
51
|
+
return scope.Escape(err);
|
52
|
+
}
|
53
|
+
|
54
|
+
void XmlSyntaxError::PushToArray(void *errs, xmlError *error) {
|
55
|
+
Nan::HandleScope scope;
|
56
|
+
Local<Array> errors = *reinterpret_cast<Local<Array> *>(errs);
|
57
|
+
// push method for array
|
58
|
+
Local<Function> push = Local<Function>::Cast(
|
59
|
+
Nan::Get(errors, Nan::New<String>("push").ToLocalChecked())
|
60
|
+
.ToLocalChecked());
|
61
|
+
|
62
|
+
Local<Value> argv[1] = {XmlSyntaxError::BuildSyntaxError(error)};
|
63
|
+
Nan::Call(push, errors, 1, argv);
|
64
|
+
}
|
65
|
+
|
66
|
+
} // namespace libxmljs
|
@@ -0,0 +1,25 @@
|
|
1
|
+
// Copyright 2009, Squish Tech, LLC.
|
2
|
+
#ifndef SRC_XML_SYNTAX_ERROR_H_
|
3
|
+
#define SRC_XML_SYNTAX_ERROR_H_
|
4
|
+
|
5
|
+
#include <libxml/xmlerror.h>
|
6
|
+
|
7
|
+
#include "libxmljs.h"
|
8
|
+
|
9
|
+
namespace libxmljs {
|
10
|
+
|
11
|
+
// basically being used like a namespace
|
12
|
+
class XmlSyntaxError {
|
13
|
+
public:
|
14
|
+
// push xmlError onto v8::Array
|
15
|
+
// helper method for xml library
|
16
|
+
static void PushToArray(void *errs, xmlError *error);
|
17
|
+
|
18
|
+
// create a v8 object for the syntax eror
|
19
|
+
// TODO make it a v8 Erorr object
|
20
|
+
static v8::Local<v8::Value> BuildSyntaxError(xmlError *error);
|
21
|
+
};
|
22
|
+
|
23
|
+
} // namespace libxmljs
|
24
|
+
|
25
|
+
#endif // SRC_XML_SYNTAX_ERROR_H_
|
package/src/xml_text.cc
ADDED
@@ -0,0 +1,320 @@
|
|
1
|
+
// Copyright 2009, Squish Tech, LLC.
|
2
|
+
|
3
|
+
#include <node.h>
|
4
|
+
|
5
|
+
#include <cstring>
|
6
|
+
|
7
|
+
#include "libxmljs.h"
|
8
|
+
|
9
|
+
#include "xml_attribute.h"
|
10
|
+
#include "xml_document.h"
|
11
|
+
#include "xml_text.h"
|
12
|
+
#include "xml_xpath_context.h"
|
13
|
+
|
14
|
+
using namespace v8;
|
15
|
+
|
16
|
+
namespace libxmljs {
|
17
|
+
|
18
|
+
Nan::Persistent<FunctionTemplate> XmlText::constructor_template;
|
19
|
+
|
20
|
+
Local<Value> XmlText::get_path() {
|
21
|
+
Nan::EscapableHandleScope scope;
|
22
|
+
xmlChar *path = xmlGetNodePath(xml_obj);
|
23
|
+
const char *return_path = path ? reinterpret_cast<char *>(path) : "";
|
24
|
+
int str_len = xmlStrlen((const xmlChar *)return_path);
|
25
|
+
Local<String> js_obj =
|
26
|
+
Nan::New<String>(return_path, str_len).ToLocalChecked();
|
27
|
+
xmlFree(path);
|
28
|
+
return scope.Escape(js_obj);
|
29
|
+
}
|
30
|
+
|
31
|
+
// doc, name, content
|
32
|
+
NAN_METHOD(XmlText::New) {
|
33
|
+
NAN_CONSTRUCTOR_CHECK(Text)
|
34
|
+
Nan::HandleScope scope;
|
35
|
+
|
36
|
+
// if we were created for an existing xml node, then we don't need
|
37
|
+
// to create a new node on the document
|
38
|
+
if (info.Length() == 0) {
|
39
|
+
return info.GetReturnValue().Set(info.Holder());
|
40
|
+
}
|
41
|
+
|
42
|
+
DOCUMENT_ARG_CHECK
|
43
|
+
if (!info[1]->IsString()) {
|
44
|
+
Nan::ThrowError("content argument must be of type string");
|
45
|
+
return;
|
46
|
+
}
|
47
|
+
|
48
|
+
XmlDocument *document = Nan::ObjectWrap::Unwrap<XmlDocument>(doc);
|
49
|
+
assert(document);
|
50
|
+
|
51
|
+
Local<Value> contentOpt;
|
52
|
+
if (info[1]->IsString()) {
|
53
|
+
contentOpt = info[1];
|
54
|
+
}
|
55
|
+
Nan::Utf8String contentRaw(contentOpt);
|
56
|
+
const char *content = (contentRaw.length()) ? *contentRaw : NULL;
|
57
|
+
|
58
|
+
xmlNode *textNode =
|
59
|
+
xmlNewDocText(document->xml_obj, (const xmlChar *)content);
|
60
|
+
|
61
|
+
XmlText *element = new XmlText(textNode);
|
62
|
+
textNode->_private = element;
|
63
|
+
element->Wrap(info.Holder());
|
64
|
+
|
65
|
+
// this prevents the document from going away
|
66
|
+
Nan::Set(info.Holder(), Nan::New<String>("document").ToLocalChecked(),
|
67
|
+
info[0])
|
68
|
+
.Check();
|
69
|
+
|
70
|
+
return info.GetReturnValue().Set(info.Holder());
|
71
|
+
}
|
72
|
+
|
73
|
+
NAN_METHOD(XmlText::NextElement) {
|
74
|
+
Nan::HandleScope scope;
|
75
|
+
XmlText *element = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
|
76
|
+
assert(element);
|
77
|
+
|
78
|
+
return info.GetReturnValue().Set(element->get_next_element());
|
79
|
+
}
|
80
|
+
|
81
|
+
NAN_METHOD(XmlText::PrevElement) {
|
82
|
+
Nan::HandleScope scope;
|
83
|
+
XmlText *element = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
|
84
|
+
assert(element);
|
85
|
+
|
86
|
+
return info.GetReturnValue().Set(element->get_prev_element());
|
87
|
+
}
|
88
|
+
|
89
|
+
NAN_METHOD(XmlText::Text) {
|
90
|
+
Nan::HandleScope scope;
|
91
|
+
XmlText *element = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
|
92
|
+
assert(element);
|
93
|
+
|
94
|
+
if (info.Length() == 0) {
|
95
|
+
return info.GetReturnValue().Set(element->get_content());
|
96
|
+
} else {
|
97
|
+
element->set_content(*Nan::Utf8String(info[0]));
|
98
|
+
}
|
99
|
+
|
100
|
+
return info.GetReturnValue().Set(info.Holder());
|
101
|
+
}
|
102
|
+
|
103
|
+
NAN_METHOD(XmlText::AddPrevSibling) {
|
104
|
+
XmlText *text = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
|
105
|
+
assert(text);
|
106
|
+
|
107
|
+
XmlNode *new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(
|
108
|
+
Nan::To<Object>(info[0]).ToLocalChecked());
|
109
|
+
assert(new_sibling);
|
110
|
+
|
111
|
+
xmlNode *imported_sibling = text->import_node(new_sibling->xml_obj);
|
112
|
+
if (imported_sibling == NULL) {
|
113
|
+
return Nan::ThrowError(
|
114
|
+
"Could not add sibling. Failed to copy node to new Document.");
|
115
|
+
} else if ((new_sibling->xml_obj == imported_sibling) &&
|
116
|
+
text->prev_sibling_will_merge(imported_sibling)) {
|
117
|
+
imported_sibling = xmlCopyNode(imported_sibling, 0);
|
118
|
+
}
|
119
|
+
text->add_prev_sibling(imported_sibling);
|
120
|
+
|
121
|
+
return info.GetReturnValue().Set(info[0]);
|
122
|
+
}
|
123
|
+
|
124
|
+
NAN_METHOD(XmlText::AddNextSibling) {
|
125
|
+
XmlText *text = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
|
126
|
+
assert(text);
|
127
|
+
|
128
|
+
XmlNode *new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(
|
129
|
+
Nan::To<Object>(info[0]).ToLocalChecked());
|
130
|
+
assert(new_sibling);
|
131
|
+
|
132
|
+
xmlNode *imported_sibling = text->import_node(new_sibling->xml_obj);
|
133
|
+
if (imported_sibling == NULL) {
|
134
|
+
return Nan::ThrowError(
|
135
|
+
"Could not add sibling. Failed to copy node to new Document.");
|
136
|
+
} else if ((new_sibling->xml_obj == imported_sibling) &&
|
137
|
+
text->next_sibling_will_merge(imported_sibling)) {
|
138
|
+
imported_sibling = xmlCopyNode(imported_sibling, 0);
|
139
|
+
}
|
140
|
+
text->add_next_sibling(imported_sibling);
|
141
|
+
|
142
|
+
return info.GetReturnValue().Set(info[0]);
|
143
|
+
}
|
144
|
+
|
145
|
+
NAN_METHOD(XmlText::Replace) {
|
146
|
+
XmlText *element = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
|
147
|
+
assert(element);
|
148
|
+
|
149
|
+
if (info[0]->IsString()) {
|
150
|
+
element->replace_text(*Nan::Utf8String(info[0]));
|
151
|
+
} else {
|
152
|
+
XmlText *new_sibling = Nan::ObjectWrap::Unwrap<XmlText>(
|
153
|
+
Nan::To<Object>(info[0]).ToLocalChecked());
|
154
|
+
assert(new_sibling);
|
155
|
+
|
156
|
+
xmlNode *imported_sibling = element->import_node(new_sibling->xml_obj);
|
157
|
+
if (imported_sibling == NULL) {
|
158
|
+
return Nan::ThrowError(
|
159
|
+
"Could not replace. Failed to copy node to new Document.");
|
160
|
+
}
|
161
|
+
element->replace_element(imported_sibling);
|
162
|
+
}
|
163
|
+
|
164
|
+
return info.GetReturnValue().Set(info[0]);
|
165
|
+
}
|
166
|
+
|
167
|
+
NAN_METHOD(XmlText::Path) {
|
168
|
+
Nan::HandleScope scope;
|
169
|
+
XmlText *text = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
|
170
|
+
assert(text);
|
171
|
+
|
172
|
+
return info.GetReturnValue().Set(text->get_path());
|
173
|
+
}
|
174
|
+
|
175
|
+
NAN_METHOD(XmlText::Name) {
|
176
|
+
Nan::HandleScope scope;
|
177
|
+
XmlText *text = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
|
178
|
+
assert(text);
|
179
|
+
|
180
|
+
if (info.Length() == 0)
|
181
|
+
return info.GetReturnValue().Set(text->get_name());
|
182
|
+
return info.GetReturnValue().Set(info.Holder());
|
183
|
+
}
|
184
|
+
|
185
|
+
void XmlText::set_content(const char *content) {
|
186
|
+
xmlChar *encoded =
|
187
|
+
xmlEncodeSpecialChars(xml_obj->doc, (const xmlChar *)content);
|
188
|
+
xmlNodeSetContent(xml_obj, encoded);
|
189
|
+
xmlFree(encoded);
|
190
|
+
}
|
191
|
+
|
192
|
+
Local<Value> XmlText::get_content() {
|
193
|
+
Nan::EscapableHandleScope scope;
|
194
|
+
xmlChar *content = xmlNodeGetContent(xml_obj);
|
195
|
+
if (content) {
|
196
|
+
Local<String> ret_content =
|
197
|
+
Nan::New<String>((const char *)content).ToLocalChecked();
|
198
|
+
xmlFree(content);
|
199
|
+
return scope.Escape(ret_content);
|
200
|
+
}
|
201
|
+
|
202
|
+
return scope.Escape(Nan::New<String>("").ToLocalChecked());
|
203
|
+
}
|
204
|
+
|
205
|
+
Local<Value> XmlText::get_name() {
|
206
|
+
Nan::EscapableHandleScope scope;
|
207
|
+
if (xml_obj->name)
|
208
|
+
return scope.Escape(
|
209
|
+
Nan::New<String>((const char *)xml_obj->name).ToLocalChecked());
|
210
|
+
else
|
211
|
+
return scope.Escape(Nan::Undefined());
|
212
|
+
}
|
213
|
+
|
214
|
+
Local<Value> XmlText::get_next_element() {
|
215
|
+
Nan::EscapableHandleScope scope;
|
216
|
+
|
217
|
+
xmlNode *sibling = xml_obj->next;
|
218
|
+
if (!sibling)
|
219
|
+
return scope.Escape(Nan::Null());
|
220
|
+
|
221
|
+
while (sibling && sibling->type != XML_ELEMENT_NODE)
|
222
|
+
sibling = sibling->next;
|
223
|
+
|
224
|
+
if (sibling) {
|
225
|
+
return scope.Escape(XmlText::New(sibling));
|
226
|
+
}
|
227
|
+
|
228
|
+
return scope.Escape(Nan::Null());
|
229
|
+
}
|
230
|
+
|
231
|
+
Local<Value> XmlText::get_prev_element() {
|
232
|
+
Nan::EscapableHandleScope scope;
|
233
|
+
|
234
|
+
xmlNode *sibling = xml_obj->prev;
|
235
|
+
if (!sibling)
|
236
|
+
return scope.Escape(Nan::Null());
|
237
|
+
|
238
|
+
while (sibling && sibling->type != XML_ELEMENT_NODE) {
|
239
|
+
sibling = sibling->prev;
|
240
|
+
}
|
241
|
+
|
242
|
+
if (sibling) {
|
243
|
+
return scope.Escape(XmlText::New(sibling));
|
244
|
+
}
|
245
|
+
|
246
|
+
return scope.Escape(Nan::Null());
|
247
|
+
}
|
248
|
+
|
249
|
+
Local<Object> XmlText::New(xmlNode *node) {
|
250
|
+
Nan::EscapableHandleScope scope;
|
251
|
+
if (node->_private) {
|
252
|
+
return scope.Escape(static_cast<XmlNode *>(node->_private)->handle());
|
253
|
+
}
|
254
|
+
|
255
|
+
XmlText *text = new XmlText(node);
|
256
|
+
Local<Object> obj =
|
257
|
+
Nan::NewInstance(
|
258
|
+
Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked())
|
259
|
+
.ToLocalChecked();
|
260
|
+
text->Wrap(obj);
|
261
|
+
return scope.Escape(obj);
|
262
|
+
}
|
263
|
+
|
264
|
+
XmlText::XmlText(xmlNode *node) : XmlNode(node) {}
|
265
|
+
|
266
|
+
void XmlText::add_prev_sibling(xmlNode *element) {
|
267
|
+
xmlAddPrevSibling(xml_obj, element);
|
268
|
+
}
|
269
|
+
|
270
|
+
void XmlText::add_next_sibling(xmlNode *element) {
|
271
|
+
xmlAddNextSibling(xml_obj, element);
|
272
|
+
}
|
273
|
+
|
274
|
+
void XmlText::replace_element(xmlNode *element) {
|
275
|
+
xmlReplaceNode(xml_obj, element);
|
276
|
+
}
|
277
|
+
|
278
|
+
void XmlText::replace_text(const char *content) {
|
279
|
+
xmlNodePtr txt = xmlNewDocText(xml_obj->doc, (const xmlChar *)content);
|
280
|
+
xmlReplaceNode(xml_obj, txt);
|
281
|
+
}
|
282
|
+
|
283
|
+
bool XmlText::next_sibling_will_merge(xmlNode *child) {
|
284
|
+
return (child->type == XML_TEXT_NODE);
|
285
|
+
}
|
286
|
+
|
287
|
+
bool XmlText::prev_sibling_will_merge(xmlNode *child) {
|
288
|
+
return (child->type == XML_TEXT_NODE);
|
289
|
+
}
|
290
|
+
|
291
|
+
void XmlText::Initialize(Local<Object> target) {
|
292
|
+
Nan::HandleScope scope;
|
293
|
+
Local<FunctionTemplate> tmpl = Nan::New<FunctionTemplate>(New);
|
294
|
+
|
295
|
+
constructor_template.Reset(tmpl);
|
296
|
+
|
297
|
+
tmpl->Inherit(Nan::New(XmlNode::constructor_template));
|
298
|
+
tmpl->InstanceTemplate()->SetInternalFieldCount(1);
|
299
|
+
|
300
|
+
Nan::SetPrototypeMethod(tmpl, "nextElement", XmlText::NextElement);
|
301
|
+
|
302
|
+
Nan::SetPrototypeMethod(tmpl, "prevElement", XmlText::PrevElement);
|
303
|
+
|
304
|
+
Nan::SetPrototypeMethod(tmpl, "text", XmlText::Text);
|
305
|
+
|
306
|
+
Nan::SetPrototypeMethod(tmpl, "replace", XmlText::Replace);
|
307
|
+
|
308
|
+
Nan::SetPrototypeMethod(tmpl, "path", XmlText::Path);
|
309
|
+
|
310
|
+
Nan::SetPrototypeMethod(tmpl, "name", XmlText::Name);
|
311
|
+
|
312
|
+
Nan::SetPrototypeMethod(tmpl, "addPrevSibling", XmlText::AddPrevSibling);
|
313
|
+
|
314
|
+
Nan::SetPrototypeMethod(tmpl, "addNextSibling", XmlText::AddNextSibling);
|
315
|
+
|
316
|
+
Nan::Set(target, Nan::New<String>("Text").ToLocalChecked(),
|
317
|
+
Nan::GetFunction(tmpl).ToLocalChecked());
|
318
|
+
}
|
319
|
+
|
320
|
+
} // namespace libxmljs
|
package/src/xml_text.h
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#ifndef SRC_XML_TEXT_H_
|
2
|
+
#define SRC_XML_TEXT_H_
|
3
|
+
|
4
|
+
#include "libxmljs.h"
|
5
|
+
#include "xml_node.h"
|
6
|
+
|
7
|
+
namespace libxmljs {
|
8
|
+
|
9
|
+
class XmlText : public XmlNode {
|
10
|
+
public:
|
11
|
+
explicit XmlText(xmlNode *node);
|
12
|
+
|
13
|
+
static void Initialize(v8::Local<v8::Object> target);
|
14
|
+
|
15
|
+
static Nan::Persistent<v8::FunctionTemplate> constructor_template;
|
16
|
+
|
17
|
+
// create new xml element to wrap the node
|
18
|
+
static v8::Local<v8::Object> New(xmlNode *node);
|
19
|
+
|
20
|
+
protected:
|
21
|
+
static NAN_METHOD(New);
|
22
|
+
static NAN_METHOD(Text);
|
23
|
+
static NAN_METHOD(Replace);
|
24
|
+
static NAN_METHOD(Path);
|
25
|
+
static NAN_METHOD(Name);
|
26
|
+
|
27
|
+
static NAN_METHOD(NextElement);
|
28
|
+
static NAN_METHOD(PrevElement);
|
29
|
+
static NAN_METHOD(AddPrevSibling);
|
30
|
+
static NAN_METHOD(AddNextSibling);
|
31
|
+
|
32
|
+
v8::Local<v8::Value> get_next_element();
|
33
|
+
v8::Local<v8::Value> get_prev_element();
|
34
|
+
v8::Local<v8::Value> get_content();
|
35
|
+
v8::Local<v8::Value> get_path();
|
36
|
+
v8::Local<v8::Value> get_name();
|
37
|
+
void set_content(const char *content);
|
38
|
+
void replace_text(const char *content);
|
39
|
+
void replace_element(xmlNode *element);
|
40
|
+
void add_prev_sibling(xmlNode *element);
|
41
|
+
void add_next_sibling(xmlNode *element);
|
42
|
+
bool prev_sibling_will_merge(xmlNode *node);
|
43
|
+
bool next_sibling_will_merge(xmlNode *node);
|
44
|
+
};
|
45
|
+
|
46
|
+
} // namespace libxmljs
|
47
|
+
|
48
|
+
#endif // SRC_XML_TEXT_H_
|