Kaynağa Gözat

MentionUI will be shown when marker is typed after a soft break.

Maciej Gołaszewski 6 yıl önce
ebeveyn
işleme
e6e08840c3

+ 14 - 4
packages/ckeditor5-mention/src/textwatcher.js

@@ -114,16 +114,17 @@ export default class TextWatcher {
 	 */
 	_getText() {
 		const editor = this.editor;
-		const selection = editor.model.document.selection;
+		const model = editor.model;
+		const selection = model.document.selection;
 
 		// Do nothing if selection is not collapsed.
 		if ( !selection.isCollapsed ) {
 			return;
 		}
 
-		const block = selection.focus.parent;
+		const rangeBeforeSelection = model.createRange( model.createPositionAt( selection.focus.parent, 0 ), selection.focus );
 
-		return _getText( editor.model.createRangeIn( block ) ).slice( 0, selection.focus.offset );
+		return _getText( rangeBeforeSelection );
 	}
 }
 
@@ -135,7 +136,16 @@ export default class TextWatcher {
  * @returns {String}
  */
 export function _getText( range ) {
-	return Array.from( range.getItems() ).reduce( ( a, b ) => a + b.data, '' );
+	const rangeText = Array.from( range.getItems() ).reduce( ( rangeText, node ) => {
+		if ( node.is( 'softBreak' ) ) {
+			// Trim text to softBreak
+			return '';
+		}
+
+		return rangeText + node.data;
+	}, '' );
+
+	return rangeText;
 }
 
 mix( TextWatcher, EmitterMixin );

+ 32 - 0
packages/ckeditor5-mention/tests/mentionui.js

@@ -470,6 +470,38 @@ describe( 'MentionUI', () => {
 					} );
 			} );
 
+			it( 'should show panel for matched marker after a <softBreak>', () => {
+				model.schema.register( 'softBreak', {
+					allowWhere: '$text',
+					isInline: true
+				} );
+
+				editor.conversion.for( 'upcast' )
+					.elementToElement( {
+						model: 'softBreak',
+						view: 'br'
+					} );
+
+				editor.conversion.for( 'downcast' )
+					.elementToElement( {
+						model: 'softBreak',
+						view: ( modelElement, viewWriter ) => viewWriter.createEmptyElement( 'br' )
+					} );
+
+				setData( model, '<paragraph>abc<softBreak></softBreak>[] foo</paragraph>' );
+
+				model.change( writer => {
+					writer.insertText( '@', doc.selection.getFirstPosition() );
+				} );
+
+				return waitForDebounce()
+					.then( () => {
+						expect( panelView.isVisible ).to.be.true;
+						expect( editor.model.markers.has( 'mention' ) ).to.be.true;
+						expect( mentionsView.items ).to.have.length( 5 );
+					} );
+			} );
+
 			it( 'should not show panel for marker in the middle of other word', () => {
 				setData( model, '<paragraph>foo[]</paragraph>' );