diff --git a/lib/editor/tiny/plugins/premium/amd/build/configuration.min.js b/lib/editor/tiny/plugins/premium/amd/build/configuration.min.js
index e6bb63433f8..c06698bd6f1 100644
--- a/lib/editor/tiny/plugins/premium/amd/build/configuration.min.js
+++ b/lib/editor/tiny/plugins/premium/amd/build/configuration.min.js
@@ -1,3 +1,3 @@
-define("tiny_premium/configuration",["exports","editor_tiny/utils","editor_tiny/options"],(function(_exports,_utils,_options){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.configure=void 0;_exports.configure=(instanceConfig,options)=>{const enabledPremiumPlugins=(0,_options.getInitialPluginConfiguration)(options)[(0,_options.getPluginOptionName)("tiny_premium/plugin","premiumplugins")].split(",");let plugins=instanceConfig.plugins,menu=instanceConfig.menu,toolbar=(toolbar=>(toolbar=(0,_utils.addToolbarSection)(toolbar,"premium_a","advanced",!0),(0,_utils.addToolbarSection)(toolbar,"premium_b","formatting",!0)))(instanceConfig.toolbar),contextmenu=instanceConfig.contextmenu;return-1!==enabledPremiumPlugins.indexOf("advtable")&&(plugins+=" advtable",menu=(0,_utils.addMenubarItem)(menu,"table","| advtablerownumbering","advtablesort")),-1!==enabledPremiumPlugins.indexOf("editimage")&&(plugins+=" editimage",toolbar=(0,_utils.addToolbarButton)(toolbar,"content","editimage","tiny_media_image"),instanceConfig.editimage_toolbar="rotateleft rotateright flipv fliph editimage"),-1!==enabledPremiumPlugins.indexOf("export")&&(plugins+=" export",menu=(0,_utils.addMenubarItem)(menu,"tools","| export")),-1!==enabledPremiumPlugins.indexOf("pageembed")&&(plugins+=" pageembed",toolbar=(0,_utils.addToolbarButton)(toolbar,"content","pageembed","tiny_media_video")),-1!==enabledPremiumPlugins.indexOf("typography")&&(plugins+=" typography",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_b","typography")),-1!==enabledPremiumPlugins.indexOf("casechange")&&(plugins+=" casechange",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","casechange")),-1!==enabledPremiumPlugins.indexOf("checklist")&&(plugins+=" checklist",toolbar=(0,_utils.addToolbarButton)(toolbar,"lists","checklist")),-1!==enabledPremiumPlugins.indexOf("tinymcespellchecker")&&(plugins+=" tinymcespellchecker",menu=(0,_utils.addMenubarItem)(menu,"tools","spellcheckdialog","spellcheckerlanguage"),contextmenu=(0,_utils.addContextmenuItem)(contextmenu,"spellchecker"),toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","spellcheckdialog")),-1!==enabledPremiumPlugins.indexOf("autocorrect")&&(plugins+=" autocorrect",menu=(0,_utils.addMenubarItem)(menu,"tools","| autocorrect capitalization","spellcheckdialog")),-1!==enabledPremiumPlugins.indexOf("permanentpen")&&(plugins+=" permanentpen",menu=(0,_utils.addMenubarItem)(menu,"format","| permanentpen configurepermanentpen"),toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","permanentpen"),contextmenu=(0,_utils.addContextmenuItem)(contextmenu,"configurepermanentpen")),-1!==enabledPremiumPlugins.indexOf("formatpainter")&&(plugins+=" formatpainter",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","formatpainter")),-1!==enabledPremiumPlugins.indexOf("linkchecker")&&(plugins+=" linkchecker",contextmenu=(0,_utils.addContextmenuItem)(contextmenu,"linkchecker")),-1!==enabledPremiumPlugins.indexOf("tableofcontents")&&(plugins+=" tableofcontents",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","tableofcontents")),-1!==enabledPremiumPlugins.indexOf("math")&&(plugins+=" math",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","math"),menu=(0,_utils.addMenubarItem)(menu,"insert","math","tableofcontents")),-1!==enabledPremiumPlugins.indexOf("footnotes")&&(plugins+=" footnotes",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","footnotes"),menu=(0,_utils.addMenubarItem)(menu,"insert","footnotes","tableofcontents")),-1!==enabledPremiumPlugins.indexOf("powerpaste")&&(plugins+=" powerpaste"),{plugins:plugins,toolbar:toolbar,menu:menu,contextmenu:contextmenu}}}));
+define("tiny_premium/configuration",["exports","editor_tiny/utils","editor_tiny/options"],(function(_exports,_utils,_options){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.configure=void 0;_exports.configure=(instanceConfig,options)=>{const enabledPremiumPlugins=(0,_options.getInitialPluginConfiguration)(options)[(0,_options.getPluginOptionName)("tiny_premium/plugin","premiumplugins")].split(",");let plugins=instanceConfig.plugins,menu=instanceConfig.menu,toolbar=(toolbar=>(toolbar=(0,_utils.addToolbarSection)(toolbar,"premium_a","advanced",!0),(0,_utils.addToolbarSection)(toolbar,"premium_b","formatting",!0)))(instanceConfig.toolbar),contextmenu=instanceConfig.contextmenu;return-1!==enabledPremiumPlugins.indexOf("advtable")&&(plugins+=" advtable",menu=(0,_utils.addMenubarItem)(menu,"table","| advtablerownumbering","advtablesort")),-1!==enabledPremiumPlugins.indexOf("editimage")&&(plugins+=" editimage",toolbar=(0,_utils.addToolbarButton)(toolbar,"content","editimage","tiny_media_image"),instanceConfig.editimage_toolbar="rotateleft rotateright flipv fliph editimage"),-1!==enabledPremiumPlugins.indexOf("export")&&(plugins+=" export",menu=(0,_utils.addMenubarItem)(menu,"tools","| export")),-1!==enabledPremiumPlugins.indexOf("pageembed")&&(plugins+=" pageembed",toolbar=(0,_utils.addToolbarButton)(toolbar,"content","pageembed","tiny_media_video")),-1!==enabledPremiumPlugins.indexOf("typography")&&(plugins+=" typography",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_b","typography")),-1!==enabledPremiumPlugins.indexOf("casechange")&&(plugins+=" casechange",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","casechange")),-1!==enabledPremiumPlugins.indexOf("checklist")&&(plugins+=" checklist",toolbar=(0,_utils.addToolbarButton)(toolbar,"lists","checklist")),-1!==enabledPremiumPlugins.indexOf("tinymcespellchecker")&&(plugins+=" tinymcespellchecker",menu=(0,_utils.addMenubarItem)(menu,"tools","spellcheckdialog","spellcheckerlanguage"),contextmenu=(0,_utils.addContextmenuItem)(contextmenu,"spellchecker"),toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","spellcheckdialog")),-1!==enabledPremiumPlugins.indexOf("autocorrect")&&(plugins+=" autocorrect",menu=(0,_utils.addMenubarItem)(menu,"tools","| autocorrect capitalization","spellcheckdialog")),-1!==enabledPremiumPlugins.indexOf("permanentpen")&&(plugins+=" permanentpen",menu=(0,_utils.addMenubarItem)(menu,"format","| permanentpen configurepermanentpen"),toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","permanentpen"),contextmenu=(0,_utils.addContextmenuItem)(contextmenu,"configurepermanentpen")),-1!==enabledPremiumPlugins.indexOf("formatpainter")&&(plugins+=" formatpainter",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","formatpainter")),-1!==enabledPremiumPlugins.indexOf("linkchecker")&&(plugins+=" linkchecker",contextmenu=(0,_utils.addContextmenuItem)(contextmenu,"linkchecker")),-1!==enabledPremiumPlugins.indexOf("tableofcontents")&&(plugins+=" tableofcontents",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","tableofcontents")),-1!==enabledPremiumPlugins.indexOf("math")&&(plugins+=" math",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","math"),menu=(0,_utils.addMenubarItem)(menu,"insert","math","tableofcontents")),-1!==enabledPremiumPlugins.indexOf("footnotes")&&(plugins+=" footnotes",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","footnotes"),menu=(0,_utils.addMenubarItem)(menu,"insert","footnotes","tableofcontents")),-1!==enabledPremiumPlugins.indexOf("powerpaste")&&(plugins+=" powerpaste"),-1!==enabledPremiumPlugins.indexOf("a11ychecker")&&(plugins+=" a11ychecker",toolbar=(0,_utils.addToolbarButton)(toolbar,"premium_a","a11ycheck"),menu=(0,_utils.removeMenubarItem)(menu,"tools","a11ycheck"),menu=(0,_utils.addMenubarItem)(menu,"tools","a11ycheck","count"),menu=(0,_utils.removeMenubarItem)(menu,"tools","tiny_accessibilitychecker")),{plugins:plugins,toolbar:toolbar,menu:menu,contextmenu:contextmenu}}}));
//# sourceMappingURL=configuration.min.js.map
\ No newline at end of file
diff --git a/lib/editor/tiny/plugins/premium/amd/build/configuration.min.js.map b/lib/editor/tiny/plugins/premium/amd/build/configuration.min.js.map
index 168f12453a9..74966e22b45 100644
--- a/lib/editor/tiny/plugins/premium/amd/build/configuration.min.js.map
+++ b/lib/editor/tiny/plugins/premium/amd/build/configuration.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"configuration.min.js","sources":["../src/configuration.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 Premium configuration.\n *\n * @module tiny_premium/configuration\n * @copyright 2023 David Woloszyn \n * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {\n addToolbarButton,\n addMenubarItem,\n addToolbarSection,\n addContextmenuItem\n} from 'editor_tiny/utils';\nimport {\n getInitialPluginConfiguration,\n getPluginOptionName\n} from 'editor_tiny/options';\n\nconst configureToolbar = (toolbar) => {\n // Add premium toolbar sections to house all the plugins with no natural home.\n toolbar = addToolbarSection(toolbar, 'premium_a', 'advanced', true);\n toolbar = addToolbarSection(toolbar, 'premium_b', 'formatting', true);\n return toolbar;\n};\n\nexport const configure = (instanceConfig, options) => {\n // Get the namespaced options for Tiny Premium before they are officially initialised.\n // Due to the timing the plugin options are available, we need to get at the options in this slightly unconventional way.\n const pluginOptions = getInitialPluginConfiguration(options);\n const enabledPremiumPlugins = pluginOptions[getPluginOptionName('tiny_premium/plugin', 'premiumplugins')].split(',');\n\n let plugins = instanceConfig.plugins;\n let menu = instanceConfig.menu;\n let toolbar = configureToolbar(instanceConfig.toolbar);\n let contextmenu = instanceConfig.contextmenu;\n let pluginsettings = {};\n\n // Advanced Table.\n if (enabledPremiumPlugins.indexOf('advtable') !== -1) {\n plugins += ` advtable`;\n menu = addMenubarItem(menu, 'table', '| advtablerownumbering', 'advtablesort');\n }\n // Enhanced Image Editing.\n if (enabledPremiumPlugins.indexOf('editimage') !== -1) {\n plugins += ` editimage`;\n toolbar = addToolbarButton(toolbar, 'content', 'editimage', 'tiny_media_image');\n // Remove the duplicate image button from the quickbar toolbar by redefining the values without 'imageoptions'.\n // eslint-disable-next-line camelcase\n instanceConfig.editimage_toolbar = 'rotateleft rotateright flipv fliph editimage';\n }\n // Export.\n if (enabledPremiumPlugins.indexOf('export') !== -1) {\n plugins += ` export`;\n menu = addMenubarItem(menu, 'tools', '| export');\n }\n // Page Embed.\n if (enabledPremiumPlugins.indexOf('pageembed') !== -1) {\n plugins += ` pageembed`;\n toolbar = addToolbarButton(toolbar, 'content', 'pageembed', 'tiny_media_video');\n }\n // Advanced Typography.\n if (enabledPremiumPlugins.indexOf('typography') !== -1) {\n plugins += ` typography`;\n toolbar = addToolbarButton(toolbar, 'premium_b', 'typography');\n }\n // Case Change.\n if (enabledPremiumPlugins.indexOf('casechange') !== -1) {\n plugins += ` casechange`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'casechange');\n }\n // Checklist.\n if (enabledPremiumPlugins.indexOf('checklist') !== -1) {\n plugins += ` checklist`;\n toolbar = addToolbarButton(toolbar, 'lists', 'checklist');\n }\n // Spell Checker Pro.\n if (enabledPremiumPlugins.indexOf('tinymcespellchecker') !== -1) {\n plugins += ` tinymcespellchecker`;\n menu = addMenubarItem(menu, 'tools', 'spellcheckdialog', 'spellcheckerlanguage');\n contextmenu = addContextmenuItem(contextmenu, 'spellchecker');\n toolbar = addToolbarButton(toolbar, 'premium_a', 'spellcheckdialog');\n }\n // Spelling Autocorrect.\n if (enabledPremiumPlugins.indexOf('autocorrect') !== -1) {\n plugins += ` autocorrect`;\n menu = addMenubarItem(menu, 'tools', '| autocorrect capitalization', 'spellcheckdialog');\n }\n // Permanent Pen.\n if (enabledPremiumPlugins.indexOf('permanentpen') !== -1) {\n plugins += ` permanentpen`;\n menu = addMenubarItem(menu, 'format', '| permanentpen configurepermanentpen');\n toolbar = addToolbarButton(toolbar, 'premium_a', 'permanentpen');\n contextmenu = addContextmenuItem(contextmenu, 'configurepermanentpen');\n }\n // Format Painter.\n if (enabledPremiumPlugins.indexOf('formatpainter') !== -1) {\n plugins += ` formatpainter`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'formatpainter');\n }\n // Link Checker.\n if (enabledPremiumPlugins.indexOf('linkchecker') !== -1) {\n plugins += ` linkchecker`;\n contextmenu = addContextmenuItem(contextmenu, 'linkchecker');\n }\n // Table of Contents.\n if (enabledPremiumPlugins.indexOf('tableofcontents') !== -1) {\n plugins += ` tableofcontents`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'tableofcontents');\n }\n // MathML\n if (enabledPremiumPlugins.indexOf('math') !== -1) {\n plugins += ` math`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'math');\n menu = addMenubarItem(menu, 'insert', 'math', 'tableofcontents');\n }\n // Footnotes.\n if (enabledPremiumPlugins.indexOf('footnotes') !== -1) {\n plugins += ` footnotes`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'footnotes');\n menu = addMenubarItem(menu, 'insert', 'footnotes', 'tableofcontents');\n }\n // Powerpaste.\n if (enabledPremiumPlugins.indexOf('powerpaste') !== -1) {\n plugins += ` powerpaste`;\n }\n\n return {\n plugins,\n toolbar,\n menu,\n contextmenu,\n ...pluginsettings\n };\n};\n"],"names":["instanceConfig","options","enabledPremiumPlugins","split","plugins","menu","toolbar","configureToolbar","contextmenu","indexOf","editimage_toolbar"],"mappings":"mOAyCyB,CAACA,eAAgBC,iBAIhCC,uBADgB,0CAA8BD,UACR,gCAAoB,sBAAuB,mBAAmBE,MAAM,SAE5GC,QAAUJ,eAAeI,QACzBC,KAAOL,eAAeK,KACtBC,QAfkBA,CAAAA,UAEtBA,SAAU,4BAAkBA,QAAS,YAAa,YAAY,IACpD,4BAAkBA,QAAS,YAAa,cAAc,IAYlDC,CAAiBP,eAAeM,SAC1CE,YAAcR,eAAeQ,mBAIkB,IAA/CN,sBAAsBO,QAAQ,cAC9BL,qBACAC,MAAO,yBAAeA,KAAM,QAAS,yBAA0B,kBAGf,IAAhDH,sBAAsBO,QAAQ,eAC9BL,sBACAE,SAAU,2BAAiBA,QAAS,UAAW,YAAa,oBAG5DN,eAAeU,kBAAoB,iDAGU,IAA7CR,sBAAsBO,QAAQ,YAC9BL,mBACAC,MAAO,yBAAeA,KAAM,QAAS,cAGW,IAAhDH,sBAAsBO,QAAQ,eAC9BL,sBACAE,SAAU,2BAAiBA,QAAS,UAAW,YAAa,sBAGX,IAAjDJ,sBAAsBO,QAAQ,gBAC9BL,uBACAE,SAAU,2BAAiBA,QAAS,YAAa,gBAGA,IAAjDJ,sBAAsBO,QAAQ,gBAC9BL,uBACAE,SAAU,2BAAiBA,QAAS,YAAa,gBAGD,IAAhDJ,sBAAsBO,QAAQ,eAC9BL,sBACAE,SAAU,2BAAiBA,QAAS,QAAS,eAGa,IAA1DJ,sBAAsBO,QAAQ,yBAC9BL,gCACAC,MAAO,yBAAeA,KAAM,QAAS,mBAAoB,wBACzDG,aAAc,6BAAmBA,YAAa,gBAC9CF,SAAU,2BAAiBA,QAAS,YAAa,sBAGC,IAAlDJ,sBAAsBO,QAAQ,iBAC9BL,wBACAC,MAAO,yBAAeA,KAAM,QAAS,+BAAgC,sBAGlB,IAAnDH,sBAAsBO,QAAQ,kBAC9BL,yBACAC,MAAO,yBAAeA,KAAM,SAAU,wCACtCC,SAAU,2BAAiBA,QAAS,YAAa,gBACjDE,aAAc,6BAAmBA,YAAa,2BAGM,IAApDN,sBAAsBO,QAAQ,mBAC9BL,0BACAE,SAAU,2BAAiBA,QAAS,YAAa,mBAGC,IAAlDJ,sBAAsBO,QAAQ,iBAC9BL,wBACAI,aAAc,6BAAmBA,YAAa,iBAGQ,IAAtDN,sBAAsBO,QAAQ,qBAC9BL,4BACAE,SAAU,2BAAiBA,QAAS,YAAa,qBAGN,IAA3CJ,sBAAsBO,QAAQ,UAC9BL,iBACAE,SAAU,2BAAiBA,QAAS,YAAa,QACjDD,MAAO,yBAAeA,KAAM,SAAU,OAAQ,qBAGE,IAAhDH,sBAAsBO,QAAQ,eAC9BL,sBACAE,SAAU,2BAAiBA,QAAS,YAAa,aACjDD,MAAO,yBAAeA,KAAM,SAAU,YAAa,qBAGF,IAAjDH,sBAAsBO,QAAQ,gBAC9BL,wBAGG,CACHA,QAAAA,QACAE,QAAAA,QACAD,KAAAA,KACAG,YAAAA"}
\ No newline at end of file
+{"version":3,"file":"configuration.min.js","sources":["../src/configuration.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 Premium configuration.\n *\n * @module tiny_premium/configuration\n * @copyright 2023 David Woloszyn \n * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {\n addToolbarButton,\n addMenubarItem,\n addToolbarSection,\n addContextmenuItem,\n removeMenubarItem,\n} from 'editor_tiny/utils';\nimport {\n getInitialPluginConfiguration,\n getPluginOptionName\n} from 'editor_tiny/options';\n\nconst configureToolbar = (toolbar) => {\n // Add premium toolbar sections to house all the plugins with no natural home.\n toolbar = addToolbarSection(toolbar, 'premium_a', 'advanced', true);\n toolbar = addToolbarSection(toolbar, 'premium_b', 'formatting', true);\n return toolbar;\n};\n\nexport const configure = (instanceConfig, options) => {\n // Get the namespaced options for Tiny Premium before they are officially initialised.\n // Due to the timing the plugin options are available, we need to get at the options in this slightly unconventional way.\n const pluginOptions = getInitialPluginConfiguration(options);\n const enabledPremiumPlugins = pluginOptions[getPluginOptionName('tiny_premium/plugin', 'premiumplugins')].split(',');\n\n let plugins = instanceConfig.plugins;\n let menu = instanceConfig.menu;\n let toolbar = configureToolbar(instanceConfig.toolbar);\n let contextmenu = instanceConfig.contextmenu;\n let pluginsettings = {};\n\n // Advanced Table.\n if (enabledPremiumPlugins.indexOf('advtable') !== -1) {\n plugins += ` advtable`;\n menu = addMenubarItem(menu, 'table', '| advtablerownumbering', 'advtablesort');\n }\n // Enhanced Image Editing.\n if (enabledPremiumPlugins.indexOf('editimage') !== -1) {\n plugins += ` editimage`;\n toolbar = addToolbarButton(toolbar, 'content', 'editimage', 'tiny_media_image');\n // Remove the duplicate image button from the quickbar toolbar by redefining the values without 'imageoptions'.\n // eslint-disable-next-line camelcase\n instanceConfig.editimage_toolbar = 'rotateleft rotateright flipv fliph editimage';\n }\n // Export.\n if (enabledPremiumPlugins.indexOf('export') !== -1) {\n plugins += ` export`;\n menu = addMenubarItem(menu, 'tools', '| export');\n }\n // Page Embed.\n if (enabledPremiumPlugins.indexOf('pageembed') !== -1) {\n plugins += ` pageembed`;\n toolbar = addToolbarButton(toolbar, 'content', 'pageembed', 'tiny_media_video');\n }\n // Advanced Typography.\n if (enabledPremiumPlugins.indexOf('typography') !== -1) {\n plugins += ` typography`;\n toolbar = addToolbarButton(toolbar, 'premium_b', 'typography');\n }\n // Case Change.\n if (enabledPremiumPlugins.indexOf('casechange') !== -1) {\n plugins += ` casechange`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'casechange');\n }\n // Checklist.\n if (enabledPremiumPlugins.indexOf('checklist') !== -1) {\n plugins += ` checklist`;\n toolbar = addToolbarButton(toolbar, 'lists', 'checklist');\n }\n // Spell Checker Pro.\n if (enabledPremiumPlugins.indexOf('tinymcespellchecker') !== -1) {\n plugins += ` tinymcespellchecker`;\n menu = addMenubarItem(menu, 'tools', 'spellcheckdialog', 'spellcheckerlanguage');\n contextmenu = addContextmenuItem(contextmenu, 'spellchecker');\n toolbar = addToolbarButton(toolbar, 'premium_a', 'spellcheckdialog');\n }\n // Spelling Autocorrect.\n if (enabledPremiumPlugins.indexOf('autocorrect') !== -1) {\n plugins += ` autocorrect`;\n menu = addMenubarItem(menu, 'tools', '| autocorrect capitalization', 'spellcheckdialog');\n }\n // Permanent Pen.\n if (enabledPremiumPlugins.indexOf('permanentpen') !== -1) {\n plugins += ` permanentpen`;\n menu = addMenubarItem(menu, 'format', '| permanentpen configurepermanentpen');\n toolbar = addToolbarButton(toolbar, 'premium_a', 'permanentpen');\n contextmenu = addContextmenuItem(contextmenu, 'configurepermanentpen');\n }\n // Format Painter.\n if (enabledPremiumPlugins.indexOf('formatpainter') !== -1) {\n plugins += ` formatpainter`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'formatpainter');\n }\n // Link Checker.\n if (enabledPremiumPlugins.indexOf('linkchecker') !== -1) {\n plugins += ` linkchecker`;\n contextmenu = addContextmenuItem(contextmenu, 'linkchecker');\n }\n // Table of Contents.\n if (enabledPremiumPlugins.indexOf('tableofcontents') !== -1) {\n plugins += ` tableofcontents`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'tableofcontents');\n }\n // MathML\n if (enabledPremiumPlugins.indexOf('math') !== -1) {\n plugins += ` math`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'math');\n menu = addMenubarItem(menu, 'insert', 'math', 'tableofcontents');\n }\n // Footnotes.\n if (enabledPremiumPlugins.indexOf('footnotes') !== -1) {\n plugins += ` footnotes`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'footnotes');\n menu = addMenubarItem(menu, 'insert', 'footnotes', 'tableofcontents');\n }\n // Powerpaste.\n if (enabledPremiumPlugins.indexOf('powerpaste') !== -1) {\n plugins += ` powerpaste`;\n }\n // Accessibility Checker.\n if (enabledPremiumPlugins.indexOf('a11ychecker') !== -1) {\n plugins += ` a11ychecker`;\n toolbar = addToolbarButton(toolbar, 'premium_a', 'a11ycheck');\n // Tiny's allychecker plugin is listed in the menu by default. Let's remove it and add it where we want it.\n menu = removeMenubarItem(menu, 'tools', 'a11ycheck');\n // Positioning the a11ychecker in the same position as tiny_accessibilitychecker (for familiarity).\n menu = addMenubarItem(menu, 'tools', 'a11ycheck', 'count');\n // Finally, hide tiny_accessibilitychecker so there is no confusion.\n menu = removeMenubarItem(menu, 'tools', 'tiny_accessibilitychecker');\n }\n\n return {\n plugins,\n toolbar,\n menu,\n contextmenu,\n ...pluginsettings\n };\n};\n"],"names":["instanceConfig","options","enabledPremiumPlugins","split","plugins","menu","toolbar","configureToolbar","contextmenu","indexOf","editimage_toolbar"],"mappings":"mOA0CyB,CAACA,eAAgBC,iBAIhCC,uBADgB,0CAA8BD,UACR,gCAAoB,sBAAuB,mBAAmBE,MAAM,SAE5GC,QAAUJ,eAAeI,QACzBC,KAAOL,eAAeK,KACtBC,QAfkBA,CAAAA,UAEtBA,SAAU,4BAAkBA,QAAS,YAAa,YAAY,IACpD,4BAAkBA,QAAS,YAAa,cAAc,IAYlDC,CAAiBP,eAAeM,SAC1CE,YAAcR,eAAeQ,mBAIkB,IAA/CN,sBAAsBO,QAAQ,cAC9BL,qBACAC,MAAO,yBAAeA,KAAM,QAAS,yBAA0B,kBAGf,IAAhDH,sBAAsBO,QAAQ,eAC9BL,sBACAE,SAAU,2BAAiBA,QAAS,UAAW,YAAa,oBAG5DN,eAAeU,kBAAoB,iDAGU,IAA7CR,sBAAsBO,QAAQ,YAC9BL,mBACAC,MAAO,yBAAeA,KAAM,QAAS,cAGW,IAAhDH,sBAAsBO,QAAQ,eAC9BL,sBACAE,SAAU,2BAAiBA,QAAS,UAAW,YAAa,sBAGX,IAAjDJ,sBAAsBO,QAAQ,gBAC9BL,uBACAE,SAAU,2BAAiBA,QAAS,YAAa,gBAGA,IAAjDJ,sBAAsBO,QAAQ,gBAC9BL,uBACAE,SAAU,2BAAiBA,QAAS,YAAa,gBAGD,IAAhDJ,sBAAsBO,QAAQ,eAC9BL,sBACAE,SAAU,2BAAiBA,QAAS,QAAS,eAGa,IAA1DJ,sBAAsBO,QAAQ,yBAC9BL,gCACAC,MAAO,yBAAeA,KAAM,QAAS,mBAAoB,wBACzDG,aAAc,6BAAmBA,YAAa,gBAC9CF,SAAU,2BAAiBA,QAAS,YAAa,sBAGC,IAAlDJ,sBAAsBO,QAAQ,iBAC9BL,wBACAC,MAAO,yBAAeA,KAAM,QAAS,+BAAgC,sBAGlB,IAAnDH,sBAAsBO,QAAQ,kBAC9BL,yBACAC,MAAO,yBAAeA,KAAM,SAAU,wCACtCC,SAAU,2BAAiBA,QAAS,YAAa,gBACjDE,aAAc,6BAAmBA,YAAa,2BAGM,IAApDN,sBAAsBO,QAAQ,mBAC9BL,0BACAE,SAAU,2BAAiBA,QAAS,YAAa,mBAGC,IAAlDJ,sBAAsBO,QAAQ,iBAC9BL,wBACAI,aAAc,6BAAmBA,YAAa,iBAGQ,IAAtDN,sBAAsBO,QAAQ,qBAC9BL,4BACAE,SAAU,2BAAiBA,QAAS,YAAa,qBAGN,IAA3CJ,sBAAsBO,QAAQ,UAC9BL,iBACAE,SAAU,2BAAiBA,QAAS,YAAa,QACjDD,MAAO,yBAAeA,KAAM,SAAU,OAAQ,qBAGE,IAAhDH,sBAAsBO,QAAQ,eAC9BL,sBACAE,SAAU,2BAAiBA,QAAS,YAAa,aACjDD,MAAO,yBAAeA,KAAM,SAAU,YAAa,qBAGF,IAAjDH,sBAAsBO,QAAQ,gBAC9BL,yBAGkD,IAAlDF,sBAAsBO,QAAQ,iBAC9BL,wBACAE,SAAU,2BAAiBA,QAAS,YAAa,aAEjDD,MAAO,4BAAkBA,KAAM,QAAS,aAExCA,MAAO,yBAAeA,KAAM,QAAS,YAAa,SAElDA,MAAO,4BAAkBA,KAAM,QAAS,8BAGrC,CACHD,QAAAA,QACAE,QAAAA,QACAD,KAAAA,KACAG,YAAAA"}
\ No newline at end of file
diff --git a/lib/editor/tiny/plugins/premium/amd/src/configuration.js b/lib/editor/tiny/plugins/premium/amd/src/configuration.js
index 9cf0a9b6cd6..d51c572ac60 100644
--- a/lib/editor/tiny/plugins/premium/amd/src/configuration.js
+++ b/lib/editor/tiny/plugins/premium/amd/src/configuration.js
@@ -25,7 +25,8 @@ import {
addToolbarButton,
addMenubarItem,
addToolbarSection,
- addContextmenuItem
+ addContextmenuItem,
+ removeMenubarItem,
} from 'editor_tiny/utils';
import {
getInitialPluginConfiguration,
@@ -139,6 +140,17 @@ export const configure = (instanceConfig, options) => {
if (enabledPremiumPlugins.indexOf('powerpaste') !== -1) {
plugins += ` powerpaste`;
}
+ // Accessibility Checker.
+ if (enabledPremiumPlugins.indexOf('a11ychecker') !== -1) {
+ plugins += ` a11ychecker`;
+ toolbar = addToolbarButton(toolbar, 'premium_a', 'a11ycheck');
+ // Tiny's allychecker plugin is listed in the menu by default. Let's remove it and add it where we want it.
+ menu = removeMenubarItem(menu, 'tools', 'a11ycheck');
+ // Positioning the a11ychecker in the same position as tiny_accessibilitychecker (for familiarity).
+ menu = addMenubarItem(menu, 'tools', 'a11ycheck', 'count');
+ // Finally, hide tiny_accessibilitychecker so there is no confusion.
+ menu = removeMenubarItem(menu, 'tools', 'tiny_accessibilitychecker');
+ }
return {
plugins,
diff --git a/lib/editor/tiny/plugins/premium/classes/manager.php b/lib/editor/tiny/plugins/premium/classes/manager.php
index 97614e9ba70..a5e421d89b0 100644
--- a/lib/editor/tiny/plugins/premium/classes/manager.php
+++ b/lib/editor/tiny/plugins/premium/classes/manager.php
@@ -34,6 +34,7 @@ class manager {
*/
public static function get_plugins(): array {
return [
+ 'a11ychecker',
'advtable',
'typography',
'casechange',
diff --git a/lib/editor/tiny/plugins/premium/lang/en/tiny_premium.php b/lib/editor/tiny/plugins/premium/lang/en/tiny_premium.php
index 4e783e6b278..ef10836afc4 100644
--- a/lib/editor/tiny/plugins/premium/lang/en/tiny_premium.php
+++ b/lib/editor/tiny/plugins/premium/lang/en/tiny_premium.php
@@ -25,12 +25,14 @@
defined('MOODLE_INTERNAL') || die();
+$string['accessibilitycheckerinfo'] = 'The premium Accessibility Checker will override the default Accessibility Checker for users who have access to it.';
$string['apikey'] = 'API key';
$string['apikey_desc'] = 'Your API key is available on your Tiny Cloud account page if you have purchased a subscription, or if you are on a free trial.';
$string['emptyapikeywarning'] = 'Enabled TinyMCE Premium plugins will not be available until an API key is added.';
$string['pluginname'] = 'TinyMCE Premium';
$string['pluginnotfound'] = 'Tiny Premium plugin {$a} not found.';
$string['premium:accesspremium'] = 'Access TinyMCE Premium features';
+$string['premiumplugin:a11ychecker'] = 'Accessibility Checker';
$string['premiumplugin:advtable'] = 'Advanced Table';
$string['premiumplugin:autocorrect'] = 'Spelling Autocorrect';
$string['premiumplugin:casechange'] = 'Case Change';
diff --git a/lib/editor/tiny/plugins/premium/pluginsettings.php b/lib/editor/tiny/plugins/premium/pluginsettings.php
index 4111246556f..acb51f71156 100644
--- a/lib/editor/tiny/plugins/premium/pluginsettings.php
+++ b/lib/editor/tiny/plugins/premium/pluginsettings.php
@@ -67,6 +67,14 @@ switch ($action) {
get_string('plugin_enabled', 'core_admin', $pluginname),
\core\notification::SUCCESS
);
+
+ // Special notification for the Accessibility Checker plugin.
+ if ($plugin === 'a11ychecker') {
+ \core\notification::add(
+ get_string('accessibilitycheckerinfo', 'tiny_premium'),
+ \core\notification::INFO
+ );
+ }
}
break;
}
diff --git a/lib/editor/tiny/plugins/premium/tests/behat/tiny_premium_settings.feature b/lib/editor/tiny/plugins/premium/tests/behat/tiny_premium_settings.feature
index e60ce3aee15..2f08f629bc5 100644
--- a/lib/editor/tiny/plugins/premium/tests/behat/tiny_premium_settings.feature
+++ b/lib/editor/tiny/plugins/premium/tests/behat/tiny_premium_settings.feature
@@ -21,3 +21,9 @@ Feature: Check the features of the TinyMCE Premium settings
When I click on "Enable Advanced Table" "link"
Then I should see "Advanced Table enabled."
And I should not see "Enabled TinyMCE Premium plugins will not be available until an API key is added."
+
+ @javascript
+ Scenario: I see a notification when I have both the premium and default accessibility checkers enabled
+ When I click on "Enable Accessibility Checker" "link"
+ Then I should see "Accessibility Checker enabled."
+ And I should see "The premium Accessibility Checker will override the default Accessibility Checker for users who have access to it."
diff --git a/lib/editor/tiny/plugins/premium/tests/manager_test.php b/lib/editor/tiny/plugins/premium/tests/manager_test.php
index 601c7273e0f..381df742941 100644
--- a/lib/editor/tiny/plugins/premium/tests/manager_test.php
+++ b/lib/editor/tiny/plugins/premium/tests/manager_test.php
@@ -37,7 +37,7 @@ final class manager_test extends \advanced_testcase {
// Check all Tiny Premium plugins are returned.
$premiumplugins = manager::get_plugins();
- $this->assertCount(16, $premiumplugins);
+ $this->assertCount(17, $premiumplugins);
}
/**
diff --git a/lib/editor/tiny/plugins/premium/version.php b/lib/editor/tiny/plugins/premium/version.php
index b359c923e62..5bfb6ebcd37 100644
--- a/lib/editor/tiny/plugins/premium/version.php
+++ b/lib/editor/tiny/plugins/premium/version.php
@@ -24,6 +24,6 @@
defined('MOODLE_INTERNAL') || die();
-$plugin->version = 2024121800;
+$plugin->version = 2025011900;
$plugin->requires = 2024100100;
$plugin->component = 'tiny_premium';