Spoilers: Keep non-overlapping bodyRanges separate

This commit is contained in:
Scott Nonnenberg 2023-08-01 12:06:20 -07:00 committed by GitHub
parent 1c9651f557
commit 269cd9b51d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 20 deletions

View file

@ -44,6 +44,7 @@ export namespace BodyRange {
};
export type Formatting = {
style: Style;
spoilerId?: number;
};
export type DisplayOnly = {
displayStyle: DisplayStyle;
@ -356,8 +357,8 @@ export type DisplayNode = {
// DisplayOnly
isKeywordHighlight?: boolean;
// Only for spoilers, only to represent contiguous groupings
spoilerIndex?: number;
// Only for spoilers, only to make sure we honor original spoiler breakdown
spoilerId?: number;
spoilerChildren?: ReadonlyArray<DisplayNode>;
};
type PartialDisplayNode = Omit<
@ -381,7 +382,7 @@ function rangeToPartialNode(
return { isMonospace: true };
}
if (range.style === BodyRange.Style.SPOILER) {
return { isSpoiler: true };
return { isSpoiler: true, spoilerId: range.spoilerId };
}
if (range.style === BodyRange.Style.STRIKETHROUGH) {
return { isStrikethrough: true };
@ -482,25 +483,29 @@ export function groupContiguousSpoilers(
const result: Array<DisplayNode> = [];
let spoilerContainer: DisplayNode | undefined;
let spoilerIndex = 0;
nodes.forEach(node => {
if (node.isSpoiler) {
if (!spoilerContainer) {
spoilerContainer = {
...node,
spoilerIndex,
isSpoiler: true,
spoilerChildren: [],
};
spoilerIndex += 1;
result.push(spoilerContainer);
}
if (spoilerContainer) {
if (
spoilerContainer &&
isNumber(spoilerContainer.spoilerId) &&
spoilerContainer.spoilerId === node.spoilerId
) {
spoilerContainer.spoilerChildren = [
...(spoilerContainer.spoilerChildren || []),
node,
];
} else {
spoilerContainer = undefined;
}
if (!spoilerContainer) {
spoilerContainer = {
...node,
isSpoiler: true,
spoilerChildren: [node],
};
result.push(spoilerContainer);
}
} else {
spoilerContainer = undefined;