@@ -125,71 +125,134 @@ describe('findNotEmptyContentPosses', () => {
125
125
} ) ;
126
126
127
127
describe ( 'trimContent' , ( ) => {
128
- it ( 'removes empty list items at the start and end of a bullet list' , ( ) => {
129
- const fragment = doc ( ul ( li ( ) , li ( p ( '11' ) ) , li ( p ( '22' ) ) , li ( ) ) ) . content ;
128
+ describe ( 'should trim empty list items at both ends' , ( ) => {
129
+ it ( 'of bullet list' , ( ) => {
130
+ const fragment = doc ( ul ( li ( ) , li ( p ( '11' ) ) , li ( p ( '22' ) ) , li ( ) ) ) . content ;
131
+
132
+ const trimmedFragment = trimContent ( fragment ) ;
133
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
134
+ doc ( ul ( li ( p ( '11' ) ) , li ( p ( '22' ) ) ) ) ,
135
+ ) ;
136
+ } ) ;
137
+
138
+ it ( 'of bullet list with nested list' , ( ) => {
139
+ const fragment = doc (
140
+ ul ( li ( ) , li ( p ( 'Outer item' ) , ul ( li ( p ( 'Nested item' ) ) ) ) , li ( ) ) ,
141
+ ) . content ;
142
+
143
+ const trimmedFragment = trimContent ( fragment ) ;
144
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
145
+ doc ( ul ( li ( p ( 'Outer item' ) , ul ( li ( p ( 'Nested item' ) ) ) ) ) ) ,
146
+ ) ;
147
+ } ) ;
148
+
149
+ it ( 'of ordered list' , ( ) => {
150
+ const fragment = doc ( ol ( li ( ) , li ( p ( '11' ) ) , li ( p ( '22' ) ) , li ( ) ) ) . content ;
151
+
152
+ const trimmedFragment = trimContent ( fragment ) ;
153
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
154
+ doc ( ol ( li ( p ( '11' ) ) , li ( p ( '22' ) ) ) ) ,
155
+ ) ;
156
+ } ) ;
157
+
158
+ it ( 'of bullet list with nested list' , ( ) => {
159
+ const fragment = doc ( ul ( li ( ) , li ( ul ( li ( ul ( li ( ul ( li ( p ( 'Deep' ) ) ) ) ) ) ) , li ( ) ) ) ) . content ;
160
+ const trimmedFragment = trimContent ( fragment ) ;
161
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
162
+ doc ( ul ( li ( ul ( li ( ul ( li ( ul ( li ( p ( 'Deep' ) ) ) ) ) ) ) ) ) ) ,
163
+ ) ;
164
+ } ) ;
165
+
166
+ it ( 'of mixed lists' , ( ) => {
167
+ const fragment = doc (
168
+ ul ( li ( ) , li ( p ( '11' ) ) , li ( ) , li ( p ( '22' ) ) , li ( ) ) ,
169
+ ol ( li ( ) , li ( p ( 'aaa' ) ) , li ( p ( 'bbb' ) ) , li ( ) ) ,
170
+ ) . content ;
171
+
172
+ const trimmedFragment = trimContent ( fragment ) ;
173
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
174
+ doc ( ul ( li ( p ( '11' ) ) , li ( ) , li ( p ( '22' ) ) , li ( ) ) , ol ( li ( ) , li ( p ( 'aaa' ) ) , li ( p ( 'bbb' ) ) ) ) ,
175
+ ) ;
176
+ } ) ;
177
+ } ) ;
130
178
131
- const trimmedFragment = trimContent ( fragment ) ;
132
- expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
133
- doc ( ul ( li ( p ( '11' ) ) , li ( p ( '22' ) ) ) ) ,
134
- ) ;
179
+ describe ( 'should preserve empty list items' , ( ) => {
180
+ it ( 'in the middle of bullet list' , ( ) => {
181
+ const fragment = doc ( ul ( li ( ) , li ( p ( '11' ) ) , li ( ) , li ( p ( '22' ) ) , li ( ) ) ) . content ;
182
+
183
+ const trimmedFragment = trimContent ( fragment ) ;
184
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
185
+ doc ( ul ( li ( p ( '11' ) ) , li ( ) , li ( p ( '22' ) ) ) ) ,
186
+ ) ;
187
+ } ) ;
188
+
189
+ it ( 'in the middle of bullet list with nested list' , ( ) => {
190
+ const fragment = doc (
191
+ ul ( li ( ul ( li ( p ( 'Begin' ) ) , li ( ) ) ) , li ( ul ( li ( ) , li ( p ( 'End' ) ) ) ) ) ,
192
+ ) . content ;
193
+ const trimmedFragment = trimContent ( fragment ) ;
194
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
195
+ doc ( ul ( li ( ul ( li ( p ( 'Begin' ) ) , li ( ) ) ) , li ( ul ( li ( ) , li ( p ( 'End' ) ) ) ) ) ) ,
196
+ ) ;
197
+ } ) ;
198
+
199
+ it ( 'in the middle and end of bullet list' , ( ) => {
200
+ const fragment = doc (
201
+ p ( 'Some text' ) ,
202
+ ul ( li ( ) , li ( p ( '11' ) ) , li ( p ( '22' ) ) , li ( ) ) ,
203
+ p ( 'More text' ) ,
204
+ ) . content ;
205
+
206
+ const trimmedFragment = trimContent ( fragment ) ;
207
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
208
+ doc ( p ( 'Some text' ) , ul ( li ( ) , li ( p ( '11' ) ) , li ( p ( '22' ) ) , li ( ) ) , p ( 'More text' ) ) ,
209
+ ) ;
210
+ } ) ;
135
211
} ) ;
136
212
137
- it ( 'removes empty list items at the start and end of an ordered list' , ( ) => {
138
- const fragment = doc ( ol ( li ( ) , li ( p ( '11' ) ) , li ( p ( '22' ) ) , li ( ) ) ) . content ;
213
+ it ( 'should trim empty items at boundaries of multi-level nested lists' , ( ) => {
214
+ const fragment = doc (
215
+ ul (
216
+ li ( ) ,
217
+ li (
218
+ p ( 'Level 1' ) ,
219
+ ul ( li ( ) , li ( p ( 'Level 2' ) , ul ( li ( ) , li ( p ( 'Level 3' ) ) , li ( ) ) ) , li ( ) ) ,
220
+ ) ,
221
+ li ( ) ,
222
+ ) ,
223
+ ) . content ;
139
224
140
225
const trimmedFragment = trimContent ( fragment ) ;
141
226
expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
142
- doc ( ol ( li ( p ( '11' ) ) , li ( p ( '22' ) ) ) ) ,
227
+ doc ( ul ( li ( p ( 'Level 1' ) , ul ( li ( ) , li ( p ( 'Level 2' ) , ul ( li ( ) , li ( p ( 'Level 3' ) ) ) ) ) ) ) ) ,
143
228
) ;
144
229
} ) ;
145
-
146
- it ( 'removes only empty list items at the start and end, keeping empty ones in the middle' , ( ) => {
147
- const fragment = doc ( ul ( li ( ) , li ( p ( '11' ) ) , li ( ) , li ( p ( '22' ) ) , li ( ) ) ) . content ;
230
+ it ( 'should preserve only nested not-empty content' , ( ) => {
231
+ const fragment = doc ( ul ( li ( ) , li ( ul ( li ( ) , li ( p ( 'Nested content' ) ) , li ( ) ) ) , li ( ) ) ) . content ;
148
232
149
233
const trimmedFragment = trimContent ( fragment ) ;
150
234
expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
151
- doc ( ul ( li ( p ( '11' ) ) , li ( ) , li ( p ( '22' ) ) ) ) ,
235
+ doc ( ul ( li ( ul ( li ( p ( 'Nested content' ) ) ) ) ) ) ,
152
236
) ;
153
237
} ) ;
154
-
155
- it ( 'does not modify a list with no empty items' , ( ) => {
156
- const fragment = doc ( ul ( li ( p ( '11' ) ) , li ( p ( '22' ) ) ) ) . content ;
157
-
238
+ it ( 'should remove list items containing only whitespace' , ( ) => {
239
+ const fragment = doc ( ul ( li ( p ( ' ' ) ) , li ( p ( '111' ) ) , li ( p ( '\t\n' ) ) ) ) . content ;
158
240
const trimmedFragment = trimContent ( fragment ) ;
159
- expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
160
- doc ( ul ( li ( p ( '11' ) ) , li ( p ( '22' ) ) ) ) ,
161
- ) ;
241
+ expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode ( doc ( ul ( li ( p ( '111' ) ) ) ) ) ;
162
242
} ) ;
163
243
164
- it ( 'trims a list to one empty list item if it contains only empty list items ' , ( ) => {
244
+ it ( 'should return empty fragment when all list items are empty' , ( ) => {
165
245
const fragment = doc ( ul ( li ( ) , li ( ) , li ( ) ) ) . content ;
166
246
167
247
const trimmedFragment = trimContent ( fragment ) ;
168
248
expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode ( doc ( ) ) ;
169
249
} ) ;
170
-
171
- it ( 'correctly handles multiple lists in a single fragment' , ( ) => {
172
- const fragment = doc (
173
- ul ( li ( ) , li ( p ( '11' ) ) , li ( ) , li ( p ( '22' ) ) , li ( ) ) ,
174
- ol ( li ( ) , li ( p ( 'A' ) ) , li ( p ( 'B' ) ) , li ( ) ) ,
175
- ) . content ;
176
-
177
- const trimmedFragment = trimContent ( fragment ) ;
178
- expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
179
- doc ( ul ( li ( p ( '11' ) ) , li ( ) , li ( p ( '22' ) ) , li ( ) ) , ol ( li ( ) , li ( p ( 'A' ) ) , li ( p ( 'B' ) ) ) ) ,
180
- ) ;
181
- } ) ;
182
-
183
- it ( 'does not modify paragraphs and other nodes outside lists' , ( ) => {
184
- const fragment = doc (
185
- p ( 'Some text' ) ,
186
- ul ( li ( ) , li ( p ( '11' ) ) , li ( p ( '22' ) ) , li ( ) ) ,
187
- p ( 'More text' ) ,
188
- ) . content ;
250
+ it ( 'should not modify lists without empty items' , ( ) => {
251
+ const fragment = doc ( ul ( li ( p ( '11' ) ) , li ( p ( '22' ) ) ) ) . content ;
189
252
190
253
const trimmedFragment = trimContent ( fragment ) ;
191
254
expect ( schema . nodes . doc . create ( null , trimmedFragment ) ) . toMatchNode (
192
- doc ( p ( 'Some text' ) , ul ( li ( ) , li ( p ( '11' ) ) , li ( p ( '22' ) ) , li ( ) ) , p ( 'More text' ) ) ,
255
+ doc ( ul ( li ( p ( '11' ) ) , li ( p ( '22' ) ) ) ) ,
193
256
) ;
194
257
} ) ;
195
258
} ) ;
0 commit comments