-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
xsd.js
151 lines (137 loc) · 3.71 KB
/
xsd.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/**
* @module ol/format/xsd
*/
import {getAllTextContent, getDocument} from '../xml.js';
import {padNumber} from '../string.js';
/**
* @param {Node} node Node.
* @return {boolean|undefined} Boolean.
*/
export function readBoolean(node) {
const s = getAllTextContent(node, false);
return readBooleanString(s);
}
/**
* @param {string} string String.
* @return {boolean|undefined} Boolean.
*/
export function readBooleanString(string) {
const m = /^\s*(true|1)|(false|0)\s*$/.exec(string);
if (m) {
return m[1] !== undefined || false;
}
return undefined;
}
/**
* @param {Node} node Node.
* @return {number|undefined} DateTime in seconds.
*/
export function readDateTime(node) {
const s = getAllTextContent(node, false);
const dateTime = Date.parse(s);
return isNaN(dateTime) ? undefined : dateTime / 1000;
}
/**
* @param {Node} node Node.
* @return {number|undefined} Decimal.
*/
export function readDecimal(node) {
const s = getAllTextContent(node, false);
return readDecimalString(s);
}
/**
* @param {string} string String.
* @return {number|undefined} Decimal.
*/
export function readDecimalString(string) {
// FIXME check spec
const m = /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*$/i.exec(string);
if (m) {
return parseFloat(m[1]);
}
return undefined;
}
/**
* @param {Node} node Node.
* @return {number|undefined} Non negative integer.
*/
export function readPositiveInteger(node) {
const s = getAllTextContent(node, false);
return readNonNegativeIntegerString(s);
}
/**
* @param {string} string String.
* @return {number|undefined} Non negative integer.
*/
export function readNonNegativeIntegerString(string) {
const m = /^\s*(\d+)\s*$/.exec(string);
if (m) {
return parseInt(m[1], 10);
}
return undefined;
}
/**
* @param {Node} node Node.
* @return {string|undefined} String.
*/
export function readString(node) {
return getAllTextContent(node, false).trim();
}
/**
* @param {Node} node Node to append a TextNode with the boolean to.
* @param {boolean} bool Boolean.
*/
export function writeBooleanTextNode(node, bool) {
writeStringTextNode(node, bool ? '1' : '0');
}
/**
* @param {Node} node Node to append a CDATA Section with the string to.
* @param {string} string String.
*/
export function writeCDATASection(node, string) {
node.appendChild(getDocument().createCDATASection(string));
}
/**
* @param {Node} node Node to append a TextNode with the dateTime to.
* @param {number} dateTime DateTime in seconds.
*/
export function writeDateTimeTextNode(node, dateTime) {
const date = new Date(dateTime * 1000);
const string =
date.getUTCFullYear() +
'-' +
padNumber(date.getUTCMonth() + 1, 2) +
'-' +
padNumber(date.getUTCDate(), 2) +
'T' +
padNumber(date.getUTCHours(), 2) +
':' +
padNumber(date.getUTCMinutes(), 2) +
':' +
padNumber(date.getUTCSeconds(), 2) +
'Z';
node.appendChild(getDocument().createTextNode(string));
}
/**
* @param {Node} node Node to append a TextNode with the decimal to.
* @param {number} decimal Decimal.
*/
export function writeDecimalTextNode(node, decimal) {
const string = decimal.toPrecision();
node.appendChild(getDocument().createTextNode(string));
}
/**
* @param {Node} node Node to append a TextNode with the decimal to.
* @param {number} nonNegativeInteger Non negative integer.
*/
export function writeNonNegativeIntegerTextNode(node, nonNegativeInteger) {
const string = nonNegativeInteger.toString();
node.appendChild(getDocument().createTextNode(string));
}
/**
* @param {Node} node Node to append a TextNode with the string to.
* @param {string} string String.
*/
export function writeStringTextNode(node, string) {
node.appendChild(getDocument().createTextNode(string));
}