@@ -14,9 +14,11 @@ import {
1414import {
1515 assertHTML ,
1616 assertSelection ,
17+ click ,
1718 focusEditor ,
1819 html ,
1920 initialize ,
21+ pasteFromClipboard ,
2022 pressToggleBold ,
2123 repeat ,
2224 test ,
@@ -383,4 +385,119 @@ test.describe('Hashtags', () => {
383385 ` ,
384386 ) ;
385387 } ) ;
388+
389+ test ( 'Can handle hashtags following multiple invalid hashtags' , async ( {
390+ page,
391+ } ) => {
392+ await focusEditor ( page ) ;
393+ await page . keyboard . type ( '#hello' ) ;
394+
395+ await page . keyboard . press ( 'Space' ) ;
396+
397+ await page . keyboard . type ( '#world' ) ;
398+ await page . keyboard . type ( '#invalid' ) ;
399+ await page . keyboard . type ( '#invalid' ) ;
400+ await page . keyboard . type ( '#invalid' ) ;
401+
402+ await page . keyboard . press ( 'Space' ) ;
403+
404+ await page . keyboard . type ( '#valid' ) ;
405+
406+ await page . keyboard . press ( 'Space' ) ;
407+
408+ await page . keyboard . type ( '#valid' ) ;
409+ await page . keyboard . type ( '#invalid' ) ;
410+
411+ await page . keyboard . press ( 'Space' ) ;
412+ await page . keyboard . type ( '#valid' ) ;
413+
414+ await waitForSelector ( page , '.PlaygroundEditorTheme__hashtag' ) ;
415+
416+ await assertHTML (
417+ page ,
418+ html `
419+ < p
420+ class ="PlaygroundEditorTheme__paragraph PlaygroundEditorTheme__ltr "
421+ dir ="ltr ">
422+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
423+ #hello
424+ </ span >
425+ < span data-lexical-text ="true "> </ span >
426+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
427+ #world
428+ </ span >
429+ < span data-lexical-text ="true "> #invalid#invalid#invalid</ span >
430+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
431+ #valid
432+ </ span >
433+ < span data-lexical-text ="true "> </ span >
434+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
435+ #valid
436+ </ span >
437+ < span data-lexical-text ="true "> #invalid</ span >
438+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
439+ #valid
440+ </ span >
441+ </ p >
442+ ` ,
443+ ) ;
444+ } ) ;
445+
446+ test ( 'Should not break when pasting multiple matches' , async ( {
447+ page,
448+ isPlainText,
449+ } ) => {
450+ test . skip ( isPlainText ) ;
451+
452+ await focusEditor ( page ) ;
453+
454+ const clipboard = { 'text/html' : '#hello#world' } ;
455+ await pasteFromClipboard ( page , clipboard ) ;
456+
457+ await assertHTML (
458+ page ,
459+ html `
460+ < p
461+ class ="PlaygroundEditorTheme__paragraph PlaygroundEditorTheme__ltr "
462+ dir ="ltr ">
463+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
464+ #hello
465+ </ span >
466+ < span data-lexical-text ="true "> #world</ span >
467+ </ p >
468+ ` ,
469+ ) ;
470+ } ) ;
471+
472+ test ( 'Should not break while importing and exporting multiple matches' , async ( {
473+ page,
474+ } ) => {
475+ await focusEditor ( page ) ;
476+ await page . keyboard . type ( '```markdown #hello#invalid #a #b' ) ;
477+
478+ await click ( page , '.action-button .markdown' ) ;
479+ await click ( page , '.action-button .markdown' ) ;
480+ await click ( page , '.action-button .markdown' ) ;
481+
482+ await assertHTML (
483+ page ,
484+ html `
485+ < p
486+ class ="PlaygroundEditorTheme__paragraph PlaygroundEditorTheme__ltr "
487+ dir ="ltr ">
488+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
489+ #hello
490+ </ span >
491+ < span data-lexical-text ="true "> #invalid</ span >
492+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
493+ #a
494+ </ span >
495+ < span data-lexical-text ="true "> </ span >
496+ < span class ="PlaygroundEditorTheme__hashtag " data-lexical-text ="true ">
497+ #b
498+ </ span >
499+ </ p >
500+ ` ,
501+ ) ;
502+ } ) ;
386503} ) ;
0 commit comments