From dc4a96a15fcf2512058a0d4d104d4c0c752ffbb3 Mon Sep 17 00:00:00 2001 From: Stephan Robotta Date: Tue, 26 Sep 2023 08:41:48 +0200 Subject: [PATCH] Remove the setting: fallbackspantag - It was not observed correctly (markup in the editor is still applied even if the setting was off). - Correcting the first point would have leed to no styling which is somewhat awkward when there are tags contained in the text but not marked as such (because of the setting being disabled). Therefore the tag is now the default behaviour when there is no multilang filter 2 installed. --- README.md | 4 +--- amd/build/options.min.js | 4 ++-- amd/build/options.min.js.map | 2 +- amd/build/ui.min.js | 2 +- amd/build/ui.min.js.map | 2 +- amd/src/options.js | 14 -------------- amd/src/ui.js | 8 ++------ lang/de/tiny_multilang2.php | 2 -- lang/en/tiny_multilang2.php | 2 -- lang/es/tiny_multilang2.php | 2 -- lang/fr/tiny_multilang2.php | 2 -- screenshots/admin_general.png | Bin 81719 -> 65432 bytes settings.php | 2 -- tests/behat/tiny_langfallback.feature | 1 - 14 files changed, 8 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index aac68d6..0da4587 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,6 @@ is enabled, the standard `` tags are used. If the language selection does not appear in the editor: - Check that the [multilang2 filter][1] is installed and enabled. - - If you don't use the [multilang2 filter][1], check that the setting `fallbackspantag` is active. - Check that your site has at least two languages installed. - If you don't have more than one language installed, enable the `addlanguage` option and set a few language iso codes in the `languageoptions` setting. @@ -88,8 +87,7 @@ transformed into the standard Moodle annotation is used. These are span elements and the `dir` attribute annotates whether this is a left to right language or vice versa. When loading a text, both annotations are read and translated into marked language tags in the -WYSIWYG mode, if the setting `fallbackspantag` is enabled. Otherwise, the Moodle default -span tags are ignored. If mixed annotations are used in the text, these are preserved upon +WYSIWYG mode. If mixed annotations are used in the text, these are preserved upon saving. ### Possible languages options diff --git a/amd/build/options.min.js b/amd/build/options.min.js index 4f517a9..5401d70 100644 --- a/amd/build/options.min.js +++ b/amd/build/options.min.js @@ -1,4 +1,4 @@ -define("tiny_multilang2/options",["exports","editor_tiny/options","./common"],(function(_exports,_options,_common){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.showAllLanguages=_exports.register=_exports.mlangFilterExists=_exports.isFallbackSpanTag=_exports.isContentToHighlight=_exports.isAddLanguage=_exports.getRTLLanguages=_exports.getLanguageList=_exports.getHighlightCss=void 0; +define("tiny_multilang2/options",["exports","editor_tiny/options","./common"],(function(_exports,_options,_common){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.showAllLanguages=_exports.register=_exports.mlangFilterExists=_exports.isContentToHighlight=_exports.isAddLanguage=_exports.getRTLLanguages=_exports.getLanguageList=_exports.getHighlightCss=void 0; /** * Options helper for multilang2 plugin. * @@ -8,6 +8,6 @@ define("tiny_multilang2/options",["exports","editor_tiny/options","./common"],(f * @copyright 2015 onwards Iñaki Arenaza & Mondragon Unibertsitatea * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -const languages=(0,_options.getPluginOptionName)(_common.pluginName,"languages"),mlangfilter=(0,_options.getPluginOptionName)(_common.pluginName,"mlangfilter"),fallbackspan=(0,_options.getPluginOptionName)(_common.pluginName,"fallbackspantag"),showalllangs=(0,_options.getPluginOptionName)(_common.pluginName,"showalllangs"),highlight=(0,_options.getPluginOptionName)(_common.pluginName,"highlight"),highlightcss=(0,_options.getPluginOptionName)(_common.pluginName,"css"),addlanguage=(0,_options.getPluginOptionName)(_common.pluginName,"addlanguage"),languageoptions=(0,_options.getPluginOptionName)(_common.pluginName,"optionlanguages");_exports.register=editor=>{editor.options.register(languages,{processor:"Array",default:[]}),editor.options.register(mlangfilter,{processor:"boolean",default:!1}),editor.options.register(showalllangs,{processor:"boolean",default:!1}),editor.options.register(fallbackspan,{processor:"boolean",default:!1}),editor.options.register(highlight,{processor:"boolean",default:!1}),editor.options.register(highlightcss,{processor:"string",default:""}),editor.options.register(addlanguage,{processor:"boolean",default:!1}),editor.options.register(languageoptions,{processor:"Array",default:[]})};_exports.getLanguageList=editor=>editor.options.get(languages);_exports.mlangFilterExists=editor=>editor.options.get(mlangfilter);_exports.showAllLanguages=editor=>editor.options.get(showalllangs);_exports.isFallbackSpanTag=editor=>editor.options.get(fallbackspan);_exports.isContentToHighlight=editor=>editor.options.get(highlight);_exports.getHighlightCss=editor=>editor.options.get(highlightcss);_exports.isAddLanguage=editor=>editor.options.get(addlanguage);_exports.getRTLLanguages=()=>["ar","az","dv","he","ku","fa","ur"]})); +const languages=(0,_options.getPluginOptionName)(_common.pluginName,"languages"),mlangfilter=(0,_options.getPluginOptionName)(_common.pluginName,"mlangfilter"),showalllangs=(0,_options.getPluginOptionName)(_common.pluginName,"showalllangs"),highlight=(0,_options.getPluginOptionName)(_common.pluginName,"highlight"),highlightcss=(0,_options.getPluginOptionName)(_common.pluginName,"css"),addlanguage=(0,_options.getPluginOptionName)(_common.pluginName,"addlanguage"),languageoptions=(0,_options.getPluginOptionName)(_common.pluginName,"optionlanguages");_exports.register=editor=>{editor.options.register(languages,{processor:"Array",default:[]}),editor.options.register(mlangfilter,{processor:"boolean",default:!1}),editor.options.register(showalllangs,{processor:"boolean",default:!1}),editor.options.register(highlight,{processor:"boolean",default:!1}),editor.options.register(highlightcss,{processor:"string",default:""}),editor.options.register(addlanguage,{processor:"boolean",default:!1}),editor.options.register(languageoptions,{processor:"Array",default:[]})};_exports.getLanguageList=editor=>editor.options.get(languages);_exports.mlangFilterExists=editor=>editor.options.get(mlangfilter);_exports.showAllLanguages=editor=>editor.options.get(showalllangs);_exports.isContentToHighlight=editor=>editor.options.get(highlight);_exports.getHighlightCss=editor=>editor.options.get(highlightcss);_exports.isAddLanguage=editor=>editor.options.get(addlanguage);_exports.getRTLLanguages=()=>["ar","az","dv","he","ku","fa","ur"]})); //# sourceMappingURL=options.min.js.map \ No newline at end of file diff --git a/amd/build/options.min.js.map b/amd/build/options.min.js.map index 04fdc92..4ccbd86 100644 --- a/amd/build/options.min.js.map +++ b/amd/build/options.min.js.map @@ -1 +1 @@ -{"version":3,"file":"options.min.js","sources":["../src/options.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Options helper for multilang2 plugin.\n *\n * @module tiny_multilang2\n * @author Iñaki Arenaza \n * @author Stephan Robotta \n * @copyright 2015 onwards Iñaki Arenaza & Mondragon Unibertsitatea\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {getPluginOptionName} from 'editor_tiny/options';\nimport {pluginName} from './common';\n\nconst languages = getPluginOptionName(pluginName, 'languages');\nconst mlangfilter = getPluginOptionName(pluginName, 'mlangfilter');\nconst fallbackspan = getPluginOptionName(pluginName, 'fallbackspantag');\nconst showalllangs = getPluginOptionName(pluginName, 'showalllangs');\nconst highlight = getPluginOptionName(pluginName, 'highlight');\nconst highlightcss = getPluginOptionName(pluginName, 'css');\nconst addlanguage = getPluginOptionName(pluginName, 'addlanguage');\nconst languageoptions = getPluginOptionName(pluginName, 'optionlanguages');\n\n/**\n * Register the options for the Tiny Equation plugin.\n *\n * @param {tinymce.Editor} editor\n */\nexport const register = (editor) => {\n editor.options.register(languages, {\n processor: 'Array',\n \"default\": [],\n });\n\n editor.options.register(mlangfilter, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(showalllangs, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(fallbackspan, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(highlight, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(highlightcss, {\n processor: 'string',\n \"default\": '',\n });\n\n editor.options.register(addlanguage, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(languageoptions, {\n processor: 'Array',\n \"default\": [],\n });\n};\n\n/**\n * Get the list of languages that are used for the translation button/menu item.\n *\n * @param {tinymce.Editor} editor\n * @returns {Array}\n */\nexport const getLanguageList = (editor) => editor.options.get(languages);\n\n/**\n * Get the information whether the multilang2 filter is installed or not.\n * @param {tinymce.Editor} editor\n * @return {boolean}\n */\nexport const mlangFilterExists = (editor) => editor.options.get(mlangfilter);\n\n/**\n * Get the option whether to show all languages or not.\n *\n * @param {tinymce.Editor} editor\n * @returns {boolean}\n */\nexport const showAllLanguages = (editor) => editor.options.get(showalllangs);\n\n/**\n * Get the defined option whether the classic are supported as well.\n *\n * @param {tinymce.Editor} editor\n * @returns {boolean}\n */\nexport const isFallbackSpanTag = (editor) => editor.options.get(fallbackspan);\n\n/**\n * Get the defined option whether to highlight the language dependent content blocks.\n *\n * @param {tinymce.Editor} editor\n * @returns {boolean}\n */\nexport const isContentToHighlight = (editor) => editor.options.get(highlight);\n\n/**\n * Get the highlight css in case the language dependent block are supposed to be emphasized.\n *\n * @param {tinymce.Editor} editor\n * @returns {string}\n */\nexport const getHighlightCss = (editor) => editor.options.get(highlightcss);\n\n/**\n * Get the defined option whether to add language manually.\n *\n * @param {tinymce.Editor} editor\n * @returns {boolean}\n */\nexport const isAddLanguage = (editor) => editor.options.get(addlanguage);\n\n/**\n * Returns an array of all the languages that have the direction right to left (RTL).\n *\n * @returns {string[]} An array of language codes representing RTL languages.\n */\nexport const getRTLLanguages = () => ['ar', 'az', 'dv', 'he', 'ku', 'fa', 'ur'];\n"],"names":["languages","pluginName","mlangfilter","fallbackspan","showalllangs","highlight","highlightcss","addlanguage","languageoptions","editor","options","register","processor","get"],"mappings":";;;;;;;;;;MA4BMA,WAAY,gCAAoBC,mBAAY,aAC5CC,aAAc,gCAAoBD,mBAAY,eAC9CE,cAAe,gCAAoBF,mBAAY,mBAC/CG,cAAe,gCAAoBH,mBAAY,gBAC/CI,WAAY,gCAAoBJ,mBAAY,aAC5CK,cAAe,gCAAoBL,mBAAY,OAC/CM,aAAc,gCAAoBN,mBAAY,eAC9CO,iBAAkB,gCAAoBP,mBAAY,qCAO/BQ,SACrBA,OAAOC,QAAQC,SAASX,UAAW,CAC/BY,UAAW,gBACA,KAGfH,OAAOC,QAAQC,SAAST,YAAa,CACjCU,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASP,aAAc,CAClCQ,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASR,aAAc,CAClCS,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASN,UAAW,CAC/BO,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASL,aAAc,CAClCM,UAAW,iBACD,KAGdH,OAAOC,QAAQC,SAASJ,YAAa,CACjCK,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASH,gBAAiB,CACrCI,UAAW,gBACA,+BAUaH,QAAWA,OAAOC,QAAQG,IAAIb,sCAO5BS,QAAWA,OAAOC,QAAQG,IAAIX,uCAQ/BO,QAAWA,OAAOC,QAAQG,IAAIT,yCAQ7BK,QAAWA,OAAOC,QAAQG,IAAIV,4CAQ3BM,QAAWA,OAAOC,QAAQG,IAAIR,oCAQnCI,QAAWA,OAAOC,QAAQG,IAAIP,qCAQhCG,QAAWA,OAAOC,QAAQG,IAAIN,sCAO7B,IAAM,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM"} \ No newline at end of file +{"version":3,"file":"options.min.js","sources":["../src/options.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Options helper for multilang2 plugin.\n *\n * @module tiny_multilang2\n * @author Iñaki Arenaza \n * @author Stephan Robotta \n * @copyright 2015 onwards Iñaki Arenaza & Mondragon Unibertsitatea\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {getPluginOptionName} from 'editor_tiny/options';\nimport {pluginName} from './common';\n\nconst languages = getPluginOptionName(pluginName, 'languages');\nconst mlangfilter = getPluginOptionName(pluginName, 'mlangfilter');\nconst showalllangs = getPluginOptionName(pluginName, 'showalllangs');\nconst highlight = getPluginOptionName(pluginName, 'highlight');\nconst highlightcss = getPluginOptionName(pluginName, 'css');\nconst addlanguage = getPluginOptionName(pluginName, 'addlanguage');\nconst languageoptions = getPluginOptionName(pluginName, 'optionlanguages');\n\n/**\n * Register the options for the Tiny Equation plugin.\n *\n * @param {tinymce.Editor} editor\n */\nexport const register = (editor) => {\n editor.options.register(languages, {\n processor: 'Array',\n \"default\": [],\n });\n\n editor.options.register(mlangfilter, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(showalllangs, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(highlight, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(highlightcss, {\n processor: 'string',\n \"default\": '',\n });\n\n editor.options.register(addlanguage, {\n processor: 'boolean',\n \"default\": false,\n });\n\n editor.options.register(languageoptions, {\n processor: 'Array',\n \"default\": [],\n });\n};\n\n/**\n * Get the list of languages that are used for the translation button/menu item.\n *\n * @param {tinymce.Editor} editor\n * @returns {Array}\n */\nexport const getLanguageList = (editor) => editor.options.get(languages);\n\n/**\n * Get the information whether the multilang2 filter is installed or not.\n * @param {tinymce.Editor} editor\n * @return {boolean}\n */\nexport const mlangFilterExists = (editor) => editor.options.get(mlangfilter);\n\n/**\n * Get the option whether to show all languages or not.\n *\n * @param {tinymce.Editor} editor\n * @returns {boolean}\n */\nexport const showAllLanguages = (editor) => editor.options.get(showalllangs);\n\n/**\n * Get the defined option whether to highlight the language dependent content blocks.\n *\n * @param {tinymce.Editor} editor\n * @returns {boolean}\n */\nexport const isContentToHighlight = (editor) => editor.options.get(highlight);\n\n/**\n * Get the highlight css in case the language dependent block are supposed to be emphasized.\n *\n * @param {tinymce.Editor} editor\n * @returns {string}\n */\nexport const getHighlightCss = (editor) => editor.options.get(highlightcss);\n\n/**\n * Get the defined option whether to add language manually.\n *\n * @param {tinymce.Editor} editor\n * @returns {boolean}\n */\nexport const isAddLanguage = (editor) => editor.options.get(addlanguage);\n\n/**\n * Returns an array of all the languages that have the direction right to left (RTL).\n *\n * @returns {string[]} An array of language codes representing RTL languages.\n */\nexport const getRTLLanguages = () => ['ar', 'az', 'dv', 'he', 'ku', 'fa', 'ur'];\n"],"names":["languages","pluginName","mlangfilter","showalllangs","highlight","highlightcss","addlanguage","languageoptions","editor","options","register","processor","get"],"mappings":";;;;;;;;;;MA4BMA,WAAY,gCAAoBC,mBAAY,aAC5CC,aAAc,gCAAoBD,mBAAY,eAC9CE,cAAe,gCAAoBF,mBAAY,gBAC/CG,WAAY,gCAAoBH,mBAAY,aAC5CI,cAAe,gCAAoBJ,mBAAY,OAC/CK,aAAc,gCAAoBL,mBAAY,eAC9CM,iBAAkB,gCAAoBN,mBAAY,qCAO/BO,SACrBA,OAAOC,QAAQC,SAASV,UAAW,CAC/BW,UAAW,gBACA,KAGfH,OAAOC,QAAQC,SAASR,YAAa,CACjCS,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASP,aAAc,CAClCQ,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASN,UAAW,CAC/BO,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASL,aAAc,CAClCM,UAAW,iBACD,KAGdH,OAAOC,QAAQC,SAASJ,YAAa,CACjCK,UAAW,mBACA,IAGfH,OAAOC,QAAQC,SAASH,gBAAiB,CACrCI,UAAW,gBACA,+BAUaH,QAAWA,OAAOC,QAAQG,IAAIZ,sCAO5BQ,QAAWA,OAAOC,QAAQG,IAAIV,uCAQ/BM,QAAWA,OAAOC,QAAQG,IAAIT,4CAQ1BK,QAAWA,OAAOC,QAAQG,IAAIR,oCAQnCI,QAAWA,OAAOC,QAAQG,IAAIP,qCAQhCG,QAAWA,OAAOC,QAAQG,IAAIN,sCAO7B,IAAM,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM"} \ No newline at end of file diff --git a/amd/build/ui.min.js b/amd/build/ui.min.js index eef2b71..c3c3298 100644 --- a/amd/build/ui.min.js +++ b/amd/build/ui.min.js @@ -9,6 +9,6 @@ define("tiny_multilang2/ui",["exports","./options"],(function(_exports,_options2 * @copyright 2015 onwards Iñaki Arenaza & Mondragon Unibertsitatea * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -const spanClass="multilang-begin mceNonEditable",spanFixedAttrs='{mlang %lang}',spanMultilangEnd=spanFixedAttrs.replace("begin","end")+">{mlang}",isNull=a=>null==a;let _isSubmit=!1;const _options={},addVisualStyling=function(ed){let content=ed.getContent();if(-1!==content.indexOf(spanClass))return content;if(content=content.replace(new RegExp("{\\s*mlang\\s+([^}]+?)\\s*}","ig"),(function(match,p1){return spanMultilangBegin.replace(new RegExp("%lang","g"),p1)})),content=content.replace(new RegExp("{\\s*mlang\\s*}","ig"),spanMultilangEnd),(0,_options2.mlangFilterExists)(ed)&&!(0,_options2.isFallbackSpanTag)(ed))return content;const doc=(new DOMParser).parseFromString(content,"text/html");if(0===doc.children.length)return content;const nodes=doc.querySelectorAll("span.multilang");if(0===nodes.length)return content;for(const span of nodes){const newSpan=spanMultilangBegin.replace(new RegExp("%lang","g"),span.getAttribute("lang")).replace("mceNonEditable","mceNonEditable fallback")+span.innerHTML+spanMultilangEnd.replace("mceNonEditable","mceNonEditable fallback");span.insertAdjacentHTML("afterend",newSpan),span.remove()}return doc.getElementsByTagName("body")[0].innerHTML},removeVisualStyling=function(ed){["begin","end"].forEach((function(t){for(const span of ed.dom.select("span.multilang-"+t))if("begin"===t&&span.classList.contains("fallback")){let innerHTML="",end=span,toRemove=[];for(;end&&(end=end.nextSibling,!isNull(end));){if(!isNull(end.classList)&&end.classList.contains("multilang-end")){toRemove.push(end);break}3===end.nodeType?innerHTML+=end.nodeValue:1===end.nodeType&&(innerHTML+=end.outerHTML),toRemove.push(end)}if(!isNull(end)){const lang=span.innerHTML.match(new RegExp("{\\s*mlang\\s+([^}]+?)\\s*}","i")),rtlLanguages=(0,_options2.getRTLLanguages)();if(lang){const langCode=lang[1],dir=rtlLanguages.includes(langCode)?"rtl":"ltr",newHTML=''+innerHTML+"";for(end of(ed.dom.setOuterHTML(span,newHTML),toRemove))ed.dom.remove(end)}}}else ed.dom.setOuterHTML(span,span.innerHTML.toLowerCase())}))},getHighlightNodeFromSelect=function(ed,search){let span;return ed.dom.getParents(ed.selection.getStart(),(elm=>{if(!isNull(elm.classList)){const pair="begin"===search?"end":"begin";if(elm.classList.contains("multilang-"+pair)){span=elm;do{span="begin"===search?span.previousSibling:span.nextSibling}while(!isNull(span)&&(isNull(span.classList)||!span.classList.contains("multilang-"+search)))}else elm.classList.contains("multilang-"+search)&&(span=elm)}})),span},hideContentToolbar=function(el){for(;!isNull(el);){if(el.nodeType===Node.ELEMENT_NODE&&!isNull(el.getAttribute("class"))&&-1!=el.getAttribute("class").indexOf("tox-pop-"))return void(el.style.display="none");el=el.parentNode}};_exports.onInit=function(ed,options){Object.keys(options).forEach((function(key){_options[key]=options[key]})),ed.setContent(addVisualStyling(ed)),(0,_options2.isContentToHighlight)(ed)&&ed.dom.addStyle((0,_options2.getHighlightCss)(ed))};_exports.onBeforeGetContent=function(ed,content){if(!isNull(content.source_view)&&!0===content.source_view){var onClose=function(ed){ed.off("close",onClose),ed.setContent(addVisualStyling(ed))};ed.on("CloseWindow",(()=>{onClose(ed)})),removeVisualStyling(ed)}};_exports.onFocus=function(ed){_isSubmit&&(ed.setContent(addVisualStyling(ed),{no_events:!0}),_isSubmit=!1)};_exports.onSubmit=function(ed){removeVisualStyling(ed),_isSubmit=!0};_exports.onDelete=function(ed,event){if(event.isComposing||isNull(event.clientX)&&46!==event.keyCode&&8!==event.keyCode)return;if(!isNull(event.clientX)&&(event.target.nodeType!==Node.ELEMENT_NODE||"path"!==event.target.nodeName&&"svg"!==event.target.nodeName))return;const begin=getHighlightNodeFromSelect(ed,"begin"),end=getHighlightNodeFromSelect(ed,"end");isNull(begin)||isNull(end)||(event.preventDefault(),ed.dom.remove(begin),ed.dom.remove(end),isNull(event.clientX)||hideContentToolbar(event.target))};_exports.applyLanguage=function(ed,iso,event){if(isNull(iso))return;if("remove"===iso){return void ed.contentDocument.body.querySelectorAll(".multilang-begin, .multilang-end").forEach((element=>{ed.dom.remove(element)}))}const regexLang=/%lang/g;let text=ed.selection.getContent();if(""===text.toString().replace(/^\s+/,"").replace(/\s+$/,"")){if(!isNull(event))return void hideContentToolbar(event.target);let newtext=spanMultilangBegin.replace(regexLang,iso)+" "+spanMultilangEnd;return(0,_options2.mlangFilterExists)(ed)||(newtext=newtext.replaceAll("mceNonEditable","mceNonEditable fallback")),void ed.insertContent(newtext)}isNull(event)||hideContentToolbar(event.target);const span=getHighlightNodeFromSelect(ed,"begin");if(!isNull(span)){let replacement=spanMultilangBegin.replace(regexLang,iso);return span.classList.contains("fallback")&&(replacement=replacement.replace("mceNonEditable","mceNonEditable fallback")),void ed.dom.setOuterHTML(span,replacement)}if(-1!==text.indexOf("multilang-begin")||-1!==text.indexOf("multilang-end"))return void ed.notificationManager.open({text:_options.langInSelectionErrMsg,type:"error"});const block=function(text){let result={el:null,cnt:0};const body=(new DOMParser).parseFromString(text,"text/html").body;if(body.firstChild.nodeType!==Node.ELEMENT_NODE)return result;const blockTags=["address","article","aside","blockquote","dd","div","dl","dt","figcaption","h1","h2","h3","h4","h5","h6","li","ol","p","pre","section","tfoot","ul"];for(let i=0;i{mlang %lang}',spanMultilangEnd=spanFixedAttrs.replace("begin","end")+">{mlang}",isNull=a=>null==a;let _isSubmit=!1;const _options={},addVisualStyling=function(ed){let content=ed.getContent();if(-1!==content.indexOf(spanClass))return content;content=content.replace(new RegExp("{\\s*mlang\\s+([^}]+?)\\s*}","ig"),(function(match,p1){return spanMultilangBegin.replace(new RegExp("%lang","g"),p1)})),content=content.replace(new RegExp("{\\s*mlang\\s*}","ig"),spanMultilangEnd);const doc=(new DOMParser).parseFromString(content,"text/html");if(0===doc.children.length)return content;const nodes=doc.querySelectorAll("span.multilang");if(0===nodes.length)return content;for(const span of nodes){const newSpan=spanMultilangBegin.replace(new RegExp("%lang","g"),span.getAttribute("lang")).replace("mceNonEditable","mceNonEditable fallback")+span.innerHTML+spanMultilangEnd.replace("mceNonEditable","mceNonEditable fallback");span.insertAdjacentHTML("afterend",newSpan),span.remove()}return doc.getElementsByTagName("body")[0].innerHTML},removeVisualStyling=function(ed){["begin","end"].forEach((function(t){for(const span of ed.dom.select("span.multilang-"+t))if("begin"===t&&span.classList.contains("fallback")){let innerHTML="",end=span,toRemove=[];for(;end&&(end=end.nextSibling,!isNull(end));){if(!isNull(end.classList)&&end.classList.contains("multilang-end")){toRemove.push(end);break}3===end.nodeType?innerHTML+=end.nodeValue:1===end.nodeType&&(innerHTML+=end.outerHTML),toRemove.push(end)}if(!isNull(end)){const lang=span.innerHTML.match(new RegExp("{\\s*mlang\\s+([^}]+?)\\s*}","i")),rtlLanguages=(0,_options2.getRTLLanguages)();if(lang){const langCode=lang[1],dir=rtlLanguages.includes(langCode)?"rtl":"ltr",newHTML=''+innerHTML+"";for(end of(ed.dom.setOuterHTML(span,newHTML),toRemove))ed.dom.remove(end)}}}else ed.dom.setOuterHTML(span,span.innerHTML.toLowerCase())}))},getHighlightNodeFromSelect=function(ed,search){let span;return ed.dom.getParents(ed.selection.getStart(),(elm=>{if(!isNull(elm.classList)){const pair="begin"===search?"end":"begin";if(elm.classList.contains("multilang-"+pair)){span=elm;do{span="begin"===search?span.previousSibling:span.nextSibling}while(!isNull(span)&&(isNull(span.classList)||!span.classList.contains("multilang-"+search)))}else elm.classList.contains("multilang-"+search)&&(span=elm)}})),span},hideContentToolbar=function(el){for(;!isNull(el);){if(el.nodeType===Node.ELEMENT_NODE&&!isNull(el.getAttribute("class"))&&-1!=el.getAttribute("class").indexOf("tox-pop-"))return void(el.style.display="none");el=el.parentNode}};_exports.onInit=function(ed,options){Object.keys(options).forEach((function(key){_options[key]=options[key]})),ed.setContent(addVisualStyling(ed)),(0,_options2.isContentToHighlight)(ed)&&ed.dom.addStyle((0,_options2.getHighlightCss)(ed))};_exports.onBeforeGetContent=function(ed,content){if(!isNull(content.source_view)&&!0===content.source_view){var onClose=function(ed){ed.off("close",onClose),ed.setContent(addVisualStyling(ed))};ed.on("CloseWindow",(()=>{onClose(ed)})),removeVisualStyling(ed)}};_exports.onFocus=function(ed){_isSubmit&&(ed.setContent(addVisualStyling(ed),{no_events:!0}),_isSubmit=!1)};_exports.onSubmit=function(ed){removeVisualStyling(ed),_isSubmit=!0};_exports.onDelete=function(ed,event){if(event.isComposing||isNull(event.clientX)&&46!==event.keyCode&&8!==event.keyCode)return;if(!isNull(event.clientX)&&(event.target.nodeType!==Node.ELEMENT_NODE||"path"!==event.target.nodeName&&"svg"!==event.target.nodeName))return;const begin=getHighlightNodeFromSelect(ed,"begin"),end=getHighlightNodeFromSelect(ed,"end");isNull(begin)||isNull(end)||(event.preventDefault(),ed.dom.remove(begin),ed.dom.remove(end),isNull(event.clientX)||hideContentToolbar(event.target))};_exports.applyLanguage=function(ed,iso,event){if(isNull(iso))return;if("remove"===iso){return void ed.contentDocument.body.querySelectorAll(".multilang-begin, .multilang-end").forEach((element=>{ed.dom.remove(element)}))}const regexLang=/%lang/g;let text=ed.selection.getContent();if(""===text.toString().replace(/^\s+/,"").replace(/\s+$/,"")){if(!isNull(event))return void hideContentToolbar(event.target);let newtext=spanMultilangBegin.replace(regexLang,iso)+" "+spanMultilangEnd;return(0,_options2.mlangFilterExists)(ed)||(newtext=newtext.replaceAll("mceNonEditable","mceNonEditable fallback")),void ed.insertContent(newtext)}isNull(event)||hideContentToolbar(event.target);const span=getHighlightNodeFromSelect(ed,"begin");if(!isNull(span)){let replacement=spanMultilangBegin.replace(regexLang,iso);return span.classList.contains("fallback")&&(replacement=replacement.replace("mceNonEditable","mceNonEditable fallback")),void ed.dom.setOuterHTML(span,replacement)}if(-1!==text.indexOf("multilang-begin")||-1!==text.indexOf("multilang-end"))return void ed.notificationManager.open({text:_options.langInSelectionErrMsg,type:"error"});const block=function(text){let result={el:null,cnt:0};const body=(new DOMParser).parseFromString(text,"text/html").body;if(body.firstChild.nodeType!==Node.ELEMENT_NODE)return result;const blockTags=["address","article","aside","blockquote","dd","div","dl","dt","figcaption","h1","h2","h3","h4","h5","h6","li","ol","p","pre","section","tfoot","ul"];for(let i=0;i.\n\n/**\n * Commands for the plugin logic of the Moodle tiny_multilang2 plugin.\n *\n * @module tiny_multilang2\n * @author Iñaki Arenaza \n * @author Stephan Robotta \n * @author Tai Le Tan \n * @copyright 2015 onwards Iñaki Arenaza & Mondragon Unibertsitatea\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {getHighlightCss, isContentToHighlight, mlangFilterExists, isFallbackSpanTag, getRTLLanguages} from './options';\n\n// This class inside a identified the {mlang} tag that is encapsulated in a span.\nconst spanClass = 'multilang-begin mceNonEditable';\n// This is the element with the data attribute.\nconst spanFixedAttrs = '{mlang %lang}';\n// The end span doesn't need information about the used language.\nconst spanMultilangEnd = spanFixedAttrs.replace('begin', 'end') + '>{mlang}';\n// Helper functions\nconst trim = v => v.toString().replace(/^\\s+/, '').replace(/\\s+$/, '');\nconst isNull = a => a === null || a === undefined;\n\n/**\n * Marker to remember that the submit button was hit.\n * @type {boolean}\n * @private\n */\nlet _isSubmit = false;\n\n/**\n * @type {object}\n * @private\n */\nconst _options = {};\n\n/**\n * Convert {mlang xx} and {mlang} strings to spans, so we can style them visually.\n * Remove superflous whitespace while at it.\n * @param {tinymce.Editor} ed\n * @return {string}\n */\nconst addVisualStyling = function(ed) {\n\n let content = ed.getContent();\n\n // Do not use a variable whether text is already highlighted, do a check for the existing class\n // because this is safe for many tiny element windows at one page.\n if (content.indexOf(spanClass) !== -1) {\n return content;\n }\n\n // First look for any {mlang} tags in the content string and do a preg_replace with the corresponding\n // tag that encapsulated the {mlang} tag so that the {mlang} is highlighted.\n content = content.replace(new RegExp('{\\\\s*mlang\\\\s+([^}]+?)\\\\s*}', 'ig'), function(match, p1) {\n return spanMultilangBegin.replace(new RegExp('%lang', 'g'), p1);\n });\n content = content.replace(new RegExp('{\\\\s*mlang\\\\s*}', 'ig'), spanMultilangEnd);\n\n // If we have the multilang2 filter installed and wish not to check for the traditional\n // tags, then we are done here.\n if (mlangFilterExists(ed) && !isFallbackSpanTag(ed)) {\n return content;\n }\n // Any tag must be replaced with a {mlang XX}\n // and the corresponding closing must be replaced by {mlang}.\n // To handle this, we must convert the string into a DOMDocument so that any span.multilang tag can be searched\n // and replaced.\n const dom = new DOMParser();\n const doc = dom.parseFromString(content, 'text/html');\n if (doc.children.length === 0) { // Should not happen, but anyway, keep the check.\n return content;\n }\n const nodes = doc.querySelectorAll('span.multilang');\n if (nodes.length === 0) {\n return content;\n }\n for (const span of nodes) {\n const newSpan = spanMultilangBegin\n .replace(new RegExp('%lang', 'g'), span.getAttribute('lang'))\n .replace('mceNonEditable', 'mceNonEditable fallback')\n + span.innerHTML\n + spanMultilangEnd\n .replace('mceNonEditable', 'mceNonEditable fallback');\n // Insert the replacement string after the span tag itself by converting it into a html fragment.\n span.insertAdjacentHTML('afterend', newSpan);\n // Once the new tags are placed at the correct position, we can remove the original span tag.\n span.remove();\n }\n // Convert the DOMDocument into a string again.\n return doc.getElementsByTagName('body')[0].innerHTML;\n};\n\n/**\n * Remove the spans we added in _add_visual_styling() to leave only the {mlang xx} and {mlang} tags.\n * Also make sure we lowercase the multilang 'tags'\n * @param {tinymce.Editor} ed\n */\nconst removeVisualStyling = function(ed) {\n ['begin', 'end'].forEach(function(t) {\n for (const span of ed.dom.select('span.multilang-' + t)) {\n if (t === 'begin' && span.classList.contains('fallback')) {\n // This placeholder tag was created from an oldstyle tag.\n let innerHTML = '';\n let end = span;\n let toRemove = [];\n // Search the corresponding closing tag.\n while (end) {\n end = end.nextSibling;\n if (isNull(end)) { // Got a parent that does not exist. Stop here.\n break;\n }\n if (!isNull(end.classList) && end.classList.contains('multilang-end')) {\n // We found the multilang-end node, that needs to be removed, and also, we can stop here.\n toRemove.push(end);\n break;\n }\n // Sibling inside the tags need to be preserved, but moved to the innerHTML of the real\n // span tag. Therefore, collect the node content as string and remember the real nodes\n // to remove them later.\n if (end.nodeType === 3) {\n innerHTML += end.nodeValue;\n } else if (end.nodeType === 1) {\n innerHTML += end.outerHTML;\n }\n toRemove.push(end);\n }\n if (!isNull(end)) {\n // Extract the language from the {mlang XX} tag.\n const lang = span.innerHTML.match(new RegExp('{\\\\s*mlang\\\\s+([^}]+?)\\\\s*}', 'i'));\n // Right to left default languages.\n const rtlLanguages = getRTLLanguages();\n if (lang) {\n const langCode = lang[1];\n // Add dir=\"rtl\" to the html tag any time the overall document direction is right-to-left.\n const dir = rtlLanguages.includes(langCode) ? 'rtl' : 'ltr';\n const newHTML = '' + innerHTML + '';\n ed.dom.setOuterHTML(span, newHTML);\n // And remove the other siblings.\n for (end of toRemove) {\n ed.dom.remove(end);\n }\n }\n }\n } else {\n // Normal placeholder tag, just restore the innerHTML that is {mlang XX} or {mlang}-\n ed.dom.setOuterHTML(span, span.innerHTML.toLowerCase());\n }\n }\n });\n};\n\n/**\n * At the current selection lookup for the current node. If we are inside a special span that encapsulates\n * the {lang} tag, then look for the corresponding opening or closing tag, depending on what's set in the\n * search param.\n * @param {tinymce.Editor} ed\n * @param {string} search\n * @return {Node|null} The encapsulating span tag if found.\n */\nconst getHighlightNodeFromSelect = function(ed, search) {\n let span;\n ed.dom.getParents(ed.selection.getStart(), elm => {\n // Are we in a span that highlights the lang tag.\n if (!isNull(elm.classList)) {\n // If we are on an opening/closing lang tag, we need to search for the corresponding opening/closing tag.\n const pair = search === 'begin' ? 'end' : 'begin';\n if (elm.classList.contains('multilang-' + pair)) {\n span = elm;\n do {\n // If we look for begin, go back siblings, otherwise look fnext siblings until end is found.\n span = search === 'begin' ? span.previousSibling : span.nextSibling;\n } while (!isNull(span) && (isNull(span.classList) || !span.classList.contains('multilang-' + search)));\n } else if (elm.classList.contains('multilang-' + search)) {\n // We are already on the correct tag we search for\n span = elm;\n }\n }\n });\n return span;\n};\n\n/**\n * From the given text (that is derived from a selection) we try to check if we have block elements selected and\n * in case yes, how many.\n * Return an object with:\n * el: the first block element node from the string\n * cnt: number of block elements found on the first level\n * In case the text fragment is not valid parsable HTML, then null and 0 is returned.\n * @param {string} text\n * @return {object}\n */\nconst getBlockElement = function(text) {\n let result = {el: null, cnt: 0};\n const dom = new DOMParser();\n const body = dom.parseFromString(text, 'text/html').body;\n // If the children nodes start with no block element, then just quit here.\n if (body.firstChild.nodeType !== Node.ELEMENT_NODE) {\n return result;\n }\n // These are not all block elements, we check for some only where the lang tags should be placed inside.\n const blockTags = ['address', 'article', 'aside', 'blockquote',\n 'dd', 'div', 'dl', 'dt', 'figcaption', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'li', 'ol', 'p', 'pre', 'section', 'tfoot', 'ul'];\n for (let i = 0; i < body.children.length; i++) {\n if (body.children[i].nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n if (blockTags.indexOf(body.children[i].tagName.toString().toLowerCase()) != -1) {\n result.cnt += 1;\n if (isNull(result.el)) {\n result.el = body.children[i];\n }\n }\n }\n return result;\n};\n\n/**\n * Check for the parent hierarchy elements, if there's a context toolbar container, then hide it.\n * @param {Node} el\n */\nconst hideContentToolbar = function(el) {\n while (!isNull(el)) {\n if (el.nodeType === Node.ELEMENT_NODE &&\n !isNull(el.getAttribute('class')) &&\n el.getAttribute('class').indexOf('tox-pop-') != -1\n ) {\n el.style.display = 'none';\n return;\n }\n el = el.parentNode;\n }\n};\n\n/**\n * When loading the editor for the first time, add the spans for highlighting the lang tags.\n * These are highlighted with the appropriate css only.\n * In addition pass some options to the plugin instance.\n * @param {tinymce.Editor} ed\n * @param {object} options\n */\nconst onInit = function(ed, options) {\n Object.keys(options).forEach(function(key) {\n _options[key] = options[key];\n });\n ed.setContent(addVisualStyling(ed));\n if (isContentToHighlight(ed)) {\n ed.dom.addStyle(getHighlightCss(ed));\n }\n};\n\n/**\n * When the source code view dialogue is show, we must remove the highlight spans from the editor content\n * and also add them again when the dialogue is closed.\n * @param {tinymce.Editor} ed\n * @param {object} content\n */\nconst onBeforeGetContent = function(ed, content) {\n if (!isNull(content.source_view) && content.source_view === true) {\n // If the user clicks on 'Cancel' or the close button on the html\n // source code dialog view, make sure we re-add the visual styling.\n var onClose = function(ed) {\n ed.off('close', onClose);\n ed.setContent(addVisualStyling(ed));\n };\n ed.on('CloseWindow', () => {\n onClose(ed);\n });\n removeVisualStyling(ed);\n }\n};\n\n/**\n * When the submit button is hit, the marker spans are removed. However, if there's an error\n * in saving the content (via ajax) the editor remains with the cleaned content. Therefore,\n * we need to add the marker span elements once again when the user tries to change the content\n * of the editor.\n * @param {tinymce.Editor} ed\n */\nconst onFocus = function(ed) {\n if (_isSubmit) {\n // eslint-disable-next-line camelcase\n ed.setContent(addVisualStyling(ed), {no_events: true});\n _isSubmit = false;\n }\n};\n\n/**\n * Fires when the form containing the editor is submitted. Remove all the marker span elements.\n * @param {tinymce.Editor} ed\n */\nconst onSubmit = function(ed) {\n removeVisualStyling(ed);\n _isSubmit = true;\n};\n\n/**\n * Check for key press when something is deleted. If that happens inside a highlight span\n * tag, then remove this tag and the corresponding that open/closes this lang tag.\n * @param {tinymce.Editor} ed\n * @param {Object} event\n */\nconst onDelete = function(ed, event) {\n // We are not in composing mode, have not clicked and key or was not pressed.\n if (event.isComposing || (isNull(event.clientX) && event.keyCode !== 46 && event.keyCode !== 8)) {\n return;\n }\n // In case we clicked, check that we clicked an icon (this must have been the trash icon in the context menu).\n if (!isNull(event.clientX) &&\n (event.target.nodeType !== Node.ELEMENT_NODE || (event.target.nodeName !== 'path' && event.target.nodeName !== 'svg'))) {\n return;\n }\n // Conditions match either key or was pressed, or an click on an svg icon was done.\n // Check if we are inside a span for the language tag.\n const begin = getHighlightNodeFromSelect(ed, 'begin');\n const end = getHighlightNodeFromSelect(ed, 'end');\n // Only if both, start and end tags are found, then delete the nodes here and prevent the default handling\n // because the stuff to be deleted is already gone.\n if (!isNull(begin) && !isNull(end)) {\n event.preventDefault();\n ed.dom.remove(begin);\n ed.dom.remove(end);\n if (!isNull(event.clientX)) {\n hideContentToolbar(event.target);\n }\n }\n};\n\n/**\n * The action when a language icon or menu entry is clicked. This adds the {mlang} tags at the current content\n * position or around the selection.\n * @param {tinymce.Editor} ed\n * @param {string} iso\n * @param {Event} event\n */\nconst applyLanguage = function(ed, iso, event) {\n if (isNull(iso)) {\n return;\n }\n if (iso === \"remove\") {\n const elements = ed.contentDocument.body;\n // Find all elements with the class \"multilang-begin\" or \"multilang-end\".\n const multiLangElements = elements.querySelectorAll('.multilang-begin, .multilang-end');\n multiLangElements.forEach(element => {\n ed.dom.remove(element);\n });\n return;\n }\n const regexLang = /%lang/g;\n let text = ed.selection.getContent();\n // Selection is empty, just insert the lang opening and closing tag\n // together with a space where the user may add the content.\n if (trim(text) === '') {\n // Event is set when the context menu was hit, here the editor lost the previously selected node. Therfore,\n // don't do anything.\n if (!isNull(event)) {\n hideContentToolbar(event.target);\n return;\n }\n let newtext = spanMultilangBegin.replace(regexLang, iso) + ' ' + spanMultilangEnd;\n if (!mlangFilterExists(ed)) {\n // No mlang filter, add the fallback class to the highlight spans so that these are translated\n // to the standard elements.\n newtext = newtext.replaceAll('mceNonEditable', 'mceNonEditable fallback');\n }\n ed.insertContent(newtext);\n return;\n }\n // Hide context toolbar, because at any subsequent call the node is not selected anymore.\n if (!isNull(event)) {\n hideContentToolbar(event.target);\n }\n // No matter if we have syntax highlighting enabled or not, the spans around the language tags exist\n // in the WYSIWYG mode. So check if we are on a special span that encapsulates the language tags. Search\n // for the start span tag.\n const span = getHighlightNodeFromSelect(ed, 'begin');\n // If we have a span, then it's the opening tag, and we just replace this one with the new iso.\n if (!isNull(span)) {\n let replacement = spanMultilangBegin.replace(regexLang, iso);\n if (span.classList.contains('fallback')) {\n replacement = replacement.replace('mceNonEditable', 'mceNonEditable fallback');\n }\n ed.dom.setOuterHTML(span, replacement);\n return;\n }\n // Check if we have language tags inside the selection:\n if (text.indexOf('multilang-begin') !== -1 || text.indexOf('multilang-end') !== -1) {\n ed.notificationManager.open({\n text: _options.langInSelectionErrMsg,\n type: 'error',\n });\n return;\n }\n const block = getBlockElement(text);\n if (!isNull(block.el)) {\n if (block.cnt === 1) {\n // We have a block element selected, such as a hX or p tag. Then keep this tag and place the\n // language tags inside but around the content of the block element.\n let newtext = spanMultilangBegin.replace(regexLang, iso) + block.el.innerHTML + spanMultilangEnd;\n if (!mlangFilterExists(ed)) { // No mlang filter, add the fallback class to the highlight spans.\n newtext = newtext.replaceAll('mceNonEditable', 'mceNonEditable fallback');\n }\n block.el.innerHTML = newtext;\n ed.selection.setContent(block.el.outerHTML);\n return;\n }\n if (!mlangFilterExists(ed)) {\n ed.notificationManager.open({\n text: _options.multipleBlocksErrMsg,\n type: 'error',\n });\n return;\n }\n }\n // Not inside a lang tag, insert a new opening and closing tag with the selection inside.\n let newtext = spanMultilangBegin.replace(regexLang, iso) + text + spanMultilangEnd;\n if (!mlangFilterExists(ed)) { // No mlang filter, add the fallback class to the highlight spans.\n newtext = newtext.replaceAll('mceNonEditable', 'mceNonEditable fallback');\n }\n ed.selection.setContent(newtext);\n};\n\nexport {\n onInit,\n onBeforeGetContent,\n onFocus,\n onSubmit,\n onDelete,\n applyLanguage\n};\n"],"names":["spanClass","spanFixedAttrs","spanMultilangBegin","spanMultilangEnd","replace","isNull","a","_isSubmit","_options","addVisualStyling","ed","content","getContent","indexOf","RegExp","match","p1","doc","DOMParser","parseFromString","children","length","nodes","querySelectorAll","span","newSpan","getAttribute","innerHTML","insertAdjacentHTML","remove","getElementsByTagName","removeVisualStyling","forEach","t","dom","select","classList","contains","end","toRemove","nextSibling","push","nodeType","nodeValue","outerHTML","lang","rtlLanguages","langCode","dir","includes","newHTML","setOuterHTML","toLowerCase","getHighlightNodeFromSelect","search","getParents","selection","getStart","elm","pair","previousSibling","hideContentToolbar","el","Node","ELEMENT_NODE","style","display","parentNode","options","Object","keys","key","setContent","addStyle","source_view","onClose","off","on","no_events","event","isComposing","clientX","keyCode","target","nodeName","begin","preventDefault","iso","contentDocument","body","element","regexLang","text","toString","newtext","replaceAll","insertContent","replacement","notificationManager","open","langInSelectionErrMsg","type","block","result","cnt","firstChild","blockTags","i","tagName","getBlockElement","multipleBlocksErrMsg"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ui.min.js","sources":["../src/ui.js"],"sourcesContent":["// This file is part of Moodle - https://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Commands for the plugin logic of the Moodle tiny_multilang2 plugin.\n *\n * @module tiny_multilang2\n * @author Iñaki Arenaza \n * @author Stephan Robotta \n * @author Tai Le Tan \n * @copyright 2015 onwards Iñaki Arenaza & Mondragon Unibertsitatea\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {getHighlightCss, isContentToHighlight, mlangFilterExists, getRTLLanguages} from './options';\n\n// This class inside a identified the {mlang} tag that is encapsulated in a span.\nconst spanClass = 'multilang-begin mceNonEditable';\n// This is the element with the data attribute.\nconst spanFixedAttrs = '{mlang %lang}';\n// The end span doesn't need information about the used language.\nconst spanMultilangEnd = spanFixedAttrs.replace('begin', 'end') + '>{mlang}';\n// Helper functions\nconst trim = v => v.toString().replace(/^\\s+/, '').replace(/\\s+$/, '');\nconst isNull = a => a === null || a === undefined;\n\n/**\n * Marker to remember that the submit button was hit.\n * @type {boolean}\n * @private\n */\nlet _isSubmit = false;\n\n/**\n * @type {object}\n * @private\n */\nconst _options = {};\n\n/**\n * Convert {mlang xx} and {mlang} strings to spans, so we can style them visually.\n * Remove superflous whitespace while at it.\n * @param {tinymce.Editor} ed\n * @return {string}\n */\nconst addVisualStyling = function(ed) {\n\n let content = ed.getContent();\n\n // Do not use a variable whether text is already highlighted, do a check for the existing class\n // because this is safe for many tiny element windows at one page.\n if (content.indexOf(spanClass) !== -1) {\n return content;\n }\n\n // First look for any {mlang} tags in the content string and do a preg_replace with the corresponding\n // tag that encapsulated the {mlang} tag so that the {mlang} is highlighted.\n content = content.replace(new RegExp('{\\\\s*mlang\\\\s+([^}]+?)\\\\s*}', 'ig'), function(match, p1) {\n return spanMultilangBegin.replace(new RegExp('%lang', 'g'), p1);\n });\n content = content.replace(new RegExp('{\\\\s*mlang\\\\s*}', 'ig'), spanMultilangEnd);\n\n // Check for the traditional tags, in case these were used as well in the text.\n // Any tag must be replaced with a {mlang XX}\n // and the corresponding closing must be replaced by {mlang}.\n // To handle this, we must convert the string into a DOMDocument so that any span.multilang tag can be searched\n // and replaced.\n const dom = new DOMParser();\n const doc = dom.parseFromString(content, 'text/html');\n if (doc.children.length === 0) { // Should not happen, but anyway, keep the check.\n return content;\n }\n const nodes = doc.querySelectorAll('span.multilang');\n if (nodes.length === 0) {\n return content;\n }\n for (const span of nodes) {\n const newSpan = spanMultilangBegin\n .replace(new RegExp('%lang', 'g'), span.getAttribute('lang'))\n .replace('mceNonEditable', 'mceNonEditable fallback')\n + span.innerHTML\n + spanMultilangEnd\n .replace('mceNonEditable', 'mceNonEditable fallback');\n // Insert the replacement string after the span tag itself by converting it into a html fragment.\n span.insertAdjacentHTML('afterend', newSpan);\n // Once the new tags are placed at the correct position, we can remove the original span tag.\n span.remove();\n }\n // Convert the DOMDocument into a string again.\n return doc.getElementsByTagName('body')[0].innerHTML;\n};\n\n/**\n * Remove the spans we added in _add_visual_styling() to leave only the {mlang xx} and {mlang} tags.\n * Also make sure we lowercase the multilang 'tags'\n * @param {tinymce.Editor} ed\n */\nconst removeVisualStyling = function(ed) {\n ['begin', 'end'].forEach(function(t) {\n for (const span of ed.dom.select('span.multilang-' + t)) {\n if (t === 'begin' && span.classList.contains('fallback')) {\n // This placeholder tag was created from an oldstyle tag.\n let innerHTML = '';\n let end = span;\n let toRemove = [];\n // Search the corresponding closing tag.\n while (end) {\n end = end.nextSibling;\n if (isNull(end)) { // Got a parent that does not exist. Stop here.\n break;\n }\n if (!isNull(end.classList) && end.classList.contains('multilang-end')) {\n // We found the multilang-end node, that needs to be removed, and also, we can stop here.\n toRemove.push(end);\n break;\n }\n // Sibling inside the tags need to be preserved, but moved to the innerHTML of the real\n // span tag. Therefore, collect the node content as string and remember the real nodes\n // to remove them later.\n if (end.nodeType === 3) {\n innerHTML += end.nodeValue;\n } else if (end.nodeType === 1) {\n innerHTML += end.outerHTML;\n }\n toRemove.push(end);\n }\n if (!isNull(end)) {\n // Extract the language from the {mlang XX} tag.\n const lang = span.innerHTML.match(new RegExp('{\\\\s*mlang\\\\s+([^}]+?)\\\\s*}', 'i'));\n // Right to left default languages.\n const rtlLanguages = getRTLLanguages();\n if (lang) {\n const langCode = lang[1];\n // Add dir=\"rtl\" to the html tag any time the overall document direction is right-to-left.\n const dir = rtlLanguages.includes(langCode) ? 'rtl' : 'ltr';\n const newHTML = '' + innerHTML + '';\n ed.dom.setOuterHTML(span, newHTML);\n // And remove the other siblings.\n for (end of toRemove) {\n ed.dom.remove(end);\n }\n }\n }\n } else {\n // Normal placeholder tag, just restore the innerHTML that is {mlang XX} or {mlang}-\n ed.dom.setOuterHTML(span, span.innerHTML.toLowerCase());\n }\n }\n });\n};\n\n/**\n * At the current selection lookup for the current node. If we are inside a special span that encapsulates\n * the {lang} tag, then look for the corresponding opening or closing tag, depending on what's set in the\n * search param.\n * @param {tinymce.Editor} ed\n * @param {string} search\n * @return {Node|null} The encapsulating span tag if found.\n */\nconst getHighlightNodeFromSelect = function(ed, search) {\n let span;\n ed.dom.getParents(ed.selection.getStart(), elm => {\n // Are we in a span that highlights the lang tag.\n if (!isNull(elm.classList)) {\n // If we are on an opening/closing lang tag, we need to search for the corresponding opening/closing tag.\n const pair = search === 'begin' ? 'end' : 'begin';\n if (elm.classList.contains('multilang-' + pair)) {\n span = elm;\n do {\n // If we look for begin, go back siblings, otherwise look fnext siblings until end is found.\n span = search === 'begin' ? span.previousSibling : span.nextSibling;\n } while (!isNull(span) && (isNull(span.classList) || !span.classList.contains('multilang-' + search)));\n } else if (elm.classList.contains('multilang-' + search)) {\n // We are already on the correct tag we search for\n span = elm;\n }\n }\n });\n return span;\n};\n\n/**\n * From the given text (that is derived from a selection) we try to check if we have block elements selected and\n * in case yes, how many.\n * Return an object with:\n * el: the first block element node from the string\n * cnt: number of block elements found on the first level\n * In case the text fragment is not valid parsable HTML, then null and 0 is returned.\n * @param {string} text\n * @return {object}\n */\nconst getBlockElement = function(text) {\n let result = {el: null, cnt: 0};\n const dom = new DOMParser();\n const body = dom.parseFromString(text, 'text/html').body;\n // If the children nodes start with no block element, then just quit here.\n if (body.firstChild.nodeType !== Node.ELEMENT_NODE) {\n return result;\n }\n // These are not all block elements, we check for some only where the lang tags should be placed inside.\n const blockTags = ['address', 'article', 'aside', 'blockquote',\n 'dd', 'div', 'dl', 'dt', 'figcaption', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'li', 'ol', 'p', 'pre', 'section', 'tfoot', 'ul'];\n for (let i = 0; i < body.children.length; i++) {\n if (body.children[i].nodeType !== Node.ELEMENT_NODE) {\n continue;\n }\n if (blockTags.indexOf(body.children[i].tagName.toString().toLowerCase()) != -1) {\n result.cnt += 1;\n if (isNull(result.el)) {\n result.el = body.children[i];\n }\n }\n }\n return result;\n};\n\n/**\n * Check for the parent hierarchy elements, if there's a context toolbar container, then hide it.\n * @param {Node} el\n */\nconst hideContentToolbar = function(el) {\n while (!isNull(el)) {\n if (el.nodeType === Node.ELEMENT_NODE &&\n !isNull(el.getAttribute('class')) &&\n el.getAttribute('class').indexOf('tox-pop-') != -1\n ) {\n el.style.display = 'none';\n return;\n }\n el = el.parentNode;\n }\n};\n\n/**\n * When loading the editor for the first time, add the spans for highlighting the lang tags.\n * These are highlighted with the appropriate css only.\n * In addition pass some options to the plugin instance.\n * @param {tinymce.Editor} ed\n * @param {object} options\n */\nconst onInit = function(ed, options) {\n Object.keys(options).forEach(function(key) {\n _options[key] = options[key];\n });\n ed.setContent(addVisualStyling(ed));\n if (isContentToHighlight(ed)) {\n ed.dom.addStyle(getHighlightCss(ed));\n }\n};\n\n/**\n * When the source code view dialogue is show, we must remove the highlight spans from the editor content\n * and also add them again when the dialogue is closed.\n * @param {tinymce.Editor} ed\n * @param {object} content\n */\nconst onBeforeGetContent = function(ed, content) {\n if (!isNull(content.source_view) && content.source_view === true) {\n // If the user clicks on 'Cancel' or the close button on the html\n // source code dialog view, make sure we re-add the visual styling.\n var onClose = function(ed) {\n ed.off('close', onClose);\n ed.setContent(addVisualStyling(ed));\n };\n ed.on('CloseWindow', () => {\n onClose(ed);\n });\n removeVisualStyling(ed);\n }\n};\n\n/**\n * When the submit button is hit, the marker spans are removed. However, if there's an error\n * in saving the content (via ajax) the editor remains with the cleaned content. Therefore,\n * we need to add the marker span elements once again when the user tries to change the content\n * of the editor.\n * @param {tinymce.Editor} ed\n */\nconst onFocus = function(ed) {\n if (_isSubmit) {\n // eslint-disable-next-line camelcase\n ed.setContent(addVisualStyling(ed), {no_events: true});\n _isSubmit = false;\n }\n};\n\n/**\n * Fires when the form containing the editor is submitted. Remove all the marker span elements.\n * @param {tinymce.Editor} ed\n */\nconst onSubmit = function(ed) {\n removeVisualStyling(ed);\n _isSubmit = true;\n};\n\n/**\n * Check for key press when something is deleted. If that happens inside a highlight span\n * tag, then remove this tag and the corresponding that open/closes this lang tag.\n * @param {tinymce.Editor} ed\n * @param {Object} event\n */\nconst onDelete = function(ed, event) {\n // We are not in composing mode, have not clicked and key or was not pressed.\n if (event.isComposing || (isNull(event.clientX) && event.keyCode !== 46 && event.keyCode !== 8)) {\n return;\n }\n // In case we clicked, check that we clicked an icon (this must have been the trash icon in the context menu).\n if (!isNull(event.clientX) &&\n (event.target.nodeType !== Node.ELEMENT_NODE || (event.target.nodeName !== 'path' && event.target.nodeName !== 'svg'))) {\n return;\n }\n // Conditions match either key or was pressed, or an click on an svg icon was done.\n // Check if we are inside a span for the language tag.\n const begin = getHighlightNodeFromSelect(ed, 'begin');\n const end = getHighlightNodeFromSelect(ed, 'end');\n // Only if both, start and end tags are found, then delete the nodes here and prevent the default handling\n // because the stuff to be deleted is already gone.\n if (!isNull(begin) && !isNull(end)) {\n event.preventDefault();\n ed.dom.remove(begin);\n ed.dom.remove(end);\n if (!isNull(event.clientX)) {\n hideContentToolbar(event.target);\n }\n }\n};\n\n/**\n * The action when a language icon or menu entry is clicked. This adds the {mlang} tags at the current content\n * position or around the selection.\n * @param {tinymce.Editor} ed\n * @param {string} iso\n * @param {Event} event\n */\nconst applyLanguage = function(ed, iso, event) {\n if (isNull(iso)) {\n return;\n }\n if (iso === \"remove\") {\n const elements = ed.contentDocument.body;\n // Find all elements with the class \"multilang-begin\" or \"multilang-end\".\n const multiLangElements = elements.querySelectorAll('.multilang-begin, .multilang-end');\n multiLangElements.forEach(element => {\n ed.dom.remove(element);\n });\n return;\n }\n const regexLang = /%lang/g;\n let text = ed.selection.getContent();\n // Selection is empty, just insert the lang opening and closing tag\n // together with a space where the user may add the content.\n if (trim(text) === '') {\n // Event is set when the context menu was hit, here the editor lost the previously selected node. Therfore,\n // don't do anything.\n if (!isNull(event)) {\n hideContentToolbar(event.target);\n return;\n }\n let newtext = spanMultilangBegin.replace(regexLang, iso) + ' ' + spanMultilangEnd;\n if (!mlangFilterExists(ed)) {\n // No mlang filter, add the fallback class to the highlight spans so that these are translated\n // to the standard elements.\n newtext = newtext.replaceAll('mceNonEditable', 'mceNonEditable fallback');\n }\n ed.insertContent(newtext);\n return;\n }\n // Hide context toolbar, because at any subsequent call the node is not selected anymore.\n if (!isNull(event)) {\n hideContentToolbar(event.target);\n }\n // No matter if we have syntax highlighting enabled or not, the spans around the language tags exist\n // in the WYSIWYG mode. So check if we are on a special span that encapsulates the language tags. Search\n // for the start span tag.\n const span = getHighlightNodeFromSelect(ed, 'begin');\n // If we have a span, then it's the opening tag, and we just replace this one with the new iso.\n if (!isNull(span)) {\n let replacement = spanMultilangBegin.replace(regexLang, iso);\n if (span.classList.contains('fallback')) {\n replacement = replacement.replace('mceNonEditable', 'mceNonEditable fallback');\n }\n ed.dom.setOuterHTML(span, replacement);\n return;\n }\n // Check if we have language tags inside the selection:\n if (text.indexOf('multilang-begin') !== -1 || text.indexOf('multilang-end') !== -1) {\n ed.notificationManager.open({\n text: _options.langInSelectionErrMsg,\n type: 'error',\n });\n return;\n }\n const block = getBlockElement(text);\n if (!isNull(block.el)) {\n if (block.cnt === 1) {\n // We have a block element selected, such as a hX or p tag. Then keep this tag and place the\n // language tags inside but around the content of the block element.\n let newtext = spanMultilangBegin.replace(regexLang, iso) + block.el.innerHTML + spanMultilangEnd;\n if (!mlangFilterExists(ed)) { // No mlang filter, add the fallback class to the highlight spans.\n newtext = newtext.replaceAll('mceNonEditable', 'mceNonEditable fallback');\n }\n block.el.innerHTML = newtext;\n ed.selection.setContent(block.el.outerHTML);\n return;\n }\n if (!mlangFilterExists(ed)) {\n ed.notificationManager.open({\n text: _options.multipleBlocksErrMsg,\n type: 'error',\n });\n return;\n }\n }\n // Not inside a lang tag, insert a new opening and closing tag with the selection inside.\n let newtext = spanMultilangBegin.replace(regexLang, iso) + text + spanMultilangEnd;\n if (!mlangFilterExists(ed)) { // No mlang filter, add the fallback class to the highlight spans.\n newtext = newtext.replaceAll('mceNonEditable', 'mceNonEditable fallback');\n }\n ed.selection.setContent(newtext);\n};\n\nexport {\n onInit,\n onBeforeGetContent,\n onFocus,\n onSubmit,\n onDelete,\n applyLanguage\n};\n"],"names":["spanClass","spanFixedAttrs","spanMultilangBegin","spanMultilangEnd","replace","isNull","a","_isSubmit","_options","addVisualStyling","ed","content","getContent","indexOf","RegExp","match","p1","doc","DOMParser","parseFromString","children","length","nodes","querySelectorAll","span","newSpan","getAttribute","innerHTML","insertAdjacentHTML","remove","getElementsByTagName","removeVisualStyling","forEach","t","dom","select","classList","contains","end","toRemove","nextSibling","push","nodeType","nodeValue","outerHTML","lang","rtlLanguages","langCode","dir","includes","newHTML","setOuterHTML","toLowerCase","getHighlightNodeFromSelect","search","getParents","selection","getStart","elm","pair","previousSibling","hideContentToolbar","el","Node","ELEMENT_NODE","style","display","parentNode","options","Object","keys","key","setContent","addStyle","source_view","onClose","off","on","no_events","event","isComposing","clientX","keyCode","target","nodeName","begin","preventDefault","iso","contentDocument","body","element","regexLang","text","toString","newtext","replaceAll","insertContent","replacement","notificationManager","open","langInSelectionErrMsg","type","block","result","cnt","firstChild","blockTags","i","tagName","getBlockElement","multipleBlocksErrMsg"],"mappings":"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"} \ No newline at end of file diff --git a/amd/src/options.js b/amd/src/options.js index 3335a1c..085971e 100644 --- a/amd/src/options.js +++ b/amd/src/options.js @@ -28,7 +28,6 @@ import {pluginName} from './common'; const languages = getPluginOptionName(pluginName, 'languages'); const mlangfilter = getPluginOptionName(pluginName, 'mlangfilter'); -const fallbackspan = getPluginOptionName(pluginName, 'fallbackspantag'); const showalllangs = getPluginOptionName(pluginName, 'showalllangs'); const highlight = getPluginOptionName(pluginName, 'highlight'); const highlightcss = getPluginOptionName(pluginName, 'css'); @@ -56,11 +55,6 @@ export const register = (editor) => { "default": false, }); - editor.options.register(fallbackspan, { - processor: 'boolean', - "default": false, - }); - editor.options.register(highlight, { processor: 'boolean', "default": false, @@ -105,14 +99,6 @@ export const mlangFilterExists = (editor) => editor.options.get(mlangfilter); */ export const showAllLanguages = (editor) => editor.options.get(showalllangs); -/** - * Get the defined option whether the classic are supported as well. - * - * @param {tinymce.Editor} editor - * @returns {boolean} - */ -export const isFallbackSpanTag = (editor) => editor.options.get(fallbackspan); - /** * Get the defined option whether to highlight the language dependent content blocks. * diff --git a/amd/src/ui.js b/amd/src/ui.js index b495f69..8628ed2 100644 --- a/amd/src/ui.js +++ b/amd/src/ui.js @@ -24,7 +24,7 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -import {getHighlightCss, isContentToHighlight, mlangFilterExists, isFallbackSpanTag, getRTLLanguages} from './options'; +import {getHighlightCss, isContentToHighlight, mlangFilterExists, getRTLLanguages} from './options'; // This class inside a identified the {mlang} tag that is encapsulated in a span. const spanClass = 'multilang-begin mceNonEditable'; @@ -74,11 +74,7 @@ const addVisualStyling = function(ed) { }); content = content.replace(new RegExp('{\\s*mlang\\s*}', 'ig'), spanMultilangEnd); - // If we have the multilang2 filter installed and wish not to check for the traditional - // tags, then we are done here. - if (mlangFilterExists(ed) && !isFallbackSpanTag(ed)) { - return content; - } + // Check for the traditional tags, in case these were used as well in the text. // Any tag must be replaced with a {mlang}. // To handle this, we must convert the string into a DOMDocument so that any span.multilang tag can be searched diff --git a/lang/de/tiny_multilang2.php b/lang/de/tiny_multilang2.php index c54f115..a9f341e 100644 --- a/lang/de/tiny_multilang2.php +++ b/lang/de/tiny_multilang2.php @@ -22,8 +22,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -$string['fallbackspantag'] = 'Beachte die tags'; -$string['fallbackspantag_desc'] = 'Neben der {mlang} Syntax werden die herkömmlichen tags unterstützt.'; $string['highlightcss'] = 'CSS für Sprachtag'; $string['highlightcss_desc'] = "CSS für die Marker um dem sprachabhängigen Inhalt anzuzeigen. diff --git a/lang/en/tiny_multilang2.php b/lang/en/tiny_multilang2.php index 40487b3..a491f45 100644 --- a/lang/en/tiny_multilang2.php +++ b/lang/en/tiny_multilang2.php @@ -22,8 +22,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -$string['fallbackspantag'] = 'Support <span> tags'; -$string['fallbackspantag_desc'] = 'In addition to the {mlang} syntax preserve the traditional <span class="multilang"> tags.'; $string['helplinktext'] = 'Multi-Language Content (v2)'; $string['highlight'] = 'Highlight delimiters'; $string['highlight_desc'] = 'Visually highlight the multi-language content delimiters (i.e., {mlang XX} and {mlang}) in the WYSIWYG editor'; diff --git a/lang/es/tiny_multilang2.php b/lang/es/tiny_multilang2.php index ce0344e..f5b41dc 100644 --- a/lang/es/tiny_multilang2.php +++ b/lang/es/tiny_multilang2.php @@ -22,8 +22,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -$string['fallbackspantag'] = 'Accepta los tags '; -$string['fallbackspantag_desc'] = 'Aparte de syntax {mlang} los classico tags ha soportado tambien.'; $string['highlightcss'] = 'CSS para los delimitadores'; $string['highlightcss_desc'] = "CSS usado para destacar los delimitadores del contenido multi-idioma. diff --git a/lang/fr/tiny_multilang2.php b/lang/fr/tiny_multilang2.php index af7d105..631fd35 100644 --- a/lang/fr/tiny_multilang2.php +++ b/lang/fr/tiny_multilang2.php @@ -22,8 +22,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -$string['fallbackspantag'] = 'Soutien les tags '; -$string['fallbackspantag_desc'] = 'En plus de la syntaxe {mlang}, les tags conventionnels sont également pris en charge.'; $string['highlightcss'] = 'CSS pour séparateurs'; $string['highlightcss_desc'] = "CSS utilisé pour mettre en évidence les délimiteurs de contenus multilingues. diff --git a/screenshots/admin_general.png b/screenshots/admin_general.png index ffd89b588103fcc5a772dc8ae0eed2db801bda21..8afa9d7e41aa7d811fa96641626d825a87e8490d 100644 GIT binary patch delta 44757 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
A}WhgDjIEYMNh;nNsxaA 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Π9IH0m#nWCUOf%oo7FKDIMPOXKq3V zk1kv9T#$|US0pnw_I8A=g}TY$=r&*-v|!}3YXJ{RvL5)!^oZH$5(brtcJ`XJhaz+v73 zf2EL!WcDT-TLYKP40UcUU+Bd|B02<$Sr#t^s!KyKa(Ct{XaCtmks!hw!0ni;D+(GO zUqG4Uo30W1`M7KAojf#l$!#tKBbLvU-bsjSLSGizxdetJB<(!^NtFgJbl8wI+b z*KU}49F;OeQTMGOi@;My00bNJFn+af(e)jAUPz&c-S_OBW;^IY2~8Iv&vq_KXu9k??hy94J>H6Ds6Y2$)~8L& zGMHz7`ys)8Od#&hAKM~~Y`dds3)%!+Df9Y}qCA7v&SB-bEp+67YgFn>i1@H#B5)ubDSTLSsMOO)*lyliOyCC>s%Ry1GZ@1d7y& z1`-2z`-#PWgpjbn|>bf5e2_h z)KHVoP)$ot&1pn@+wU1H!g(5q70NCO)9juCc8O*sa%=oQr6AMD$Jp4sE3o}E)!*Ya zRN%(`BghM*q36z5X=PA}LjSN9prKL!a3XBVlj+w*$a!&mg!(7t?E5v9(7=qXEF5X2 zv7v0-3L*V5dg z%(#^;2J$T#1?n*x3CFY+_I=W{&z|9D$x4c8aJdgA z6>@s^2h3?KxAfcZ)qQ>Usq1M%d#oA&$U&%%y~8x$U4-t&>DypA(&aGuMWaS|Ye(+6 z0=pWS)83(CY=i8n zVXHCOyKkZ6c~`bm8Ljql^ZQk?0!l*G#yL*NHlW3FkK@uNvUoL~q@o zz&@|5>fC~x`Rp^hu9VA`SgWz`4wy_xzpMQjWQ*28T4dX%dLL{&YPg<(=@8RZKab#h zm++JRbBu~Hjt?)ErKS$0`?f-fy5Su$jS^MPEB1|h-PQw-*2O8&)n_@MU;Cc@w1OwU z*(21>&bj^4Ar{^5mC>iz=G_R8YpKR~ef!3>=l4NoZ|r9wk{LVw>t%+B^4b!J#iN@D zWRUs7Y^=HVxdxz2(s;YxS5floOssZCV6=@`EMCw6MeG^4$FS~L ziOlhQN0MQ(I#5>h^EZ-9VK7-WbZIc!S{baj1%BnsaLPwC`sp-{124n~!B;v_23c7d zp|&|P5o>xPPE3!Wrn|wVT>LkOf62cvia{BCMOM*|d)M4RkmurcOHljh!&jJ-nLVHp z<0bHWuxcSWRjYsVAyXA7^q_uM5whd+WBq^(p_)_(Qr7-U5y(cga?3kNOx6KMWPQ_w^_Mo zsE^fHJtx?|MhW#c^{2gI$dyo2V3Z}!5Lk$B>QAHwTsEE2m2;y`H}{{hzl}u(A-8qq z(V*BlIA4Cly1n8Ued??~rO;w@-sm`^oZ|wC9_<(=yDh}S1Hj@K_Sa<(JVW~@5&2;K z$r3{z1J4-~9iWZ=vz`P~Q^FgW5tKu& z5b?ELt*IIp%cWMA2>qSzEK9oU^P{fLK~w_Osx|@)fzlg$YX;(lb2H~}>vgFPNleqOumdBHb|-Vz)Rj^$|Tf9tf(U z9dqtcXR1--U$pbMaEN*_ksygxGd^$REy}}l2A!pfcUe-)xbnJ7lvtS+U~7}|E(=-4 zsBplnTn)OKObgi>RLbWQ%>KabaQBtd&13}7^GucWnj9`*yErt|A+(9Sy6x8iC07wl zjcC4NHn~aao_-Ob}i92gU6l$4EVQ+A!Su0%Y57cu-l7F3uU{K{2utIzfz zmDj`8Qw&4A!^bL$htUu(ESkFAymWl*Sz%DFsP;s_(*t7E@jj{xinZ#`xu3cZ;Q9j~ zk~D0CQH1j*i=31)P27<9ZD2eQKt_Ar9IuYvf#_is=?TqjNq1d3z0|D<^}-pqs#$cq z-*BwbR_=jCNh@MQIcvy(dzi*8!D&$;{2M?QM5=b00m zoSgZ&Bdk8AKNj@j8XH9BD?X7<zsAn$E>dqpS!BL8{cJTt16E&WBK0QqyBfgAXCKShGT;g0j%9^fwt;h+xB-^7w`r}dshoPbDo#2&o@sRkoq50X zTU)hEoJsF8v&%Dx3EkY$*w+V_T$v?6$R#0J17$$7A!oMBCc;70NP4qNKkqGP0~)lv zxpJ`(CqblRD=AIe#Nfhyz_7yT7n9}BTDn&gnL5=(a z{{wbn^*{R)C-%e`w|GJT^m;t~p#hf-6^~B^ZNg7)#-vEujvFI>N8{R^;ONY9_vVDt zJf7-?PqDRPf))}}#QGhd4(XJKO0i6RUDkiTtI8qiu}^Z6_sD)Cd+MJm;!gE{cHeyh zx^PA$4I^`UkrSCxIQBL7Q*Edf*uU}I@%qEk4;`hQslQlmiYr|}3)A{DT6#Crj-jS| zz8;h(8pj*E<-oFe!B8!!71w1?6rEOq_#qs%DqlwUH|b?(H17;EZ%l@!RMVy7VRM?G zp!caJhxZssml64@!%B=TB?FouwY3JFX(yAOz4$WJ6z7+Z8%j@6kSc4HOc2*Fo8xqN z4C0{?vA;<8iK2XR_F zg!c82=Yo;AG4e&}=d*92$ZW9cU#L<~43q@+U&DKXC0CoTK&r(an}m8ENEp>%v<;!N z^iuvnFMd3rZMx^0$?7=cfV{|654VuJP8MBoDCLmh>uX@EuWpnz0(0xDLjCqW;v?TJ z9!JOw=l!==9AL6aw=;Bcj_Q9jH+VG#N9`tA1nQ|o&xq2&u+FS$PaAd*T;QW%&)+!T zdDh`58GY$V*B(_h5m|$*rhf@f2XoPX1ATZEb^7X;1?KlSa2o1^KVG?HPrei(^RFZ= z!LyuEEOr3S*%ow>Z9zpT{+c3gNP)E0-ROc@cX1Z8(A!s6q?Mc$tT$0rC=X7&igMx*U{9aDnaO;1Qov~lYr0kl+i^Vs*dZjkRp zE99L#iB)g~*7|hv^<+4s=aFbGKUR_1Bv!+4p)N2#8lfd(=wF9#Xh_P=QRDeO(wS&3 z_T=J#H!((8(^a8&f+EVU+{?2w;F#~^De?Bgw}$?#8-qVZ@}3V|eu+O-G@ZQT4_hO@ z^O<|x+g?qcdcr7U8e+4xR`%6)jOyB1{s%eE>Y}22`-D-EB!q#v7NN^>%iS`x{=K)t zxDg=!+8!iV>&%KGH*Qma7R5H0Qpp}swqNLU7UDQx!t)*VeOm1Fbo5SF)$0K_GAM6h zaB@6@Z2u_3ISCGzOS&PD(??dw7H zkM?ka#zre_d{e~re(xp=f40x=-k0jlB&g2leCH!d2ruuyFEm!8-{kGILe8>aDm%Y) zS>f$A%!g^eww+lL4N*u9!41+zLo=@sU7H{Om6-~y63ZxEw9XHQF~7=6SNz(i)yf`l zDt_n@@CG!n1n%X1y7D{RoM8t{_xj6J&t-gxU}x`DXC_aDyfYY{ml9?j4gOI*_&vgq z$1k^_5dnSbyU+&1%w&|*%5?>NI61c6+N-p+={r$g{8d*9HTy?^Ay;R1sUUOAoI0?t zPn4H&VL4%GAN;r_{r(||fmV5$pE~qZe{cr_$3>yyw#7#KwxJ??yzn=0FfMkP?iaOO z88iRQe|XG?wx-Z6*GM>NKQ?-}03J^PYJzNEcVoPK;Ep;Ad{1;p8as{c$;0Y0q~vx7 z*_isZd6=pdw=9g-$Dlo23RYJh$-mM81|oI3t1!e~mXigKk2?~v9uV3*LngFazN~o^ zMHTda(4A~f|0s>5z{CP?DZBKG)xXM4ODSJ%zd%Jt6>K={TuZ(E&aKHrqRI`SWxC@% z`-`tq`$p?x>gO`%sG-rkQJK)@Xjot!Z8=0S=4|HNqeS}tSGeRqdXXT#WkVZvBN7#r ziILz}L_BXW(54FKYM$N$$Tv{ctQL2fylK5p8!w!nv9jh4A?+oWNu-$?07gTAYloYU^+OCh59e0ecGf zQF{x09iv}dS&`M44N))6?MsJDu+c!16Rni)hk7daUKBL!&oUNJ*cT5s%&j#ZU9rnnN6fZg7kCy$Wk+ELbMdbU&xJJtLU+6ntHf{Q6Ra7i1z;!_Q~TPOpvqFX;)7P8@eY?RffG1@^5}t*qj3?q0Ghy z^wMHm!2VZR%UxO{?m>6#wX)SCBZNN5b$T3P1%A2oM`S}Ulob^y6=ZNn$ps)NrF|JZJkXoP3 zH5TQCz=IBa9%oU`#$ahf3`c zfKIyT9eKle>s;D{l2mz=b-9$cSEKDaf5GE1+x`kh_oA?D{H5E!9FQl!nrlCFb>v}Q zc)7!fdt0&B;+vt9qhU!4tDMUlw$}O`HV_`NY}VTXVL8T<V=hjGP&F@k#k|sKl&8e_o9~FH_)l)#0Q|uhMiMrHsTfT`!U%AwUHp&gC zg?*#`{CC7Qlb?XTJt%f=m{V6V(_xm$!k>&Vo9QUV? zcP9td{+T!IIq$&@8yvXvUy}1v>Z$p9zk}JGJ?l48a%PADAx(|*@cBT(Jd@*I%3fha zXW=OG@Q3u?kMp^0NFrYWnoXXc1t$D(XR)HEX1|@UGiRfb+%;tIc^lg}!t>ohZFlxQ z&F}DcZWrlNXpiP9Ar-of2YA{JQf~t`-^qC1u|h3g+LCc)S!@C=3z{Uofe*9*2=!QB z+$%Xz3^ZiZVkj`#znn>x6|5#ZjpnPf?;3i&W!3fSY2e4d=&|V{u)EXYYMPpi7VClN z%YGtyGUF$dXf7Dr-tv2rU;p!9K~~du?0?r+)t7OPlPMFtA8|syBnx0$fd_t}is1D2 zud%cO^%rZ_fz*T>hgHdx`7el$On&`BTp2juzeKnmB!Lz~~Te z7=%-k&)9Sc{p7$!YTr~tB^iW6$j@p85m5ZpvS&G&>~qP?7*X5f`(Vzv%KoOVQB8KT z@pb3m!X&$|no2P$Q)#d(!$dkaME+lIOg*<5z-@1t$R6Y`5|uCGOFgXTVc8zB>OE!0 zF2Eg?g`Y{mEUKFQdGONC)KcH@MN98^jhSzH6PCrq*=H*5j~(?Ai-e1F6mX%&P?7`u zTIzl)!up-as>2;wmEnH7jLqMaSw$l6GRYTXYE23274;@uO)>xVdgOSO->IBASUv2# z2ToHgx=G<;I%zyodrd@A6`FQw=9I3Xzus<$C}nGvPFEBCyv9>v?f0Y7lONr*xMF!D z`;fk+fhvV%Kf?1*ZA++Qe*aX{%1M-9W7TLR~1AOhj^rp hyMJUM{M7J-_HYDQU{?2k`3(7yl~R%{7dQFw{{U6v$t?f? diff --git a/settings.php b/settings.php index 9a6b669..1d6561a 100644 --- a/settings.php +++ b/settings.php @@ -33,8 +33,6 @@ if ($ADMIN->fulltree) { $settings->add(new admin_setting_configcheckbox('tiny_multilang2/requiremultilang2', get_string('requiremultilang2', 'tiny_multilang2'), get_string('requiremultilang2_desc', 'tiny_multilang2'), 1)); - $settings->add(new admin_setting_configcheckbox('tiny_multilang2/fallbackspantag', - get_string('fallbackspantag', 'tiny_multilang2'), get_string('fallbackspantag_desc', 'tiny_multilang2'), 0)); $settings->add(new admin_setting_configcheckbox('tiny_multilang2/showalllangs', get_string('showalllangs', 'tiny_multilang2'), get_string('showalllangs_desc', 'tiny_multilang2'), 0)); $settings->add(new admin_setting_configcheckbox('tiny_multilang2/highlight', diff --git a/tests/behat/tiny_langfallback.feature b/tests/behat/tiny_langfallback.feature index 97a6027..181c1a4 100644 --- a/tests/behat/tiny_langfallback.feature +++ b/tests/behat/tiny_langfallback.feature @@ -6,7 +6,6 @@ Feature: Tiny editor multilang plugin for default behaviour with no multilangfil Given the following config values are set as admin: | requiremultilang2 | 0 | tiny_multilang2 | | highlight | 1 | tiny_multilang2 | - | fallbackspantag | 1 | tiny_multilang2 | And the following "language packs" exist: | language | | de |