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)
515 lines • 21.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Lists = exports.ReRenderListsItem = exports.reNumber = exports.bItemTag = exports.TBegin = void 0;
var re_level_1 = require("./re-level");
var helper_1 = require("../helper");
var TBegin;
(function (TBegin) {
TBegin["itemize"] = "itemize";
TBegin["enumerate"] = "enumerate";
})(TBegin = exports.TBegin || (exports.TBegin = {}));
;
var openTag = /\\begin\s{0,}\{(itemize|enumerate)\}/;
exports.bItemTag = /^(?:item\s{0,}\[([^\]]*)\]|item)/;
var closeTag = /\\end\s{0,}\{(itemize|enumerate)\}/;
exports.reNumber = /^-?\d+$/;
var setTokenListItemOpenBlock = function (state, startLine, endLine, marker, li, iLevel, eLevel, iLevelC) {
var token;
token = state.push('latex_list_item_open', 'li', 1);
token.parentType = state.types && state.types.length > 0 ? state.types[state.types.length - 1] : '';
if (marker) {
token.marker = marker;
var chMarker = [];
state.md.inline.parse(marker, state.md, state.env, chMarker);
token.markerTokens = chMarker;
}
if (li && li.hasOwnProperty('value')) {
token.startValue = li.value;
token.attrSet('value', li.value.toString());
li = null;
}
token.parentType = state.types && state.types.length > 0 ? state.types[state.types.length - 1] : '';
token.parentStart = state.startLine;
token.map = [startLine, endLine];
token.prentLevel = state.prentLevel;
token.itemizeLevel = iLevel;
token.itemizeLevelContents = iLevelC;
token.enumerateLevel = eLevel;
};
var ListItemsBlock = function (state, items) {
if (items && items.length > 0) {
if (items && items.length > 0) {
items.forEach(function (item) {
(0, helper_1.SetTokensBlockParse)(state, item.content.trim(), item.startLine, item.endLine + 1);
});
}
}
};
var ListItems = function (state, items, iLevel, eLevel, li, iOpen, iLevelC) {
var token;
var blockStartTag = /\\begin{(center|left|right|table|figure|tabular)}/;
var padding = 0;
if (items && items.length > 0) {
if (items && items.length > 0) {
items.forEach(function (item) {
var _a;
var children = [];
state.env.parentType = state.parentType;
state.env.isBlock = true;
item.content = item.content.trim();
if (blockStartTag.test(item.content) || (item.content.indexOf('`') > -1) //&& item.content.charCodeAt(0) === 0x5c /* \ */
) {
var match = item.content.slice(1).match(exports.bItemTag);
if (match) {
setTokenListItemOpenBlock(state, item.startLine, item.endLine + 1, match[1], li, iLevel, eLevel, iLevelC);
if (li && li.hasOwnProperty('value')) {
li = null;
}
(0, helper_1.SetTokensBlockParse)(state, item.content.slice(match.index + match[0].length + 1).trim());
token = state.push('latex_list_item_close', 'li', -1);
return;
}
}
state.md.inline.parse(item.content.trim(), state.md, state.env, children);
for (var j = 0; j < children.length; j++) {
var child = children[j];
if (child.type === "setcounter") {
li = { value: child.content };
continue;
}
token = state.push(child.type, child.tag, 1);
token.attrs = child.attrs;
if (child.type === "item_inline"
&& li && li.hasOwnProperty('value')) {
token.startValue = li.value;
token.attrSet('value', li.value.toString());
li = null;
}
if (child.hasOwnProperty('marker')) {
token.marker = child.marker;
token.markerTokens = child.markerTokens;
var paddingChild = 0;
for (var i = 0; i < ((_a = child.markerTokens) === null || _a === void 0 ? void 0 : _a.length); i++) {
if (child.markerTokens[i].type === 'text') {
paddingChild += child.markerTokens[i].content.length;
}
}
if (paddingChild > padding) {
padding = paddingChild;
}
}
token.parentType = state.types && state.types.length > 0 ? state.types[state.types.length - 1] : '';
token.parentStart = state.startLine;
token.map = [item.startLine, item.endLine + 1];
if (child.hasOwnProperty('inlinePos')) {
token.bMarks = child.inlinePos.start_content;
}
token.content = child.content;
token.children = child.children;
token.prentLevel = state.prentLevel;
if (child.type === "item_inline") {
token.prentLevel = state.prentLevel + 1;
}
if (child.type === "enumerate_list_open" || child.type === "itemize_list_open") {
state.prentLevel++;
if (child.type === "itemize_list_open") {
state.types.push('itemize');
}
else {
state.types.push('enumerate');
}
iOpen++;
}
if (child.type === "enumerate_list_close" || child.type === "itemize_list_close") {
state.prentLevel--;
if (state.types && state.types.length > 0) {
state.types.pop();
}
iOpen--;
}
token.itemizeLevel = iLevel;
token.itemizeLevelContents = iLevelC;
// token.itemizeLevelTokens = iLevelTokens;
token.enumerateLevel = eLevel;
}
state.env.isBlock = false;
});
}
}
return {
iOpen: iOpen,
padding: padding
};
};
var setTokenOpenList = function (state, startLine, endLine, type, iLevel, eLevel, iLevelC) {
var token;
if (type === TBegin.itemize) {
token = state.push('itemize_list_open', 'ul', 1);
state.prentLevel = (state.parentType !== 'itemize' && state.parentType !== 'enumerate') ? 0 : state.prentLevel + 1;
state.parentType = 'itemize';
if (state.types && state.types.length > 0) {
state.types.push('itemize');
}
else {
state.types = ['itemize'];
}
}
else {
token = state.push('enumerate_list_open', 'ol', 1);
state.prentLevel = (state.parentType !== 'itemize' && state.parentType !== 'enumerate') ? 0 : state.prentLevel + 1;
state.parentType = 'enumerate';
if (state.types && state.types.length > 0) {
state.types.push('enumerate');
}
else {
state.types = ['enumerate'];
}
}
token.itemizeLevel = iLevel;
token.itemizeLevelContents = iLevelC;
token.enumerateLevel = eLevel;
token.prentLevel = state.prentLevel;
if (startLine > -1 && endLine > -1) {
state.startLine = startLine;
token.map = [startLine, endLine];
}
return token;
};
var setTokenCloseList = function (state, startLine, endLine) {
var token;
if (state.types && state.types.length > 0 && state.types[state.types.length - 1] === TBegin.itemize) {
token = state.push('itemize_list_close', 'ul', -1);
token.map = [startLine, endLine];
}
else {
token = state.push('enumerate_list_close', 'ol', -1);
token.map = [startLine, endLine];
}
token.level -= 1;
state.level -= 1;
state.prentLevel = state.prentLevel > 0 ? state.prentLevel - 1 : 0;
token.prentLevel = state.prentLevel;
state.types.pop();
};
var ListOpen = function (state, startLine, lineText, iLevel, eLevel, iLevelC) {
var token, tokenStart = null;
var iOpen = 0;
var li = null;
if (lineText.charCodeAt(0) !== 0x5c /* \ */) {
return { iOpen: iOpen, tokenStart: tokenStart };
}
var match = lineText.match(openTag);
if (!match && (state.parentType !== 'itemize' && state.parentType !== 'enumerate')) {
return { iOpen: iOpen, tokenStart: tokenStart };
}
(0, re_level_1.SetItemizeLevelTokens)(state);
if (match) {
var strAfter = lineText.slice(match.index + match[0].length);
var type = match[1].trim() in TBegin ? match[1].trim() : null;
if (!type) {
return { iOpen: iOpen, tokenStart: tokenStart };
}
tokenStart = setTokenOpenList(state, startLine, startLine + 1, type, iLevel, eLevel, iLevelC);
iOpen++;
if (strAfter && strAfter.trim().length > 0) {
var children = [];
state.env.parentType = state.parentType;
state.env.isBlock = true;
state.md.inline.parse(strAfter, state.md, state.env, children);
for (var j = 0; j < children.length; j++) {
var child = children[j];
if (child.type === "setcounter") {
li = { value: child.content };
continue;
}
token = state.push(child.type, child.tag, 1);
token.parentType = state.types && state.types.length > 0 ? state.types[state.types.length - 1] : '';
token.parentStart = state.startLine;
token.map = [startLine, startLine];
token.content = child.content;
token.children = child.children;
token.itemizeLevel = iLevel;
token.itemizeLevelContents = iLevelC;
token.enumerateLevel = eLevel;
if (child.type === "enumerate_list_open" || child.type === "itemize_list_open") {
state.prentLevel++;
if (child.type === "itemize_list_open") {
state.types.push('itemize');
}
else {
state.types.push('enumerate');
}
iOpen++;
}
if (child.type === "enumerate_list_close" || child.type === "itemize_list_close") {
state.prentLevel--;
if (state.types && state.types.length > 0) {
state.types.pop();
}
iOpen--;
}
if (child.type === "item_inline") {
if (li && li.value) {
token.startValue = li.value;
token.attrSet('value', li.value.toString());
li = null;
}
token.prentLevel = state.prentLevel + 1;
}
else {
token.prentLevel = state.prentLevel;
}
}
state.env.isBlock = false;
}
}
return { iOpen: iOpen, tokenStart: tokenStart, li: li };
};
var ItemsListPush = function (items, content, startLine, endLine) {
//const itemTag: RegExp = /\\item/;
var index = content.indexOf('\\item');
if (index > 0) {
if (content.slice(0, index).indexOf('`') > -1 && content.slice(index).indexOf('`') > -1) {
if (items.length > 0) {
var last = items.length - 1;
items[last].content += '\n' + content;
items[last].endLine += 1;
}
else {
items.push({ content: content, startLine: startLine, endLine: endLine });
}
return items;
}
if (items.length > 0) {
var last = items.length - 1;
items[last].content += '\n' + content.slice(0, index);
items[last].endLine += 1;
}
else {
items = ItemsListPush(items, content.slice(0, index), startLine, endLine);
}
items = ItemsListPush(items, content.slice(index), startLine, endLine);
}
else {
items.push({ content: content, startLine: startLine, endLine: endLine });
}
return items;
};
var ItemsAddToPrev = function (items, lineText, nextLine) {
if (items && items.length > 0) {
items[items.length - 1].content += '\n' + lineText;
items[items.length - 1].endLine = nextLine;
}
else {
if (!closeTag.test(lineText)) {
items = ItemsListPush(items, lineText, nextLine, nextLine);
// break
}
}
return items;
};
var ReRenderListsItem = function (state, startLine, endLine, silent) {
var pos = state.bMarks[startLine] + state.tShift[startLine];
var max = state.eMarks[startLine];
var nextLine = startLine + 1;
var lineText = state.src.slice(pos, max);
var content = lineText;
if (lineText.charCodeAt(0) !== 0x5c /* \ */) {
return false;
}
var match = lineText.slice(1).match(exports.bItemTag);
if (!match) {
return false;
}
var eLevel = (0, re_level_1.GetEnumerateLevel)();
var dataMarkers = (0, re_level_1.GetItemizeLevelTokensByState)(state);
var iLevelT = dataMarkers.tokens;
var iLevelC = dataMarkers.contents;
for (; nextLine < endLine; nextLine++) {
pos = state.bMarks[nextLine] + state.tShift[nextLine];
max = state.eMarks[nextLine];
lineText = state.src.slice(pos, max);
content += '\n' + lineText;
}
match = content.slice(1).match(exports.bItemTag);
if (match) {
setTokenListItemOpenBlock(state, startLine, nextLine + 1, match[1], null, iLevelT, eLevel, iLevelC);
(0, helper_1.SetTokensBlockParse)(state, content.slice(match.index + match[0].length + 1).trim());
state.push('latex_list_item_close', 'li', -1);
}
state.line = nextLine;
return true;
};
exports.ReRenderListsItem = ReRenderListsItem;
var Lists = function (state, startLine, endLine, silent) {
var _a;
var openTag = /\\begin\s{0,}\{(itemize|enumerate)\}/;
var itemTag = /\\item/;
var setcounterTag = /^(?:\\setcounter\s{0,}\{([^}]*)\}\s{0,}\{([^}]*)\})/;
var pos = state.bMarks[startLine] + state.tShift[startLine];
var max = state.eMarks[startLine];
var nextLine = startLine; // + 1;
var dStart = state.md.options.renderElement && state.md.options.renderElement.startLine
? Number(state.md.options.renderElement.startLine)
: 0;
var oldParentType;
var type;
// let li = null;
var lineText = state.src.slice(pos, max);
if (lineText.charCodeAt(0) !== 0x5c /* \ */) {
return false;
}
var match = lineText.match(openTag);
if (!match) {
return false;
}
var eLevel = (0, re_level_1.GetEnumerateLevel)();
var dataMarkers = (0, re_level_1.GetItemizeLevelTokensByState)(state);
var iLevelT = dataMarkers.tokens;
var iLevelC = dataMarkers.contents;
oldParentType = state.parentType;
var data = ListOpen(state, startLine + dStart, lineText, iLevelT, eLevel, iLevelC);
var _b = data.iOpen, iOpen = _b === void 0 ? 0 : _b, _c = data.tokenStart, tokenStart = _c === void 0 ? null : _c, _d = data.li, li = _d === void 0 ? null : _d;
if (iOpen === 0) {
nextLine += 1;
state.line = nextLine;
state.startLine = '';
state.parentType = oldParentType;
state.level = state.prentLevel < 0 ? 0 : state.prentLevel;
return true;
}
else {
nextLine += 1;
}
var items = [];
var haveClose = false;
for (; nextLine < endLine; nextLine++) {
pos = state.bMarks[nextLine] + state.tShift[nextLine];
max = state.eMarks[nextLine];
lineText = state.src.slice(pos, max);
if (setcounterTag.test(lineText)) {
match = lineText.match(setcounterTag);
if (match && state.md.options && state.md.options.forLatex) {
var token = state.push("setcounter", "", 0);
token.latex = match[0].trim();
}
if (match && match[2]) {
var sE = match.index + match[0].length < lineText.length
? lineText.slice(match.index + match[0].length)
: '';
sE = sE.trim();
var startNumber = ((_a = match[2]) === null || _a === void 0 ? void 0 : _a.trim()) && exports.reNumber.test(match[2].trim())
? Number(match[2].trim()) + 1 : 1;
li = { value: startNumber };
if (sE.length > 0) {
items = ItemsAddToPrev(items, sE, nextLine);
}
continue;
}
}
if (closeTag.test(lineText)) {
var match_1 = lineText.match(closeTag);
if (match_1) {
type = match_1[1].trim() in TBegin ? match_1[1].trim() : null;
if (!type) {
return false;
}
var sB = match_1.index > 0 ? lineText.slice(0, match_1.index) : '';
var sE = match_1.index + match_1[0].length < lineText.length
? lineText.slice(match_1.index + match_1[0].length)
: '';
sB = sB.trim();
sE = sE.trim();
if (sB.indexOf('`') > -1 && sE.indexOf('`') > -1) {
items = ItemsListPush(items, lineText, nextLine, nextLine);
continue;
}
if (sB.length > 0) {
items = ItemsAddToPrev(items, sB, nextLine);
}
var dataItems = ListItems(state, items, iLevelT, eLevel, li, iOpen, iLevelC);
iOpen = dataItems.iOpen;
if (!tokenStart.padding || tokenStart.padding < dataItems.padding) {
tokenStart.padding = dataItems.padding;
if (tokenStart.padding > 3) {
tokenStart.attrSet('data-padding-inline-start', (tokenStart.padding * 14).toString());
}
}
items = [];
li = null;
setTokenCloseList(state, startLine + dStart, nextLine + dStart);
if (sE.length > 0) {
items = ItemsAddToPrev(items, sE, nextLine);
}
iOpen--;
if (iOpen <= 0) {
haveClose = true;
nextLine += 1;
break;
}
}
continue;
}
if (openTag.test(lineText)) {
var match_2 = lineText.match(openTag);
if (match_2) {
type = match_2[1].trim() in TBegin ? match_2[1].trim() : null;
if (!type) {
return false;
}
var sB = match_2.index > 0 ? lineText.slice(0, match_2.index) : '';
var sE = match_2.index + match_2[0].length < lineText.length
? lineText.slice(match_2.index + match_2[0].length)
: '';
sB = sB.trim();
sE = sE.trim();
if (sB.indexOf('`') > -1 && sE.indexOf('`') > -1) {
items = ItemsListPush(items, lineText, nextLine, nextLine);
continue;
}
if (sB.length > 0) {
items = ItemsAddToPrev(items, sB, nextLine);
}
var dataItems = ListItems(state, items, iLevelT, eLevel, li, iOpen, iLevelC);
iOpen = dataItems.iOpen;
if (!tokenStart.padding || tokenStart.padding < dataItems.padding) {
tokenStart.padding = dataItems.padding;
if (tokenStart.padding > 3) {
tokenStart.attrSet('data-padding-inline-start', (tokenStart.padding * 14).toString());
}
}
items = [];
li = null;
setTokenOpenList(state, -1, -1, type, iLevelT, eLevel, iLevelC);
if (sE.length > 0) {
items = ItemsAddToPrev(items, sE, nextLine);
}
iOpen++;
}
}
else {
if (itemTag.test(lineText)) {
items = ItemsListPush(items, lineText, nextLine + dStart, nextLine + dStart);
}
else {
items = ItemsAddToPrev(items, lineText, nextLine);
}
}
}
if (!haveClose) {
console.log('NOT CLOSE TAG.');
ListItemsBlock(state, items);
li = null;
//return false
}
state.line = nextLine;
state.startLine = '';
state.parentType = oldParentType;
state.level = state.prentLevel < 0 ? 0 : state.prentLevel;
if (tokenStart) {
tokenStart.map[1] = nextLine + dStart;
}
return true;
};
exports.Lists = Lists;
//# sourceMappingURL=index.js.map