| /* globals jQuery, MathJax */ | 
| /** | 
|  * ext-mathjax.js | 
|  * | 
|  * @license Apache | 
|  * | 
|  * @copyright 2013 Jo Segaert | 
|  * | 
|  */ | 
| // Todo: Wait for Mathjax 3.0 to get ES Module/avoid global | 
| import {importScript} from '../external/dynamic-import-polyfill/importModule.js'; | 
|   | 
| export default { | 
|   name: 'mathjax', | 
|   async init ({importLocale}) { | 
|     const strings = await importLocale(); | 
|     const svgEditor = this; | 
|     const $ = jQuery; | 
|     const svgCanvas = svgEditor.canvas; | 
|   | 
|     // Configuration of the MathJax extention. | 
|   | 
|     // This will be added to the head tag before MathJax is loaded. | 
|     const /* mathjaxConfiguration = `<script type="text/x-mathjax-config"> | 
|         MathJax.Hub.Config({ | 
|           extensions: ['tex2jax.js'], | 
|           jax: ['input/TeX', 'output/SVG'], | 
|           showProcessingMessages: true, | 
|           showMathMenu: false, | 
|           showMathMenuMSIE: false, | 
|           errorSettings: { | 
|             message: ['[Math Processing Error]'], | 
|             style: {color: '#CC0000', 'font-style': 'italic'} | 
|           }, | 
|           elements: [], | 
|             tex2jax: { | 
|             ignoreClass: 'tex2jax_ignore2', processClass: 'tex2jax_process2', | 
|           }, | 
|           TeX: { | 
|             extensions: ['AMSmath.js', 'AMSsymbols.js', 'noErrors.js', 'noUndefined.js'] | 
|           }, | 
|           SVG: { | 
|           } | 
|       }); | 
|       </script>`, */ | 
|       // mathjaxSrc = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js', | 
|       // Had been on https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG.js | 
|       // Obtained Text-AMS-MML_SVG.js from https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.3/config/TeX-AMS-MML_SVG.js | 
|       mathjaxSrcSecure = 'mathjax/MathJax.min.js?config=TeX-AMS-MML_SVG.js', | 
|       {uiStrings} = svgEditor; | 
|     let | 
|       math, | 
|       locationX, | 
|       locationY, | 
|       mathjaxLoaded = false; | 
|   | 
|     // TODO: Implement language support. Move these uiStrings to the locale files and the code to the langReady callback. | 
|     $.extend(uiStrings, { | 
|       mathjax: { | 
|         embed_svg: 'Save as mathematics', | 
|         embed_mathml: 'Save as figure', | 
|         svg_save_warning: 'The math will be transformed into a figure is manipulatable like everything else. You will not be able to manipulate the TeX-code anymore. ', | 
|         mathml_save_warning: 'Advised. The math will be saved as a figure.', | 
|         title: 'Mathematics code editor' | 
|       } | 
|     }); | 
|   | 
|     function saveMath () { | 
|       const code = $('#mathjax_code_textarea').val(); | 
|       // displaystyle to force MathJax NOT to use the inline style. Because it is | 
|       // less fancy! | 
|       MathJax.Hub.queue.Push(['Text', math, '\\displaystyle{' + code + '}']); | 
|   | 
|       /* | 
|        * The MathJax library doesn't want to bloat your webpage so it creates | 
|        * every symbol (glymph) you need only once. These are saved in a `<svg>` on | 
|        * the top of your html document, just under the body tag. Each glymph has | 
|        * its unique id and is saved as a `<path>` in the `<defs>` tag of the `<svg>` | 
|        * | 
|        * Then when the symbols are needed in the rest of your html document they | 
|        * are refferd to by a `<use>` tag. | 
|        * Because of bug 1076 we can't just grab the defs tag on the top and add it | 
|        * to your formula's `<svg>` and copy the lot. So we have to replace each | 
|        * `<use>` tag by its `<path>`. | 
|        */ | 
|       MathJax.Hub.queue.Push( | 
|         function () { | 
|           const mathjaxMath = $('.MathJax_SVG'); | 
|           const svg = $(mathjaxMath.html()); | 
|           svg.find('use').each(function () { | 
|             // TODO: find a less pragmatic and more elegant solution to this. | 
|             const id = $(this).attr('href') | 
|               ? $(this).attr('href').slice(1) // Works in Chrome. | 
|               : $(this).attr('xlink:href').slice(1); // Works in Firefox. | 
|             const glymph = $('#' + id).clone().removeAttr('id'); | 
|             const x = $(this).attr('x'); | 
|             const y = $(this).attr('y'); | 
|             const transform = $(this).attr('transform'); | 
|             if (transform && (x || y)) { | 
|               glymph.attr('transform', transform + ' translate(' + x + ',' + y + ')'); | 
|             } else if (transform) { | 
|               glymph.attr('transform', transform); | 
|             } else if (x || y) { | 
|               glymph.attr('transform', 'translate(' + x + ',' + y + ')'); | 
|             } | 
|             $(this).replaceWith(glymph); | 
|           }); | 
|           // Remove the style tag because it interferes with SVG-Edit. | 
|           svg.removeAttr('style'); | 
|           svg.attr('xmlns', 'http://www.w3.org/2000/svg'); | 
|           svgCanvas.importSvgString($('<div>').append(svg.clone()).html(), true); | 
|           svgCanvas.ungroupSelectedElement(); | 
|           // TODO: To undo the adding of the Formula you now have to undo twice. | 
|           // This should only be once! | 
|           svgCanvas.moveSelectedElements(locationX, locationY, true); | 
|         } | 
|       ); | 
|     } | 
|   | 
|     const buttons = [{ | 
|       id: 'tool_mathjax', | 
|       type: 'mode', | 
|       icon: svgEditor.curConfig.extIconsPath + 'mathjax.png', | 
|       events: { | 
|         click () { | 
|           // Only load Mathjax when needed, we don't want to strain Svg-Edit any more. | 
|           // From this point on it is very probable that it will be needed, so load it. | 
|           if (mathjaxLoaded === false) { | 
|             $('<div id="mathjax">' + | 
|               '<!-- Here is where MathJax creates the math -->' + | 
|                 '<div id="mathjax_creator" class="tex2jax_process" style="display:none">' + | 
|                   '$${}$$' + | 
|                 '</div>' + | 
|                 '<div id="mathjax_overlay"></div>' + | 
|                 '<div id="mathjax_container">' + | 
|                   '<div id="tool_mathjax_back" class="toolbar_button">' + | 
|                     '<button id="tool_mathjax_save">OK</button>' + | 
|                     '<button id="tool_mathjax_cancel">Cancel</button>' + | 
|                   '</div>' + | 
|                   '<fieldset>' + | 
|                     '<legend id="mathjax_legend">Mathematics Editor</legend>' + | 
|                     '<label>' + | 
|                       '<span id="mathjax_explication">Please type your mathematics in ' + | 
|                       '<a href="https://en.wikipedia.org/wiki/Help:Displaying_a_formula" target="_blank">TeX</a> code.</span></label>' + | 
|                     '<textarea id="mathjax_code_textarea" spellcheck="false"></textarea>' + | 
|                   '</fieldset>' + | 
|                 '</div>' + | 
|               '</div>' | 
|             ).insertAfter('#svg_prefs').hide(); | 
|   | 
|             // Make the MathEditor draggable. | 
|             $('#mathjax_container').draggable({ | 
|               cancel: 'button,fieldset', | 
|               containment: 'window' | 
|             }); | 
|   | 
|             // Add functionality and picture to cancel button. | 
|             $('#tool_mathjax_cancel').prepend($.getSvgIcon('cancel', true)) | 
|               .on('click touched', function () { | 
|                 $('#mathjax').hide(); | 
|               }); | 
|   | 
|             // Add functionality and picture to the save button. | 
|             $('#tool_mathjax_save').prepend($.getSvgIcon('ok', true)) | 
|               .on('click touched', function () { | 
|                 saveMath(); | 
|                 $('#mathjax').hide(); | 
|               }); | 
|   | 
|             // MathJax preprocessing has to ignore most of the page. | 
|             $('body').addClass('tex2jax_ignore'); | 
|   | 
|             // Now get (and run) the MathJax Library. | 
|             // Todo: insert script with modules once widely supported | 
|             //   and if MathJax (and its `TeX-AMS-MML_SVG.js` dependency) ends up | 
|             //   providing an ES6 module export: https://github.com/mathjax/MathJax/issues/1998 | 
|             /* | 
|             const modularVersion = !('svgEditor' in window) || | 
|               !window.svgEditor || | 
|               window.svgEditor.modules !== false; | 
|             // Add as second argument to `importScript` | 
|             { | 
|               type: modularVersion | 
|                 ? 'module' // Make this the default when widely supported | 
|                 : 'text/javascript' | 
|             } | 
|             // If only using modules, just use this: | 
|             const {default: MathJax} = await importModule( // or `import()` when widely supported | 
|               svgEditor.curConfig.extIconsPath + mathjaxSrcSecure | 
|             ); | 
|             */ | 
|             // We use `extIconsPath` here for now as it does not vary with | 
|             //  the modular type as does `extPath` | 
|             importScript(svgEditor.curConfig.extIconsPath + mathjaxSrcSecure).then(() => { | 
|               // When MathJax is loaded get the div where the math will be rendered. | 
|               MathJax.Hub.queue.Push(function () { | 
|                 math = MathJax.Hub.getAllJax('#mathjax_creator')[0]; | 
|                 console.log(math); | 
|                 mathjaxLoaded = true; | 
|                 console.log('MathJax Loaded'); | 
|               }); | 
|             }).catch(() => { | 
|               console.log('Failed loadeing MathJax.'); | 
|               $.alert('Failed loading MathJax. You will not be able to change the mathematics.'); | 
|             }); | 
|           } | 
|           // Set the mode. | 
|           svgCanvas.setMode('mathjax'); | 
|         } | 
|       } | 
|     }]; | 
|   | 
|     return { | 
|       name: strings.name, | 
|       svgicons: svgEditor.curConfig.extIconsPath + 'mathjax-icons.xml', | 
|       buttons: strings.buttons.map((button, i) => { | 
|         return Object.assign(buttons[i], button); | 
|       }), | 
|   | 
|       mouseDown () { | 
|         if (svgCanvas.getMode() === 'mathjax') { | 
|           return {started: true}; | 
|         } | 
|       }, | 
|       mouseUp (opts) { | 
|         if (svgCanvas.getMode() === 'mathjax') { | 
|           // Get the coordinates from your mouse. | 
|           const zoom = svgCanvas.getZoom(); | 
|           // Get the actual coordinate by dividing by the zoom value | 
|           locationX = opts.mouse_x / zoom; | 
|           locationY = opts.mouse_y / zoom; | 
|   | 
|           $('#mathjax').show(); | 
|           return {started: false}; // Otherwise the last selected object dissapears. | 
|         } | 
|       }, | 
|       callback () { | 
|         $('<style>').text( | 
|           '#mathjax fieldset{' + | 
|             'padding: 5px;' + | 
|             'margin: 5px;' + | 
|             'border: 1px solid #DDD;' + | 
|           '}' + | 
|           '#mathjax label{' + | 
|             'display: block;' + | 
|             'margin: .5em;' + | 
|           '}' + | 
|           '#mathjax legend {' + | 
|             'max-width:195px;' + | 
|           '}' + | 
|           '#mathjax_overlay {' + | 
|             'position: absolute;' + | 
|             'top: 0;' + | 
|             'left: 0;' + | 
|             'right: 0;' + | 
|             'bottom: 0;' + | 
|             'background-color: black;' + | 
|             'opacity: 0.6;' + | 
|             'z-index: 20000;' + | 
|           '}' + | 
|           '#mathjax_container {' + | 
|             'position: absolute;' + | 
|             'top: 50px;' + | 
|             'padding: 10px;' + | 
|             'background-color: #B0B0B0;' + | 
|             'border: 1px outset #777;' + | 
|             'opacity: 1.0;' + | 
|             'font-family: Verdana, Helvetica, sans-serif;' + | 
|             'font-size: .8em;' + | 
|             'z-index: 20001;' + | 
|           '}' + | 
|           '#tool_mathjax_back {' + | 
|             'margin-left: 1em;' + | 
|             'overflow: auto;' + | 
|           '}' + | 
|           '#mathjax_legend{' + | 
|             'font-weight: bold;' + | 
|             'font-size:1.1em;' + | 
|           '}' + | 
|           '#mathjax_code_textarea {\\n' + | 
|             'margin: 5px .7em;' + | 
|             'overflow: hidden;' + | 
|             'width: 416px;' + | 
|             'display: block;' + | 
|             'height: 100px;' + | 
|           '}' | 
|         ).appendTo('head'); | 
|   | 
|         // Add the MathJax configuration. | 
|         // $(mathjaxConfiguration).appendTo('head'); | 
|       } | 
|     }; | 
|   } | 
| }; |