一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled
92 行
2.7 KiB
TypeScript
92 行
2.7 KiB
TypeScript
import postprocessEditorOutput from './postprocessEditorOutput';
|
|
|
|
const normalizeHtmlString = (html: string) => {
|
|
return html.replace(/\s+/g, ' ').trim();
|
|
};
|
|
|
|
const processListHtml = (inputHtml: string) => {
|
|
const doc = new DOMParser().parseFromString(`<body>${inputHtml}</body>`, 'text/html');
|
|
const output = postprocessEditorOutput(doc.body);
|
|
return normalizeHtmlString(output.querySelector('ul').outerHTML);
|
|
};
|
|
|
|
describe('postprocessEditorOutput', () => {
|
|
test.each([
|
|
[
|
|
'should remove extra paragraphs from around list items',
|
|
`<ul>
|
|
<li><p>Test</p></li>
|
|
<li>Test 2</li>
|
|
<li><p></p><p>Test 3</p><p></p></li>
|
|
</ul>`,
|
|
`<ul>
|
|
<li>Test</li>
|
|
<li>Test 2</li>
|
|
<li>Test 3</li>
|
|
</ul>`,
|
|
],
|
|
[
|
|
'should remove wrapper paragraph from list items with nested lists',
|
|
`<ul>
|
|
<li><p>Parent item</p><ul><li><p>Nested item</p></li></ul></li>
|
|
<li><p>After nested</p></li>
|
|
</ul>`,
|
|
`<ul>
|
|
<li>Parent item<ul><li>Nested item</li></ul></li>
|
|
<li>After nested</li>
|
|
</ul>`,
|
|
],
|
|
[
|
|
'should preserve multiple paragraphs in list items with nested lists',
|
|
`<ul>
|
|
<li><p>First paragraph</p><p>Second paragraph</p><ul><li><p>Nested</p></li></ul></li>
|
|
</ul>`,
|
|
`<ul>
|
|
<li><p>First paragraph</p><p>Second paragraph</p><ul><li>Nested</li></ul></li>
|
|
</ul>`,
|
|
],
|
|
[
|
|
'should preserve non-consecutive paragraphs separated by nested lists',
|
|
`<ul>
|
|
<li><p>Before</p><ul><li><p>Nested</p></li></ul><p>After</p></li>
|
|
</ul>`,
|
|
`<ul>
|
|
<li><p>Before</p><ul><li>Nested</li></ul><p>After</p></li>
|
|
</ul>`,
|
|
],
|
|
[
|
|
'should preserve text nodes before paragraphs in list items',
|
|
`<ul>
|
|
<li>Text before<p>Paragraph</p></li>
|
|
</ul>`,
|
|
`<ul>
|
|
<li>Text before<p>Paragraph</p></li>
|
|
</ul>`,
|
|
],
|
|
[
|
|
'should remove wrapper paragraph from checklist items with nested lists',
|
|
`<ul>
|
|
<li><input><div><p>Parent</p><ul><li><input><div><p>Nested</p></div></li></ul></div></li>
|
|
<li><input><div><p>After nested</p></div></li>
|
|
</ul>`,
|
|
`<ul>
|
|
<li><input><span>Parent</span><ul><li><input><span>Nested</span></li></ul></li>
|
|
<li><input><span>After nested</span></li>
|
|
</ul>`,
|
|
],
|
|
[
|
|
'should remove wrapper paragraphs from around checklist items',
|
|
`<ul>
|
|
<li><input><div><p>Should remove single wrapper paragraphs.</p></div></li>
|
|
<li><input><div><p>Should not remove paragraphs...</p><p>...when there are multiple.</p></div></li>
|
|
</ul>`,
|
|
`<ul>
|
|
<li><input><span>Should remove single wrapper paragraphs.</span></li>
|
|
<li><input><div><p>Should not remove paragraphs...</p><p>...when there are multiple.</p></div></li>
|
|
</ul>`,
|
|
],
|
|
])('%s', (_name, input, expected) => {
|
|
expect(processListHtml(input)).toBe(normalizeHtmlString(expected));
|
|
});
|
|
});
|