diff --git a/lib/editor/tiny/plugins/equation/amd/build/ui.min.js b/lib/editor/tiny/plugins/equation/amd/build/ui.min.js index 87e27f56690..9cd0bace890 100644 --- a/lib/editor/tiny/plugins/equation/amd/build/ui.min.js +++ b/lib/editor/tiny/plugins/equation/amd/build/ui.min.js @@ -5,6 +5,6 @@ define("tiny_equation/ui",["exports","tiny_equation/modal","core/modal_factory", * @module tiny_equation/ui * @copyright 2022 Huong Nguyen * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */let currentForm;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.handleAction=void 0,_modal=_interopRequireDefault(_modal),_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),TinyEquationRepository=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(TinyEquationRepository),_selectors=_interopRequireDefault(_selectors);let lastCursorPos=0;_exports.handleAction=editor=>{displayDialogue(editor)};const displayDialogue=async editor=>{let data={};const currentEquationData=(0,_equation.getCurrentEquationData)(editor);currentEquationData&&Object.assign(data,currentEquationData);const modalPromises=await _modal_factory.default.create({type:_modal.default.TYPE,templateContext:getTemplateContext(editor,data),large:!0});modalPromises.show();const $root=await modalPromises.getRoot(),root=$root[0];currentForm=root.querySelector(_selectors.default.elements.form),$root.on(_modal_events.default.hidden,(()=>{modalPromises.destroy()})),$root.on(_modal_events.default.shown,(()=>{const library=root.querySelector(_selectors.default.elements.library);TinyEquationRepository.filterEquation(1,library.innerHTML).then((async data=>(library.innerHTML=data.content,updatePreview(),notifyFilter(library),data))).catch(_notification.exception)})),root.addEventListener("click",(e=>{const libraryItem=e.target.closest(_selectors.default.elements.libraryItem),submitAction=e.target.closest(_selectors.default.actions.submit),textArea=e.target.closest(".tiny_equation_equation");libraryItem&&(e.preventDefault(),selectLibraryItem(libraryItem)),submitAction&&(e.preventDefault(),(0,_equation.setEquation)(currentForm,editor),modalPromises.destroy()),textArea&&(0,_utils.debounce)(updatePreview(),500)})),root.addEventListener("keyup",(e=>{e.target.closest(_selectors.default.elements.equationTextArea)&&(0,_utils.debounce)(updatePreview(),500)})),root.addEventListener("keydown",(e=>{e.target.closest(_selectors.default.elements.libraryItem)&&(37!=e.keyCode&&39!=e.keyCode||groupNavigation(e))}))},getTemplateContext=(editor,data)=>{const libraries=(0,_options.getLibraries)(editor),texDocsUrl=(0,_options.getTexDocsUrl)(editor);return Object.assign({},{elementid:editor.id,libraries:libraries,texdocsurl:texDocsUrl,delimiters:_selectors.default.delimiters},data)},selectLibraryItem=libraryItem=>{const tex=libraryItem.getAttribute("data-tex"),input=currentForm.querySelector(_selectors.default.elements.equationTextArea);let oldValue,newValue,focusPoint=0;oldValue=input.value,newValue=oldValue.substring(0,lastCursorPos)," "!==newValue.charAt(newValue.length-1)&&(newValue+=" "),newValue+=tex,focusPoint=newValue.length," "!==oldValue.charAt(lastCursorPos)&&(newValue+=" "),newValue+=oldValue.substring(lastCursorPos,oldValue.length),input.value=newValue,input.focus(),input.selectionStart=input.selectionEnd=focusPoint,updatePreview()},updatePreview=()=>{const textarea=currentForm.querySelector(_selectors.default.elements.equationTextArea),preview=currentForm.querySelector(_selectors.default.elements.preview),cursorLatex=_selectors.default.cursorLatex,isChar=/[a-zA-Z{]/;let currentPos=textarea.selectionStart,equation=textarea.value;for(currentPos||(currentPos=0),(0,_equation.getSourceEquation)()&&(currentPos=equation.length);"\\"===equation.charAt(currentPos)&¤tPos>=0;)currentPos-=1;if(0!==currentPos&&"{"!=equation.charAt(currentPos-1))for(;isChar.test(equation.charAt(currentPos))&¤tPos(preview.innerHTML=data.content,notifyFilter(preview),data))).catch(_notification.exception)},notifyFilter=element=>{(0,_event.notifyFilterContentUpdated)(element)},groupNavigation=e=>{e.preventDefault();const current=e.target.closest(_selectors.default.elements.libraryItem),parent=current.parentNode,buttons=Array.prototype.slice.call(parent.querySelectorAll(_selectors.default.elements.libraryItem)),direction=37!==e.keyCode?1:-1;let nextButton,index=buttons.indexOf(current);index<0&&(index=0),index+=direction,index<0?index=buttons.length-1:index>=buttons.length&&(index=0),nextButton=buttons[index],nextButton.focus()}})); + */let currentForm;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.handleAction=void 0,_modal=_interopRequireDefault(_modal),_modal_factory=_interopRequireDefault(_modal_factory),_modal_events=_interopRequireDefault(_modal_events),TinyEquationRepository=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(TinyEquationRepository),_selectors=_interopRequireDefault(_selectors);let lastCursorPos=0;_exports.handleAction=editor=>{displayDialogue(editor)};const displayDialogue=async editor=>{let data={};const currentEquationData=(0,_equation.getCurrentEquationData)(editor);currentEquationData&&Object.assign(data,currentEquationData);const modalPromises=await _modal_factory.default.create({type:_modal.default.TYPE,templateContext:getTemplateContext(editor,data),large:!0});modalPromises.show();const $root=await modalPromises.getRoot(),root=$root[0];currentForm=root.querySelector(_selectors.default.elements.form);const contextId=(0,_options.getContextId)(editor);$root.on(_modal_events.default.hidden,(()=>{modalPromises.destroy()})),$root.on(_modal_events.default.shown,(()=>{const library=root.querySelector(_selectors.default.elements.library);TinyEquationRepository.filterEquation(contextId,library.innerHTML).then((async data=>(library.innerHTML=data.content,updatePreview(contextId),notifyFilter(library),data))).catch(_notification.exception)})),root.addEventListener("click",(e=>{const libraryItem=e.target.closest(_selectors.default.elements.libraryItem),submitAction=e.target.closest(_selectors.default.actions.submit),textArea=e.target.closest(".tiny_equation_equation");libraryItem&&(e.preventDefault(),selectLibraryItem(libraryItem,contextId)),submitAction&&(e.preventDefault(),(0,_equation.setEquation)(currentForm,editor),modalPromises.destroy()),textArea&&(0,_utils.debounce)(updatePreview(contextId),500)})),root.addEventListener("keyup",(e=>{e.target.closest(_selectors.default.elements.equationTextArea)&&(0,_utils.debounce)(updatePreview(contextId),500)})),root.addEventListener("keydown",(e=>{e.target.closest(_selectors.default.elements.libraryItem)&&(37!=e.keyCode&&39!=e.keyCode||groupNavigation(e))}))},getTemplateContext=(editor,data)=>{const libraries=(0,_options.getLibraries)(editor),texDocsUrl=(0,_options.getTexDocsUrl)(editor);return Object.assign({},{elementid:editor.id,libraries:libraries,texdocsurl:texDocsUrl,delimiters:_selectors.default.delimiters},data)},selectLibraryItem=(libraryItem,contextId)=>{const tex=libraryItem.getAttribute("data-tex"),input=currentForm.querySelector(_selectors.default.elements.equationTextArea);let oldValue,newValue,focusPoint=0;oldValue=input.value,newValue=oldValue.substring(0,lastCursorPos)," "!==newValue.charAt(newValue.length-1)&&(newValue+=" "),newValue+=tex,focusPoint=newValue.length," "!==oldValue.charAt(lastCursorPos)&&(newValue+=" "),newValue+=oldValue.substring(lastCursorPos,oldValue.length),input.value=newValue,input.focus(),input.selectionStart=input.selectionEnd=focusPoint,updatePreview(contextId)},updatePreview=contextId=>{const textarea=currentForm.querySelector(_selectors.default.elements.equationTextArea),preview=currentForm.querySelector(_selectors.default.elements.preview),cursorLatex=_selectors.default.cursorLatex,isChar=/[a-zA-Z{]/;let currentPos=textarea.selectionStart,equation=textarea.value;for(currentPos||(currentPos=0),(0,_equation.getSourceEquation)()&&(currentPos=equation.length);"\\"===equation.charAt(currentPos)&¤tPos>=0;)currentPos-=1;if(0!==currentPos&&"{"!=equation.charAt(currentPos-1))for(;isChar.test(equation.charAt(currentPos))&¤tPos(preview.innerHTML=data.content,notifyFilter(preview),data))).catch(_notification.exception)},notifyFilter=element=>{(0,_event.notifyFilterContentUpdated)(element)},groupNavigation=e=>{e.preventDefault();const current=e.target.closest(_selectors.default.elements.libraryItem),parent=current.parentNode,buttons=Array.prototype.slice.call(parent.querySelectorAll(_selectors.default.elements.libraryItem)),direction=37!==e.keyCode?1:-1;let nextButton,index=buttons.indexOf(current);index<0&&(index=0),index+=direction,index<0?index=buttons.length-1:index>=buttons.length&&(index=0),nextButton=buttons[index],nextButton.focus()}})); //# sourceMappingURL=ui.min.js.map \ No newline at end of file diff --git a/lib/editor/tiny/plugins/equation/amd/build/ui.min.js.map b/lib/editor/tiny/plugins/equation/amd/build/ui.min.js.map index 453c1f6e99a..58c0aa25ad6 100644 --- a/lib/editor/tiny/plugins/equation/amd/build/ui.min.js.map +++ b/lib/editor/tiny/plugins/equation/amd/build/ui.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ui.min.js","sources":["../src/ui.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 * Tiny Equation UI.\n *\n * @module tiny_equation/ui\n * @copyright 2022 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport EquationModal from 'tiny_equation/modal';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport {getLibraries, getTexDocsUrl} from 'tiny_equation/options';\nimport {notifyFilterContentUpdated} from 'core/event';\nimport * as TinyEquationRepository from 'tiny_equation/repository';\nimport {exception as displayException} from 'core/notification';\nimport {debounce} from 'core/utils';\nimport Selectors from 'tiny_equation/selectors';\nimport {getSourceEquation, getCurrentEquationData, setEquation} from 'tiny_equation/equation';\n\nlet currentForm;\nlet lastCursorPos = 0;\n\n/**\n * Handle action\n * @param {TinyMCE} editor\n */\nexport const handleAction = (editor) => {\n displayDialogue(editor);\n};\n\n/**\n * Display the equation editor\n * @param {TinyMCE} editor\n * @returns {Promise}\n */\nconst displayDialogue = async(editor) => {\n let data = {};\n const currentEquationData = getCurrentEquationData(editor);\n if (currentEquationData) {\n Object.assign(data, currentEquationData);\n }\n const modalPromises = await ModalFactory.create({\n type: EquationModal.TYPE,\n templateContext: getTemplateContext(editor, data),\n large: true,\n });\n\n modalPromises.show();\n const $root = await modalPromises.getRoot();\n const root = $root[0];\n currentForm = root.querySelector(Selectors.elements.form);\n\n $root.on(ModalEvents.hidden, () => {\n modalPromises.destroy();\n });\n\n $root.on(ModalEvents.shown, () => {\n const library = root.querySelector(Selectors.elements.library);\n TinyEquationRepository.filterEquation(1, library.innerHTML).then(async data => {\n library.innerHTML = data.content;\n updatePreview();\n notifyFilter(library);\n return data;\n }).catch(displayException);\n });\n\n root.addEventListener('click', (e) => {\n const libraryItem = e.target.closest(Selectors.elements.libraryItem);\n const submitAction = e.target.closest(Selectors.actions.submit);\n const textArea = e.target.closest('.tiny_equation_equation');\n if (libraryItem) {\n e.preventDefault();\n selectLibraryItem(libraryItem);\n }\n if (submitAction) {\n e.preventDefault();\n setEquation(currentForm, editor);\n modalPromises.destroy();\n }\n if (textArea) {\n debounce(updatePreview(), 500);\n }\n });\n\n root.addEventListener('keyup', (e) => {\n const textArea = e.target.closest(Selectors.elements.equationTextArea);\n if (textArea) {\n debounce(updatePreview(), 500);\n }\n });\n\n root.addEventListener('keydown', (e) => {\n const libraryItem = e.target.closest(Selectors.elements.libraryItem);\n if (libraryItem) {\n if (e.keyCode == 37 || e.keyCode == 39) {\n groupNavigation(e);\n }\n }\n });\n};\n\n/**\n * Get template context.\n * @param {TinyMCE} editor\n * @param {Object} data\n * @returns {Object}\n */\nconst getTemplateContext = (editor, data) => {\n const libraries = getLibraries(editor);\n const texDocsUrl = getTexDocsUrl(editor);\n\n return Object.assign({}, {\n elementid: editor.id,\n libraries: libraries,\n texdocsurl: texDocsUrl,\n delimiters: Selectors.delimiters,\n }, data);\n};\n\n/**\n * Handle select library item.\n * @param {Object} libraryItem\n */\nconst selectLibraryItem = (libraryItem) => {\n const tex = libraryItem.getAttribute('data-tex');\n const input = currentForm.querySelector(Selectors.elements.equationTextArea);\n let oldValue;\n let newValue;\n let focusPoint = 0;\n\n oldValue = input.value;\n\n newValue = oldValue.substring(0, lastCursorPos);\n if (newValue.charAt(newValue.length - 1) !== ' ') {\n newValue += ' ';\n }\n newValue += tex;\n focusPoint = newValue.length;\n\n if (oldValue.charAt(lastCursorPos) !== ' ') {\n newValue += ' ';\n }\n newValue += oldValue.substring(lastCursorPos, oldValue.length);\n\n input.value = newValue;\n input.focus();\n\n input.selectionStart = input.selectionEnd = focusPoint;\n\n updatePreview();\n};\n\n/**\n * Update the preview section.\n */\nconst updatePreview = () => {\n const textarea = currentForm.querySelector(Selectors.elements.equationTextArea);\n const preview = currentForm.querySelector(Selectors.elements.preview);\n const prefix = '';\n const cursorLatex = Selectors.cursorLatex;\n const isChar = /[a-zA-Z{]/;\n let currentPos = textarea.selectionStart;\n let equation = textarea.value;\n\n // Move the cursor so it does not break expressions.\n // Start at the very beginning.\n if (!currentPos) {\n currentPos = 0;\n }\n\n if (getSourceEquation()) {\n currentPos = equation.length;\n }\n\n // First move back to the beginning of the line.\n while (equation.charAt(currentPos) === '\\\\' && currentPos >= 0) {\n currentPos -= 1;\n }\n if (currentPos !== 0) {\n if (equation.charAt(currentPos - 1) != '{') {\n // Now match to the end of the line.\n while (isChar.test(equation.charAt(currentPos)) &&\n currentPos < equation.length &&\n isChar.test(equation.charAt(currentPos - 1))) {\n currentPos += 1;\n }\n }\n }\n // Save the cursor position - for insertion from the library.\n lastCursorPos = currentPos;\n equation = prefix + equation.substring(0, currentPos) + cursorLatex + equation.substring(currentPos);\n\n equation = Selectors.delimiters.start + ' ' + equation + ' ' + Selectors.delimiters.end;\n TinyEquationRepository.filterEquation(1, equation).then((data) => {\n preview.innerHTML = data.content;\n notifyFilter(preview);\n\n return data;\n }).catch(displayException);\n};\n\n/**\n * Notify the filters about the modified nodes\n * @param {Element} element\n */\nconst notifyFilter = (element) => {\n notifyFilterContentUpdated(element);\n};\n\n/**\n * Callback handling the keyboard navigation in the groups of the library.\n * @param {Event} e\n */\nconst groupNavigation = (e) => {\n e.preventDefault();\n\n const current = e.target.closest(Selectors.elements.libraryItem);\n const parent = current.parentNode; // This must be the
containing all the buttons of the group.\n const buttons = Array.prototype.slice.call(parent.querySelectorAll(Selectors.elements.libraryItem));\n const direction = e.keyCode !== 37 ? 1 : -1;\n let index = buttons.indexOf(current);\n let nextButton;\n\n if (index < 0) {\n index = 0;\n }\n\n index += direction;\n if (index < 0) {\n index = buttons.length - 1;\n } else if (index >= buttons.length) {\n index = 0;\n }\n nextButton = buttons[index];\n nextButton.focus();\n};\n"],"names":["currentForm","lastCursorPos","editor","displayDialogue","async","data","currentEquationData","Object","assign","modalPromises","ModalFactory","create","type","EquationModal","TYPE","templateContext","getTemplateContext","large","show","$root","getRoot","root","querySelector","Selectors","elements","form","on","ModalEvents","hidden","destroy","shown","library","TinyEquationRepository","filterEquation","innerHTML","then","content","updatePreview","notifyFilter","catch","displayException","addEventListener","e","libraryItem","target","closest","submitAction","actions","submit","textArea","preventDefault","selectLibraryItem","equationTextArea","keyCode","groupNavigation","libraries","texDocsUrl","elementid","id","texdocsurl","delimiters","tex","getAttribute","input","oldValue","newValue","focusPoint","value","substring","charAt","length","focus","selectionStart","selectionEnd","textarea","preview","cursorLatex","isChar","currentPos","equation","test","start","end","element","current","parent","parentNode","buttons","Array","prototype","slice","call","querySelectorAll","direction","nextButton","index","indexOf"],"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 - 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 * Tiny Equation UI.\n *\n * @module tiny_equation/ui\n * @copyright 2022 Huong Nguyen \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport EquationModal from 'tiny_equation/modal';\nimport ModalFactory from 'core/modal_factory';\nimport ModalEvents from 'core/modal_events';\nimport {getContextId, getLibraries, getTexDocsUrl} from 'tiny_equation/options';\nimport {notifyFilterContentUpdated} from 'core/event';\nimport * as TinyEquationRepository from 'tiny_equation/repository';\nimport {exception as displayException} from 'core/notification';\nimport {debounce} from 'core/utils';\nimport Selectors from 'tiny_equation/selectors';\nimport {getSourceEquation, getCurrentEquationData, setEquation} from 'tiny_equation/equation';\n\nlet currentForm;\nlet lastCursorPos = 0;\n\n/**\n * Handle action\n * @param {TinyMCE} editor\n */\nexport const handleAction = (editor) => {\n displayDialogue(editor);\n};\n\n/**\n * Display the equation editor\n * @param {TinyMCE} editor\n * @returns {Promise}\n */\nconst displayDialogue = async(editor) => {\n let data = {};\n const currentEquationData = getCurrentEquationData(editor);\n if (currentEquationData) {\n Object.assign(data, currentEquationData);\n }\n const modalPromises = await ModalFactory.create({\n type: EquationModal.TYPE,\n templateContext: getTemplateContext(editor, data),\n large: true,\n });\n\n modalPromises.show();\n const $root = await modalPromises.getRoot();\n const root = $root[0];\n currentForm = root.querySelector(Selectors.elements.form);\n\n const contextId = getContextId(editor);\n\n $root.on(ModalEvents.hidden, () => {\n modalPromises.destroy();\n });\n\n $root.on(ModalEvents.shown, () => {\n const library = root.querySelector(Selectors.elements.library);\n TinyEquationRepository.filterEquation(contextId, library.innerHTML).then(async data => {\n library.innerHTML = data.content;\n updatePreview(contextId);\n notifyFilter(library);\n return data;\n }).catch(displayException);\n });\n\n root.addEventListener('click', (e) => {\n const libraryItem = e.target.closest(Selectors.elements.libraryItem);\n const submitAction = e.target.closest(Selectors.actions.submit);\n const textArea = e.target.closest('.tiny_equation_equation');\n if (libraryItem) {\n e.preventDefault();\n selectLibraryItem(libraryItem, contextId);\n }\n if (submitAction) {\n e.preventDefault();\n setEquation(currentForm, editor);\n modalPromises.destroy();\n }\n if (textArea) {\n debounce(updatePreview(contextId), 500);\n }\n });\n\n root.addEventListener('keyup', (e) => {\n const textArea = e.target.closest(Selectors.elements.equationTextArea);\n if (textArea) {\n debounce(updatePreview(contextId), 500);\n }\n });\n\n root.addEventListener('keydown', (e) => {\n const libraryItem = e.target.closest(Selectors.elements.libraryItem);\n if (libraryItem) {\n if (e.keyCode == 37 || e.keyCode == 39) {\n groupNavigation(e);\n }\n }\n });\n};\n\n/**\n * Get template context.\n * @param {TinyMCE} editor\n * @param {Object} data\n * @returns {Object}\n */\nconst getTemplateContext = (editor, data) => {\n const libraries = getLibraries(editor);\n const texDocsUrl = getTexDocsUrl(editor);\n\n return Object.assign({}, {\n elementid: editor.id,\n libraries: libraries,\n texdocsurl: texDocsUrl,\n delimiters: Selectors.delimiters,\n }, data);\n};\n\n/**\n * Handle select library item.\n * @param {Object} libraryItem\n * @param {number} contextId\n */\nconst selectLibraryItem = (libraryItem, contextId) => {\n const tex = libraryItem.getAttribute('data-tex');\n const input = currentForm.querySelector(Selectors.elements.equationTextArea);\n let oldValue;\n let newValue;\n let focusPoint = 0;\n\n oldValue = input.value;\n\n newValue = oldValue.substring(0, lastCursorPos);\n if (newValue.charAt(newValue.length - 1) !== ' ') {\n newValue += ' ';\n }\n newValue += tex;\n focusPoint = newValue.length;\n\n if (oldValue.charAt(lastCursorPos) !== ' ') {\n newValue += ' ';\n }\n newValue += oldValue.substring(lastCursorPos, oldValue.length);\n\n input.value = newValue;\n input.focus();\n\n input.selectionStart = input.selectionEnd = focusPoint;\n\n updatePreview(contextId);\n};\n\n/**\n * Update the preview section.\n * @param {number} contextId\n */\nconst updatePreview = (contextId) => {\n const textarea = currentForm.querySelector(Selectors.elements.equationTextArea);\n const preview = currentForm.querySelector(Selectors.elements.preview);\n const prefix = '';\n const cursorLatex = Selectors.cursorLatex;\n const isChar = /[a-zA-Z{]/;\n let currentPos = textarea.selectionStart;\n let equation = textarea.value;\n\n // Move the cursor so it does not break expressions.\n // Start at the very beginning.\n if (!currentPos) {\n currentPos = 0;\n }\n\n if (getSourceEquation()) {\n currentPos = equation.length;\n }\n\n // First move back to the beginning of the line.\n while (equation.charAt(currentPos) === '\\\\' && currentPos >= 0) {\n currentPos -= 1;\n }\n if (currentPos !== 0) {\n if (equation.charAt(currentPos - 1) != '{') {\n // Now match to the end of the line.\n while (isChar.test(equation.charAt(currentPos)) &&\n currentPos < equation.length &&\n isChar.test(equation.charAt(currentPos - 1))) {\n currentPos += 1;\n }\n }\n }\n // Save the cursor position - for insertion from the library.\n lastCursorPos = currentPos;\n equation = prefix + equation.substring(0, currentPos) + cursorLatex + equation.substring(currentPos);\n\n equation = Selectors.delimiters.start + ' ' + equation + ' ' + Selectors.delimiters.end;\n TinyEquationRepository.filterEquation(contextId, equation).then((data) => {\n preview.innerHTML = data.content;\n notifyFilter(preview);\n\n return data;\n }).catch(displayException);\n};\n\n/**\n * Notify the filters about the modified nodes\n * @param {Element} element\n */\nconst notifyFilter = (element) => {\n notifyFilterContentUpdated(element);\n};\n\n/**\n * Callback handling the keyboard navigation in the groups of the library.\n * @param {Event} e\n */\nconst groupNavigation = (e) => {\n e.preventDefault();\n\n const current = e.target.closest(Selectors.elements.libraryItem);\n const parent = current.parentNode; // This must be the
containing all the buttons of the group.\n const buttons = Array.prototype.slice.call(parent.querySelectorAll(Selectors.elements.libraryItem));\n const direction = e.keyCode !== 37 ? 1 : -1;\n let index = buttons.indexOf(current);\n let nextButton;\n\n if (index < 0) {\n index = 0;\n }\n\n index += direction;\n if (index < 0) {\n index = buttons.length - 1;\n } else if (index >= buttons.length) {\n index = 0;\n }\n nextButton = buttons[index];\n nextButton.focus();\n};\n"],"names":["currentForm","lastCursorPos","editor","displayDialogue","async","data","currentEquationData","Object","assign","modalPromises","ModalFactory","create","type","EquationModal","TYPE","templateContext","getTemplateContext","large","show","$root","getRoot","root","querySelector","Selectors","elements","form","contextId","on","ModalEvents","hidden","destroy","shown","library","TinyEquationRepository","filterEquation","innerHTML","then","content","updatePreview","notifyFilter","catch","displayException","addEventListener","e","libraryItem","target","closest","submitAction","actions","submit","textArea","preventDefault","selectLibraryItem","equationTextArea","keyCode","groupNavigation","libraries","texDocsUrl","elementid","id","texdocsurl","delimiters","tex","getAttribute","input","oldValue","newValue","focusPoint","value","substring","charAt","length","focus","selectionStart","selectionEnd","textarea","preview","cursorLatex","isChar","currentPos","equation","test","start","end","element","current","parent","parentNode","buttons","Array","prototype","slice","call","querySelectorAll","direction","nextButton","index","indexOf"],"mappings":";;;;;;;SAkCIA,+9BACAC,cAAgB,wBAMSC,SACzBC,gBAAgBD,eAQdC,gBAAkBC,MAAAA,aAChBC,KAAO,SACLC,qBAAsB,oCAAuBJ,QAC/CI,qBACAC,OAAOC,OAAOH,KAAMC,2BAElBG,oBAAsBC,uBAAaC,OAAO,CAC5CC,KAAMC,eAAcC,KACpBC,gBAAiBC,mBAAmBd,OAAQG,MAC5CY,OAAO,IAGXR,cAAcS,aACRC,YAAcV,cAAcW,UAC5BC,KAAOF,MAAM,GACnBnB,YAAcqB,KAAKC,cAAcC,mBAAUC,SAASC,YAE9CC,WAAY,yBAAaxB,QAE/BiB,MAAMQ,GAAGC,sBAAYC,QAAQ,KACzBpB,cAAcqB,aAGlBX,MAAMQ,GAAGC,sBAAYG,OAAO,WAClBC,QAAUX,KAAKC,cAAcC,mBAAUC,SAASQ,SACtDC,uBAAuBC,eAAeR,UAAWM,QAAQG,WAAWC,MAAKhC,MAAAA,OACrE4B,QAAQG,UAAY9B,KAAKgC,QACzBC,cAAcZ,WACda,aAAaP,SACN3B,QACRmC,MAAMC,4BAGbpB,KAAKqB,iBAAiB,SAAUC,UACtBC,YAAcD,EAAEE,OAAOC,QAAQvB,mBAAUC,SAASoB,aAClDG,aAAeJ,EAAEE,OAAOC,QAAQvB,mBAAUyB,QAAQC,QAClDC,SAAWP,EAAEE,OAAOC,QAAQ,2BAC9BF,cACAD,EAAEQ,iBACFC,kBAAkBR,YAAalB,YAE/BqB,eACAJ,EAAEQ,2CACUnD,YAAaE,QACzBO,cAAcqB,WAEdoB,8BACSZ,cAAcZ,WAAY,QAI3CL,KAAKqB,iBAAiB,SAAUC,IACXA,EAAEE,OAAOC,QAAQvB,mBAAUC,SAAS6B,uCAExCf,cAAcZ,WAAY,QAI3CL,KAAKqB,iBAAiB,WAAYC,IACVA,EAAEE,OAAOC,QAAQvB,mBAAUC,SAASoB,eAEnC,IAAbD,EAAEW,SAA8B,IAAbX,EAAEW,SACrBC,gBAAgBZ,QAY1B3B,mBAAqB,CAACd,OAAQG,cAC1BmD,WAAY,yBAAatD,QACzBuD,YAAa,0BAAcvD,eAE1BK,OAAOC,OAAO,GAAI,CACrBkD,UAAWxD,OAAOyD,GAClBH,UAAWA,UACXI,WAAYH,WACZI,WAAYtC,mBAAUsC,YACvBxD,OAQD+C,kBAAoB,CAACR,YAAalB,mBAC9BoC,IAAMlB,YAAYmB,aAAa,YAC/BC,MAAQhE,YAAYsB,cAAcC,mBAAUC,SAAS6B,sBACvDY,SACAC,SACAC,WAAa,EAEjBF,SAAWD,MAAMI,MAEjBF,SAAWD,SAASI,UAAU,EAAGpE,eACY,MAAzCiE,SAASI,OAAOJ,SAASK,OAAS,KAClCL,UAAY,KAEhBA,UAAYJ,IACZK,WAAaD,SAASK,OAEiB,MAAnCN,SAASK,OAAOrE,iBAChBiE,UAAY,KAEhBA,UAAYD,SAASI,UAAUpE,cAAegE,SAASM,QAEvDP,MAAMI,MAAQF,SACdF,MAAMQ,QAENR,MAAMS,eAAiBT,MAAMU,aAAeP,WAE5C7B,cAAcZ,YAOZY,cAAiBZ,kBACbiD,SAAW3E,YAAYsB,cAAcC,mBAAUC,SAAS6B,kBACxDuB,QAAU5E,YAAYsB,cAAcC,mBAAUC,SAASoD,SAEvDC,YAActD,mBAAUsD,YACxBC,OAAS,gBACXC,WAAaJ,SAASF,eACtBO,SAAWL,SAASP,UAInBW,aACDA,WAAa,IAGb,mCACAA,WAAaC,SAAST,QAIa,OAAhCS,SAASV,OAAOS,aAAwBA,YAAc,GACzDA,YAAc,KAEC,IAAfA,YACuC,KAAnCC,SAASV,OAAOS,WAAa,QAEtBD,OAAOG,KAAKD,SAASV,OAAOS,cAC3BA,WAAaC,SAAST,QACtBO,OAAOG,KAAKD,SAASV,OAAOS,WAAa,KAC7CA,YAAc,EAK1B9E,cAAgB8E,WAChBC,SAhCe,GAgCKA,SAASX,UAAU,EAAGU,YAAcF,YAAcG,SAASX,UAAUU,YAEzFC,SAAWzD,mBAAUsC,WAAWqB,MAAQ,IAAMF,SAAW,IAAMzD,mBAAUsC,WAAWsB,IACpFlD,uBAAuBC,eAAeR,UAAWsD,UAAU5C,MAAM/B,OAC7DuE,QAAQzC,UAAY9B,KAAKgC,QACzBE,aAAaqC,SAENvE,QACRmC,MAAMC,0BAOPF,aAAgB6C,gDACSA,UAOzB7B,gBAAmBZ,IACrBA,EAAEQ,uBAEIkC,QAAU1C,EAAEE,OAAOC,QAAQvB,mBAAUC,SAASoB,aAC9C0C,OAASD,QAAQE,WACjBC,QAAUC,MAAMC,UAAUC,MAAMC,KAAKN,OAAOO,iBAAiBtE,mBAAUC,SAASoB,cAChFkD,UAA0B,KAAdnD,EAAEW,QAAiB,GAAK,MAEtCyC,WADAC,MAAQR,QAAQS,QAAQZ,SAGxBW,MAAQ,IACRA,MAAQ,GAGZA,OAASF,UACLE,MAAQ,EACRA,MAAQR,QAAQjB,OAAS,EAClByB,OAASR,QAAQjB,SACxByB,MAAQ,GAEZD,WAAaP,QAAQQ,OACrBD,WAAWvB"} \ No newline at end of file diff --git a/lib/editor/tiny/plugins/equation/amd/src/ui.js b/lib/editor/tiny/plugins/equation/amd/src/ui.js index 142925db267..593c72729ed 100644 --- a/lib/editor/tiny/plugins/equation/amd/src/ui.js +++ b/lib/editor/tiny/plugins/equation/amd/src/ui.js @@ -24,7 +24,7 @@ import EquationModal from 'tiny_equation/modal'; import ModalFactory from 'core/modal_factory'; import ModalEvents from 'core/modal_events'; -import {getLibraries, getTexDocsUrl} from 'tiny_equation/options'; +import {getContextId, getLibraries, getTexDocsUrl} from 'tiny_equation/options'; import {notifyFilterContentUpdated} from 'core/event'; import * as TinyEquationRepository from 'tiny_equation/repository'; import {exception as displayException} from 'core/notification'; @@ -65,15 +65,17 @@ const displayDialogue = async(editor) => { const root = $root[0]; currentForm = root.querySelector(Selectors.elements.form); + const contextId = getContextId(editor); + $root.on(ModalEvents.hidden, () => { modalPromises.destroy(); }); $root.on(ModalEvents.shown, () => { const library = root.querySelector(Selectors.elements.library); - TinyEquationRepository.filterEquation(1, library.innerHTML).then(async data => { + TinyEquationRepository.filterEquation(contextId, library.innerHTML).then(async data => { library.innerHTML = data.content; - updatePreview(); + updatePreview(contextId); notifyFilter(library); return data; }).catch(displayException); @@ -85,7 +87,7 @@ const displayDialogue = async(editor) => { const textArea = e.target.closest('.tiny_equation_equation'); if (libraryItem) { e.preventDefault(); - selectLibraryItem(libraryItem); + selectLibraryItem(libraryItem, contextId); } if (submitAction) { e.preventDefault(); @@ -93,14 +95,14 @@ const displayDialogue = async(editor) => { modalPromises.destroy(); } if (textArea) { - debounce(updatePreview(), 500); + debounce(updatePreview(contextId), 500); } }); root.addEventListener('keyup', (e) => { const textArea = e.target.closest(Selectors.elements.equationTextArea); if (textArea) { - debounce(updatePreview(), 500); + debounce(updatePreview(contextId), 500); } }); @@ -135,8 +137,9 @@ const getTemplateContext = (editor, data) => { /** * Handle select library item. * @param {Object} libraryItem + * @param {number} contextId */ -const selectLibraryItem = (libraryItem) => { +const selectLibraryItem = (libraryItem, contextId) => { const tex = libraryItem.getAttribute('data-tex'); const input = currentForm.querySelector(Selectors.elements.equationTextArea); let oldValue; @@ -162,13 +165,14 @@ const selectLibraryItem = (libraryItem) => { input.selectionStart = input.selectionEnd = focusPoint; - updatePreview(); + updatePreview(contextId); }; /** * Update the preview section. + * @param {number} contextId */ -const updatePreview = () => { +const updatePreview = (contextId) => { const textarea = currentForm.querySelector(Selectors.elements.equationTextArea); const preview = currentForm.querySelector(Selectors.elements.preview); const prefix = ''; @@ -206,7 +210,7 @@ const updatePreview = () => { equation = prefix + equation.substring(0, currentPos) + cursorLatex + equation.substring(currentPos); equation = Selectors.delimiters.start + ' ' + equation + ' ' + Selectors.delimiters.end; - TinyEquationRepository.filterEquation(1, equation).then((data) => { + TinyEquationRepository.filterEquation(contextId, equation).then((data) => { preview.innerHTML = data.content; notifyFilter(preview);