      1 /*
      2  Copyright 2008-2025
      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