UNPKG

6.12 kBJavaScriptView Raw
1"use strict";
2var os = require('os');
3var stream = require('stream');
4var util = require('util');
5// Java Style Sheet Language, implementation 1
6
7// convert X3D JSON format to X3D XML
8
9var content = '';
10// read content into buffer
11//process.stdin.resume();
12//process.stdin.on('data', function(buf) { content += buf.toString(); });
13//
14function toString(el, indent, writeStream) {
15 if (writeStream === undefined) {
16 console.error('writeStream undefined')
17 return;
18 }
19 var child;
20 var key;
21 var attrs;
22 if (typeof el === 'string') {
23 writeStream.write((indent + el));
24 return result;
25 }
26 if (el.key) {
27 key = el.key;
28 }
29 if (el.attributes && el.attributes.length > 0) {
30 attrs = " " + el.attributes.join(" ");
31 }
32 if (el.children && typeof key !== 'undefined' && typeof attrs !== 'undefined') {
33 writeStream.write(indent + "<" + key + attrs + ">\n");
34 } else if (el.children && typeof key !== 'undefined') {
35 writeStream.write(indent + "<" + key + ">\n");
36 } else if (typeof key !== 'undefined' && typeof attrs !== 'undefined') {
37 writeStream.write(indent + "<" + key + attrs + "/>\n");
38 } else if (typeof key !== 'undefined') {
39 writeStream.write(indent + "<" + key + "/>\n");
40 }
41 for (child in el) {
42 if (child === "children") {
43 toString(el[child], indent + " ", writeStream);
44 } else {
45 if (isNaN(parseInt(child))) {
46 } else {
47 toString(el[child], indent + "", writeStream);
48 }
49 }
50 }
51 if (el.children && typeof key !== 'undefined') {
52 writeStream.write(indent + "</" + key + ">\n");
53 }
54}
55
56function ConvertChildren(object, parentkey) {
57 var key;
58 var children = [];
59 for (key in object) {
60 if (typeof object[key] === 'object') {
61 var el = ConvertToX3D(object[key], key);
62 children.push(el);
63 }
64 }
65 return children;
66}
67
68function ConvertToX3D(object, parentkey) {
69 var key;
70 var localArray = [];
71 var isArray = false;
72 var arrayOfStrings = false;
73 var attributes = [];
74 var children = [];
75 for (key in object) {
76 if (isNaN(parseInt(key))) {
77 isArray = false;
78 } else {
79 isArray = true;
80 }
81 if (isArray) {
82 if (typeof object[key] === 'number') {
83 localArray.push(object[key]);
84 } else if (typeof object[key] === 'string') {
85 localArray.push(object[key]);
86 arrayOfStrings = true;
87 } else if (typeof object[key] === 'boolean') {
88 localArray.push(object[key]);
89 } else if (typeof object[key] === 'object') {
90 var el = ConvertToX3D(object[key], key);
91 children.push(el);
92 } else {
93 console.log("Unknown type found in array " + typeof object[key]);
94 }
95 } else if (typeof object[key] === 'object') {
96 if (key.substr(0, 1) === '@') {
97 var el = ConvertToX3D(object[key], key);
98 for (var attr in el.attributes) {
99 attributes.push(el.attributes[attr]);
100 }
101 } else if (key.substr(0, 1) === '-') {
102 children.push(ConvertChildren(object[key], key));
103 } else {
104 var el = ConvertToX3D(object[key], key);
105 el.key = key;
106 children.push(el);
107 }
108 } else if (typeof object[key] === 'number') {
109 attributes.push(key.substr(1) + "='" + object[key] + "'");
110 } else if (typeof object[key] === 'string') {
111 if (key === '#comment') {
112 children.push('<!--' + object[key] + '-->');
113 } else {
114 attributes.push(key.substr(1) + "='" + object[key] + "'");
115 }
116 } else if (typeof object[key] === 'boolean') {
117 attributes.push(key.substr(1) + "='" + object[key] + "'");
118 } else {
119 console.log("Unknown type found in object " + typeof object[key]);
120 }
121 }
122 if (isArray) {
123 if (parentkey.substr(0, 1) === '@') {
124 if (arrayOfStrings) {
125 arrayOfStrings = false;
126 attributes.push(parentkey.substr(1) + "='&quot;" + localArray.join('&quot; &quot;') + "&quot;'");
127 } else {
128 attributes.push(parentkey.substr(1) + "='" + localArray.join(" ") + "'");
129 }
130 }
131 isArray = false;
132 }
133 return {attributes: attributes, children: children};
134}
135//
136//process.stdin.on('end', function() {
137// var json = JSON.parse(content);
138//console.log('<?xml version="1.0" encoding="UTF-8"?>');
139//console.log('<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "http://www.web3d.org/specifications/x3d-3.3.dtd"><X3D><Scene>');
140// var el = ConvertToX3D(json, "", "");
141// printElement(el, "");
142//console.log('</Scene></X3D>');
143//});
144
145function convert(object, writeStream) {
146 var json = ConvertToX3D(object['X3D']['Scene'], "");
147 var result = '';
148 result += '<?xml version="1.0" encoding="UTF-8"?>\n';
149 result += '<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.2//EN" "http://www.web3d.org/specifications/x3d-3.2.dtd">\n';
150 result += '<X3D profile="Interchange" version="3.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.2.xsd">\n';
151 result += ' <Scene>\n';
152 if (writeStream) {
153 writeStream.write(result);
154 }
155// console.log(JSON.stringify(object))
156// console.log(JSON.stringify(json))
157
158//{
159// "X3D": {
160// "@profile": "Immersive",
161// "@version": 3.3,
162// "@xsd:noNamespaceSchemaLocation": "http://www.web3d.org/specifications/x3d-3.3.xsd",
163// "Scene": {
164
165 result += toString(json, " ", writeStream);
166 var endResult = '';
167 endResult += (' </Scene>\n');
168 endResult += ('</X3D>\n');
169 if (writeStream) {
170 writeStream.write(endResult);
171 }
172 return result + endResult;
173}
174
175exports.convert = convert;