Browse Source

Added Position and Range handling to stringify view util function.

Szymon Kupś 9 years ago
parent
commit
0c01f41a28

+ 15 - 0
packages/ckeditor5-engine/tests/_utils-tests/view.js

@@ -7,6 +7,7 @@
 
 import { stringify, parse } from '/tests/engine/_utils/view.js';
 import DocumentFragment from '/ckeditor5/engine/treeview/documentfragment.js';
+import Position from '/ckeditor5/engine/treeview/position.js';
 import Element from '/ckeditor5/engine/treeview/element.js';
 import AttributeElement from '/ckeditor5/engine/treeview/attributeelement.js';
 import ContainerElement from '/ckeditor5/engine/treeview/containerelement.js';
@@ -179,6 +180,20 @@ describe( 'view test utils', () => {
 
 			expect( stringify( p, selection ) ).to.equal( '<p>[<b>foobar</b>][]{baz}{q}ux</p>' );
 		} );
+
+		it( 'should use Position instance instead of Selection', () => {
+			const text = new Text( 'foobar' );
+			const position = new Position( text, 3 );
+			const string = stringify( text, position );
+			expect( string ).to.equal( 'foo{}bar' );
+		} );
+
+		it( 'should use Range instance instead of Selection', () => {
+			const text = new Text( 'foobar' );
+			const range = Range.createFromParentsAndOffsets( text, 3, text, 4 );
+			const string = stringify( text, range );
+			expect( string ).to.equal( 'foo{b}ar' );
+		} );
 	} );
 
 	describe( 'parse', () => {

+ 17 - 3
packages/ckeditor5-engine/tests/_utils/view.js

@@ -86,8 +86,10 @@ const TEXT_RANGE_END_TOKEN = '}';
  *		getData( attribute, null, { showPriority: true } ); // <b:20></b:20>
  *
  * @param {engine.treeView.Text|engine.treeView.Element|engine.treeView.DocumentFragment} node Node to stringify.
- * @param {engine.treeView.Selection} [selection = null ] Selection instance which ranges will be included in returned
- * string data.
+ * @param {engine.treeView.Selection|engine.treeView.Position|engine.treeView.Range} [selectionOrPositionOrRange = null ]
+ * Selection instance which ranges will be included in returned string data. If Range instance is provided - it will be
+ * converted to selection containing this range. If Position instance is provided - it will be converted to selection
+ * containing one range collapsed at this position.
  * @param {Object} [options] Object with additional options.
  * @param {Boolean} [options.showType=false] When set to `true` type of elements will be printed (`<container:p>`
  * instead of `<p>` and `<attribute:b>` instead of `<b>`).
@@ -95,7 +97,19 @@ const TEXT_RANGE_END_TOKEN = '}';
  * (`<span:12>`, `<b:10>`).
  * @returns {String} HTML-like string representing the view.
  */
-export function stringify( node, selection = null, options = {} ) {
+export function stringify( node, selectionOrPositionOrRange = null, options = {} ) {
+	let selection;
+
+	if ( selectionOrPositionOrRange instanceof Position ) {
+		selection = new Selection();
+		selection.addRange( new Range( selectionOrPositionOrRange, selectionOrPositionOrRange ) );
+	} else if ( selectionOrPositionOrRange instanceof Range ) {
+		selection = new Selection( );
+		selection.addRange( selectionOrPositionOrRange );
+	} else {
+		selection = selectionOrPositionOrRange;
+	}
+
 	const viewStringify = new ViewStringify( node, selection, options );
 
 	return viewStringify.stringify();