/
gltf2xml.js
89 lines (84 loc) · 2.43 KB
/
gltf2xml.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
var fs = require("fs");
var xmldom = require('@xmldom/xmldom');
var DOMImplementation = new xmldom.DOMImplementation();
var XMLSerializer = new xmldom.XMLSerializer();
var docType = DOMImplementation.createDocumentType("gltf", 'ISO//Web3D//DTD gltf 3.3//EN" "http://www.web3d.org/specifications/gltf-3.3.dtd', null);
var document = DOMImplementation.createDocument(null, "gltf", docType);
process.argv.shift();
process.argv.shift();
for (arg in process.argv) {
try {
argv = process.argv[arg];
var string = fs.readFileSync(argv).toString();
var json = JSON.parse(string);
var element = writeAsXml(document.documentElement, "gltf", json);
document.documentElement.appendChild(element);
console.log(serializeDOM(json, document));
} catch (e) {
console.error(e);
}
}
function serializeDOM(json, element) {
var xml = '<?xml version="1.0"?>\n';
if (typeof element === 'string') {
xml += element;
} else {
xml += XMLSerializer.serializeToString(element);
}
return xml;
}
function writeAsXml(parent, j, json) {
var element;
var k = j;
if (j.endsWith("s") && !j.endsWith("ss")) {
k = j.substr(0, j.length - 1);
}
if (j.endsWith("meshe")) {
k = j.substr(0, j.length - 1);
}
if (Array.isArray(json)) {
if (k !== j) {
element = document.createElement(j);
} else {
element = parent;
}
for (js in json) {
if (typeof json[js] !== 'object') {
if (k.startsWith("#")) {
var child = document.createTextNode(json[js]+"\n");
element.appendChild(child);
} else if (k.startsWith("@")) {
if (typeof json[js] === 'string') {
element.setAttribute(k.substr(1), '"'+json.join('" "').replace(/\\/g, "\\\\")+'"');
} else {
element.setAttribute(k.substr(1), json.join(" "));
}
} else {
element.setAttribute(k, json.join(" "));
}
} else {
var child = writeAsXml(element, k, json[js]);
element.appendChild(child);
}
}
} else if (typeof json === 'object') {
if (!k.startsWith("-")) {
element = document.createElement(k);
} else {
element = parent;
}
for (js in json) {
if (typeof json[js] !== 'object') {
element.setAttribute(js.startsWith("@") ? js.substr(1) : js, json[js]);
} else {
var child = writeAsXml(element, js, json[js]);
element.appendChild(child);
}
}
} else {
element = document.createElement((j.startsWith("@") ? j.substr(1) : j));
var child = document.createTextNode(json);
element.appendChild(child);
}
return element;
}