8
0
Piotr Jasiun 10 жил өмнө
parent
commit
2295d38859

+ 1 - 0
packages/ckeditor5-engine/src/treeview/node.js

@@ -71,6 +71,7 @@ CKEDITOR.define( [ 'treeview/Renderer', 'ckeditorerror' ], ( Renderer, CKEditorE
 
 	Node.ATTRIBUTES_NEED_UPDATE = Renderer.ATTRIBUTES_NEED_UPDATE;
 	Node.CHILDREN_NEED_UPDATE = Renderer.CHILDREN_NEED_UPDATE;
+	Node.TEXT_NEEDS_UPDATE = Renderer.TEXT_NEEDS_UPDATE;
 
 	return Node;
 } );

+ 19 - 0
packages/ckeditor5-engine/src/treeview/renderer.js

@@ -12,6 +12,7 @@ CKEDITOR.define( [
 ], ( diff, ViewElement, ViewText ) => {
 	const ATTRIBUTES_NEED_UPDATE = 0;
 	const CHILDREN_NEED_UPDATE = 1;
+	const TEXT_NEEDS_UPDATE = 2;
 
 	class Renderer {
 		constructor( treeView ) {
@@ -21,6 +22,7 @@ CKEDITOR.define( [
 
 			this.markedAttrs = new Set();
 			this.markedChildren = new Set();
+			this.markedTexts = new Set();
 		}
 
 		markToSync( node, type ) {
@@ -28,12 +30,20 @@ CKEDITOR.define( [
 				this.markedAttrs.push( node );
 			} else if ( type === CHILDREN_NEED_UPDATE ) {
 				this.markedChildren.push( node );
+			} else if ( type === TEXT_NEEDS_UPDATE ) {
+				this.markedTexts.push( node );
 			}
 		}
 
 		render() {
 			const domDocument = this.domRoot.ownerDocument;
 
+			for ( let node of this.markedTexts ) {
+				if ( !this.markedChildren.has( node.parent ) && node.parent.domElement ) {
+					updateText( node );
+				}
+			}
+
 			for ( let element of this.markedAttrs ) {
 				updateAttrs( element );
 			}
@@ -42,6 +52,14 @@ CKEDITOR.define( [
 				updateChildren( element );
 			}
 
+			function updateText( viewText ) {
+				const domText = viewText.getDomNode();
+
+				if ( domText.data != viewText.getText() ) {
+					domText.data = viewText.getText();
+				}
+			}
+
 			function updateAttrs( viewElement ) {
 				const domElement = viewElement.domElement;
 				const domAttrKeys = domElement.attributes;
@@ -122,6 +140,7 @@ CKEDITOR.define( [
 
 	Renderer.ATTRIBUTES_NEED_UPDATE = ATTRIBUTES_NEED_UPDATE;
 	Renderer.CHILDREN_NEED_UPDATE = CHILDREN_NEED_UPDATE;
+	Renderer.TEXT_NEEDS_UPDATE = TEXT_NEEDS_UPDATE;
 
 	return Renderer;
 } );

+ 40 - 2
packages/ckeditor5-engine/src/treeview/text.js

@@ -5,7 +5,7 @@
 
 'use strict';
 
-CKEDITOR.define( [], () => {
+CKEDITOR.define( [ 'treeview/Node', 'treeview/Element' ], ( Node, Element ) => {
 	class Text extends Node {
 		constructor( text ) {
 			this._text = text;
@@ -16,10 +16,48 @@ CKEDITOR.define( [], () => {
 		}
 
 		setText( text ) {
-			this.parent.markToSync( Node.CHILDREN_NEED_UPDATE );
+			this.markToSync( Node.TEXT_NEEDS_UPDATE );
 
 			this._text = text;
 		}
+
+		getDomText() {
+			const previousSibling = this.getPreviousSibling();
+
+			if ( previousSibling && previousSibling.domElement ) {
+				return previousSibling.domElement.nextSibling;
+			}
+
+			if ( !previousSibling && this.parent.domElement ) {
+				return this.parent.domElement.childNodes[ 0 ];
+			}
+
+			return null;
+		}
+
+		static getCorespondingText( domText ) {
+			const previousSibling = domText.previousSibling;
+
+			if ( previousSibling ) {
+				const viewElement = Element.getCorespondingElement( previousSibling );
+
+				if ( viewElement ) {
+					return viewElement.getNextSibling;
+				}
+			} else {
+				const viewElement = Element.getCorespondingElement( this.parent );
+
+				if ( viewElement ) {
+					return viewElement.getChild[ 0 ];
+				}
+			}
+
+			if ( !previousSibling && this.parent.domElement ) {
+				return this.parent.domElement.childNodes[ 0 ];
+			}
+
+			return null;
+		}
 	}
 
 	return Text;