test: add milkdown markdown roundtrip integration coverage
Co-authored-by: rfc1437 <774975+rfc1437@users.noreply.github.com>
This commit is contained in:
@@ -22,7 +22,7 @@ import { imageResolverPlugin } from '../../plugins/imageResolverPlugin';
|
||||
import '../../macros';
|
||||
import './MilkdownEditor.css';
|
||||
import { InsertModal } from '../InsertModal';
|
||||
import { unescapeMacroSyntax } from '../../utils/markdownEscape';
|
||||
import { normalizeMilkdownMarkdown } from '../../utils/markdownEscape';
|
||||
|
||||
// Remark plugin to force tight lists (no blank lines between list items)
|
||||
const remarkTightListsPlugin: Plugin<[Record<string, unknown>], Root> = () => {
|
||||
@@ -68,11 +68,11 @@ export const shouldPropagateMilkdownChange = ({
|
||||
externalContent,
|
||||
hasUserInteracted,
|
||||
}: MilkdownChangePropagationInput): boolean => {
|
||||
const unescaped = unescapeMacroSyntax(markdown);
|
||||
const prevUnescaped = unescapeMacroSyntax(prevMarkdown);
|
||||
const externalUnescaped = unescapeMacroSyntax(externalContent);
|
||||
const normalized = normalizeMilkdownMarkdown(markdown);
|
||||
const prevNormalized = normalizeMilkdownMarkdown(prevMarkdown);
|
||||
const externalNormalized = normalizeMilkdownMarkdown(externalContent);
|
||||
|
||||
if (unescaped === prevUnescaped) {
|
||||
if (normalized === prevNormalized) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ export const shouldPropagateMilkdownChange = ({
|
||||
return false;
|
||||
}
|
||||
|
||||
return unescaped !== externalUnescaped;
|
||||
return normalized !== externalNormalized;
|
||||
};
|
||||
|
||||
interface EditorToolbarProps {
|
||||
@@ -329,7 +329,7 @@ const MilkdownProviderInner: React.FC<MilkdownEditorProps> = ({
|
||||
|
||||
if (shouldEmit) {
|
||||
isInternalChange.current = true;
|
||||
onChangeRef.current(unescapeMacroSyntax(markdown));
|
||||
onChangeRef.current(normalizeMilkdownMarkdown(markdown));
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
@@ -37,3 +37,37 @@ export function unescapeMacroSyntax(markdown: string): string {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
const unorderedListItemPattern = /^\s{0,3}[-+*]\s/;
|
||||
const orderedListItemPattern = /^\s{0,3}\d+\.\s/;
|
||||
|
||||
function getListLineType(line: string): 'ordered' | 'unordered' | null {
|
||||
if (unorderedListItemPattern.test(line)) return 'unordered';
|
||||
if (orderedListItemPattern.test(line)) return 'ordered';
|
||||
return null;
|
||||
}
|
||||
|
||||
export function normalizeMilkdownMarkdown(markdown: string): string {
|
||||
const unescaped = unescapeMacroSyntax(markdown);
|
||||
const lines = unescaped.split('\n');
|
||||
const normalized: string[] = [];
|
||||
|
||||
for (let i = 0; i < lines.length; i += 1) {
|
||||
const line = lines[i];
|
||||
|
||||
const previousListType = i > 0 ? getListLineType(lines[i - 1]) : null;
|
||||
const nextListType = i < lines.length - 1 ? getListLineType(lines[i + 1]) : null;
|
||||
if (line === '' && previousListType !== null && previousListType === nextListType) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (line === '>') {
|
||||
normalized.push('> ');
|
||||
continue;
|
||||
}
|
||||
|
||||
normalized.push(line);
|
||||
}
|
||||
|
||||
return normalized.join('\n');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user