quasar-ui-danx 0.4.99 → 0.5.1
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/dist/danx.es.js +17884 -12732
- package/dist/danx.es.js.map +1 -1
- package/dist/danx.umd.js +192 -118
- package/dist/danx.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +11 -2
- package/scripts/publish.sh +76 -0
- package/src/components/Utility/Code/CodeViewer.vue +31 -14
- package/src/components/Utility/Code/CodeViewerCollapsed.vue +2 -0
- package/src/components/Utility/Code/CodeViewerFooter.vue +1 -1
- package/src/components/Utility/Code/LanguageBadge.vue +278 -5
- package/src/components/Utility/Code/MarkdownContent.vue +160 -6
- package/src/components/Utility/Code/index.ts +3 -0
- package/src/components/Utility/Markdown/ContextMenu.vue +314 -0
- package/src/components/Utility/Markdown/HotkeyHelpPopover.vue +259 -0
- package/src/components/Utility/Markdown/LineTypeMenu.vue +226 -0
- package/src/components/Utility/Markdown/LinkPopover.vue +331 -0
- package/src/components/Utility/Markdown/MarkdownEditor.vue +228 -0
- package/src/components/Utility/Markdown/MarkdownEditorContent.vue +235 -0
- package/src/components/Utility/Markdown/MarkdownEditorFooter.vue +50 -0
- package/src/components/Utility/Markdown/TablePopover.vue +420 -0
- package/src/components/Utility/Markdown/index.ts +11 -0
- package/src/components/Utility/Markdown/types.ts +27 -0
- package/src/components/Utility/index.ts +1 -0
- package/src/composables/index.ts +1 -0
- package/src/composables/markdown/features/useBlockquotes.spec.ts +428 -0
- package/src/composables/markdown/features/useBlockquotes.ts +248 -0
- package/src/composables/markdown/features/useCodeBlockManager.ts +369 -0
- package/src/composables/markdown/features/useCodeBlocks.spec.ts +779 -0
- package/src/composables/markdown/features/useCodeBlocks.ts +774 -0
- package/src/composables/markdown/features/useContextMenu.ts +444 -0
- package/src/composables/markdown/features/useFocusTracking.ts +116 -0
- package/src/composables/markdown/features/useHeadings.spec.ts +834 -0
- package/src/composables/markdown/features/useHeadings.ts +290 -0
- package/src/composables/markdown/features/useInlineFormatting.spec.ts +705 -0
- package/src/composables/markdown/features/useInlineFormatting.ts +402 -0
- package/src/composables/markdown/features/useLineTypeMenu.ts +285 -0
- package/src/composables/markdown/features/useLinks.spec.ts +369 -0
- package/src/composables/markdown/features/useLinks.ts +374 -0
- package/src/composables/markdown/features/useLists.spec.ts +834 -0
- package/src/composables/markdown/features/useLists.ts +747 -0
- package/src/composables/markdown/features/usePopoverManager.ts +181 -0
- package/src/composables/markdown/features/useTables.spec.ts +1601 -0
- package/src/composables/markdown/features/useTables.ts +1107 -0
- package/src/composables/markdown/index.ts +16 -0
- package/src/composables/markdown/useMarkdownEditor.spec.ts +332 -0
- package/src/composables/markdown/useMarkdownEditor.ts +1068 -0
- package/src/composables/markdown/useMarkdownHotkeys.spec.ts +791 -0
- package/src/composables/markdown/useMarkdownHotkeys.ts +266 -0
- package/src/composables/markdown/useMarkdownSelection.ts +219 -0
- package/src/composables/markdown/useMarkdownSync.ts +549 -0
- package/src/composables/useCodeViewerEditor.spec.ts +655 -0
- package/src/composables/useCodeViewerEditor.ts +174 -20
- package/src/helpers/formats/index.ts +1 -1
- package/src/helpers/formats/markdown/escapeHtml.ts +15 -0
- package/src/helpers/formats/markdown/escapeSequences.ts +60 -0
- package/src/helpers/formats/markdown/htmlToMarkdown/convertHeadings.ts +41 -0
- package/src/helpers/formats/markdown/htmlToMarkdown/index.spec.ts +489 -0
- package/src/helpers/formats/markdown/htmlToMarkdown/index.ts +412 -0
- package/src/helpers/formats/markdown/index.ts +92 -0
- package/src/helpers/formats/markdown/linePatterns.spec.ts +495 -0
- package/src/helpers/formats/markdown/linePatterns.ts +172 -0
- package/src/helpers/formats/markdown/parseInline.ts +124 -0
- package/src/helpers/formats/markdown/render/index.ts +92 -0
- package/src/helpers/formats/markdown/render/renderFootnotes.ts +30 -0
- package/src/helpers/formats/markdown/render/renderList.ts +69 -0
- package/src/helpers/formats/markdown/render/renderTable.ts +38 -0
- package/src/helpers/formats/markdown/state.ts +58 -0
- package/src/helpers/formats/markdown/tokenize/extractDefinitions.ts +39 -0
- package/src/helpers/formats/markdown/tokenize/index.ts +139 -0
- package/src/helpers/formats/markdown/tokenize/parseBlockquote.ts +34 -0
- package/src/helpers/formats/markdown/tokenize/parseCodeBlock.ts +85 -0
- package/src/helpers/formats/markdown/tokenize/parseDefinitionList.ts +88 -0
- package/src/helpers/formats/markdown/tokenize/parseHeading.ts +65 -0
- package/src/helpers/formats/markdown/tokenize/parseHorizontalRule.ts +22 -0
- package/src/helpers/formats/markdown/tokenize/parseList.ts +119 -0
- package/src/helpers/formats/markdown/tokenize/parseParagraph.ts +59 -0
- package/src/helpers/formats/markdown/tokenize/parseTable.ts +70 -0
- package/src/helpers/formats/markdown/tokenize/parseTaskList.ts +47 -0
- package/src/helpers/formats/markdown/tokenize/utils.ts +25 -0
- package/src/helpers/formats/markdown/types.ts +63 -0
- package/src/styles/danx.scss +1 -0
- package/src/styles/themes/danx/markdown.scss +96 -0
- package/src/test/helpers/editorTestUtils.spec.ts +296 -0
- package/src/test/helpers/editorTestUtils.ts +253 -0
- package/src/test/helpers/index.ts +1 -0
- package/src/test/setup.test.ts +12 -0
- package/src/test/setup.ts +12 -0
- package/vitest.config.ts +19 -0
- package/src/helpers/formats/renderMarkdown.ts +0 -338
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from "./useMarkdownEditor";
|
|
2
|
+
export * from "./useMarkdownSelection";
|
|
3
|
+
export * from "./useMarkdownSync";
|
|
4
|
+
export * from "./useMarkdownHotkeys";
|
|
5
|
+
export * from "./features/useBlockquotes";
|
|
6
|
+
export * from "./features/useCodeBlocks";
|
|
7
|
+
export * from "./features/useCodeBlockManager";
|
|
8
|
+
export * from "./features/useContextMenu";
|
|
9
|
+
export * from "./features/useFocusTracking";
|
|
10
|
+
export * from "./features/useHeadings";
|
|
11
|
+
export * from "./features/useInlineFormatting";
|
|
12
|
+
export * from "./features/useLineTypeMenu";
|
|
13
|
+
export * from "./features/useLinks";
|
|
14
|
+
export * from "./features/useLists";
|
|
15
|
+
export * from "./features/usePopoverManager";
|
|
16
|
+
export * from "./features/useTables";
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { useMarkdownEditor } from './useMarkdownEditor';
|
|
3
|
+
import { createTestEditor, TestEditorResult } from '../../test/helpers/editorTestUtils';
|
|
4
|
+
|
|
5
|
+
describe('useMarkdownEditor', () => {
|
|
6
|
+
let editor: TestEditorResult;
|
|
7
|
+
let onEmitValue: ReturnType<typeof vi.fn>;
|
|
8
|
+
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
if (editor) {
|
|
11
|
+
editor.destroy();
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Create markdown editor composable with test editor
|
|
17
|
+
*/
|
|
18
|
+
function createEditor(initialHtml: string, initialValue = '') {
|
|
19
|
+
editor = createTestEditor(initialHtml);
|
|
20
|
+
onEmitValue = vi.fn();
|
|
21
|
+
return useMarkdownEditor({
|
|
22
|
+
contentRef: editor.contentRef,
|
|
23
|
+
initialValue,
|
|
24
|
+
onEmitValue,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe('heading hotkeys with list handling', () => {
|
|
29
|
+
describe('Ctrl+1-6 hotkeys convert list items to headings', () => {
|
|
30
|
+
it('Ctrl+1 converts bullet list item to H1', () => {
|
|
31
|
+
const markdownEditor = createEditor('<ul><li>List item</li></ul>');
|
|
32
|
+
// Set cursor in list item
|
|
33
|
+
const li = editor.container.querySelector('li');
|
|
34
|
+
if (li?.firstChild) {
|
|
35
|
+
editor.setCursor(li.firstChild, 5);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Simulate Ctrl+1 by calling the onKeyDown handler
|
|
39
|
+
const event = new KeyboardEvent('keydown', {
|
|
40
|
+
key: '1',
|
|
41
|
+
code: 'Digit1',
|
|
42
|
+
ctrlKey: true,
|
|
43
|
+
bubbles: true,
|
|
44
|
+
cancelable: true,
|
|
45
|
+
});
|
|
46
|
+
markdownEditor.onKeyDown(event);
|
|
47
|
+
|
|
48
|
+
// Should convert to H1
|
|
49
|
+
expect(editor.getHtml()).toBe('<h1>List item</h1>');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('Ctrl+2 converts numbered list item to H2', () => {
|
|
53
|
+
const markdownEditor = createEditor('<ol><li>Numbered item</li></ol>');
|
|
54
|
+
// Set cursor in list item
|
|
55
|
+
const li = editor.container.querySelector('li');
|
|
56
|
+
if (li?.firstChild) {
|
|
57
|
+
editor.setCursor(li.firstChild, 5);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Simulate Ctrl+2
|
|
61
|
+
const event = new KeyboardEvent('keydown', {
|
|
62
|
+
key: '2',
|
|
63
|
+
code: 'Digit2',
|
|
64
|
+
ctrlKey: true,
|
|
65
|
+
bubbles: true,
|
|
66
|
+
cancelable: true,
|
|
67
|
+
});
|
|
68
|
+
markdownEditor.onKeyDown(event);
|
|
69
|
+
|
|
70
|
+
// Should convert to H2
|
|
71
|
+
expect(editor.getHtml()).toBe('<h2>Numbered item</h2>');
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('Ctrl+3 converts list item to H3', () => {
|
|
75
|
+
const markdownEditor = createEditor('<ul><li>Test item</li></ul>');
|
|
76
|
+
const li = editor.container.querySelector('li');
|
|
77
|
+
if (li?.firstChild) {
|
|
78
|
+
editor.setCursor(li.firstChild, 0);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const event = new KeyboardEvent('keydown', {
|
|
82
|
+
key: '3',
|
|
83
|
+
code: 'Digit3',
|
|
84
|
+
ctrlKey: true,
|
|
85
|
+
bubbles: true,
|
|
86
|
+
cancelable: true,
|
|
87
|
+
});
|
|
88
|
+
markdownEditor.onKeyDown(event);
|
|
89
|
+
|
|
90
|
+
expect(editor.getHtml()).toBe('<h3>Test item</h3>');
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('Ctrl+4 converts list item to H4', () => {
|
|
94
|
+
const markdownEditor = createEditor('<ul><li>Test item</li></ul>');
|
|
95
|
+
const li = editor.container.querySelector('li');
|
|
96
|
+
if (li?.firstChild) {
|
|
97
|
+
editor.setCursor(li.firstChild, 0);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const event = new KeyboardEvent('keydown', {
|
|
101
|
+
key: '4',
|
|
102
|
+
code: 'Digit4',
|
|
103
|
+
ctrlKey: true,
|
|
104
|
+
bubbles: true,
|
|
105
|
+
cancelable: true,
|
|
106
|
+
});
|
|
107
|
+
markdownEditor.onKeyDown(event);
|
|
108
|
+
|
|
109
|
+
expect(editor.getHtml()).toBe('<h4>Test item</h4>');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('Ctrl+5 converts list item to H5', () => {
|
|
113
|
+
const markdownEditor = createEditor('<ul><li>Test item</li></ul>');
|
|
114
|
+
const li = editor.container.querySelector('li');
|
|
115
|
+
if (li?.firstChild) {
|
|
116
|
+
editor.setCursor(li.firstChild, 0);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const event = new KeyboardEvent('keydown', {
|
|
120
|
+
key: '5',
|
|
121
|
+
code: 'Digit5',
|
|
122
|
+
ctrlKey: true,
|
|
123
|
+
bubbles: true,
|
|
124
|
+
cancelable: true,
|
|
125
|
+
});
|
|
126
|
+
markdownEditor.onKeyDown(event);
|
|
127
|
+
|
|
128
|
+
expect(editor.getHtml()).toBe('<h5>Test item</h5>');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('Ctrl+6 converts list item to H6', () => {
|
|
132
|
+
const markdownEditor = createEditor('<ul><li>Test item</li></ul>');
|
|
133
|
+
const li = editor.container.querySelector('li');
|
|
134
|
+
if (li?.firstChild) {
|
|
135
|
+
editor.setCursor(li.firstChild, 0);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const event = new KeyboardEvent('keydown', {
|
|
139
|
+
key: '6',
|
|
140
|
+
code: 'Digit6',
|
|
141
|
+
ctrlKey: true,
|
|
142
|
+
bubbles: true,
|
|
143
|
+
cancelable: true,
|
|
144
|
+
});
|
|
145
|
+
markdownEditor.onKeyDown(event);
|
|
146
|
+
|
|
147
|
+
expect(editor.getHtml()).toBe('<h6>Test item</h6>');
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
describe('Ctrl+0 converts list item to paragraph', () => {
|
|
152
|
+
it('Ctrl+0 converts bullet list item to paragraph', () => {
|
|
153
|
+
const markdownEditor = createEditor('<ul><li>List item</li></ul>');
|
|
154
|
+
const li = editor.container.querySelector('li');
|
|
155
|
+
if (li?.firstChild) {
|
|
156
|
+
editor.setCursor(li.firstChild, 0);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const event = new KeyboardEvent('keydown', {
|
|
160
|
+
key: '0',
|
|
161
|
+
code: 'Digit0',
|
|
162
|
+
ctrlKey: true,
|
|
163
|
+
bubbles: true,
|
|
164
|
+
cancelable: true,
|
|
165
|
+
});
|
|
166
|
+
markdownEditor.onKeyDown(event);
|
|
167
|
+
|
|
168
|
+
// Should convert to paragraph
|
|
169
|
+
expect(editor.getHtml()).toBe('<p>List item</p>');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('Ctrl+0 converts numbered list item to paragraph', () => {
|
|
173
|
+
const markdownEditor = createEditor('<ol><li>Numbered item</li></ol>');
|
|
174
|
+
const li = editor.container.querySelector('li');
|
|
175
|
+
if (li?.firstChild) {
|
|
176
|
+
editor.setCursor(li.firstChild, 0);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const event = new KeyboardEvent('keydown', {
|
|
180
|
+
key: '0',
|
|
181
|
+
code: 'Digit0',
|
|
182
|
+
ctrlKey: true,
|
|
183
|
+
bubbles: true,
|
|
184
|
+
cancelable: true,
|
|
185
|
+
});
|
|
186
|
+
markdownEditor.onKeyDown(event);
|
|
187
|
+
|
|
188
|
+
expect(editor.getHtml()).toBe('<p>Numbered item</p>');
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
describe('Ctrl+> and Ctrl+< work on list items', () => {
|
|
193
|
+
it('Ctrl+> (increase heading) converts list item to H6', () => {
|
|
194
|
+
const markdownEditor = createEditor('<ul><li>List item</li></ul>');
|
|
195
|
+
const li = editor.container.querySelector('li');
|
|
196
|
+
if (li?.firstChild) {
|
|
197
|
+
editor.setCursor(li.firstChild, 0);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Ctrl+Shift+. is typically how Ctrl+> is triggered
|
|
201
|
+
const event = new KeyboardEvent('keydown', {
|
|
202
|
+
key: '>',
|
|
203
|
+
code: 'Period',
|
|
204
|
+
ctrlKey: true,
|
|
205
|
+
shiftKey: true,
|
|
206
|
+
bubbles: true,
|
|
207
|
+
cancelable: true,
|
|
208
|
+
});
|
|
209
|
+
markdownEditor.onKeyDown(event);
|
|
210
|
+
|
|
211
|
+
// List item -> paragraph -> H6
|
|
212
|
+
expect(editor.getHtml()).toBe('<h6>List item</h6>');
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('Ctrl+< (decrease heading) converts list item to paragraph', () => {
|
|
216
|
+
const markdownEditor = createEditor('<ul><li>List item</li></ul>');
|
|
217
|
+
const li = editor.container.querySelector('li');
|
|
218
|
+
if (li?.firstChild) {
|
|
219
|
+
editor.setCursor(li.firstChild, 0);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Ctrl+Shift+, is typically how Ctrl+< is triggered
|
|
223
|
+
const event = new KeyboardEvent('keydown', {
|
|
224
|
+
key: '<',
|
|
225
|
+
code: 'Comma',
|
|
226
|
+
ctrlKey: true,
|
|
227
|
+
shiftKey: true,
|
|
228
|
+
bubbles: true,
|
|
229
|
+
cancelable: true,
|
|
230
|
+
});
|
|
231
|
+
markdownEditor.onKeyDown(event);
|
|
232
|
+
|
|
233
|
+
// List item -> paragraph (lowest level)
|
|
234
|
+
expect(editor.getHtml()).toBe('<p>List item</p>');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
describe('heading hotkeys still work on paragraphs', () => {
|
|
239
|
+
it('Ctrl+1 still converts paragraph to H1', () => {
|
|
240
|
+
const markdownEditor = createEditor('<p>Hello world</p>');
|
|
241
|
+
editor.setCursorInBlock(0, 5);
|
|
242
|
+
|
|
243
|
+
const event = new KeyboardEvent('keydown', {
|
|
244
|
+
key: '1',
|
|
245
|
+
code: 'Digit1',
|
|
246
|
+
ctrlKey: true,
|
|
247
|
+
bubbles: true,
|
|
248
|
+
cancelable: true,
|
|
249
|
+
});
|
|
250
|
+
markdownEditor.onKeyDown(event);
|
|
251
|
+
|
|
252
|
+
expect(editor.getHtml()).toBe('<h1>Hello world</h1>');
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it('Ctrl+0 converts heading to paragraph', () => {
|
|
256
|
+
const markdownEditor = createEditor('<h2>Hello world</h2>');
|
|
257
|
+
editor.setCursorInBlock(0, 0);
|
|
258
|
+
|
|
259
|
+
const event = new KeyboardEvent('keydown', {
|
|
260
|
+
key: '0',
|
|
261
|
+
code: 'Digit0',
|
|
262
|
+
ctrlKey: true,
|
|
263
|
+
bubbles: true,
|
|
264
|
+
cancelable: true,
|
|
265
|
+
});
|
|
266
|
+
markdownEditor.onKeyDown(event);
|
|
267
|
+
|
|
268
|
+
expect(editor.getHtml()).toBe('<p>Hello world</p>');
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
it('Ctrl+> increases heading level on paragraph', () => {
|
|
272
|
+
const markdownEditor = createEditor('<p>Hello world</p>');
|
|
273
|
+
editor.setCursorInBlock(0, 0);
|
|
274
|
+
|
|
275
|
+
const event = new KeyboardEvent('keydown', {
|
|
276
|
+
key: '>',
|
|
277
|
+
code: 'Period',
|
|
278
|
+
ctrlKey: true,
|
|
279
|
+
shiftKey: true,
|
|
280
|
+
bubbles: true,
|
|
281
|
+
cancelable: true,
|
|
282
|
+
});
|
|
283
|
+
markdownEditor.onKeyDown(event);
|
|
284
|
+
|
|
285
|
+
expect(editor.getHtml()).toBe('<h6>Hello world</h6>');
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
it('Ctrl+< decreases heading level on H1', () => {
|
|
289
|
+
const markdownEditor = createEditor('<h1>Hello world</h1>');
|
|
290
|
+
editor.setCursorInBlock(0, 0);
|
|
291
|
+
|
|
292
|
+
const event = new KeyboardEvent('keydown', {
|
|
293
|
+
key: '<',
|
|
294
|
+
code: 'Comma',
|
|
295
|
+
ctrlKey: true,
|
|
296
|
+
shiftKey: true,
|
|
297
|
+
bubbles: true,
|
|
298
|
+
cancelable: true,
|
|
299
|
+
});
|
|
300
|
+
markdownEditor.onKeyDown(event);
|
|
301
|
+
|
|
302
|
+
expect(editor.getHtml()).toBe('<h2>Hello world</h2>');
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
describe('multiple list items - only current item is affected', () => {
|
|
307
|
+
it('converts only the current list item when multiple items exist', () => {
|
|
308
|
+
const markdownEditor = createEditor('<ul><li>First</li><li>Second</li><li>Third</li></ul>');
|
|
309
|
+
// Set cursor in second list item
|
|
310
|
+
const items = editor.container.querySelectorAll('li');
|
|
311
|
+
if (items[1]?.firstChild) {
|
|
312
|
+
editor.setCursor(items[1].firstChild, 0);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const event = new KeyboardEvent('keydown', {
|
|
316
|
+
key: '2',
|
|
317
|
+
code: 'Digit2',
|
|
318
|
+
ctrlKey: true,
|
|
319
|
+
bubbles: true,
|
|
320
|
+
cancelable: true,
|
|
321
|
+
});
|
|
322
|
+
markdownEditor.onKeyDown(event);
|
|
323
|
+
|
|
324
|
+
// Should split the list and convert only second item
|
|
325
|
+
const html = editor.getHtml();
|
|
326
|
+
expect(html).toContain('<ul><li>First</li></ul>');
|
|
327
|
+
expect(html).toContain('<h2>Second</h2>');
|
|
328
|
+
expect(html).toContain('<ul><li>Third</li></ul>');
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
});
|