/*global ActiveXObject */ /* jsonml-xml.js JsonML XML utilities Created: 2007-02-15-2235 Modified: 2012-11-03-2051 Copyright (c)2006-2012 Stephen M. McKamey Distributed under The MIT License: http://jsonml.org/license This file creates a global JsonML object containing these methods: JsonML.toXML(string|array, filter) Converts JsonML to XML nodes JsonML.toXMLText(JsonML, filter) Converts JsonML to XML text JsonML.fromXML(node, filter) Converts XML nodes to JsonML JsonML.fromXMLText(xmlText, filter) Converts XML text to JsonML */ var JsonML = JsonML || {}; if (typeof module === 'object') { module.exports = JsonML; } (function(JsonML, document) { 'use strict'; /** * Determines if the value is an Array * * @private * @param {*} val the object being tested * @return {boolean} */ var isArray = Array.isArray || function(val) { return (val instanceof Array); }; /** * Creates a DOM element * * @private * @param {string} tag The element's tag name * @return {Node} */ var createElement = function(tag) { if (!tag) { // create a document fragment to hold multiple-root elements if (document.createDocumentFragment) { return document.createDocumentFragment(); } tag = ''; } else if (tag.charAt(0) === '!') { return document.createComment(tag === '!' ? '' : tag.substr(1)+' '); } return document.createElement(tag); }; /** * Appends an attribute to an element * * @private * @param {Node} elem The element * @param {Object} attr Attributes object * @return {Node} */ var addAttributes = function(elem, attr) { // for each attributeName for (var name in attr) { if (attr.hasOwnProperty(name)) { // attributes elem.setAttribute(name, attr[name]); } } return elem; }; /** * Appends a child to an element * * @private * @param {Node} elem The parent element * @param {Node} child The child */ var appendDOM = function(elem, child) { if (child) { if (elem.nodeType === 8) { // comment if (child.nodeType === 3) { // text node elem.nodeValue += child.nodeValue; } } else if (elem.canHaveChildren !== false) { elem.appendChild(child); } } }; /** * Default error handler * @param {Error} ex * @return {Node} */ var onError = function (ex) { return document.createTextNode('['+ex+']'); }; /* override this to perform custom error handling during binding */ JsonML.onerror = null; /** * @param {Node} elem * @param {*} jml * @param {function} filter * @return {Node} */ var patch = function(elem, jml, filter) { for (var i=1; i') || document; })(JsonML, document);