{"version":3,"sources":["jsdelivr-header.js","/npm/tinymce-variable@0.9.2/src/plugin.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACMA,QAAQ,cAAc,IAAI,YAAY,SAAS,GAElC,QAAQ,KAAK,GAOtB,IAAI,EAAS,EAAO,SAAS,kBAAmB,IAS5C,EAAQ,EAAO,SAAS,iBAAkB,MAM1C,EAAY,EAAO,SAAS,iBAAkB,YAM9C,EAAS,EAAO,SAAS,kBAAmB,MAC5C,EAAS,EAAO,SAAS,kBAAmB,MAC5C,EAAsB,IAAI,OAAO,EAAS,eAAiB,EAAQ,KA+BvE,SAAS,EAAc,GACnB,OAAO,EAAM,QAAQ,eAAgB,GAC7C,CAQI,SAAS,EAAoB,GAEzB,IApCc,EAoCV,EAAa,EAAc,GAG/B,GAvCc,EAuCA,EApCR,GAA0B,IAAjB,EAAM,WAGH,IAAM,EAAM,KAAK,KAAO,KAEvB,QAAS,IAAM,EAAO,MAAS,GAgC9C,OAAO,EAEX,IAAI,EA/BR,SAAyB,GACrB,MAAqB,mBAAX,EACC,EAAO,GAEX,EAAO,eAAe,GAAc,EAAO,GAAc,CACxE,CA0B+B,CAAe,GAQtC,OANA,EAAO,KAAK,iBAAkB,CAC1B,MAAO,EACP,WAAY,IAIT,gBAAkB,EAAY,8BADtB,EAAS,EAAa,GAC0C,6BAA+B,EAAmB,SACzI,CAMI,SAAS,IAEL,IACI,EACA,EACA,EAHA,EAAW,GAMf,QAAQ,KAAK,EAAO,WAAW,SAAS,GAClB,GAAd,EAAE,UAAiB,EAAE,WAAa,EAAoB,KAAK,EAAE,YAC7D,EAAS,KAAK,EAE9B,GAAW,cAGH,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,CAGtC,IAFA,EAAY,EAAS,GAAG,UAAU,QAAQ,EAAqB,GAC/D,EAAM,EAAO,IAAI,OAAO,MAAO,KAAM,GAC7B,EAAO,EAAI,WAGf,GAFA,EAAO,IAAI,YAAY,EAAM,EAAS,IAEnC,EAAW,GAAO,CACjB,IAAI,EAAO,EAAK,YAChB,EAAO,UAAU,kBAAkB,EACvD,CAGY,EAAO,IAAI,OAAO,EAAS,GACvC,CACA,CAqEI,SAAS,EAAW,GAChB,QAAmC,mBAAzB,EAAQ,eAA+B,EAAQ,aAAa,0BAI9E,CAmBI,EAAO,GAAG,aAAc,GACxB,EAAO,GAAG,QAAS,GACnB,EAAO,GAAG,oBA1CV,SAA+B,GAE3B,MAAoB,QAAb,EAAE,OAAmB,IAhDhC,WAEI,IACI,EACA,EACA,EAHA,EAAW,GAMf,QAAQ,KAAM,EAAO,WAAW,SAAS,GACnB,GAAd,EAAE,UAEe,OADF,EAAE,aAAa,2BAE1B,EAAS,KAAK,EAGlC,GAAW,cAGH,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,CAGtC,IAFA,EAAY,EAAS,GAAG,aAAa,0BACrC,EAAM,EAAO,IAAI,OAAO,MAAO,KAAM,GAC7B,EAAO,EAAI,WACf,EAAO,IAAI,YAAY,EAAM,EAAS,IAK1C,EAAO,IAAI,OAAO,EAAS,GACvC,CAEA,CAkBqD,EAErD,IAuCI,EAAO,GAAG,SAhBV,SAAqB,GACjB,IAAI,EAAS,EAAE,OAEf,IAAI,EAAW,GACX,OAAO,KAEX,IAAI,EAAQ,EAAO,aAAa,0BAChC,EAAO,KAAK,gBAAiB,CACzB,MAAO,EAAc,GACrB,OAAQ,GAEpB,IAOI,KAAK,YAlCL,SAAqB,GACjB,IAAI,EAAe,EAAmB,GACtC,EAAO,YAAY,oBAAoB,EAAO,EACtD,CAiCA","file":"/npm/tinymce-variable@0.9.2/src/plugin.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/tinymce-variable@0.9.2/src/plugin.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * plugin.js\n *\n * Copyright, Ambassify\n * Released under MIT License.\n *\n * License: https://www.ambassify.com\n * Contributing: https://www.ambassify.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.PluginManager.add('variable', function(editor) {\n\n    var VK = tinymce.util.VK;\n\n    /**\n     * Object that is used to replace the variable string to be used\n     * in the HTML view\n     * @type {object}\n     */\n    var mapper = editor.getParam(\"variable_mapper\", {});\n\n    /**\n     * define a list of variables that are allowed\n     * if the variable is not in the list it will not be automatically converterd\n     * by default no validation is done\n     * @todo  make it possible to pass in a function to be used a callback for validation\n     * @type {array}\n     */\n    var valid = editor.getParam(\"variable_valid\", null);\n\n    /**\n     * Get custom variable class name\n     * @type {string}\n     */\n    var className = editor.getParam(\"variable_class\", \"variable\");\n\n    /**\n     * Prefix and suffix to use to mark a variable\n     * @type {string}\n     */\n    var prefix = editor.getParam(\"variable_prefix\", \"{{\");\n    var suffix = editor.getParam(\"variable_suffix\", \"}}\");\n    var stringVariableRegex = new RegExp(prefix + '([a-z. _]*)?' + suffix, 'g');\n\n    /**\n     * check if a certain variable is valid\n     * @param {string} name\n     * @return {bool}\n     */\n    function isValid( name )\n    {\n\n        if( ! valid || valid.length === 0 )\n            return true;\n\n        var validString = '|' + valid.join('|') + '|';\n\n        return validString.indexOf( '|' + name + '|' ) > -1 ? true : false;\n    }\n\n    function getMappedValue( cleanValue ) {\n        if(typeof mapper === 'function')\n            return mapper(cleanValue);\n\n        return mapper.hasOwnProperty(cleanValue) ? mapper[cleanValue] : cleanValue;\n    }\n\n    /**\n     * Strip variable to keep the plain variable string\n     * @example \"{test}\" => \"test\"\n     * @param {string} value\n     * @return {string}\n     */\n    function cleanVariable(value) {\n        return value.replace(/[^a-zA-Z._]/g, \"\");\n    }\n\n    /**\n     * convert a text variable \"x\" to a span with the needed\n     * attributes to style it with CSS\n     * @param  {string} value\n     * @return {string}\n     */\n    function createHTMLVariable( value ) {\n\n        var cleanValue = cleanVariable(value);\n\n        // check if variable is valid\n        if( ! isValid(cleanValue) )\n            return value;\n\n        var cleanMappedValue = getMappedValue(cleanValue);\n\n        editor.fire('variableToHTML', {\n            value: value,\n            cleanValue: cleanValue\n        });\n\n        var variable = prefix + cleanValue + suffix;\n        return '<span class=\"' + className + '\" data-original-variable=\"' + variable + '\" contenteditable=\"false\">' + cleanMappedValue + '</span>';\n    }\n\n    /**\n     * convert variable strings into html elements\n     * @return {void}\n     */\n    function stringToHTML()\n    {\n        var nodeList = [],\n            nodeValue,\n            node,\n            div;\n\n        // find nodes that contain a string variable\n        tinymce.walk(editor.getBody(), function(n) {\n            if (n.nodeType == 3 && n.nodeValue && stringVariableRegex.test(n.nodeValue)) {\n                nodeList.push(n);\n            }\n        }, 'childNodes');\n\n        // loop over all nodes that contain a string variable\n        for (var i = 0; i < nodeList.length; i++) {\n            nodeValue = nodeList[i].nodeValue.replace(stringVariableRegex, createHTMLVariable);\n            div = editor.dom.create('div', null, nodeValue);\n            while ((node = div.lastChild)) {\n                editor.dom.insertAfter(node, nodeList[i]);\n\n                if(isVariable(node)) {\n                    var next = node.nextSibling;\n                    editor.selection.setCursorLocation(next);\n                }\n            }\n\n            editor.dom.remove(nodeList[i]);\n        }\n    }\n\n    /**\n     * convert HTML variables back into their original string format\n     * for example when a user opens source view\n     * @return {void}\n     */\n    function htmlToString()\n    {\n        var nodeList = [],\n            nodeValue,\n            node,\n            div;\n\n            // find nodes that contain a HTML variable\n        tinymce.walk( editor.getBody(), function(n) {\n            if (n.nodeType == 1) {\n                var original = n.getAttribute('data-original-variable');\n                if (original !== null) {\n                    nodeList.push(n);\n                }\n            }\n        }, 'childNodes');\n\n        // loop over all nodes that contain a HTML variable\n        for (var i = 0; i < nodeList.length; i++) {\n            nodeValue = nodeList[i].getAttribute('data-original-variable');\n            div = editor.dom.create('div', null, nodeValue);\n            while ((node = div.lastChild)) {\n                editor.dom.insertAfter(node, nodeList[i]);\n            }\n\n            // remove HTML variable node\n            // because we now have an text representation of the variable\n            editor.dom.remove(nodeList[i]);\n        }\n\n    }\n\n    function setCursor(selector) {\n        var ell = editor.dom.select(selector)[0];\n        if(ell) {\n            var next = ell.nextSibling;\n            editor.selection.setCursorLocation(next);\n        }\n    }\n\n    /**\n     * handle formatting the content of the editor based on\n     * the current format. For example if a user switches to source view and back\n     * @param  {object} e\n     * @return {void}\n     */\n    function handleContentRerender(e) {\n        // store cursor location\n        return e.format === 'raw' ? stringToHTML() : htmlToString();\n        // restore cursor location\n    }\n\n    /**\n     * insert a variable into the editor at the current cursor location\n     * @param {string} value\n     * @return {void}\n     */\n    function addVariable(value) {\n        var htmlVariable = createHTMLVariable(value);\n        editor.execCommand('mceInsertContent', false, htmlVariable);\n    }\n\n    function isVariable(element) {\n        if(typeof element.getAttribute === 'function' && element.hasAttribute('data-original-variable'))\n            return true;\n\n        return false;\n    }\n\n    /**\n     * Trigger special event when user clicks on a variable\n     * @return {void}\n     */\n    function handleClick(e) {\n        var target = e.target;\n\n        if(!isVariable(target))\n            return null;\n\n        var value = target.getAttribute('data-original-variable');\n        editor.fire('variableClick', {\n            value: cleanVariable(value),\n            target: target\n        });\n    }\n\n    editor.on('nodechange', stringToHTML );\n    editor.on('keyup', stringToHTML );\n    editor.on('beforegetcontent', handleContentRerender);\n    editor.on('click', handleClick);\n\n    this.addVariable = addVariable;\n\n});\n"]}