Entry.js



Wyg.Entry = class {


    constructor(entryString){
        let parts = this.getParts(entryString);
        for (let key in parts){
            this[key] = parts[key];
        }
        
    }

    getParts(entryString){
        const splitKeyReg = /\{\{([^\=\}\:\n]*)([\=\:]?)([^\}]*)\}\}/;
        const parts = entryString.match(splitKeyReg);
        let key = parts[1];
        let separator = parts[2];
        let entryData = parts[3];
        let value = null;
        let type = null;
        
        if (key=="placeholder"){
            value = "abcdefg";
            type = "text";
        } else if (separator=='='){
            type = 'text';
            value = entryData;
        } else if (separator==':'){
            const splitTypeReg = /([^\=\n]*)(\=)?([^\n]*)$/;
            const typeValueParts = entryData.match(splitTypeReg);
            type = typeValueParts[1];
            value = typeValueParts[3];
        } else if (separator==''){
            type = 'text';
            value = null;
        }

        return {
            "key":key,
            "separator":separator,
            "type":type,
            "value":value,
            "entryString":entryString
        };
    }

    getControlsNode(){
        let node = document.createElement('input');
        node.setAttribute('type','text');
        node.setAttribute('placeholder',this.key);
        return node;
    }

    getEditableValue(){
        if (this.separator=='='){
            return '';
        } else if (this.type.trim()=='children'){
            return '<span class="wyg_container_node">{{'+this.key+'}}</span>';
        } else if (this.value==''||this.value==null){
            return '{{'+this.key+'}}';
        } else {
            return this.value;
        }
    }


    parseValuesFromHtml(templateHtml){
        const valuesReg = /\{\{[^\=\}]*\=[^}]*\}\}/g;
        let valuesList = templateHtml.match(valuesReg);
        let cleanValuesList = {};
        for (let jsonIsh of valuesList){
            let splitLoc = jsonIsh.indexOf('=');
            let key = jsonIsh.substr(2,splitLoc-2);
            let value = jsonIsh.substr(splitLoc+1,jsonIsh.length-splitLoc-3);
            cleanValuesList[key] = value;
        }
        console.log(cleanValuesList);
        return cleanValuesList;
    }

    parseNearJsonArray(nearJsonArray){
        const variables = {};
        for (let nearJson of nearJsonArray){
            let json = this.parseNearJson(nearJson);
            for (let origKey in json){
                let key = origKey;
                let counter = 2;
                if (variables[key]!==undefined){
                    throw "key '"+key+"' has already been set in the template and cannot be set again.";
                }
                // while (variables[key]!==undefined){
                //     key = origKey+""+counter;
                //     counter++;
                // }
                let variable = this.fillOutVariable({'type':json[origKey], 'nearJson':nearJson, 'key':key});
                variables[key] = variable;
                
            }
        }
        // console.log('variables:');
        // console.log(variables);
        return variables;
    }
    parseNearJson(nearJson){
        const keyTypeReg = /^\{\{([^\:]*)\:([^\}]*)\}\}$/;
        const keyOnlyReg = /\{\{([^\:]*)\}\}/;
        let jsonString = '';
        if (keyTypeReg.test(nearJson)){
            jsonString = nearJson.replace(keyTypeReg,'{"$1":"$2"}');
        } else if (keyOnlyReg.test(nearJson)){
            jsonString = nearJson.replace(keyOnlyReg, '{"$1":"text"}');
        }
        let json = JSON.parse(jsonString);
        return json;
    }
    fillOutVariable(variableData){
        if (this.values[variableData.key]!=undefined){
            variableData.value = this.values[variableData.key];
        } else if (variableData.type.substr(0,1)===':'){
            variableData.value = variableData.type.substr(1);
            variableData.type = 'text';
        }
        variableData.editorReplacement = this.parseEditorReplacement(variableData);
        return variableData;
    }
};