1 /* 2 Copyright 2008-2024 3 Matthias Ehmann, 4 Michael Gerhaeuser, 5 Carsten Miller, 6 Bianca Valentin, 7 Alfred Wassermann, 8 Peter Wilfahrt 9 10 This file is part of JSXGraph. 11 12 JSXGraph is free software dual licensed under the GNU LGPL or MIT License. 13 14 You can redistribute it and/or modify it under the terms of the 15 16 * GNU Lesser General Public License as published by 17 the Free Software Foundation, either version 3 of the License, or 18 (at your option) any later version 19 OR 20 * MIT License: https://github.com/jsxgraph/jsxgraph/blob/master/LICENSE.MIT 21 22 JSXGraph is distributed in the hope that it will be useful, 23 but WITHOUT ANY WARRANTY; without even the implied warranty of 24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 25 GNU Lesser General Public License for more details. 26 27 You should have received a copy of the GNU Lesser General Public License and 28 the MIT License along with JSXGraph. If not, see <https://www.gnu.org/licenses/> 29 and <https://opensource.org/licenses/MIT/>. 30 */ 31 32 /*global JXG: true, define: true, DOMParser: true, ActiveXObject: true*/ 33 /*jslint nomen: true, plusplus: true*/ 34 35 import JXG from "../jxg.js"; 36 import Type from "./type.js"; 37 38 /** 39 * Holds browser independent xml parsing routines. Won't work in environments other than browsers. 40 * @namespace 41 */ 42 JXG.XML = { 43 /** 44 * Cleans out unneccessary whitespaces in a chunk of xml. 45 * @param {Object} el 46 */ 47 cleanWhitespace: function (el) { 48 var cur = el.firstChild; 49 50 while (Type.exists(cur)) { 51 if (cur.nodeType === 3 && !/\S/.test(cur.nodeValue)) { 52 el.removeChild(cur); 53 } else if (cur.nodeType === 1) { 54 this.cleanWhitespace(cur); 55 } 56 cur = cur.nextSibling; 57 } 58 }, 59 60 /** 61 * Converts a given string into a XML tree. 62 * @param {String} str 63 * @returns {Object} The xml tree represented by the root node. 64 */ 65 parse: function (str) { 66 var parser, tree, DP; 67 68 // DOMParser is a function in all browsers, except older IE and Safari. 69 // In IE it does not exists (workaround in else branch), in Safari it's an object. 70 if (typeof DOMParser === "function" || typeof DOMParser === "object") { 71 DP = DOMParser; 72 } else { 73 // IE workaround, since there is no DOMParser 74 DP = function () { 75 this.parseFromString = function (str) { 76 var d; 77 78 if (typeof ActiveXObject === "function") { 79 d = new ActiveXObject("MSXML.DomDocument"); 80 d.loadXML(str); 81 } 82 83 return d; 84 }; 85 }; 86 } 87 88 parser = new DP(); 89 tree = parser.parseFromString(str, "text/xml"); 90 this.cleanWhitespace(tree); 91 92 return tree; 93 } 94 }; 95 96 export default JXG.XML; 97