Skip to content
Snippets Groups Projects
API_Parsers.js 1.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • "use strict";
    // A hack to make a list of strings on type level. 
    // If you add another type to be parsable i.e. implement a parser for it, also add its name here
    const parsable = ["string", "MathMLElement", "HTMLElement", "SVGElement"];
    function is_primitive(a) {
        return "parseAs" in a
            && parsable.includes(a.parseAs)
            && "content" in a
            && typeof a.content === "string";
    }
    function backendObject_fromJSON(json_object) {
        const parser = new DOMParser;
        // just a shorthand we will need several times
        const parse = function (s) {
            const element = parser.parseFromString(s, "text/xml").childNodes[0];
            return element;
        };
        // the Backend_Object to be
        const bo = {};
        for (let i in json_object) {
            const member = json_object[i];
            if (is_primitive(member)) {
                switch (member.parseAs) {
                    case "string":
                        bo[i] = member.content;
                        break;
                    case "MathMLElement":
                        bo[i] = parse(member.content);
                        break;
                    case "HTMLElement":
                        bo[i] = parse(member.content);
                        break;
                    case "SVGElement":
                        bo[i] = parse(member.content);
                        break;
                }
            }
            else {
                bo[i] = backendObject_fromJSON(member);
            }
        }
        if (bo.label instanceof MathMLElement
            && typeof bo.uri === "string"
            && typeof bo.type === "string") {
            return bo;
        }
        else {
            console.error(`This is not a Backend_Object:`, json_object);
            throw new TypeError(`This is not a Backend_Object: \n ${json_object}`);
        }
    }