mirror of
https://github.com/Smaug123/KaTeX
synced 2025-10-11 22:18:41 +00:00
Reset to leftmost spacing mode after newline (#1841)
* Reset to leftmost spacing mode after newline Newlines have class "mspace newline" but shouldn't be fully ignored: they should reset the spacing mode back to "leftmost" so as to not accidentally create trailing spaces at end of lines. Fix #1828. * Update snapshots * Add root detection, and treat newline specially only then Co-authored-by: ylemkimon <mail@ylem.kim>
This commit is contained in:
@@ -59,7 +59,7 @@ type DomType = $Keys<typeof DomEnum>;
|
||||
export const buildExpression = function(
|
||||
expression: AnyParseNode[],
|
||||
options: Options,
|
||||
isRealGroup: boolean,
|
||||
isRealGroup: boolean | "root",
|
||||
surrounding: [?DomType, ?DomType] = [null, null],
|
||||
): HtmlDomNode[] {
|
||||
// Parse expressions into `groups`.
|
||||
@@ -102,6 +102,7 @@ export const buildExpression = function(
|
||||
|
||||
// Before determining what spaces to insert, perform bin cancellation.
|
||||
// Binary operators change to ordinary symbols in some contexts.
|
||||
const isRoot = (isRealGroup === "root");
|
||||
traverseNonSpaceNodes(groups, (node, prev) => {
|
||||
const prevType = prev.classes[0];
|
||||
const type = node.classes[0];
|
||||
@@ -110,7 +111,7 @@ export const buildExpression = function(
|
||||
} else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) {
|
||||
node.classes[0] = "mord";
|
||||
}
|
||||
}, {node: dummyPrev}, dummyNext);
|
||||
}, {node: dummyPrev}, dummyNext, isRoot);
|
||||
|
||||
traverseNonSpaceNodes(groups, (node, prev) => {
|
||||
const prevType = getTypeOfDomTree(prev);
|
||||
@@ -123,7 +124,7 @@ export const buildExpression = function(
|
||||
if (space) { // Insert glue (spacing) after the `prev`.
|
||||
return buildCommon.makeGlue(space, glueOptions);
|
||||
}
|
||||
}, {node: dummyPrev}, dummyNext);
|
||||
}, {node: dummyPrev}, dummyNext, isRoot);
|
||||
|
||||
return groups;
|
||||
};
|
||||
@@ -141,6 +142,7 @@ const traverseNonSpaceNodes = function(
|
||||
insertAfter?: HtmlDomNode => void,
|
||||
|},
|
||||
next: ?HtmlDomNode,
|
||||
isRoot: boolean,
|
||||
) {
|
||||
if (next) { // temporarily append the right node, if exists
|
||||
nodes.push(next);
|
||||
@@ -151,27 +153,31 @@ const traverseNonSpaceNodes = function(
|
||||
const partialGroup = checkPartialGroup(node);
|
||||
if (partialGroup) { // Recursive DFS
|
||||
// $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array
|
||||
traverseNonSpaceNodes(partialGroup.children, callback, prev);
|
||||
traverseNonSpaceNodes(partialGroup.children,
|
||||
callback, prev, null, isRoot);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Ignore explicit spaces (e.g., \;, \,) when determining what implicit
|
||||
// spacing should go between atoms of different classes
|
||||
if (node.classes[0] === "mspace") {
|
||||
continue;
|
||||
}
|
||||
|
||||
const result = callback(node, prev.node);
|
||||
if (result) {
|
||||
if (prev.insertAfter) {
|
||||
prev.insertAfter(result);
|
||||
} else { // insert at front
|
||||
nodes.unshift(result);
|
||||
i++;
|
||||
const nonspace = !node.hasClass("mspace");
|
||||
if (nonspace) {
|
||||
const result = callback(node, prev.node);
|
||||
if (result) {
|
||||
if (prev.insertAfter) {
|
||||
prev.insertAfter(result);
|
||||
} else { // insert at front
|
||||
nodes.unshift(result);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
prev.node = node;
|
||||
if (nonspace) {
|
||||
prev.node = node;
|
||||
} else if (isRoot && node.hasClass("newline")) {
|
||||
prev.node = makeSpan(["leftmost"]); // treat like beginning of line
|
||||
}
|
||||
prev.insertAfter = (index => n => {
|
||||
nodes.splice(index + 1, 0, n);
|
||||
i++;
|
||||
@@ -310,7 +316,7 @@ export default function buildHTML(tree: AnyParseNode[], options: Options): DomSp
|
||||
}
|
||||
|
||||
// Build the expression contained in the tree
|
||||
const expression = buildExpression(tree, options, true);
|
||||
const expression = buildExpression(tree, options, "root");
|
||||
|
||||
const children = [];
|
||||
|
||||
|
@@ -1228,10 +1228,6 @@ exports[`Newlines via \\\\ and \\newline \\\\ causes newline, even after mrel an
|
||||
<span class="mrel">
|
||||
=
|
||||
</span>
|
||||
<span class="mspace"
|
||||
style="margin-right:0.2777777777777778em;"
|
||||
>
|
||||
</span>
|
||||
</span>
|
||||
<span class="mspace newline">
|
||||
</span>
|
||||
@@ -1250,10 +1246,6 @@ exports[`Newlines via \\\\ and \\newline \\\\ causes newline, even after mrel an
|
||||
<span class="mbin">
|
||||
+
|
||||
</span>
|
||||
<span class="mspace"
|
||||
style="margin-right:0.2222222222222222em;"
|
||||
>
|
||||
</span>
|
||||
</span>
|
||||
<span class="mspace newline">
|
||||
</span>
|
||||
|
Reference in New Issue
Block a user