annotate katex/contrib/auto-render.mjs @ 8:4a25b534c81c javascript-experiment

Add v8 engine and include katex
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 17 Jun 2020 21:43:52 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 import katex from '../katex.mjs';
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3 /* eslint no-constant-condition:0 */
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4 const findEndOfMath = function findEndOfMath(delimiter, text, startIndex) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5 // Adapted from
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6 // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 let index = startIndex;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 let braceLevel = 0;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9 const delimLength = delimiter.length;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11 while (index < text.length) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12 const character = text[index];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
14 if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15 return index;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
16 } else if (character === "\\") {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17 index++;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18 } else if (character === "{") {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
19 braceLevel++;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20 } else if (character === "}") {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
21 braceLevel--;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
22 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
23
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
24 index++;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
25 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
26
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
27 return -1;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
28 };
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
30 const splitAtDelimiters = function splitAtDelimiters(startData, leftDelim, rightDelim, display) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
31 const finalData = [];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33 for (let i = 0; i < startData.length; i++) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
34 if (startData[i].type === "text") {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
35 const text = startData[i].data;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 let lookingForLeft = true;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37 let currIndex = 0;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38 let nextIndex;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39 nextIndex = text.indexOf(leftDelim);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41 if (nextIndex !== -1) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
42 currIndex = nextIndex;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43 finalData.push({
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44 type: "text",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45 data: text.slice(0, currIndex)
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46 });
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 lookingForLeft = false;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
49
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
50 while (true) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51 if (lookingForLeft) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
52 nextIndex = text.indexOf(leftDelim, currIndex);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
54 if (nextIndex === -1) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
55 break;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58 finalData.push({
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
59 type: "text",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60 data: text.slice(currIndex, nextIndex)
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
61 });
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
62 currIndex = nextIndex;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
63 } else {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
64 nextIndex = findEndOfMath(rightDelim, text, currIndex + leftDelim.length);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
65
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
66 if (nextIndex === -1) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
67 break;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
68 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
69
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
70 finalData.push({
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
71 type: "math",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
72 data: text.slice(currIndex + leftDelim.length, nextIndex),
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
73 rawData: text.slice(currIndex, nextIndex + rightDelim.length),
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
74 display: display
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
75 });
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
76 currIndex = nextIndex + rightDelim.length;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
77 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
78
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
79 lookingForLeft = !lookingForLeft;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
80 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
81
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
82 finalData.push({
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
83 type: "text",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
84 data: text.slice(currIndex)
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
85 });
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
86 } else {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
87 finalData.push(startData[i]);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
88 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
89 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
90
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
91 return finalData;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
92 };
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
93
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
94 /* eslint no-console:0 */
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
95
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
96 const splitWithDelimiters = function splitWithDelimiters(text, delimiters) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
97 let data = [{
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
98 type: "text",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
99 data: text
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
100 }];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
101
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
102 for (let i = 0; i < delimiters.length; i++) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
103 const delimiter = delimiters[i];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
104 data = splitAtDelimiters(data, delimiter.left, delimiter.right, delimiter.display || false);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
105 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
106
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
107 return data;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
108 };
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
109 /* Note: optionsCopy is mutated by this method. If it is ever exposed in the
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
110 * API, we should copy it before mutating.
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
111 */
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
112
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
113
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
114 const renderMathInText = function renderMathInText(text, optionsCopy) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
115 const data = splitWithDelimiters(text, optionsCopy.delimiters);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
116 const fragment = document.createDocumentFragment();
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
117
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
118 for (let i = 0; i < data.length; i++) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
119 if (data[i].type === "text") {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
120 fragment.appendChild(document.createTextNode(data[i].data));
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
121 } else {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
122 const span = document.createElement("span");
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
123 let math = data[i].data; // Override any display mode defined in the settings with that
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
124 // defined by the text itself
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
125
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
126 optionsCopy.displayMode = data[i].display;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
127
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
128 try {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
129 if (optionsCopy.preProcess) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
130 math = optionsCopy.preProcess(math);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
131 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
132
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
133 katex.render(math, span, optionsCopy);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
134 } catch (e) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
135 if (!(e instanceof katex.ParseError)) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
136 throw e;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
137 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
138
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
139 optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
140 fragment.appendChild(document.createTextNode(data[i].rawData));
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
141 continue;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
142 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
143
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
144 fragment.appendChild(span);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
145 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
146 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
147
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
148 return fragment;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
149 };
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
150
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
151 const renderElem = function renderElem(elem, optionsCopy) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
152 for (let i = 0; i < elem.childNodes.length; i++) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
153 const childNode = elem.childNodes[i];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
154
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
155 if (childNode.nodeType === 3) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
156 // Text node
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
157 const frag = renderMathInText(childNode.textContent, optionsCopy);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
158 i += frag.childNodes.length - 1;
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
159 elem.replaceChild(frag, childNode);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
160 } else if (childNode.nodeType === 1) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
161 // Element node
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
162 const className = ' ' + childNode.className + ' ';
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
163 const shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(x => className.indexOf(' ' + x + ' ') === -1);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
164
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
165 if (shouldRender) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
166 renderElem(childNode, optionsCopy);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
167 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
168 } // Otherwise, it's something else, and ignore it.
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
169
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
170 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
171 };
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
172
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
173 const renderMathInElement = function renderMathInElement(elem, options) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
174 if (!elem) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
175 throw new Error("No element provided to render");
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
176 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
177
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
178 const optionsCopy = {}; // Object.assign(optionsCopy, option)
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
179
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
180 for (const option in options) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
181 if (options.hasOwnProperty(option)) {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
182 optionsCopy[option] = options[option];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
183 }
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
184 } // default options
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
185
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
186
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
187 optionsCopy.delimiters = optionsCopy.delimiters || [{
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
188 left: "$$",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
189 right: "$$",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
190 display: true
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
191 }, {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
192 left: "\\(",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
193 right: "\\)",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
194 display: false
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
195 }, // LaTeX uses $…$, but it ruins the display of normal `$` in text:
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
196 // {left: "$", right: "$", display: false},
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
197 // \[…\] must come last in this array. Otherwise, renderMathInElement
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
198 // will search for \[ before it searches for $$ or \(
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
199 // That makes it susceptible to finding a \\[0.3em] row delimiter and
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
200 // treating it as if it were the start of a KaTeX math zone.
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
201 {
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
202 left: "\\[",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
203 right: "\\]",
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
204 display: true
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
205 }];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
206 optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code"];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
207 optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || [];
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
208 optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
209 // math elements within a single call to `renderMathInElement`.
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
210
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
211 optionsCopy.macros = optionsCopy.macros || {};
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
212 renderElem(elem, optionsCopy);
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
213 };
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
214
4a25b534c81c Add v8 engine and include katex
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
215 export default renderMathInElement;