zuzu-js 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/LICENSE +5 -0
  2. package/README.md +113 -0
  3. package/bin/zuzu +17 -0
  4. package/bin/zuzu-build-browser-bundle +57 -0
  5. package/bin/zuzu-generate-browser-stdlib +584 -0
  6. package/bin/zuzu-js +23 -0
  7. package/bin/zuzu-js-compile +152 -0
  8. package/bin/zuzu-js-electron +19 -0
  9. package/dist/zuzu-browser-worker.js +45574 -0
  10. package/dist/zuzu-browser.js +45362 -0
  11. package/lib/browser-bundle-entry.js +160 -0
  12. package/lib/browser-gui-renderer.js +387 -0
  13. package/lib/browser-runtime.js +167 -0
  14. package/lib/browser-worker-entry.js +413 -0
  15. package/lib/browser-ztests/runner.html +103 -0
  16. package/lib/browser-ztests/runner.js +369 -0
  17. package/lib/cli.js +350 -0
  18. package/lib/collections.js +367 -0
  19. package/lib/compiler.js +303 -0
  20. package/lib/electron/launcher.js +70 -0
  21. package/lib/electron/main.js +956 -0
  22. package/lib/electron/preload.js +80 -0
  23. package/lib/electron/renderer.html +122 -0
  24. package/lib/electron/renderer.js +24 -0
  25. package/lib/execution-metadata.js +18 -0
  26. package/lib/gui/dom-renderer.js +778 -0
  27. package/lib/host/browser-host.js +278 -0
  28. package/lib/host/capabilities.js +47 -0
  29. package/lib/host/electron-host.js +15 -0
  30. package/lib/host/node-host.js +74 -0
  31. package/lib/paths.js +150 -0
  32. package/lib/runtime-entrypoints.js +60 -0
  33. package/lib/runtime-helpers.js +886 -0
  34. package/lib/runtime.js +3529 -0
  35. package/lib/tap.js +37 -0
  36. package/lib/transpiler-new/ast.js +23 -0
  37. package/lib/transpiler-new/codegen.js +2455 -0
  38. package/lib/transpiler-new/errors.js +28 -0
  39. package/lib/transpiler-new/index.js +26 -0
  40. package/lib/transpiler-new/lexer.js +834 -0
  41. package/lib/transpiler-new/parser.js +2332 -0
  42. package/lib/transpiler-new/validate-bindings.js +326 -0
  43. package/lib/transpiler-utils.js +95 -0
  44. package/lib/transpiler.js +33 -0
  45. package/lib/zuzu.js +53 -0
  46. package/modules/javascript.js +193 -0
  47. package/modules/std/archive.js +603 -0
  48. package/modules/std/clib.js +338 -0
  49. package/modules/std/data/csv.js +1331 -0
  50. package/modules/std/data/json.js +531 -0
  51. package/modules/std/data/xml.js +441 -0
  52. package/modules/std/data/yaml.js +256 -0
  53. package/modules/std/db-worker.js +250 -0
  54. package/modules/std/db.js +664 -0
  55. package/modules/std/digest/_hash.js +443 -0
  56. package/modules/std/digest/md5.js +26 -0
  57. package/modules/std/digest/sha.js +72 -0
  58. package/modules/std/eval.js +10 -0
  59. package/modules/std/gui/objects.js +1519 -0
  60. package/modules/std/internals.js +571 -0
  61. package/modules/std/io/socks-worker.js +318 -0
  62. package/modules/std/io/socks.js +186 -0
  63. package/modules/std/io.js +475 -0
  64. package/modules/std/marshal/cbor.js +463 -0
  65. package/modules/std/marshal/graph.js +1624 -0
  66. package/modules/std/marshal.js +87 -0
  67. package/modules/std/math/bignum.js +91 -0
  68. package/modules/std/math.js +79 -0
  69. package/modules/std/net/dns.js +306 -0
  70. package/modules/std/net/http.js +820 -0
  71. package/modules/std/net/smtp.js +943 -0
  72. package/modules/std/net/url.js +109 -0
  73. package/modules/std/proc.js +602 -0
  74. package/modules/std/secure.js +3724 -0
  75. package/modules/std/string/base64.js +138 -0
  76. package/modules/std/string.js +299 -0
  77. package/modules/std/task.js +914 -0
  78. package/modules/std/time.js +579 -0
  79. package/modules/std/tui.js +188 -0
  80. package/modules/std/worker-thread.js +246 -0
  81. package/modules/std/worker.js +790 -0
  82. package/package.json +67 -0
  83. package/stdlib/modules/javascript.zzm +99 -0
  84. package/stdlib/modules/perl.zzm +105 -0
  85. package/stdlib/modules/std/archive.zzm +132 -0
  86. package/stdlib/modules/std/cache/lru.zzm +174 -0
  87. package/stdlib/modules/std/clib.zzm +112 -0
  88. package/stdlib/modules/std/colour.zzm +220 -0
  89. package/stdlib/modules/std/config.zzm +818 -0
  90. package/stdlib/modules/std/data/cbor.zzm +497 -0
  91. package/stdlib/modules/std/data/csv.zzm +285 -0
  92. package/stdlib/modules/std/data/ini.zzm +472 -0
  93. package/stdlib/modules/std/data/json/schema/core.zzm +573 -0
  94. package/stdlib/modules/std/data/json/schema/format.zzm +581 -0
  95. package/stdlib/modules/std/data/json/schema/model.zzm +255 -0
  96. package/stdlib/modules/std/data/json/schema/output.zzm +272 -0
  97. package/stdlib/modules/std/data/json/schema/relative_pointer.zzm +299 -0
  98. package/stdlib/modules/std/data/json/schema/validation.zzm +1503 -0
  99. package/stdlib/modules/std/data/json/schema.zzm +306 -0
  100. package/stdlib/modules/std/data/json.zzm +102 -0
  101. package/stdlib/modules/std/data/kdl/json.zzm +460 -0
  102. package/stdlib/modules/std/data/kdl/xml.zzm +387 -0
  103. package/stdlib/modules/std/data/kdl.zzm +1631 -0
  104. package/stdlib/modules/std/data/toml.zzm +756 -0
  105. package/stdlib/modules/std/data/toon.zzm +1017 -0
  106. package/stdlib/modules/std/data/xml/escape.zzm +156 -0
  107. package/stdlib/modules/std/data/xml.zzm +276 -0
  108. package/stdlib/modules/std/data/yaml.zzm +94 -0
  109. package/stdlib/modules/std/db.zzm +173 -0
  110. package/stdlib/modules/std/defer.zzm +75 -0
  111. package/stdlib/modules/std/digest/crc32.zzm +196 -0
  112. package/stdlib/modules/std/digest/md5.zzm +54 -0
  113. package/stdlib/modules/std/digest/sha.zzm +83 -0
  114. package/stdlib/modules/std/dump.zzm +317 -0
  115. package/stdlib/modules/std/eval.zzm +63 -0
  116. package/stdlib/modules/std/getopt.zzm +432 -0
  117. package/stdlib/modules/std/gui/dialogue.zzm +592 -0
  118. package/stdlib/modules/std/gui/objects.zzm +123 -0
  119. package/stdlib/modules/std/gui.zzm +1914 -0
  120. package/stdlib/modules/std/internals.zzm +139 -0
  121. package/stdlib/modules/std/io/socks.zzm +139 -0
  122. package/stdlib/modules/std/io.zzm +157 -0
  123. package/stdlib/modules/std/lingua/en.zzm +347 -0
  124. package/stdlib/modules/std/log.zzm +169 -0
  125. package/stdlib/modules/std/mail.zzm +2726 -0
  126. package/stdlib/modules/std/marshal.zzm +138 -0
  127. package/stdlib/modules/std/math/bignum.zzm +98 -0
  128. package/stdlib/modules/std/math/range.zzm +116 -0
  129. package/stdlib/modules/std/math/roman.zzm +156 -0
  130. package/stdlib/modules/std/math.zzm +141 -0
  131. package/stdlib/modules/std/net/dns.zzm +93 -0
  132. package/stdlib/modules/std/net/http.zzm +278 -0
  133. package/stdlib/modules/std/net/smtp.zzm +257 -0
  134. package/stdlib/modules/std/net/url.zzm +69 -0
  135. package/stdlib/modules/std/path/jsonpointer.zzm +526 -0
  136. package/stdlib/modules/std/path/kdl.zzm +1003 -0
  137. package/stdlib/modules/std/path/simple.zzm +520 -0
  138. package/stdlib/modules/std/path/z/context.zzm +147 -0
  139. package/stdlib/modules/std/path/z/evaluate.zzm +549 -0
  140. package/stdlib/modules/std/path/z/functions.zzm +874 -0
  141. package/stdlib/modules/std/path/z/lexer.zzm +490 -0
  142. package/stdlib/modules/std/path/z/node.zzm +1455 -0
  143. package/stdlib/modules/std/path/z/operators.zzm +445 -0
  144. package/stdlib/modules/std/path/z/parser.zzm +359 -0
  145. package/stdlib/modules/std/path/z.zzm +403 -0
  146. package/stdlib/modules/std/path/zz/functions.zzm +828 -0
  147. package/stdlib/modules/std/path/zz/operators.zzm +1036 -0
  148. package/stdlib/modules/std/path/zz.zzm +100 -0
  149. package/stdlib/modules/std/proc.zzm +155 -0
  150. package/stdlib/modules/std/result.zzm +149 -0
  151. package/stdlib/modules/std/secure.zzm +606 -0
  152. package/stdlib/modules/std/string/base64.zzm +66 -0
  153. package/stdlib/modules/std/string/quoted_printable.zzm +485 -0
  154. package/stdlib/modules/std/string.zzm +179 -0
  155. package/stdlib/modules/std/task.zzm +221 -0
  156. package/stdlib/modules/std/template/z.zzm +531 -0
  157. package/stdlib/modules/std/template/zz.zzm +62 -0
  158. package/stdlib/modules/std/time.zzm +188 -0
  159. package/stdlib/modules/std/tui.zzm +89 -0
  160. package/stdlib/modules/std/uuid.zzm +223 -0
  161. package/stdlib/modules/std/web/session.zzm +388 -0
  162. package/stdlib/modules/std/web/static.zzm +329 -0
  163. package/stdlib/modules/std/web.zzm +1942 -0
  164. package/stdlib/modules/std/worker.zzm +202 -0
  165. package/stdlib/modules/std/zuzuzoo.zzm +3960 -0
  166. package/stdlib/modules/test/more.zzm +528 -0
  167. package/stdlib/modules/test/parser.zzm +209 -0
