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.

Files changed (160) hide show
  1. package/LICENSE +19 -0
  2. package/Makefile +18 -0
  3. package/README.md +52 -0
  4. package/binding.gyp +81 -0
  5. package/index.d.ts +273 -0
  6. package/index.js +45 -0
  7. package/lib/bindings.js +1 -0
  8. package/lib/document.js +122 -0
  9. package/lib/element.js +82 -0
  10. package/lib/sax_parser.js +38 -0
  11. package/package.json +70 -0
  12. package/src/html_document.cc +7 -0
  13. package/src/html_document.h +18 -0
  14. package/src/libxmljs.cc +252 -0
  15. package/src/libxmljs.h +53 -0
  16. package/src/xml_attribute.cc +173 -0
  17. package/src/xml_attribute.h +40 -0
  18. package/src/xml_comment.cc +117 -0
  19. package/src/xml_comment.h +30 -0
  20. package/src/xml_document.cc +810 -0
  21. package/src/xml_document.h +67 -0
  22. package/src/xml_element.cc +565 -0
  23. package/src/xml_element.h +61 -0
  24. package/src/xml_namespace.cc +158 -0
  25. package/src/xml_namespace.h +39 -0
  26. package/src/xml_node.cc +761 -0
  27. package/src/xml_node.h +73 -0
  28. package/src/xml_pi.cc +161 -0
  29. package/src/xml_pi.h +34 -0
  30. package/src/xml_sax_parser.cc +424 -0
  31. package/src/xml_sax_parser.h +73 -0
  32. package/src/xml_syntax_error.cc +66 -0
  33. package/src/xml_syntax_error.h +25 -0
  34. package/src/xml_text.cc +320 -0
  35. package/src/xml_text.h +48 -0
  36. package/src/xml_textwriter.cc +315 -0
  37. package/src/xml_textwriter.h +62 -0
  38. package/src/xml_xpath_context.cc +70 -0
  39. package/src/xml_xpath_context.h +23 -0
  40. package/vendor/libxml/Copyright +23 -0
  41. package/vendor/libxml/DOCBparser.c +305 -0
  42. package/vendor/libxml/HTMLparser.c +7287 -0
  43. package/vendor/libxml/HTMLtree.c +1200 -0
  44. package/vendor/libxml/Makefile +2983 -0
  45. package/vendor/libxml/SAX.c +180 -0
  46. package/vendor/libxml/SAX2.c +3036 -0
  47. package/vendor/libxml/buf.c +1351 -0
  48. package/vendor/libxml/buf.h +72 -0
  49. package/vendor/libxml/c14n.c +2234 -0
  50. package/vendor/libxml/catalog.c +3828 -0
  51. package/vendor/libxml/chvalid.c +336 -0
  52. package/vendor/libxml/config.h +294 -0
  53. package/vendor/libxml/config.h.gch +0 -0
  54. package/vendor/libxml/debugXML.c +3423 -0
  55. package/vendor/libxml/dict.c +1298 -0
  56. package/vendor/libxml/elfgcchack.h +17818 -0
  57. package/vendor/libxml/enc.h +32 -0
  58. package/vendor/libxml/encoding.c +3975 -0
  59. package/vendor/libxml/entities.c +1163 -0
  60. package/vendor/libxml/error.c +998 -0
  61. package/vendor/libxml/globals.c +1126 -0
  62. package/vendor/libxml/hash.c +1146 -0
  63. package/vendor/libxml/include/libxml/DOCBparser.h +96 -0
  64. package/vendor/libxml/include/libxml/HTMLparser.h +306 -0
  65. package/vendor/libxml/include/libxml/HTMLtree.h +147 -0
  66. package/vendor/libxml/include/libxml/Makefile +725 -0
  67. package/vendor/libxml/include/libxml/Makefile.am +54 -0
  68. package/vendor/libxml/include/libxml/Makefile.in +725 -0
  69. package/vendor/libxml/include/libxml/SAX.h +173 -0
  70. package/vendor/libxml/include/libxml/SAX2.h +178 -0
  71. package/vendor/libxml/include/libxml/c14n.h +128 -0
  72. package/vendor/libxml/include/libxml/catalog.h +182 -0
  73. package/vendor/libxml/include/libxml/chvalid.h +230 -0
  74. package/vendor/libxml/include/libxml/debugXML.h +217 -0
  75. package/vendor/libxml/include/libxml/dict.h +79 -0
  76. package/vendor/libxml/include/libxml/encoding.h +245 -0
  77. package/vendor/libxml/include/libxml/entities.h +151 -0
  78. package/vendor/libxml/include/libxml/globals.h +508 -0
  79. package/vendor/libxml/include/libxml/hash.h +236 -0
  80. package/vendor/libxml/include/libxml/list.h +137 -0
  81. package/vendor/libxml/include/libxml/nanoftp.h +163 -0
  82. package/vendor/libxml/include/libxml/nanohttp.h +81 -0
  83. package/vendor/libxml/include/libxml/parser.h +1243 -0
  84. package/vendor/libxml/include/libxml/parserInternals.h +644 -0
  85. package/vendor/libxml/include/libxml/pattern.h +100 -0
  86. package/vendor/libxml/include/libxml/relaxng.h +217 -0
  87. package/vendor/libxml/include/libxml/schemasInternals.h +958 -0
  88. package/vendor/libxml/include/libxml/schematron.h +142 -0
  89. package/vendor/libxml/include/libxml/threads.h +89 -0
  90. package/vendor/libxml/include/libxml/tree.h +1311 -0
  91. package/vendor/libxml/include/libxml/uri.h +94 -0
  92. package/vendor/libxml/include/libxml/valid.h +458 -0
  93. package/vendor/libxml/include/libxml/xinclude.h +129 -0
  94. package/vendor/libxml/include/libxml/xlink.h +189 -0
  95. package/vendor/libxml/include/libxml/xmlIO.h +368 -0
  96. package/vendor/libxml/include/libxml/xmlautomata.h +146 -0
  97. package/vendor/libxml/include/libxml/xmlerror.h +945 -0
  98. package/vendor/libxml/include/libxml/xmlexports.h +77 -0
  99. package/vendor/libxml/include/libxml/xmlmemory.h +224 -0
  100. package/vendor/libxml/include/libxml/xmlmodule.h +57 -0
  101. package/vendor/libxml/include/libxml/xmlreader.h +428 -0
  102. package/vendor/libxml/include/libxml/xmlregexp.h +222 -0
  103. package/vendor/libxml/include/libxml/xmlsave.h +88 -0
  104. package/vendor/libxml/include/libxml/xmlschemas.h +246 -0
  105. package/vendor/libxml/include/libxml/xmlschemastypes.h +151 -0
  106. package/vendor/libxml/include/libxml/xmlstring.h +140 -0
  107. package/vendor/libxml/include/libxml/xmlunicode.h +202 -0
  108. package/vendor/libxml/include/libxml/xmlversion.h +484 -0
  109. package/vendor/libxml/include/libxml/xmlwin32version.h +239 -0
  110. package/vendor/libxml/include/libxml/xmlwriter.h +488 -0
  111. package/vendor/libxml/include/libxml/xpath.h +564 -0
  112. package/vendor/libxml/include/libxml/xpathInternals.h +632 -0
  113. package/vendor/libxml/include/libxml/xpointer.h +114 -0
  114. package/vendor/libxml/include/win32config.h +122 -0
  115. package/vendor/libxml/include/wsockcompat.h +54 -0
  116. package/vendor/libxml/legacy.c +1343 -0
  117. package/vendor/libxml/libxml.h +134 -0
  118. package/vendor/libxml/list.c +779 -0
  119. package/vendor/libxml/nanoftp.c +2118 -0
  120. package/vendor/libxml/nanohttp.c +1899 -0
  121. package/vendor/libxml/parser.c +15553 -0
  122. package/vendor/libxml/parserInternals.c +2164 -0
  123. package/vendor/libxml/pattern.c +2621 -0
  124. package/vendor/libxml/relaxng.c +11101 -0
  125. package/vendor/libxml/rngparser.c +1595 -0
  126. package/vendor/libxml/runsuite.c +1157 -0
  127. package/vendor/libxml/save.h +36 -0
  128. package/vendor/libxml/schematron.c +1787 -0
  129. package/vendor/libxml/threads.c +1049 -0
  130. package/vendor/libxml/timsort.h +601 -0
  131. package/vendor/libxml/tree.c +10183 -0
  132. package/vendor/libxml/trio.c +6895 -0
  133. package/vendor/libxml/trio.h +230 -0
  134. package/vendor/libxml/triodef.h +228 -0
  135. package/vendor/libxml/trionan.c +914 -0
  136. package/vendor/libxml/trionan.h +84 -0
  137. package/vendor/libxml/triop.h +150 -0
  138. package/vendor/libxml/triostr.c +2112 -0
  139. package/vendor/libxml/triostr.h +144 -0
  140. package/vendor/libxml/uri.c +2561 -0
  141. package/vendor/libxml/valid.c +7138 -0
  142. package/vendor/libxml/xinclude.c +2657 -0
  143. package/vendor/libxml/xlink.c +183 -0
  144. package/vendor/libxml/xmlIO.c +4135 -0
  145. package/vendor/libxml/xmlcatalog.c +624 -0
  146. package/vendor/libxml/xmllint.c +3796 -0
  147. package/vendor/libxml/xmlmemory.c +1163 -0
  148. package/vendor/libxml/xmlmodule.c +468 -0
  149. package/vendor/libxml/xmlreader.c +6033 -0
  150. package/vendor/libxml/xmlregexp.c +8271 -0
  151. package/vendor/libxml/xmlsave.c +2735 -0
  152. package/vendor/libxml/xmlschemas.c +29173 -0
  153. package/vendor/libxml/xmlschemastypes.c +6276 -0
  154. package/vendor/libxml/xmlstring.c +1050 -0
  155. package/vendor/libxml/xmlunicode.c +3179 -0
  156. package/vendor/libxml/xmlwriter.c +4738 -0
  157. package/vendor/libxml/xpath.c +14734 -0
  158. package/vendor/libxml/xpointer.c +2969 -0
  159. package/vendor/libxml/xzlib.c +815 -0
  160. package/vendor/libxml/xzlib.h +19 -0
