184 lines
4.7 KiB
JavaScript
184 lines
4.7 KiB
JavaScript
goog.provide('ol.format.XSD');
|
|
|
|
goog.require('goog.asserts');
|
|
goog.require('ol');
|
|
goog.require('ol.xml');
|
|
goog.require('ol.string');
|
|
|
|
|
|
/**
|
|
* @const
|
|
* @type {string}
|
|
*/
|
|
ol.format.XSD.NAMESPACE_URI = 'http://www.w3.org/2001/XMLSchema';
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node.
|
|
* @return {boolean|undefined} Boolean.
|
|
*/
|
|
ol.format.XSD.readBoolean = function(node) {
|
|
var s = ol.xml.getAllTextContent(node, false);
|
|
return ol.format.XSD.readBooleanString(s);
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {string} string String.
|
|
* @return {boolean|undefined} Boolean.
|
|
*/
|
|
ol.format.XSD.readBooleanString = function(string) {
|
|
var m = /^\s*(true|1)|(false|0)\s*$/.exec(string);
|
|
if (m) {
|
|
return m[1] !== undefined || false;
|
|
} else {
|
|
return undefined;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node.
|
|
* @return {number|undefined} DateTime in seconds.
|
|
*/
|
|
ol.format.XSD.readDateTime = function(node) {
|
|
var s = ol.xml.getAllTextContent(node, false);
|
|
var re =
|
|
/^\s*(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|(?:([+\-])(\d{2})(?::(\d{2}))?))\s*$/;
|
|
var m = re.exec(s);
|
|
if (m) {
|
|
var year = parseInt(m[1], 10);
|
|
var month = parseInt(m[2], 10) - 1;
|
|
var day = parseInt(m[3], 10);
|
|
var hour = parseInt(m[4], 10);
|
|
var minute = parseInt(m[5], 10);
|
|
var second = parseInt(m[6], 10);
|
|
var dateTime = Date.UTC(year, month, day, hour, minute, second) / 1000;
|
|
if (m[7] != 'Z') {
|
|
var sign = m[8] == '-' ? -1 : 1;
|
|
dateTime += sign * 60 * parseInt(m[9], 10);
|
|
if (m[10] !== undefined) {
|
|
dateTime += sign * 60 * 60 * parseInt(m[10], 10);
|
|
}
|
|
}
|
|
return dateTime;
|
|
} else {
|
|
return undefined;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node.
|
|
* @return {number|undefined} Decimal.
|
|
*/
|
|
ol.format.XSD.readDecimal = function(node) {
|
|
var s = ol.xml.getAllTextContent(node, false);
|
|
return ol.format.XSD.readDecimalString(s);
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {string} string String.
|
|
* @return {number|undefined} Decimal.
|
|
*/
|
|
ol.format.XSD.readDecimalString = function(string) {
|
|
// FIXME check spec
|
|
var m = /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*$/i.exec(string);
|
|
if (m) {
|
|
return parseFloat(m[1]);
|
|
} else {
|
|
return undefined;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node.
|
|
* @return {number|undefined} Non negative integer.
|
|
*/
|
|
ol.format.XSD.readNonNegativeInteger = function(node) {
|
|
var s = ol.xml.getAllTextContent(node, false);
|
|
return ol.format.XSD.readNonNegativeIntegerString(s);
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {string} string String.
|
|
* @return {number|undefined} Non negative integer.
|
|
*/
|
|
ol.format.XSD.readNonNegativeIntegerString = function(string) {
|
|
var m = /^\s*(\d+)\s*$/.exec(string);
|
|
if (m) {
|
|
return parseInt(m[1], 10);
|
|
} else {
|
|
return undefined;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node.
|
|
* @return {string|undefined} String.
|
|
*/
|
|
ol.format.XSD.readString = function(node) {
|
|
return ol.xml.getAllTextContent(node, false).trim();
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node to append a TextNode with the boolean to.
|
|
* @param {boolean} bool Boolean.
|
|
*/
|
|
ol.format.XSD.writeBooleanTextNode = function(node, bool) {
|
|
ol.format.XSD.writeStringTextNode(node, (bool) ? '1' : '0');
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node to append a TextNode with the dateTime to.
|
|
* @param {number} dateTime DateTime in seconds.
|
|
*/
|
|
ol.format.XSD.writeDateTimeTextNode = function(node, dateTime) {
|
|
var date = new Date(dateTime * 1000);
|
|
var string = date.getUTCFullYear() + '-' +
|
|
ol.string.padNumber(date.getUTCMonth() + 1, 2) + '-' +
|
|
ol.string.padNumber(date.getUTCDate(), 2) + 'T' +
|
|
ol.string.padNumber(date.getUTCHours(), 2) + ':' +
|
|
ol.string.padNumber(date.getUTCMinutes(), 2) + ':' +
|
|
ol.string.padNumber(date.getUTCSeconds(), 2) + 'Z';
|
|
node.appendChild(ol.xml.DOCUMENT.createTextNode(string));
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node to append a TextNode with the decimal to.
|
|
* @param {number} decimal Decimal.
|
|
*/
|
|
ol.format.XSD.writeDecimalTextNode = function(node, decimal) {
|
|
var string = decimal.toPrecision();
|
|
node.appendChild(ol.xml.DOCUMENT.createTextNode(string));
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node to append a TextNode with the decimal to.
|
|
* @param {number} nonNegativeInteger Non negative integer.
|
|
*/
|
|
ol.format.XSD.writeNonNegativeIntegerTextNode = function(node, nonNegativeInteger) {
|
|
goog.asserts.assert(nonNegativeInteger >= 0, 'value should be more than 0');
|
|
goog.asserts.assert(nonNegativeInteger == (nonNegativeInteger | 0),
|
|
'value should be an integer value');
|
|
var string = nonNegativeInteger.toString();
|
|
node.appendChild(ol.xml.DOCUMENT.createTextNode(string));
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {Node} node Node to append a TextNode with the string to.
|
|
* @param {string} string String.
|
|
*/
|
|
ol.format.XSD.writeStringTextNode = function(node, string) {
|
|
node.appendChild(ol.xml.DOCUMENT.createTextNode(string));
|
|
};
|