うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

(要修復)ToggleButton・RollPolygonWithoutSlipping・貯金時計・直感力トレーニング

XMLデータを利用する

データの取得(DOM)およびシリアライズ

//アプレットの設計をDOMとして取得
function getGGBDom() {

    //ggbApplet+idの場合に対応
    var idStr;
    if (typeof document.getElementsByClassName('notranslate')[0] === 'undefined') {
        idStr = 'ggbApplet';
    } else {
        idStr = document.getElementsByClassName('notranslate')[0].getAttribute('id');
    }

    console.log(idStr);
    var ggbApplet = (new Function("return " + idStr))();

    //xmlデータを取得
    var xmlStr = ggbApplet.getXML();

    //DOMにパース
    var parser = new DOMParser();
    var dom = parser.parseFromString(xmlStr, "text/xml");

    return dom;
}

//domをxmlにシリアライズ function domToXml(dom) { var serializer = new XMLSerializer(); var xmlStr = serializer.serializeToString(dom); return xmlStr; }
// 特定のオブジェクトのxmlデータをDOMにシリアライズ
function getDOM(objName) {
    var xmlText = ggbApplet.getXML(objName);
    if (xmlText == "") {
        return;
    }
    var parser = new DOMParser();
    var doc = parser.parseFromString(xmlText, "text/xml");
    return doc;
}

//DOMをeval
function evalDOM(dom) {
    var serializer = new XMLSerializer();
    var xmlStr = serializer.serializeToString(dom);
    console.log(xmlStr);
    ggbApplet.evalXML(xmlStr);
}


//要素を編集
// editElem("text1", "isLaTeX", {val:"false"});
// editElem("text1", "objColor", {r:"0", g:"255"});
function editElem(objName, tagName, attributesObj) {
    var doc = getDOM(objName);
    var parentElem = doc.getElementsByTagName("element")[0]
    var targetElem = doc.getElementsByTagName(tagName)[0];
    if (targetElem) {
        var attributeNamesOfTargetElem = targetElem.getAttributeNames();

        // console.log(attributeNamesOfTargetElem);
        for (var abName of attributeNamesOfTargetElem) {
            console.log(abName);
            if (attributesObj[abName] === undefined) {
                attributesObj[abName] = targetElem.getAttribute(abName);
            }
        }
        targetElem.remove();
    }
    console.log(attributesObj);

    var newElem = doc.createElement(tagName);
    for (var [key, value] of Object.entries(attributesObj)) {
        newElem.setAttribute(key, value);
    }
    console.log(newElem);

    parentElem.appendChild(newElem);

    evalDOM(doc);
    var doc = getDOM(objName);
    console.log(doc);
}