@@ -0,0 +1,387 @@
1
+ =encoding utf8
2
+
3
+ =head1 NAME
4
+
5
+ std/data/kdl/xml - XML-in-KDL structure conversion.
6
+
7
+ =head1 SYNOPSIS
8
+
9
+ from std/data/kdl import KDL;
10
+ from std/data/kdl/xml import kdl_to_xml, xml_to_kdl;
11
+ from std/data/xml import XML;
12
+
13
+ let kdl_doc := ( new KDL() ).decode(
14
+ "a href=\"http://example.com\" \"here's a link\""
15
+ );
16
+ let xml_doc := kdl_to_xml(kdl_doc);
17
+ let roundtrip := xml_to_kdl(xml_doc);
18
+
19
+ =head1 IMPLEMENTATION SUPPORT
20
+
21
+ This module is supported by all implementations of ZuzuScript.
22
+
23
+ =head1 DESCRIPTION
24
+
25
+ This module implements the XML-in-KDL (XiK) mapping for parsed Zuzu
26
+ objects. C<kdl_to_xml> accepts a C<KDLDocument> or C<KDLNode> and
27
+ returns an C<XMLDocument>. C<xml_to_kdl> accepts an C<XMLDocument> or
28
+ C<XMLNode> and returns a C<KDLDocument>.
29
+
30
+ =head1 EXPORTS
31
+
32
+ =head2 Functions
33
+
34
+ =over
35
+
36
+ =item C<< kdl_to_xml(value) >>
37
+
38
+ Parameters: C<value> is a C<KDLDocument>, C<KDLNode>, or compatible KDL
39
+ value. Returns: C<XMLDocument>. Converts XML-in-KDL structures into an
40
+ XML document.
41
+
42
+ =item C<< xml_to_kdl(value) >>
43
+
44
+ Parameters: C<value> is an C<XMLDocument>, C<XMLNode>, or compatible XML
45
+ value. Returns: C<KDLDocument>. Converts XML data into XML-in-KDL nodes.
46
+
47
+ =back
48
+
49
+ =head1 COPYRIGHT AND LICENCE
50
+
51
+ B<< std/data/kdl/xml >> is copyright Toby Inkster.
52
+
53
+ It is free software; you may redistribute it and/or modify it under
54
+ the terms of either the Artistic License 1.0 or the GNU General Public
55
+ License version 2.
56
+
57
+ =cut
58
+
59
+ from std/data/kdl import KDLDocument, KDLNode, KDLValue;
60
+ from std/data/xml import XML;
61
+ from std/data/xml/escape import escape_xml;
62
+ from std/string import index, substr;
63
+
64
+ function _xik_starts_with ( String text, String prefix ) {
65
+ return substr( text, 0, length prefix ) ≡ prefix;
66
+ }
67
+
68
+ function _xik_has_props ( KDLNode node ) {
69
+ return node.props().to_Array().length() > 0;
70
+ }
71
+
72
+ function _xik_string_value ( value, String context ) {
73
+ die `${context} must be a KDLValue` if not( value instanceof KDLValue );
74
+ die `${context} must be a string value` if not value.is_string();
75
+ return value.native_value();
76
+ }
77
+
78
+ function _xik_single_string_arg ( KDLNode node, String context ) {
79
+ die `${context} must contain one string argument`
80
+ if node.args().length() ≢ 1;
81
+ return _xik_string_value( node.args()[0], context );
82
+ }
83
+
84
+ function _xik_no_props_or_children ( KDLNode node, String context ) {
85
+ die `${context} cannot contain properties` if _xik_has_props(node);
86
+ die `${context} cannot contain children`
87
+ if node.children().length() > 0;
88
+ }
89
+
90
+ function _xik_attr_text ( PairList props ) {
91
+ let out := "";
92
+ for ( let pair in props.to_Array() ) {
93
+ let kv := pair{pair};
94
+ let key := kv[0];
95
+ let value := _xik_string_value(
96
+ kv[1],
97
+ `XML-in-KDL attribute '${key}'`,
98
+ );
99
+ out _= ` ${key}="${escape_xml(value)}"`;
100
+ }
101
+ return out;
102
+ }
103
+
104
+ function _xik_comment_text ( KDLNode node ) {
105
+ _xik_no_props_or_children( node, "XML-in-KDL comment node" );
106
+ let text := _xik_single_string_arg( node, "XML-in-KDL comment node" );
107
+ die "XML-in-KDL comment cannot contain '--'" if index( text, "--" ) >= 0;
108
+ die "XML-in-KDL comment cannot end with '-'"
109
+ if length text > 0 and substr( text, length text - 1, 1 ) ≡ "-";
110
+ return "<!--" _ text _ "-->";
111
+ }
112
+
113
+ function _xik_doctype_text ( KDLNode node ) {
114
+ _xik_no_props_or_children( node, "XML-in-KDL doctype node" );
115
+ let text := _xik_single_string_arg( node, "XML-in-KDL doctype node" );
116
+ die "XML-in-KDL doctype cannot contain '>'" if index( text, ">" ) >= 0;
117
+ return "<!DOCTYPE " _ text _ ">";
118
+ }
119
+
120
+ function _xik_pi_text ( KDLNode node ) {
121
+ die "XML-in-KDL processing instruction cannot contain children"
122
+ if node.children().length() > 0;
123
+
124
+ let target := substr( node.name(), 1, length node.name() - 1 );
125
+ die "XML-in-KDL processing instruction has an empty target"
126
+ if target ≡ "";
127
+
128
+ let content := "";
129
+ if ( node.args().length() > 0 ) {
130
+ _xik_no_props_or_children(
131
+ node,
132
+ "XML-in-KDL unstructured processing instruction",
133
+ );
134
+ content := _xik_single_string_arg(
135
+ node,
136
+ "XML-in-KDL unstructured processing instruction",
137
+ );
138
+ }
139
+ else {
140
+ content := _xik_attr_text( node.props() );
141
+ content := substr( content, 1, length content - 1 )
142
+ if length content > 0;
143
+ }
144
+
145
+ die "XML-in-KDL processing instruction cannot contain '?>'"
146
+ if index( content, "?>" ) >= 0;
147
+
148
+ return content ≡ "" ? `<?${target}?>` : `<?${target} ${content}?>`;
149
+ }
150
+
151
+ function _xik_text_node_text ( KDLNode node ) {
152
+ _xik_no_props_or_children( node, "XML-in-KDL text node" );
153
+ return escape_xml( _xik_single_string_arg( node, "XML-in-KDL text node" ) );
154
+ }
155
+
156
+ function _xik_node_text;
157
+
158
+ function _xik_element_text ( KDLNode node ) {
159
+ die `XML-in-KDL element '${node.name()}' cannot have type annotations`
160
+ if node.type_annotation() ≢ null;
161
+
162
+ let args := node.args();
163
+ let children := node.children();
164
+ die `XML-in-KDL element '${node.name()}' cannot contain multiple arguments`
165
+ if args.length() > 1;
166
+ die `XML-in-KDL element '${node.name()}' cannot mix text argument and children`
167
+ if args.length() > 0 and children.length() > 0;
168
+
169
+ let attrs := _xik_attr_text( node.props() );
170
+ if ( args.length() = 0 and children.length() = 0 ) {
171
+ return `<${node.name()}${attrs}/>`;
172
+ }
173
+
174
+ let body := "";
175
+ if ( args.length() = 1 ) {
176
+ body := escape_xml(
177
+ _xik_string_value(
178
+ args[0],
179
+ `XML-in-KDL element '${node.name()}' text argument`,
180
+ ),
181
+ );
182
+ }
183
+ else {
184
+ for ( let child in children ) {
185
+ body _= _xik_node_text(child);
186
+ }
187
+ }
188
+
189
+ return `<${node.name()}${attrs}>${body}</${node.name()}>`;
190
+ }
191
+
192
+ function _xik_node_text ( KDLNode node ) {
193
+ let name := node.name();
194
+ if ( name ≡ "-" ) {
195
+ return _xik_text_node_text(node);
196
+ }
197
+ if ( name ≡ "!" ) {
198
+ return _xik_comment_text(node);
199
+ }
200
+ if ( name ≡ "!doctype" ) {
201
+ return _xik_doctype_text(node);
202
+ }
203
+ if ( _xik_starts_with( name, "?" ) ) {
204
+ return _xik_pi_text(node);
205
+ }
206
+ return _xik_element_text(node);
207
+ }
208
+
209
+ function _xik_is_element_node ( KDLNode node ) {
210
+ let name := node.name();
211
+ return name ≢ "-" and name ≢ "!" and name ≢ "!doctype"
212
+ and not _xik_starts_with( name, "?" );
213
+ }
214
+
215
+ function kdl_to_xml ( value ) {
216
+ let nodes;
217
+ if ( value instanceof KDLDocument ) {
218
+ nodes := value.nodes();
219
+ }
220
+ else if ( value instanceof KDLNode ) {
221
+ nodes := [ value ];
222
+ }
223
+ else {
224
+ die "kdl_to_xml expects a KDLDocument or KDLNode";
225
+ }
226
+
227
+ let element_count := 0;
228
+ let out := "";
229
+ for ( let node in nodes ) {
230
+ element_count++ if _xik_is_element_node(node);
231
+ out _= _xik_node_text(node);
232
+ }
233
+
234
+ die "XML-in-KDL document must contain exactly one top-level element"
235
+ if element_count ≢ 1;
236
+
237
+ return XML.parse(out);
238
+ }
239
+
240
+ function _xik_kdl_value ( String text ) {
241
+ return new KDLValue( type: "string", value: text );
242
+ }
243
+
244
+ function _xik_xml_attrs_to_kdl ( xml_node ) {
245
+ let props := new PairList();
246
+ for ( let attr in xml_node.attributes() ) {
247
+ props.add( attr.nodeName(), _xik_kdl_value( attr.nodeValue() ) );
248
+ }
249
+ return props;
250
+ }
251
+
252
+ function _xik_xml_text_to_kdl ( xml_node ) {
253
+ return new KDLNode(
254
+ name: "-",
255
+ args: [ _xik_kdl_value( xml_node.nodeValue() ?: "" ) ],
256
+ );
257
+ }
258
+
259
+ function _xik_xml_comment_to_kdl ( xml_node ) {
260
+ return new KDLNode(
261
+ name: "!",
262
+ args: [ _xik_kdl_value( xml_node.nodeValue() ?: "" ) ],
263
+ );
264
+ }
265
+
266
+ function _xik_xml_node_to_kdl;
267
+
268
+ function _xik_xml_pi_to_kdl ( xml_node ) {
269
+ return new KDLNode(
270
+ name: "?" _ xml_node.nodeName(),
271
+ args: [ _xik_kdl_value( xml_node.nodeValue() ?: "" ) ],
272
+ );
273
+ }
274
+
275
+ function _xik_xml_doctype_to_kdl ( xml_node ) {
276
+ return new KDLNode(
277
+ name: "!doctype",
278
+ args: [ _xik_kdl_value( xml_node.nodeValue() ?: xml_node.nodeName() ) ],
279
+ );
280
+ }
281
+
282
+ function _xik_xml_element_to_kdl ( xml_node ) {
283
+ let child_nodes := xml_node.childNodes();
284
+ let text_only := child_nodes.length() > 0;
285
+ let text := "";
286
+
287
+ for ( let child in child_nodes ) {
288
+ let kind := 0 + child.nodeType();
289
+ if ( kind = 3 or kind = 4 ) {
290
+ text _= child.nodeValue() ?: "";
291
+ }
292
+ else {
293
+ text_only := false;
294
+ }
295
+ }
296
+
297
+ if ( text_only ) {
298
+ return new KDLNode(
299
+ name: xml_node.nodeName(),
300
+ props: _xik_xml_attrs_to_kdl(xml_node),
301
+ args: [ _xik_kdl_value(text) ],
302
+ );
303
+ }
304
+
305
+ let children := [];
306
+ for ( let child in child_nodes ) {
307
+ let kdl_child := _xik_xml_node_to_kdl(child);
308
+ children.push(kdl_child) if kdl_child ≢ null;
309
+ }
310
+
311
+ return new KDLNode(
312
+ name: xml_node.nodeName(),
313
+ props: _xik_xml_attrs_to_kdl(xml_node),
314
+ children: children,
315
+ );
316
+ }
317
+
318
+ function _xik_xml_node_to_kdl ( xml_node ) {
319
+ switch ( 0 + xml_node.nodeType() ) {
320
+ case 1:
321
+ return _xik_xml_element_to_kdl(xml_node);
322
+ case 3, 4:
323
+ return _xik_xml_text_to_kdl(xml_node);
324
+ case 7:
325
+ return _xik_xml_pi_to_kdl(xml_node);
326
+ case 8:
327
+ return _xik_xml_comment_to_kdl(xml_node);
328
+ case 10:
329
+ return _xik_xml_doctype_to_kdl(xml_node);
330
+ }
331
+ return null;
332
+ }
333
+
334
+ function _xik_xml_document_nodes ( xml_doc ) {
335
+ let raw_nodes := null;
336
+ try {
337
+ raw_nodes := xml_doc.childNodes();
338
+ }
339
+ catch {
340
+ try {
341
+ raw_nodes := xml_doc.findnodes("/node()");
342
+ }
343
+ catch {
344
+ let root := xml_doc.documentElement();
345
+ raw_nodes := root ≡ null ? [] : [ root ];
346
+ }
347
+ }
348
+
349
+ if ( raw_nodes.length() = 0 ) {
350
+ let root := xml_doc.documentElement();
351
+ raw_nodes := root ≡ null ? [] : [ root ];
352
+ }
353
+
354
+ let nodes := [];
355
+ for ( let raw in raw_nodes ) {
356
+ let node := _xik_xml_node_to_kdl(raw);
357
+ nodes.push(node) if node ≢ null;
358
+ }
359
+ return nodes;
360
+ }
361
+
362
+ function xml_to_kdl ( value ) {
363
+ let node_type := null;
364
+ try {
365
+ node_type := 0 + value.nodeType();
366
+ }
367
+ catch {
368
+ }
369
+
370
+ if ( node_type ≢ null ) {
371
+ if ( node_type = 9 ) {
372
+ return new KDLDocument( nodes: _xik_xml_document_nodes(value) );
373
+ }
374
+
375
+ let node := _xik_xml_node_to_kdl(value);
376
+ die "xml_to_kdl cannot convert this XML node type" if node ≡ null;
377
+ return new KDLDocument( nodes: [ node ] );
378
+ }
379
+
380
+ try {
381
+ value.documentElement();
382
+ return new KDLDocument( nodes: _xik_xml_document_nodes(value) );
383
+ }
384
+ catch {
385
+ die "xml_to_kdl expects an XMLDocument or XMLNode";
386
+ }
387
+ }