mathpix-markdown-it
Version:
Mathpix-markdown-it is an open source implementation of the mathpix-markdown spec written in Typescript. It relies on the following open source libraries: MathJax v3 (to render math with SVGs), markdown-it (for standard Markdown parsing)
219 lines • 11.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.initMathpixMarkdown = exports.setBaseOptionsMd = exports.mathpixMarkdownPlugin = void 0;
var tslib_1 = require("tslib");
var mathpix_markdown_model_1 = require("../mathpix-markdown-model");
var mdPluginText_1 = require("./mdPluginText");
var helper_1 = require("./md-theorem/helper");
var utils_1 = require("./md-latex-footnotes/utils");
var mdPluginConfigured_1 = require("./mdPluginConfigured");
var mdOptions_1 = require("./mdOptions");
var rules_1 = require("./rules");
var mmdRules_1 = require("./common/mmdRules");
var mmdRulesToDisable_1 = require("./common/mmdRulesToDisable");
var mathpixMarkdownPlugin = function (md, options) {
var _a;
var _b = options.width, width = _b === void 0 ? 1200 : _b, _c = options.outMath, outMath = _c === void 0 ? {} : _c, _d = options.smiles, smiles = _d === void 0 ? {} : _d, _e = options.mathJax, mathJax = _e === void 0 ? {} : _e, _f = options.renderElement, renderElement = _f === void 0 ? {} : _f, _g = options.forDocx, forDocx = _g === void 0 ? false : _g, _h = options.forLatex, forLatex = _h === void 0 ? false : _h, _j = options.forMD, forMD = _j === void 0 ? false : _j, _k = options.forPptx, forPptx = _k === void 0 ? false : _k, _l = options.maxWidth, maxWidth = _l === void 0 ? '' : _l, _m = options.enableFileLinks, enableFileLinks = _m === void 0 ? false : _m, _o = options.validateLink, validateLink = _o === void 0 ? null : _o, _p = options.toc, toc = _p === void 0 ? {} : _p, _q = options.accessibility, accessibility = _q === void 0 ? null : _q, _r = options.nonumbers, nonumbers = _r === void 0 ? false : _r, _s = options.showPageBreaks, showPageBreaks = _s === void 0 ? false : _s, _t = options.centerImages, centerImages = _t === void 0 ? true : _t, _u = options.centerTables, centerTables = _u === void 0 ? true : _u, _v = options.enableCodeBlockRuleForLatexCommands, enableCodeBlockRuleForLatexCommands = _v === void 0 ? false : _v, _w = options.addPositionsToTokens, addPositionsToTokens = _w === void 0 ? false : _w, _x = options.highlights, highlights = _x === void 0 ? [] : _x, _y = options.parserErrors, parserErrors = _y === void 0 ? mathpix_markdown_model_1.ParserErrors.show : _y, _z = options.codeHighlight, codeHighlight = _z === void 0 ? {} : _z, _0 = options.footnotes, footnotes = _0 === void 0 ? {} : _0, _1 = options.copyToClipboard, copyToClipboard = _1 === void 0 ? false : _1, _2 = options.renderOptions, renderOptions = _2 === void 0 ? null : _2, _3 = options.previewUuid, previewUuid = _3 === void 0 ? "" : _3, _4 = options.enableSizeCalculation, enableSizeCalculation = _4 === void 0 ? false : _4;
Object.assign(md.options, smiles);
Object.assign(md.options, {
width: width,
outMath: outMath,
mathJax: mathJax,
renderElement: renderElement,
forDocx: forDocx,
forLatex: forLatex,
forMD: forMD,
forPptx: forPptx,
maxWidth: maxWidth,
enableFileLinks: enableFileLinks,
accessibility: accessibility,
nonumbers: nonumbers,
showPageBreaks: showPageBreaks,
centerImages: centerImages,
centerTables: centerTables,
enableCodeBlockRuleForLatexCommands: enableCodeBlockRuleForLatexCommands,
addPositionsToTokens: addPositionsToTokens,
highlights: highlights,
parserErrors: parserErrors,
codeHighlight: codeHighlight,
footnotes: footnotes,
copyToClipboard: copyToClipboard,
renderOptions: renderOptions,
previewUuid: previewUuid,
enableSizeCalculation: enableSizeCalculation
});
md
.use(mdPluginConfigured_1.mdPluginChemistry, smiles)
.use(mdPluginConfigured_1.mdPluginTableTabular)
.use(mdPluginConfigured_1.mdPluginList)
.use((0, mdPluginConfigured_1.mdPluginMathJax)({}))
.use((0, mdPluginConfigured_1.mdPluginText)())
.use(mdPluginConfigured_1.mdLatexFootnotes)
.use(mdPluginConfigured_1.mdPluginHighlightCode, codeHighlight)
.use(mdPluginConfigured_1.mdPluginAnchor)
.use(mdPluginConfigured_1.mdPluginTOC, { toc: toc });
if (forDocx) {
md.use(mdPluginConfigured_1.mdPluginSvgToBase64);
}
if (enableFileLinks || validateLink) {
md.validateLink = validateLink
? validateLink
: mdOptions_1.validateLinkEnableFile;
}
/**
* ParserBlock.parse(str, md, env, outTokens)
*
* Process input string and push block tokens into `outTokens`
**/
if (addPositionsToTokens || ((_a = md.options.highlights) === null || _a === void 0 ? void 0 : _a.length)) {
md.block.parse = function (src, md, env, outTokens) {
var state;
if (!src) {
return;
}
state = new this.State(src, md, env, outTokens);
if (!env.lines) {
/** Copy block state lines */
env.lines = {
bMarks: tslib_1.__spreadArray([], tslib_1.__read(state.bMarks), false),
eMarks: tslib_1.__spreadArray([], tslib_1.__read(state.eMarks), false),
line: tslib_1.__spreadArray([], tslib_1.__read(state.line), false),
lineMax: tslib_1.__spreadArray([], tslib_1.__read(state.lineMax), false),
sCount: tslib_1.__spreadArray([], tslib_1.__read(state.sCount), false),
tShift: tslib_1.__spreadArray([], tslib_1.__read(state.tShift), false),
};
}
this.tokenize(state, state.line, state.lineMax);
};
// Generate tokens for input range
md.inline.tokenize = function (state) {
var _a;
var ok, i, rules = this.ruler.getRules(''), len = rules.length, end = state.posMax, maxNesting = state.md.options.maxNesting;
while (state.pos < end) {
// Try all possible rules.
// On success, rule should:
//
// - update `state.pos`
// - update `state.tokens`
// - return true
if (state.level < maxNesting) {
for (i = 0; i < len; i++) {
ok = rules[i](state, false);
if (ok) {
if (!state.pending && ((_a = state.tokens) === null || _a === void 0 ? void 0 : _a.length)) {
var token = state.tokens[state.tokens.length - 1];
token.nextPos = state.pos;
}
break;
}
}
}
if (ok) {
if (state.pos >= end) {
break;
}
continue;
}
state.pending += state.src[state.pos++];
}
if (state.pending) {
state.pushPending();
}
};
/**
* ParserInline.parse(str, md, env, outTokens)
*
* Process input string and push inline tokens into `outTokens`
**/
md.inline.parse = function (str, md, env, outTokens) {
var i, rules, len;
var state = new this.State(str, md, env, outTokens);
state.pushPending = function () {
var token = new state.Token('text', '', 0);
token.content = state.pending;
token.level = state.pendingLevel;
token.nextPos = state.isPendingBeforeLink ? state.pos - 1 : state.pos;
state.tokens.push(token);
state.pending = '';
return token;
};
state.push = function (type, tag, nesting) {
if (state.pending) {
if (type === 'link_open' || type === 'sup_open' || type === 'sub_open') {
state.isPendingBeforeLink = true;
this.pushPending();
state.isPendingBeforeLink = false;
}
else {
this.pushPending();
}
}
var token = new state.Token(type, tag, nesting);
if (nesting < 0)
state.level--; // closing tag
token.level = state.level;
if (nesting > 0)
state.level++; // opening tag
state.pendingLevel = state.level;
state.tokens.push(token);
return token;
};
this.tokenize(state);
rules = this.ruler2.getRules('');
len = rules.length;
for (i = 0; i < len; i++) {
rules[i](state);
}
};
}
(0, rules_1.injectLabelIdToParagraph)(md);
};
exports.mathpixMarkdownPlugin = mathpixMarkdownPlugin;
var setBaseOptionsMd = function (baseOption, mmdOptions) {
var _a = mmdOptions.htmlTags, htmlTags = _a === void 0 ? false : _a, _b = mmdOptions.xhtmlOut, xhtmlOut = _b === void 0 ? false : _b, _c = mmdOptions.breaks, breaks = _c === void 0 ? true : _c, _d = mmdOptions.typographer, typographer = _d === void 0 ? true : _d, _e = mmdOptions.linkify, linkify = _e === void 0 ? true : _e, _f = mmdOptions.openLinkInNewWindow, openLinkInNewWindow = _f === void 0 ? true : _f;
var disableRuleTypes = (mmdOptions === null || mmdOptions === void 0 ? void 0 : mmdOptions.renderOptions) ? (0, mmdRulesToDisable_1.getDisableRuleTypes)(mmdOptions.renderOptions) : [];
baseOption.html = htmlTags && !disableRuleTypes.includes(mmdRules_1.eMmdRuleType.html);
baseOption.xhtmlOut = xhtmlOut;
baseOption.breaks = breaks;
baseOption.langPrefix = "language-";
baseOption.linkify = linkify;
baseOption.typographer = typographer;
baseOption.quotes = "“”‘’";
baseOption.openLinkInNewWindow = openLinkInNewWindow;
};
exports.setBaseOptionsMd = setBaseOptionsMd;
var setOptionForPreview = function (mdOption, mmdOptions) {
var _a = mmdOptions.width, width = _a === void 0 ? 1200 : _a, _b = mmdOptions.outMath, outMath = _b === void 0 ? {} : _b, _c = mmdOptions.smiles, smiles = _c === void 0 ? {} : _c, _d = mmdOptions.mathJax, mathJax = _d === void 0 ? {} : _d, _e = mmdOptions.renderElement, renderElement = _e === void 0 ? {} : _e;
Object.assign(mdOption, smiles);
Object.assign(mdOption, {
width: width,
outMath: outMath,
mathJax: mathJax,
renderElement: renderElement
});
(0, exports.setBaseOptionsMd)(mdOption, mmdOptions);
};
var initMathpixMarkdown = function (md, callback) {
var parse = md.parse, renderer = md.renderer;
var render = renderer.render;
md.parse = function (markdown, env) {
(0, helper_1.resetTheoremEnvironments)();
(0, utils_1.rest_mmd_footnotes_list)();
var mmdOptions = callback();
setOptionForPreview(md.options, mmdOptions);
return parse.call(md, markdown, env);
};
renderer.render = function (tokens, options, env) {
mathpix_markdown_model_1.MathpixMarkdownModel.texReset();
(0, mdPluginText_1.resetTextCounter)();
var html = render.call(renderer, tokens, options, env);
var style = mathpix_markdown_model_1.MathpixMarkdownModel.getMathpixMarkdownStyles(false);
var resHtml = "<style id=\"mmd-vscode-style\">".concat(style, "</style>");
resHtml += '\n';
resHtml += "<div id=\"preview-content\">".concat(html, "</div>");
return resHtml;
};
return md;
};
exports.initMathpixMarkdown = initMathpixMarkdown;
//# sourceMappingURL=mathpix-markdown-plugins.js.map