| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | const mathjax = require('mathjax-node')const _ = require('lodash')// ------------------------------------// Mathjax// ------------------------------------/* global WIKI */const mathRegex = [  {    format: 'TeX',    regex: /\\\[([\s\S]*?)\\\]/g  },  {    format: 'inline-TeX',    regex: /\\\((.*?)\\\)/g  },  {    format: 'MathML',    regex: /<math([\s\S]*?)<\/math>/g  }]module.exports = {  init ($, config) {    mathjax.config({      MathJax: {        jax: ['input/TeX', 'input/MathML', 'output/SVG'],        extensions: ['tex2jax.js', 'mml2jax.js'],        TeX: {          extensions: ['AMSmath.js', 'AMSsymbols.js', 'noErrors.js', 'noUndefined.js']        },        SVG: {          scale: 120,          font: 'STIX-Web'        }      }    })  },  async render (content) {    let matchStack = []    let replaceStack = []    let currentMatch    let mathjaxState = {}    _.forEach(mathRegex, mode => {      do {        currentMatch = mode.regex.exec(content)        if (currentMatch) {          matchStack.push(currentMatch[0])          replaceStack.push(            new Promise((resolve, reject) => {              mathjax.typeset({                math: (mode.format === 'MathML') ? currentMatch[0] : currentMatch[1],                format: mode.format,                speakText: false,                svg: true,                state: mathjaxState,                timeout: 30 * 1000              }, result => {                if (!result.errors) {                  resolve(result.svg)                } else {                  resolve(currentMatch[0])                  WIKI.logger.warn(result.errors.join(', '))                }              })            })          )        }      } while (currentMatch)    })    return (matchStack.length > 0) ? Promise.all(replaceStack).then(results => {      _.forEach(matchStack, (repMatch, idx) => {        content = content.replace(repMatch, results[idx])      })      return content    }) : Promise.resolve(content)  }}
 |