blob: 42aaee415f605024024056df67194c00e187672e [file] [log] [blame]
/* Licensed under the Apache License, Version 2.0 (the "License") http://www.apache.org/licenses/LICENSE-2.0 */
require('fabric');
// Based on this example: https://github.com/mathjax/MathJax-demos-node/blob/master/preload/tex2svg
const packages = 'base, autoload, require, ams, newcommand, noundefined'.split(/\s*,\s*/);
MathJax = {
options: {}
, tex: {
packages: packages
, noundefined: {
color: 'red'
, background: ''
, size: ''
}
, formatError(_, error) {
throw error;
}
}
, svg: {
fontCache: 'local'
}
, startup: {
typeset: false
}
};
require('mathjax-full/components/src/startup/lib/startup.js');
require('mathjax-full/components/src/core/core.js');
require('mathjax-full/js/adaptors/browserAdaptor');
require('mathjax-full/components/src/input/tex-base/tex-base.js');
require('mathjax-full/components/src/input/tex/extensions/all-packages/all-packages.js');
require('mathjax-full/components/src/input/tex/extensions/noundefined/noundefined');
require('mathjax-full/components/src/output/svg/svg.js');
require('mathjax-full/components/src/output/svg/fonts/tex/tex.js');
require('mathjax-full/components/src/startup/startup.js');
MathJax.loader.preLoad(
'core'
, 'adaptors/browserAdaptor'
, 'input/tex-base'
, '[tex]/all-packages'
, '[tex]/noundefined'
, 'output/svg'
, 'output/svg/fonts/tex'
);
MathJax.config.startup.ready();
function _tex2svg(tex, callback, _errCallback) {
MathJax.tex2svgPromise(tex, {
display: false
, em: 16 // em-size in pixels
, ex: 8 // ex-size in pixels
, containerWidth: 80 * 16
}).then(function (node) {
callback(node.firstElementChild);
}).catch(function (err) {
_errCallback(err.message);
});
}
function create(o, canvas, callback, errCallback) {
_tex2svg(o.formula, function(svg) {
fabric.parseSVGDocument(svg, function(objects, options) {
const opts = $.extend({}, o, options)
, obj = objects.length === 1
? new fabric.Group(objects, opts)
: fabric.util.groupSVGElements(objects, opts);
obj.selectable = canvas.selection;
obj.type = 'group';
if (typeof(callback) === 'function') {
callback(obj);
}
canvas.add(obj).requestRenderAll();
});
}, errCallback);
}
function highlight(el) {
el.addClass('ui-state-highlight', 2000, function() {
el.focus();
el.removeClass('ui-state-highlight', 2000);
});
}
module.exports = {
create: create
, highlight: highlight
};