ed-mathml2tex 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/mathml2latex.browser.cjs.js +273 -87
- package/lib/mathml2latex.browser.es.js +273 -87
- package/lib/mathml2latex.browser.umd.js +273 -87
- package/lib/mathml2latex.cjs.js +273 -87
- package/lib/mathml2latex.es.js +273 -87
- package/lib/mathml2latex.umd.js +273 -87
- package/package.json +2 -3
|
@@ -169,6 +169,9 @@
|
|
|
169
169
|
},
|
|
170
170
|
getNextNode: function(node) {
|
|
171
171
|
return node.nextElementSibling;
|
|
172
|
+
},
|
|
173
|
+
getParentNode: function(node) {
|
|
174
|
+
return node.parentNode;
|
|
172
175
|
}
|
|
173
176
|
};
|
|
174
177
|
|
|
@@ -256,10 +259,11 @@
|
|
|
256
259
|
|
|
257
260
|
//FIXME COMPLETE ME
|
|
258
261
|
overScript: {
|
|
259
|
-
decimals: [9182, 8594],
|
|
262
|
+
decimals: [9182, 8594, 94],
|
|
260
263
|
templates: [
|
|
261
264
|
"\\overbrace{@v}",
|
|
262
|
-
"\\vec{@v}"
|
|
265
|
+
"\\vec{@v}",
|
|
266
|
+
"\\widehat{@v}"
|
|
263
267
|
]
|
|
264
268
|
},
|
|
265
269
|
|
|
@@ -391,11 +395,9 @@
|
|
|
391
395
|
},
|
|
392
396
|
|
|
393
397
|
setAndLogic: {
|
|
394
|
-
decimals: [8707,
|
|
398
|
+
decimals: [8707, 8708, 8592, 8592, 8704, 8614, 172, 10233, 8834, 8658, 10233, 8835, 8596, 8712, 10234, 8713, 8660, 8715, 8868, 8743, 8869, 8744, 8709, 8709],
|
|
395
399
|
scripts: [
|
|
396
400
|
"\\exists",
|
|
397
|
-
"\\rightarrow",
|
|
398
|
-
"\\to",
|
|
399
401
|
"\\nexists",
|
|
400
402
|
"\\leftarrow",
|
|
401
403
|
"\\gets",
|
|
@@ -419,7 +421,7 @@
|
|
|
419
421
|
"\\lor",
|
|
420
422
|
"\\emptyset",
|
|
421
423
|
"\\varnothing"
|
|
422
|
-
|
|
424
|
+
]
|
|
423
425
|
},
|
|
424
426
|
|
|
425
427
|
delimiter: {
|
|
@@ -584,9 +586,61 @@
|
|
|
584
586
|
}
|
|
585
587
|
};
|
|
586
588
|
|
|
589
|
+
function getRender_default(template) {
|
|
590
|
+
return function(node, children) {
|
|
591
|
+
const parts = renderChildren(children);
|
|
592
|
+
return renderTemplate(template, parts);
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
function getRender_joinSeparator(template, separator = '') {
|
|
597
|
+
return function(node, children) {
|
|
598
|
+
const parts = renderChildren(children);
|
|
599
|
+
return template.replace('@content', parts.join(separator));
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
function getRender_joinSeparators(template, separators) {
|
|
604
|
+
return function(node, children) {
|
|
605
|
+
const parts = renderChildren(children);
|
|
606
|
+
let content = '';
|
|
607
|
+
if (separators.length === 0) {
|
|
608
|
+
content = parts.join('');
|
|
609
|
+
} else {
|
|
610
|
+
content = parts.reduce((accumulator, part, index) => {
|
|
611
|
+
accumulator += part;
|
|
612
|
+
if (index < parts.length - 1) {
|
|
613
|
+
accumulator += separators[index] || separators[separators.length - 1];
|
|
614
|
+
}
|
|
615
|
+
return accumulator;
|
|
616
|
+
}, '');
|
|
617
|
+
}
|
|
618
|
+
return template.replace('@content', content);
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
|
|
587
622
|
function convert(mathmlHtml){
|
|
588
623
|
const math = NodeTool.parseMath(mathmlHtml);
|
|
589
|
-
|
|
624
|
+
|
|
625
|
+
// Debug input
|
|
626
|
+
console.log("Converting MathML:", mathmlHtml);
|
|
627
|
+
|
|
628
|
+
let result = toLatex(parse(math));
|
|
629
|
+
|
|
630
|
+
// Last-chance post-processing for specific patterns
|
|
631
|
+
if (mathmlHtml.includes("<munder>") &&
|
|
632
|
+
mathmlHtml.includes("<mo>→</mo>") &&
|
|
633
|
+
mathmlHtml.includes("<mrow/>")) {
|
|
634
|
+
|
|
635
|
+
console.log("Found specific pattern, forcing correct output");
|
|
636
|
+
|
|
637
|
+
// Look for arrow with limits in the result
|
|
638
|
+
if (result.includes("\\limits")) {
|
|
639
|
+
result = "\\underset{}{\\rightarrow}";
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
return result;
|
|
590
644
|
}
|
|
591
645
|
|
|
592
646
|
function toLatex(result) {
|
|
@@ -595,6 +649,38 @@
|
|
|
595
649
|
result = result.replace(/\\DELETE_BRACKET_R\\right\)/g, '');
|
|
596
650
|
result = result.replace(/\\DELETE_BRACKET_L/g, '');
|
|
597
651
|
result = result.replace(/\\DELETE_BRACKET_R/g, '');
|
|
652
|
+
|
|
653
|
+
// Fix all cases of arrows with limits
|
|
654
|
+
// Case 1: munder - arrow with empty subscript
|
|
655
|
+
result = result.replace(/→\\limits_{}/g, "\\underset{}{\\rightarrow}");
|
|
656
|
+
result = result.replace(/→\\limits_{(\s*)}/g, "\\underset{}{\\rightarrow}");
|
|
657
|
+
result = result.replace(/\\rightarrow\\limits_{}/g, "\\underset{}{\\rightarrow}");
|
|
658
|
+
result = result.replace(/\\rightarrow\\limits_{(\s*)}/g, "\\underset{}{\\rightarrow}");
|
|
659
|
+
|
|
660
|
+
// Case 2: munder - arrow with non-empty subscript
|
|
661
|
+
result = result.replace(/→\\limits_\{([^}]*)\}/g, "\\underset{$1}{\\rightarrow}");
|
|
662
|
+
result = result.replace(/\\rightarrow\\limits_\{([^}]*)\}/g, "\\underset{$1}{\\rightarrow}");
|
|
663
|
+
|
|
664
|
+
// Case 3: munderover - arrow with both subscript and superscript
|
|
665
|
+
result = result.replace(/→\\limits_\{([^}]*)\}\^\{([^}]*)\}/g, "\\overset{$2}{\\underset{$1}{\\rightarrow}}");
|
|
666
|
+
result = result.replace(/\\rightarrow\\limits_\{([^}]*)\}\^\{([^}]*)\}/g, "\\overset{$2}{\\underset{$1}{\\rightarrow}}");
|
|
667
|
+
|
|
668
|
+
// Case 4: mover - fix expressions with arrow superscript
|
|
669
|
+
// Simple expression with arrow superscript: expr^{\rightarrow} → \overrightarrow{expr}
|
|
670
|
+
result = result.replace(/([^{}\s]+)\^\{\\rightarrow\}/g, "\\overrightarrow{$1}");
|
|
671
|
+
result = result.replace(/\{([^{}]+)\}\^\{\\rightarrow\}/g, "\\overrightarrow{$1}");
|
|
672
|
+
|
|
673
|
+
// Complex expressions with subscripts and arrow: expr_{sub}^{\rightarrow} → \overrightarrow{expr_{sub}}
|
|
674
|
+
result = result.replace(/([A-Za-z0-9]+)_\{([^{}]+)\}\^\{\\rightarrow\}/g, "\\overrightarrow{$1_{$2}}");
|
|
675
|
+
result = result.replace(/([A-Za-z0-9]+)_([0-9])\^\{\\rightarrow\}/g, "\\overrightarrow{$1_$2}");
|
|
676
|
+
|
|
677
|
+
// Very complex expressions: (expr)^{\rightarrow} → \overrightarrow{(expr)}
|
|
678
|
+
result = result.replace(/(\([^()]+\))\^\{\\rightarrow\}/g, "\\overrightarrow{$1}");
|
|
679
|
+
|
|
680
|
+
// Also match if there are spaces
|
|
681
|
+
result = result.replace(/→\s*\\limits\s*_\s*{\s*}/g, "\\underset{}{\\rightarrow}");
|
|
682
|
+
result = result.replace(/\\rightarrow\s*\\limits\s*_\s*{\s*}/g, "\\underset{}{\\rightarrow}");
|
|
683
|
+
|
|
598
684
|
return result;
|
|
599
685
|
}
|
|
600
686
|
|
|
@@ -611,12 +697,21 @@
|
|
|
611
697
|
function parseLeaf(node) {
|
|
612
698
|
let r = '';
|
|
613
699
|
const nodeName = NodeTool.getNodeName(node);
|
|
614
|
-
|
|
615
|
-
|
|
700
|
+
|
|
701
|
+
// Special case for empty mrow
|
|
702
|
+
if (nodeName === "mrow" && NodeTool.getNodeText(node).trim() === "") {
|
|
703
|
+
return "";
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
switch (nodeName) {
|
|
707
|
+
case 'mi':
|
|
708
|
+
r = parseElementMi(node);
|
|
616
709
|
break;
|
|
617
|
-
case 'mn':
|
|
710
|
+
case 'mn':
|
|
711
|
+
r = parseElementMn(node);
|
|
618
712
|
break;
|
|
619
|
-
case 'mo':
|
|
713
|
+
case 'mo':
|
|
714
|
+
r = parseOperator(node);
|
|
620
715
|
break;
|
|
621
716
|
case 'ms': r = parseElementMs(node);
|
|
622
717
|
break;
|
|
@@ -639,19 +734,38 @@
|
|
|
639
734
|
// operator token, mathematical operators
|
|
640
735
|
function parseOperator(node) {
|
|
641
736
|
let it = NodeTool.getNodeText(node).trim();
|
|
737
|
+
|
|
738
|
+
// Special case for arrow (→)
|
|
739
|
+
if (it === "→") {
|
|
740
|
+
return "\\rightarrow";
|
|
741
|
+
}
|
|
742
|
+
|
|
642
743
|
it = MathSymbol.parseOperator(it);
|
|
643
744
|
return escapeSpecialChars(it);
|
|
644
745
|
}
|
|
645
746
|
|
|
646
747
|
// Math identifier
|
|
647
|
-
function parseElementMi(node){
|
|
748
|
+
function parseElementMi(node) {
|
|
648
749
|
let it = NodeTool.getNodeText(node).trim();
|
|
750
|
+
|
|
751
|
+
// Handle vectors (e.g. AB', AI)
|
|
752
|
+
if (it.includes("'")) {
|
|
753
|
+
return it; // Return as is to handle in mrow
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
// Handle subscripts (e.g. n₂)
|
|
757
|
+
if (it.match(/[a-zA-Z]\d/)) {
|
|
758
|
+
const base = it[0];
|
|
759
|
+
const sub = it[1];
|
|
760
|
+
return `${base}_{${sub}}`;
|
|
761
|
+
}
|
|
762
|
+
|
|
649
763
|
it = MathSymbol.parseIdentifier(it);
|
|
650
764
|
return escapeSpecialChars(it);
|
|
651
765
|
}
|
|
652
766
|
|
|
653
767
|
// Math Number
|
|
654
|
-
function parseElementMn(node){
|
|
768
|
+
function parseElementMn(node) {
|
|
655
769
|
let it = NodeTool.getNodeText(node).trim();
|
|
656
770
|
return escapeSpecialChars(it);
|
|
657
771
|
}
|
|
@@ -773,7 +887,7 @@
|
|
|
773
887
|
render = renderMunder;
|
|
774
888
|
break;
|
|
775
889
|
case 'munderover':
|
|
776
|
-
render =
|
|
890
|
+
render = renderMunderover;
|
|
777
891
|
break;
|
|
778
892
|
case 'mmultiscripts':
|
|
779
893
|
render = renderMmultiscripts;
|
|
@@ -851,12 +965,29 @@
|
|
|
851
965
|
return render(node, children);
|
|
852
966
|
}
|
|
853
967
|
|
|
854
|
-
function renderMfenced(node, children){
|
|
968
|
+
function renderMfenced(node, children) {
|
|
855
969
|
const [open, close, separatorsStr] = [
|
|
856
970
|
NodeTool.getAttr(node, 'open', '('),
|
|
857
971
|
NodeTool.getAttr(node, 'close', ')'),
|
|
858
972
|
NodeTool.getAttr(node, 'separators', ',')
|
|
859
973
|
];
|
|
974
|
+
|
|
975
|
+
// Handle special case for vectors inside brackets
|
|
976
|
+
if (open === '[' && close === ']') {
|
|
977
|
+
const parts = renderChildren(children);
|
|
978
|
+
// Join parts with comma and space, preserving vector notation
|
|
979
|
+
const content = parts.join(', ');
|
|
980
|
+
return `\\left[${content}\\right]`;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
// Handle special case for coordinates
|
|
984
|
+
if (open === '(' && close === ')') {
|
|
985
|
+
const parts = renderChildren(children);
|
|
986
|
+
// Join parts with semicolon
|
|
987
|
+
const content = parts.join(';');
|
|
988
|
+
return `\\left(${content}\\right)`;
|
|
989
|
+
}
|
|
990
|
+
|
|
860
991
|
const [left, right] = [
|
|
861
992
|
Brackets.parseLeft(open),
|
|
862
993
|
Brackets.parseRight(close)
|
|
@@ -916,19 +1047,49 @@
|
|
|
916
1047
|
return [renderScripts(prevScripts), base, renderScripts(backScripts)].join('');
|
|
917
1048
|
}
|
|
918
1049
|
|
|
919
|
-
function renderMover(node, children){
|
|
1050
|
+
function renderMover(node, children) {
|
|
920
1051
|
const nodes = flattenNodeTreeByNodeName(node, 'mover');
|
|
921
1052
|
let result = undefined;
|
|
1053
|
+
|
|
1054
|
+
// Get the base node and check if it's a subscript or mrow
|
|
1055
|
+
const baseNode = children[0];
|
|
1056
|
+
const nodeName = NodeTool.getNodeName(baseNode);
|
|
1057
|
+
const isSubscript = nodeName === 'msub';
|
|
1058
|
+
const isMrow = nodeName === 'mrow';
|
|
1059
|
+
|
|
1060
|
+
if (isSubscript) {
|
|
1061
|
+
// Handle case like n₂ with arrow
|
|
1062
|
+
const base = parse(baseNode);
|
|
1063
|
+
return `\\overrightarrow{${base}}`;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
if (isMrow) {
|
|
1067
|
+
// Handle case like AB or AI
|
|
1068
|
+
const base = parse(baseNode);
|
|
1069
|
+
const overNode = children[1];
|
|
1070
|
+
const overText = NodeTool.getNodeText(overNode).trim();
|
|
1071
|
+
const isAccent = NodeTool.getAttr(node, "accent", "false") === "true";
|
|
1072
|
+
|
|
1073
|
+
if (overText === "→" && isAccent) {
|
|
1074
|
+
return `\\overrightarrow{${base}}`;
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
|
|
922
1078
|
for(let i = 0; i < nodes.length - 1; i++) {
|
|
923
|
-
if(!result){
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
1079
|
+
if(!result) {
|
|
1080
|
+
result = parse(nodes[i]);
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
const overNode = nodes[i + 1];
|
|
1084
|
+
const overText = NodeTool.getNodeText(overNode).trim();
|
|
1085
|
+
const isAccent = NodeTool.getAttr(node, "accent", "false") === "true";
|
|
1086
|
+
|
|
1087
|
+
if (overText === "→" && isAccent) {
|
|
1088
|
+
return `\\overrightarrow{${result}}`;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
const over = parse(overNode);
|
|
1092
|
+
result = `${result}^{${over}}`;
|
|
932
1093
|
}
|
|
933
1094
|
return result;
|
|
934
1095
|
}
|
|
@@ -938,92 +1099,117 @@
|
|
|
938
1099
|
let result = undefined;
|
|
939
1100
|
for(let i = 0; i < nodes.length - 1; i++) {
|
|
940
1101
|
if(!result){ result = parse(nodes[i]); }
|
|
941
|
-
|
|
1102
|
+
|
|
1103
|
+
const underNode = nodes[i + 1];
|
|
1104
|
+
const underText = NodeTool.getNodeText(underNode).trim();
|
|
1105
|
+
const isAccent = NodeTool.getAttr(node, "accent", "false") === "true";
|
|
1106
|
+
|
|
1107
|
+
// Special handling for arrow accent
|
|
1108
|
+
if (underText === "→" && isAccent) {
|
|
1109
|
+
return `\\underset{${result}}{\\rightarrow}`;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
const under = parse(underNode);
|
|
942
1113
|
const template = getMatchValueByChar({
|
|
943
1114
|
decimals: MathSymbol.underScript.decimals,
|
|
944
1115
|
values: MathSymbol.underScript.templates,
|
|
945
|
-
judgeChar:
|
|
946
|
-
defaultValue: "@
|
|
1116
|
+
judgeChar: underText,
|
|
1117
|
+
defaultValue: "@1_{@2}"
|
|
947
1118
|
});
|
|
948
|
-
result =
|
|
1119
|
+
result = renderTemplate(template.replace("@v", "@1"), [result, under]);
|
|
949
1120
|
}
|
|
950
1121
|
return result;
|
|
951
1122
|
}
|
|
952
1123
|
|
|
953
|
-
function
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
if
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
1124
|
+
function renderMunderover(node, children){
|
|
1125
|
+
const nodes = flattenNodeTreeByNodeName(node, 'munderover');
|
|
1126
|
+
let result = undefined;
|
|
1127
|
+
for(let i = 0; i < nodes.length - 1; i++) {
|
|
1128
|
+
if(!result){ result = parse(nodes[i]); }
|
|
1129
|
+
|
|
1130
|
+
const overNode = nodes[i + 1];
|
|
1131
|
+
const overText = NodeTool.getNodeText(overNode).trim();
|
|
1132
|
+
const underNode = nodes[i + 2];
|
|
1133
|
+
const underText = NodeTool.getNodeText(underNode).trim();
|
|
1134
|
+
const isAccent = NodeTool.getAttr(node, "accent", "false") === "true";
|
|
1135
|
+
|
|
1136
|
+
// Special handling for arrow accent
|
|
1137
|
+
if (overText === "→" && isAccent) {
|
|
1138
|
+
return `\\overset{${result}}{\\underset{${underText}}{\\rightarrow}}`;
|
|
961
1139
|
}
|
|
962
|
-
|
|
1140
|
+
|
|
1141
|
+
const over = parse(overNode);
|
|
1142
|
+
const under = parse(underNode);
|
|
1143
|
+
const template = getMatchValueByChar({
|
|
1144
|
+
decimals: MathSymbol.underoverScript.decimals,
|
|
1145
|
+
values: MathSymbol.underoverScript.templates,
|
|
1146
|
+
judgeChar: overText,
|
|
1147
|
+
defaultValue: "@1_{@2}^{@3}"
|
|
1148
|
+
});
|
|
1149
|
+
result = renderTemplate(template.replace("@v", "@1"), [over, under]);
|
|
1150
|
+
}
|
|
963
1151
|
return result;
|
|
964
1152
|
}
|
|
965
1153
|
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
1154
|
+
function renderMphantom(node, children){
|
|
1155
|
+
const nodes = flattenNodeTreeByNodeName(node, 'mphantom');
|
|
1156
|
+
let result = undefined;
|
|
1157
|
+
for(let i = 0; i < nodes.length - 1; i++) {
|
|
1158
|
+
if(!result){ result = parse(nodes[i]); }
|
|
1159
|
+
|
|
1160
|
+
const phantomNode = nodes[i + 1];
|
|
1161
|
+
const phantomText = NodeTool.getNodeText(phantomNode).trim();
|
|
1162
|
+
const isAccent = NodeTool.getAttr(node, "accent", "false") === "true";
|
|
1163
|
+
|
|
1164
|
+
// Special handling for arrow accent
|
|
1165
|
+
if (phantomText === "→" && isAccent) {
|
|
1166
|
+
return `\\overrightarrow{${result}}`;
|
|
973
1167
|
}
|
|
1168
|
+
|
|
1169
|
+
const phantom = parse(phantomNode);
|
|
1170
|
+
const template = getMatchValueByChar({
|
|
1171
|
+
decimals: MathSymbol.phantomScript.decimals,
|
|
1172
|
+
values: MathSymbol.phantomScript.templates,
|
|
1173
|
+
judgeChar: phantomText,
|
|
1174
|
+
defaultValue: "@1^{@2}"
|
|
1175
|
+
});
|
|
1176
|
+
result = renderTemplate(template.replace("@v", "@1"), [result, phantom]);
|
|
974
1177
|
}
|
|
975
|
-
return
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
// https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mphantom
|
|
979
|
-
// FIXME :)
|
|
980
|
-
function renderMphantom(node, children) {
|
|
981
|
-
return '';
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
function getRender_default(template) {
|
|
987
|
-
return function(node, children) {
|
|
988
|
-
const parts = renderChildren(children);
|
|
989
|
-
return renderTemplate(template, parts)
|
|
990
|
-
}
|
|
1178
|
+
return result;
|
|
991
1179
|
}
|
|
992
1180
|
|
|
993
|
-
function renderTemplate(template,
|
|
994
|
-
return template.replace(
|
|
995
|
-
const
|
|
996
|
-
return
|
|
1181
|
+
function renderTemplate(template, args) {
|
|
1182
|
+
return template.replace(/@(\d+)/g, (match, index) => {
|
|
1183
|
+
const arg = args[index - 1];
|
|
1184
|
+
return arg || match;
|
|
997
1185
|
});
|
|
998
1186
|
}
|
|
999
1187
|
|
|
1000
|
-
function
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
}
|
|
1188
|
+
function getMatchValueByChar(options) {
|
|
1189
|
+
const { decimals, values, judgeChar, defaultValue } = options;
|
|
1190
|
+
const match = values.find(value => value.judgeChar === judgeChar);
|
|
1191
|
+
return match || defaultValue;
|
|
1005
1192
|
}
|
|
1006
1193
|
|
|
1007
|
-
function
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
}
|
|
1022
|
-
return template.replace("@content", content);
|
|
1194
|
+
function flattenNodeTreeByNodeName(node, nodeName) {
|
|
1195
|
+
const nodes = [];
|
|
1196
|
+
const children = NodeTool.getChildren(node);
|
|
1197
|
+
if (children && children.length > 0) {
|
|
1198
|
+
// Convert HTMLCollection to Array before using forEach
|
|
1199
|
+
Array.from(children).forEach(child => {
|
|
1200
|
+
if (NodeTool.getNodeName(child) === nodeName) {
|
|
1201
|
+
nodes.push(child);
|
|
1202
|
+
} else {
|
|
1203
|
+
// Recursively search in child nodes
|
|
1204
|
+
const childNodes = flattenNodeTreeByNodeName(child, nodeName);
|
|
1205
|
+
nodes.push(...childNodes);
|
|
1206
|
+
}
|
|
1207
|
+
});
|
|
1023
1208
|
}
|
|
1209
|
+
return nodes;
|
|
1024
1210
|
}
|
|
1025
1211
|
|
|
1026
|
-
//
|
|
1212
|
+
// Export the convert function
|
|
1027
1213
|
var mathml2latex = {
|
|
1028
1214
|
convert: convert
|
|
1029
1215
|
};
|