mathjax-node-page
This Node.js module builds on mathjax-node and provides processing of larger content fragments
installation
Use
npm install mathjax-node-page
to install mathjax-node-page and its dependencies.
Usage
mathjax-node-page exports mjpage
which expects four parameters:
mjpage(input, mjpageConfig, mjnodeConfig, callback)
Where input
is a string with HTML or jsdom
object (JSDOM
class should be acquired via exported JSDOM
), pageConfig
specifies page-wide options, and mjnodeConfig
expects mathjax-node configuration options.
The defaults for pageConfig
are
{
format: ["MathML", "TeX", "AsciiMath"],
output: '',
tex: {},
ascii: {},
singleDollars: false,
fragment: false,
cssInline: true,
jsdom: {...},
displayMessages: false,
displayErrors: false,
undefinedCharError: false,
extensions: '',
fontURL: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/fonts/HTML-CSS',
MathJax: {},
errorHandler: (id, wrapperNode, sourceFormula, sourceFormat, errors) => {...}
}
and where mjnodeConfig
represents mathjax-node configuration options, the defaults are.
{
ex: 6,
width: 100,
useFontCache: true,
useGlobalCache: false,
state: mjstate,
linebreaks: false,
equationNumbers: "none",
math: "",
html: false,
css: false,
mml: false,
svg: false,
speakText: true,
timeout: 10 * 1000,
}
Advanced usage
mathjax-node customization
mathjax-node-page exports init
function that allows you to pass in a custom mathjax-node
(for example, mathjax-node-svg2png).
const mjnode = require('mathjax-node-svg2png');
mjpage.init(mjnode);
If your custom mathjax-node provides new output options, you can add them by calling addOutput
. As a second parameter, you can pass custom output handler, which is a function that modifies a DOM element with the conversion result. The default output handler behavior is to write contents to wrapper.innerHTML
.
mjpage.addOutput('png', (wrapper, data) => {
wrapper.innerHTML = `<img src="${data}">`;
});
Reset to default mathjax-node behavior by calling init
with empty parameters. Ensure that all your current mathjax-node-page tasks have been completed before calling it.
mjpage.init();
Events
mjpage
runs jobs which inherit EventEmitter
and provide the following event hooks.
Add the corresponding event handlers to manipulate the input/output and DOM before/after conversion.
All the event handlers are destroyed when job ends to prevent memory leaks.
Formula conversion events
beforeConversion
-> handler(parsedFormula)
: runs before individual formula conversion started, but after initial DOM processing. All the formulas are wrapped in <script type="...">
tags, where @type
is one of the following:
const scripts = document.querySelectorAll(`
script[type="math/TeX"],
script[type="math/inline-TeX"],
script[type="math/AsciiMath"],
script[type="math/MathML"],
script[type="math/MathML-block"]`
);
afterConersion
-> handler(parsedFormula)
: runs after individual formula conversion completed and DOM was changed. Formula DOM node is a <span class="mjpage...">
wrapper whose contents are the conversion result.
All formula conversion events pass ParsedFormula
instance to the event handler.
{
id,
jobID,
node,
sourceFormula,
sourceFormat,
outputFormula,
outputFormat
}
Page conversion events
beforeSerialiation
-> handler(document, css
): runs when converted page DOM was prepared immediately before serialization. Use to manipulate resulting page DOM. The event handler receives document
node (jsdom) and page css
. Won't trigger if input
is a jsdom
object.
If input
is a HTML string, mjpage
function callback receives result after the DOM serialization.
If input
is a jsdom
object, mjpage
function callback receives jsdom
object itself.
Error handling
When a rendering error occurs, config.errorHandler
will be called. These arguments are passed:
id
: index of formula on the page.wrapperNode
: The jsdom HTMLElement object where the rendered math should be put.sourceFormula
: The input math code.sourceFormat
: The format of input math code -- e.g. inline-TeX
or TeX
.errors
: A array of strings of MathJax-Node returned errors.
Modify the wrapperNode
object to show some error message to user. The default error handling function is printing the error with console.log
.
Example
mjpage(input, {
format: ["TeX"]
}, {
svg: true
}, function(output) {
})
.on('afterConversion', function(parsedFormula) {
});
CLI
mathjax-node-page installs a CLI tool. Run mjpage
to print usage instructions.
Example
const mjpage = require('../lib/main.js').mjpage;
const fs = require('fs');
const input = fs.readFileSync('input.html');
mjpage(input, {format: ["TeX"]}, {svg: true}, function(output) {
console.log(output);
});