123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- /*globals MathJax, svgEditor, svgCanvas, $*/
- /*jslint es5: true, todo: true, vars: true*/
- /*
- * ext-mathjax.js
- *
- * Licensed under the Apache License
- *
- * Copyright(c) 2013 Jo Segaert
- *
- */
- svgEditor.addExtension("mathjax", function() {'use strict';
- // Configuration of the MathJax extention.
- // This will be added to the head tag before MathJax is loaded.
- var /*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',
- mathjaxSrcSecure = 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG.js',
- math,
- locationX,
- locationY,
- mathjaxLoaded = false,
- uiStrings = svgEditor.uiStrings;
- // 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() {
- var 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 it's <path>.
- */
- MathJax.Hub.queue.Push(
- function() {
- var mathjaxMath = $('.MathJax_SVG');
- var svg = $(mathjaxMath.html());
- svg.find('use').each(function() {
- var x, y, id, transform;
- // TODO: find a less pragmatic and more elegant solution to this.
- if ($(this).attr('href')) {
- id = $(this).attr('href').slice(1); // Works in Chrome.
- } else {
- id = $(this).attr('xlink:href').slice(1); // Works in Firefox.
- }
- var glymph = $('#' + id).clone().removeAttr('id');
- x = $(this).attr('x');
- y = $(this).attr('y');
- 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);
- }
- );
- }
- return {
- name: "MatJax",
- svgicons: svgEditor.curConfig.extPath + "mathjax-icons.xml",
- buttons: [{
- id: "tool_mathjax",
- type: "mode",
- title: "Add Mathematics",
- events: {
- 'click': function() {
- // 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="http://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.
- $.getScript(mathjaxSrcSecure)
- .done(function(script, textStatus) {
- // 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');
- });
- })
- // If it fails.
- .fail(function() {
- console.log("Failed loadeing MathJax.");
- $.alert("Failed loading MathJax. You will not be able to change the mathematics.");
- });
- }
- // Set the mode.
- svgCanvas.setMode("mathjax");
- }
- }
- }],
-
- mouseDown: function() {
- if (svgCanvas.getMode() === "mathjax") {
- return {started: true};
- }
- },
- mouseUp: function(opts) {
- if (svgCanvas.getMode() === "mathjax") {
- // Get the coordinates from your mouse.
- var 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: function() {
- $('<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');
- }
- };
- });
|