@@ -0,0 +1,38 @@
1
+ const events = require('events');
2
+
3
+ const bindings = require('./bindings');
4
+
5
+ const SaxParser = function SaxParser(callbacks) {
6
+ const parser = new bindings.SaxParser();
7
+
8
+ // attach callbacks
9
+ for (const callback in callbacks) {
10
+ parser.on(callback, callbacks[callback]);
11
+ }
12
+
13
+ return parser;
14
+ };
15
+
16
+ // Overriding the prototype, like util.inherit, wipes out the native binding.
17
+ // Copy over the methods instead.
18
+ for (const k in events.EventEmitter.prototype)
19
+ bindings.SaxParser.prototype[k] = events.EventEmitter.prototype[k];
20
+
21
+ const SaxPushParser = function SaxPushParser(callbacks) {
22
+ const parser = new bindings.SaxPushParser();
23
+
24
+ // attach callbacks
25
+ for (const callback in callbacks) {
26
+ parser.on(callback, callbacks[callback]);
27
+ }
28
+
29
+ return parser;
30
+ };
31
+
32
+ // Overriding the prototype, like util.inherit, wipes out the native binding.
33
+ // Copy over the methods instead.
34
+ for (const k in events.EventEmitter.prototype)
35
+ bindings.SaxPushParser.prototype[k] = events.EventEmitter.prototype[k];
36
+
37
+ module.exports.SaxParser = SaxParser;
38
+ module.exports.SaxPushParser = SaxPushParser;
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "pocxxeci",
3
+ "author": "marudor",
4
+ "contributors": [
5
+ "Jeff Smick",
6
+ "Marco Rogers"
7
+ ],
8
+ "packageManager": "pnpm@6.32.9",
9
+ "binary": {
10
+ "module_name": "xmljs",
11
+ "module_path": "./build/Release/",
12
+ "host": "https://github.com",
13
+ "remote_path": "./marudor/libxmljs2/releases/download/v{version}/",
14
+ "package_name": "{node_abi}-{platform}-{arch}-{libc}.tar.gz"
15
+ },
16
+ "description": "libxml bindings for v8 javascript engine",
17
+ "version": "0.30.1",
18
+ "scripts": {
19
+ "build": "node-pre-gyp install --build-from-source",
20
+ "install": "node-pre-gyp install --fallback-to-build --loglevel http",
21
+ "test": "node --expose_gc ./node_modules/jest/bin/jest.js",
22
+ "lint": "eslint index.js test",
23
+ "tsd": "tsd",
24
+ "package": "node-pre-gyp package 2>&1"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+ssh://git@github.com/Antiphishing/test-xxe.git"
29
+ },
30
+ "bugs": {
31
+ "url": "http://github.com/marudor/libxmljs2/issues"
32
+ },
33
+ "main": "./index",
34
+ "license": "MIT",
35
+ "engines": {
36
+ "node": ">=12"
37
+ },
38
+ "files": [
39
+ "index.js",
40
+ "index.d.ts",
41
+ "src",
42
+ "lib",
43
+ "vendor",
44
+ "binding.gyp",
45
+ "Makefile"
46
+ ],
47
+ "dependencies": {
48
+ "@mapbox/node-pre-gyp": "^1.0.9",
49
+ "bindings": "~1.5.0",
50
+ "child_process": "^1.0.2",
51
+ "nan": "~2.15.0",
52
+ "net": "^1.0.2"
53
+ },
54
+ "devDependencies": {
55
+ "eslint": "^8.14.0",
56
+ "eslint-config-marudor": "^9.0.0",
57
+ "jest": "^27.5.1",
58
+ "jest-watch-typeahead": "^1.0.0",
59
+ "prettier": "^2.6.2",
60
+ "tsd": "^0.20.0",
61
+ "typescript": "^4.6.3"
62
+ },
63
+ "types": "./index.d.ts",
64
+ "homepage": "https://github.com/marudor/libxmljs2#readme",
65
+ "directories": {
66
+ "example": "examples",
67
+ "lib": "lib",
68
+ "test": "test"
69
+ }
70
+ }
@@ -0,0 +1,7 @@
1
+ // Copyright 2009, Squish Tech, LLC.
2
+ #include "html_document.h"
3
+
4
+ namespace libxmljs {
5
+
6
+ void HtmlDocument::Initialize(v8::Local<v8::Object> target) {}
7
+ } // namespace libxmljs
@@ -0,0 +1,18 @@
1
+ // Copyright 2009, Squish Tech, LLC.
2
+ #ifndef SRC_HTML_DOCUMENT_H_
3
+ #define SRC_HTML_DOCUMENT_H_
4
+
5
+ #include "libxmljs.h"
6
+ #include "xml_document.h"
7
+
8
+ namespace libxmljs {
9
+
10
+ class HtmlDocument : public XmlDocument {
11
+ public:
12
+ explicit HtmlDocument(xmlDoc *doc) : XmlDocument(doc) {}
13
+ static void Initialize(v8::Local<v8::Object> target);
14
+ };
15
+
16
+ } // namespace libxmljs
17
+
18
+ #endif // SRC_HTML_DOCUMENT_H_
@@ -0,0 +1,252 @@
1
+ // Copyright 2009, Squish Tech, LLC.
2
+
3
+ #include <v8.h>
4
+
5
+ #include <libxml/xmlmemory.h>
6
+
7
+ #include "libxmljs.h"
8
+ #include "xml_document.h"
9
+ #include "xml_namespace.h"
10
+ #include "xml_node.h"
11
+ #include "xml_sax_parser.h"
12
+ #include "xml_textwriter.h"
13
+
14
+ using namespace v8;
15
+ namespace libxmljs {
16
+
17
+ // ensure destruction at exit time
18
+ // v8 doesn't cleanup its resources
19
+ LibXMLJS LibXMLJS::instance;
20
+
21
+ // track how much memory libxml2 is using
22
+ int xml_memory_used = 0;
23
+
24
+ // How often we report memory usage changes back to V8.
25
+ const int nan_adjust_external_memory_threshold = 1024 * 1024;
26
+
27
+ // track how many nodes haven't been freed
28
+ int nodeCount = 0;
29
+
30
+ void adjustExternalMemory() {
31
+ const int diff = xmlMemUsed() - xml_memory_used;
32
+
33
+ if (abs(diff) > nan_adjust_external_memory_threshold) {
34
+ xml_memory_used += diff;
35
+ Nan::AdjustExternalMemory(diff);
36
+ }
37
+ }
38
+
39
+ // wrapper for xmlMemMalloc to update v8's knowledge of memory used
40
+ // the GC relies on this information
41
+ void *xmlMemMallocWrap(size_t size) {
42
+ void *res = xmlMemMalloc(size);
43
+
44
+ // no need to udpate memory if we didn't allocate
45
+ if (!res) {
46
+ return res;
47
+ }
48
+
49
+ adjustExternalMemory();
50
+ return res;
51
+ }
52
+
53
+ // wrapper for xmlMemFree to update v8's knowledge of memory used
54
+ // the GC relies on this information
55
+ void xmlMemFreeWrap(void *p) {
56
+ xmlMemFree(p);
57
+
58
+ // if v8 is no longer running, don't try to adjust memory
59
+ // this happens when the v8 vm is shutdown and the program is exiting
60
+ // our cleanup routines for libxml will be called (freeing memory)
61
+ // but v8 is already offline and does not need to be informed
62
+ // trying to adjust after shutdown will result in a fatal error
63
+ if (Isolate::GetCurrent() == 0 || Isolate::GetCurrent()->IsDead()) {
64
+ return;
65
+ }
66
+
67
+ adjustExternalMemory();
68
+ }
69
+
70
+ // wrapper for xmlMemRealloc to update v8's knowledge of memory used
71
+ void *xmlMemReallocWrap(void *ptr, size_t size) {
72
+ void *res = xmlMemRealloc(ptr, size);
73
+
74
+ // if realloc fails, no need to update v8 memory state
75
+ if (!res) {
76
+ return res;
77
+ }
78
+
79
+ adjustExternalMemory();
80
+ return res;
81
+ }
82
+
83
+ // wrapper for xmlMemoryStrdupWrap to update v8's knowledge of memory used
84
+ char *xmlMemoryStrdupWrap(const char *str) {
85
+ char *res = xmlMemoryStrdup(str);
86
+
87
+ // if strdup fails, no need to update v8 memory state
88
+ if (!res) {
89
+ return res;
90
+ }
91
+
92
+ adjustExternalMemory();
93
+ return res;
94
+ }
95
+
96
+ void deregisterNsList(xmlNs *ns) {
97
+ while (ns != NULL) {
98
+ if (ns->_private != NULL) {
99
+ XmlNamespace *wrapper = static_cast<XmlNamespace *>(ns->_private);
100
+ wrapper->xml_obj = NULL;
101
+ ns->_private = NULL;
102
+ }
103
+ ns = ns->next;
104
+ }
105
+ }
106
+
107
+ void deregisterNodeNamespaces(xmlNode *xml_obj) {
108
+ xmlNs *ns = NULL;
109
+ if ((xml_obj->type == XML_DOCUMENT_NODE) ||
110
+ #ifdef LIBXML_DOCB_ENABLED
111
+ (xml_obj->type == XML_DOCB_DOCUMENT_NODE) ||
112
+ #endif
113
+ (xml_obj->type == XML_HTML_DOCUMENT_NODE)) {
114
+ ns = reinterpret_cast<xmlDoc *>(xml_obj)->oldNs;
115
+ } else if ((xml_obj->type == XML_ELEMENT_NODE) ||
116
+ (xml_obj->type == XML_XINCLUDE_START) ||
117
+ (xml_obj->type == XML_XINCLUDE_END)) {
118
+ ns = xml_obj->nsDef;
119
+ }
120
+ if (ns != NULL) {
121
+ deregisterNsList(ns);
122
+ }
123
+ }
124
+
125
+ /*
126
+ * Before libxmljs nodes are freed, they are passed to the deregistration
127
+ * callback, (configured by `xmlDeregisterNodeDefault`).
128
+ *
129
+ * In deregistering each node, we update any wrapper (e.g. `XmlElement`,
130
+ * `XmlAttribute`) to ensure that when it is destroyed, it doesn't try to
131
+ * access the freed memory.
132
+ *
133
+ * Because namespaces (`xmlNs`) attached to nodes are also freed and may be
134
+ * wrapped, it is necessary to update any wrappers (`XmlNamespace`) which have
135
+ * been created for attached namespaces.
136
+ */
137
+ void xmlDeregisterNodeCallback(xmlNode *xml_obj) {
138
+ nodeCount--;
139
+ deregisterNodeNamespaces(xml_obj);
140
+ if (xml_obj->_private != NULL) {
141
+ static_cast<XmlNode *>(xml_obj->_private)->xml_obj = NULL;
142
+ xml_obj->_private = NULL;
143
+ }
144
+ return;
145
+ }
146
+
147
+ // this is called for any created nodes
148
+ void xmlRegisterNodeCallback(xmlNode *xml_obj) { nodeCount++; }
149
+
150
+ LibXMLJS::LibXMLJS() {
151
+ // set the callback for when a node is created
152
+ xmlRegisterNodeDefault(xmlRegisterNodeCallback);
153
+
154
+ // set the callback for when a node is about to be freed
155
+ xmlDeregisterNodeDefault(xmlDeregisterNodeCallback);
156
+
157
+ // populated debugMemSize (see xmlmemory.h/c) and makes the call to
158
+ // xmlMemUsed work, this must happen first!
159
+ xmlMemSetup(xmlMemFreeWrap, xmlMemMallocWrap, xmlMemReallocWrap,
160
+ xmlMemoryStrdupWrap);
161
+
162
+ // initialize libxml
163
+ LIBXML_TEST_VERSION;
164
+
165
+ // initial memory usage
166
+ xml_memory_used = xmlMemUsed();
167
+ }
168
+
169
+ LibXMLJS::~LibXMLJS() { xmlCleanupParser(); }
170
+
171
+ Local<Object> listFeatures() {
172
+ Nan::EscapableHandleScope scope;
173
+ Local<Object> target = Nan::New<Object>();
174
+ #define FEAT(x) \
175
+ Nan::Set(target, Nan::New<String>(#x).ToLocalChecked(), \
176
+ Nan::New<Boolean>(xmlHasFeature(XML_WITH_##x)))
177
+ // See enum xmlFeature in parser.h
178
+ FEAT(THREAD);
179
+ FEAT(TREE);
180
+ FEAT(OUTPUT);
181
+ FEAT(PUSH);
182
+ FEAT(READER);
183
+ FEAT(PATTERN);
184
+ FEAT(WRITER);
185
+ FEAT(SAX1);
186
+ FEAT(FTP);
187
+ FEAT(HTTP);
188
+ FEAT(VALID);
189
+ FEAT(HTML);
190
+ FEAT(LEGACY);
191
+ FEAT(C14N);
192
+ FEAT(CATALOG);
193
+ FEAT(XPATH);
194
+ FEAT(XPTR);
195
+ FEAT(XINCLUDE);
196
+ FEAT(ICONV);
197
+ FEAT(ISO8859X);
198
+ FEAT(UNICODE);
199
+ FEAT(REGEXP);
200
+ FEAT(AUTOMATA);
201
+ FEAT(EXPR);
202
+ FEAT(SCHEMAS);
203
+ FEAT(SCHEMATRON);
204
+ FEAT(MODULES);
205
+ FEAT(DEBUG);
206
+ FEAT(DEBUG_MEM);
207
+ FEAT(DEBUG_RUN);
208
+ FEAT(ZLIB);
209
+ FEAT(ICU);
210
+ FEAT(LZMA);
211
+ return scope.Escape(target);
212
+ }
213
+
214
+ NAN_METHOD(XmlMemUsed) {
215
+ Nan::HandleScope scope;
216
+ return info.GetReturnValue().Set(Nan::New<Int32>(xmlMemUsed()));
217
+ }
218
+
219
+ NAN_METHOD(XmlNodeCount) {
220
+ Nan::HandleScope scope;
221
+ return info.GetReturnValue().Set(Nan::New<Int32>(nodeCount));
222
+ }
223
+
224
+ NAN_MODULE_INIT(init) {
225
+ Nan::HandleScope scope;
226
+
227
+ XmlDocument::Initialize(target);
228
+ XmlSaxParser::Initialize(target);
229
+ XmlTextWriter::Initialize(target);
230
+
231
+ Nan::Set(target, Nan::New<String>("libxml_version").ToLocalChecked(),
232
+ Nan::New<String>(LIBXML_DOTTED_VERSION).ToLocalChecked());
233
+
234
+ Nan::Set(target, Nan::New<String>("libxml_parser_version").ToLocalChecked(),
235
+ Nan::New<String>(xmlParserVersion).ToLocalChecked());
236
+
237
+ Nan::Set(target, Nan::New<String>("libxml_debug_enabled").ToLocalChecked(),
238
+ Nan::New<Boolean>(debugging));
239
+
240
+ Nan::Set(target, Nan::New<String>("features").ToLocalChecked(),
241
+ listFeatures());
242
+
243
+ Nan::Set(target, Nan::New<String>("libxml").ToLocalChecked(), target);
244
+
245
+ Nan::SetMethod(target, "xmlMemUsed", XmlMemUsed);
246
+
247
+ Nan::SetMethod(target, "xmlNodeCount", XmlNodeCount);
248
+ }
249
+
250
+ NODE_MODULE(xmljs, init)
251
+
252
+ } // namespace libxmljs
package/src/libxmljs.h ADDED
@@ -0,0 +1,53 @@
1
+ // Copyright 2009, Squish Tech, LLC.
2
+ #ifndef SRC_LIBXMLJS_H_
3
+ #define SRC_LIBXMLJS_H_
4
+
5
+ #include "nan.h"
6
+ #include <node.h>
7
+ #include <v8.h>
8
+
9
+ #define LIBXMLJS_ARGUMENT_TYPE_CHECK(arg, type, err) \
10
+ if (!arg->type()) { \
11
+ return Nan::ThrowTypeError(err); \
12
+ }
13
+
14
+ #define NAN_CONSTRUCTOR_CHECK(name) \
15
+ if (!info.IsConstructCall()) { \
16
+ Nan::ThrowTypeError("Class constructor " #name \
17
+ " cannot be invoked without 'new'"); \
18
+ return; \
19
+ }
20
+
21
+ #define DOCUMENT_ARG_CHECK \
22
+ if (info.Length() == 0 || info[0]->IsNullOrUndefined()) { \
23
+ Nan::ThrowError("document argument required"); \
24
+ return; \
25
+ } \
26
+ Local<Object> doc = Nan::To<Object>(info[0]).ToLocalChecked(); \
27
+ if (!XmlDocument::constructor_template.Get(Isolate::GetCurrent()) \
28
+ ->HasInstance(doc)) { \
29
+ Nan::ThrowError("document argument must be an instance of Document"); \
30
+ return; \
31
+ }
32
+
33
+ namespace libxmljs {
34
+
35
+ #ifdef LIBXML_DEBUG_ENABLED
36
+ static const bool debugging = true;
37
+ #else
38
+ static const bool debugging = false;
39
+ #endif
40
+
41
+ // Ensure that libxml is properly initialised and destructed at shutdown
42
+ class LibXMLJS {
43
+ public:
44
+ LibXMLJS();
45
+ virtual ~LibXMLJS();
46
+
47
+ private:
48
+ static LibXMLJS instance;
49
+ };
50
+
51
+ } // namespace libxmljs
52
+
53
+ #endif // SRC_LIBXMLJS_H_
@@ -0,0 +1,173 @@
1
+ // Copyright 2009, Squish Tech, LLC.
2
+ #include "xml_attribute.h"
3
+
4
+ using namespace v8;
5
+ namespace libxmljs {
6
+
7
+ Nan::Persistent<FunctionTemplate> XmlAttribute::constructor_template;
8
+
9
+ NAN_METHOD(XmlAttribute::New) {
10
+ Nan::HandleScope scope;
11
+
12
+ return info.GetReturnValue().Set(info.Holder());
13
+ }
14
+
15
+ Local<Object> XmlAttribute::New(xmlNode *xml_obj, const xmlChar *name,
16
+ const xmlChar *value) {
17
+ Nan::EscapableHandleScope scope;
18
+ xmlAttr *attr = xmlSetProp(xml_obj, name, value);
19
+ assert(attr);
20
+
21
+ if (attr->_private) {
22
+ return scope.Escape(static_cast<XmlNode *>(xml_obj->_private)->handle());
23
+ }
24
+
25
+ XmlAttribute *attribute = new XmlAttribute(attr);
26
+ Local<Object> obj =
27
+ Nan::NewInstance(
28
+ Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked())
29
+ .ToLocalChecked();
30
+ attribute->Wrap(obj);
31
+ return scope.Escape(obj);
32
+ }
33
+
34
+ Local<Object> XmlAttribute::New(xmlAttr *attr) {
35
+ Nan::EscapableHandleScope scope;
36
+ assert(attr->type == XML_ATTRIBUTE_NODE);
37
+
38
+ if (attr->_private) {
39
+ return scope.Escape(static_cast<XmlNode *>(attr->_private)->handle());
40
+ }
41
+
42
+ XmlAttribute *attribute = new XmlAttribute(attr);
43
+ Local<Object> obj =
44
+ Nan::NewInstance(
45
+ Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked())
46
+ .ToLocalChecked();
47
+ attribute->Wrap(obj);
48
+ return scope.Escape(obj);
49
+ }
50
+
51
+ NAN_METHOD(XmlAttribute::Name) {
52
+ Nan::HandleScope scope;
53
+ XmlAttribute *attr = Nan::ObjectWrap::Unwrap<XmlAttribute>(info.Holder());
54
+ assert(attr);
55
+
56
+ return info.GetReturnValue().Set(attr->get_name());
57
+ }
58
+
59
+ NAN_METHOD(XmlAttribute::Value) {
60
+ Nan::HandleScope scope;
61
+ XmlAttribute *attr = Nan::ObjectWrap::Unwrap<XmlAttribute>(info.Holder());
62
+ assert(attr);
63
+
64
+ // attr.value('new value');
65
+ if (info.Length() > 0) {
66
+ attr->set_value(*Nan::Utf8String(info[0]));
67
+ return info.GetReturnValue().Set(info.Holder());
68
+ }
69
+
70
+ // attr.value();
71
+ return info.GetReturnValue().Set(attr->get_value());
72
+ }
73
+
74
+ NAN_METHOD(XmlAttribute::Node) {
75
+ Nan::HandleScope scope;
76
+ XmlAttribute *attr = Nan::ObjectWrap::Unwrap<XmlAttribute>(info.Holder());
77
+ assert(attr);
78
+
79
+ return info.GetReturnValue().Set(attr->get_element());
80
+ }
81
+
82
+ NAN_METHOD(XmlAttribute::Namespace) {
83
+ Nan::HandleScope scope;
84
+ XmlAttribute *attr = Nan::ObjectWrap::Unwrap<XmlAttribute>(info.Holder());
85
+ assert(attr);
86
+
87
+ return info.GetReturnValue().Set(attr->get_namespace());
88
+ }
89
+
90
+ Local<Value> XmlAttribute::get_name() {
91
+ Nan::EscapableHandleScope scope;
92
+ if (xml_obj->name)
93
+ return scope.Escape(
94
+ Nan::New<String>((const char *)xml_obj->name, xmlStrlen(xml_obj->name))
95
+ .ToLocalChecked());
96
+
97
+ return scope.Escape(Nan::Null());
98
+ }
99
+
100
+ Local<Value> XmlAttribute::get_value() {
101
+ Nan::EscapableHandleScope scope;
102
+ xmlChar *value = xmlNodeGetContent(xml_obj);
103
+ if (value != NULL) {
104
+ Local<String> ret_value =
105
+ Nan::New<String>((const char *)value, xmlStrlen(value))
106
+ .ToLocalChecked();
107
+ xmlFree(value);
108
+ return scope.Escape(ret_value);
109
+ }
110
+
111
+ return scope.Escape(Nan::Null());
112
+ }
113
+
114
+ void XmlAttribute::set_value(const char *value) {
115
+ if (xml_obj->children)
116
+ xmlFreeNodeList(xml_obj->children);
117
+
118
+ xml_obj->children = xml_obj->last = NULL;
119
+
120
+ if (value) {
121
+ xmlChar *buffer;
122
+ xmlNode *tmp;
123
+
124
+ // Encode our content
125
+ buffer = xmlEncodeEntitiesReentrant(xml_obj->doc, (const xmlChar *)value);
126
+
127
+ xml_obj->children = xmlStringGetNodeList(xml_obj->doc, buffer);
128
+ xml_obj->last = NULL;
129
+ tmp = xml_obj->children;
130
+
131
+ // Loop through the children
132
+ for (tmp = xml_obj->children; tmp; tmp = tmp->next) {
133
+ tmp->parent = reinterpret_cast<xmlNode *>(xml_obj);
134
+ tmp->doc = xml_obj->doc;
135
+ if (tmp->next == NULL)
136
+ xml_obj->last = tmp;
137
+ }
138
+
139
+ // Free up memory
140
+ xmlFree(buffer);
141
+ }
142
+ }
143
+
144
+ Local<Value> XmlAttribute::get_element() {
145
+ Nan::EscapableHandleScope scope;
146
+ return scope.Escape(XmlElement::New(xml_obj->parent));
147
+ }
148
+
149
+ Local<Value> XmlAttribute::get_namespace() {
150
+ Nan::EscapableHandleScope scope;
151
+ if (!xml_obj->ns) {
152
+ return scope.Escape(Nan::Null());
153
+ }
154
+ return scope.Escape(XmlNamespace::New(xml_obj->ns));
155
+ }
156
+
157
+ void XmlAttribute::Initialize(Local<Object> target) {
158
+ Nan::HandleScope scope;
159
+ Local<FunctionTemplate> tmpl = Nan::New<FunctionTemplate>(XmlAttribute::New);
160
+ constructor_template.Reset(tmpl);
161
+ tmpl->Inherit(Nan::New(XmlNode::constructor_template));
162
+ tmpl->InstanceTemplate()->SetInternalFieldCount(1);
163
+
164
+ Nan::SetPrototypeMethod(tmpl, "name", XmlAttribute::Name);
165
+ Nan::SetPrototypeMethod(tmpl, "value", XmlAttribute::Value);
166
+ Nan::SetPrototypeMethod(tmpl, "node", XmlAttribute::Node);
167
+ Nan::SetPrototypeMethod(tmpl, "namespace", XmlAttribute::Namespace);
168
+
169
+ Nan::Set(target, Nan::New<String>("Attribute").ToLocalChecked(),
170
+ Nan::GetFunction(tmpl).ToLocalChecked());
171
+ }
172
+
173
+ } // namespace libxmljs
@@ -0,0 +1,40 @@
1
+ // Copyright 2009, Squish Tech, LLC.
2
+ #ifndef SRC_XML_ATTRIBUTE_H_
3
+ #define SRC_XML_ATTRIBUTE_H_
4
+
5
+ #include "libxmljs.h"
6
+ #include "xml_element.h"
7
+ #include "xml_namespace.h"
8
+
9
+ namespace libxmljs {
10
+
11
+ class XmlAttribute : public XmlNode {
12
+ public:
13
+ explicit XmlAttribute(xmlAttr *node)
14
+ : XmlNode(reinterpret_cast<xmlNode *>(node)) {}
15
+
16
+ static void Initialize(v8::Local<v8::Object> target);
17
+ static Nan::Persistent<v8::FunctionTemplate> constructor_template;
18
+
19
+ static v8::Local<v8::Object> New(xmlNode *xml_obj, const xmlChar *name,
20
+ const xmlChar *value);
21
+
22
+ static v8::Local<v8::Object> New(xmlAttr *attr);
23
+
24
+ protected:
25
+ static NAN_METHOD(New);
26
+ static NAN_METHOD(Name);
27
+ static NAN_METHOD(Value);
28
+ static NAN_METHOD(Node);
29
+ static NAN_METHOD(Namespace);
30
+
31
+ v8::Local<v8::Value> get_name();
32
+ v8::Local<v8::Value> get_value();
33
+ void set_value(const char *value);
34
+ v8::Local<v8::Value> get_element();
35
+ v8::Local<v8::Value> get_namespace();
36
+ };
37
+
38
+ } // namespace libxmljs
39
+
40
+ #endif // SRC_XML_ATTRIBUTE_H_