Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit 00dd70c

Browse files
authored
Merge pull request #1574 from ckeditor/t/1554
Feature: The `model.insertContent()` method will accept offset parameter. Made `Position.createAt()` require the `offset` when the first parameter is an model/view item. See breaking changes. Closes #1554. BREAKING CHANGE: The `offset` parameter of the following methods does not default to `0` and hence is no longer optional when `itemOrPosition` is a model/view item: * `model.Position.createAt()` * `model.Range.createCollapsedAt()` * `model.Selection#setFocus()` * `model.Writer#insert()` * `model.Writer#insertText()` * `model.Writer#insertElement()` * `model.Writer#move()` * `model.Writer#setSelectionFocus()` * `view.Writer#setSelectionFocus()` * `view.Position.createAt()` * `view.Range.createCollapsedAt()` * `view.Selection#setFocus()`
2 parents 80392ad + 0dca79e commit 00dd70c

31 files changed

+181
-115
lines changed

src/controller/datacontroller.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ export default class DataController {
201201
const modelRoot = this.model.document.getRoot( rootName );
202202

203203
this.model.enqueueChange( 'transparent', writer => {
204-
writer.insert( this.parse( data, modelRoot ), modelRoot );
204+
writer.insert( this.parse( data, modelRoot ), modelRoot, 0 );
205205
} );
206206

207207
return Promise.resolve();
@@ -228,7 +228,7 @@ export default class DataController {
228228
writer.removeSelectionAttribute( this.model.document.selection.getAttributeKeys() );
229229

230230
writer.remove( ModelRange.createIn( modelRoot ) );
231-
writer.insert( this.parse( data, modelRoot ), modelRoot );
231+
writer.insert( this.parse( data, modelRoot ), modelRoot, 0 );
232232
} );
233233
}
234234

src/conversion/upcast-converters.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ function _prepareToElementConverter( config ) {
358358
conversionApi.writer.insert( modelElement, splitResult.position );
359359

360360
// Convert children and insert to element.
361-
const childrenResult = conversionApi.convertChildren( data.viewItem, ModelPosition.createAt( modelElement ) );
361+
const childrenResult = conversionApi.convertChildren( data.viewItem, ModelPosition.createAt( modelElement, 0 ) );
362362

363363
// Consume appropriate value from consumable values list.
364364
conversionApi.consumable.consume( data.viewItem, match.match );
@@ -380,7 +380,7 @@ function _prepareToElementConverter( config ) {
380380
// before: <allowed><notAllowed>[]</notAllowed></allowed>
381381
// after: <allowed><notAllowed></notAllowed><converted></converted><notAllowed>[]</notAllowed></allowed>
382382
if ( splitResult.cursorParent ) {
383-
data.modelCursor = ModelPosition.createAt( splitResult.cursorParent );
383+
data.modelCursor = ModelPosition.createAt( splitResult.cursorParent, 0 );
384384

385385
// Otherwise just continue after inserted element.
386386
} else {

src/conversion/upcastdispatcher.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ import mix from '@ckeditor/ckeditor5-utils/src/mix';
7171
* conversionApi.writer.insert( paragraph, splitResult.position );
7272
*
7373
* // Convert children to paragraph.
74-
* const { modelRange } = conversionApi.convertChildren( data.viewItem, Position.createAt( paragraph ) );
74+
* const { modelRange } = conversionApi.convertChildren( data.viewItem, Position.createAt( paragraph, 0 ) );
7575
*
7676
* // Set as conversion result, attribute converters may use this property.
7777
* data.modelRange = new Range( Position.createBefore( paragraph ), modelRange.end );
@@ -419,7 +419,7 @@ function createContextTree( contextDefinition, writer ) {
419419
writer.append( current, position );
420420
}
421421

422-
position = ModelPosition.createAt( current );
422+
position = ModelPosition.createAt( current, 0 );
423423
}
424424

425425
return position;

src/dev-utils/model.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ function convertToModelElement() {
391391

392392
conversionApi.mapper.bindElements( element, data.viewItem );
393393

394-
conversionApi.convertChildren( data.viewItem, ModelPosition.createAt( element ) );
394+
conversionApi.convertChildren( data.viewItem, ModelPosition.createAt( element, 0 ) );
395395

396396
data.modelRange = ModelRange.createOn( element );
397397
data.modelCursor = data.modelRange.end;

src/model/model.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,9 @@ export default class Model {
307307
*
308308
* // Insert text at given position - document selection will not be modified.
309309
* editor.model.change( writer => {
310+
* editor.model.insertContent( writer.createText( 'x' ), doc.getRoot(), 2 );
311+
*
312+
* // Which is a shorthand for:
310313
* editor.model.insertContent( writer.createText( 'x' ), Position.createAt( doc.getRoot(), 2 ) );
311314
* } );
312315
*
@@ -327,12 +330,14 @@ export default class Model {
327330
* @fires insertContent
328331
* @param {module:engine/model/documentfragment~DocumentFragment|module:engine/model/item~Item} content The content to insert.
329332
* @param {module:engine/model/selection~Selection|module:engine/model/documentselection~DocumentSelection|
330-
* module:engine/model/position~Position|module:engine/model/element~Element|
333+
* module:engine/model/position~Position|module:engine/model/item~Item|
331334
* Iterable.<module:engine/model/range~Range>|module:engine/model/range~Range|null} [selectable=model.document.selection]
332335
* Selection into which the content should be inserted. If not provided the current model document selection will be used.
336+
* @param {Number|'before'|'end'|'after'|'on'|'in'} [placeOrOffset] To be used when a model item was passed as `selectable`.
337+
* This param defines a position in relation to that item.
333338
*/
334-
insertContent( content, selectable ) {
335-
insertContent( this, content, selectable );
339+
insertContent( content, selectable, placeOrOffset ) {
340+
insertContent( this, content, selectable, placeOrOffset );
336341
}
337342

338343
/**

src/model/position.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ export default class Position {
816816
* * {@link module:engine/model/position~Position.createFromPosition}.
817817
*
818818
* @param {module:engine/model/item~Item|module:engine/model/position~Position} itemOrPosition
819-
* @param {Number|'end'|'before'|'after'} [offset=0] Offset or one of the flags. Used only when
819+
* @param {Number|'end'|'before'|'after'} [offset] Offset or one of the flags. Used only when
820820
* first parameter is a {@link module:engine/model/item~Item model item}.
821821
*/
822822
static createAt( itemOrPosition, offset ) {
@@ -831,8 +831,16 @@ export default class Position {
831831
return this.createBefore( node );
832832
} else if ( offset == 'after' ) {
833833
return this.createAfter( node );
834-
} else if ( !offset ) {
835-
offset = 0;
834+
} else if ( offset !== 0 && !offset ) {
835+
/**
836+
* {@link module:engine/model/position~Position.createAt `Position.createAt()`}
837+
* requires the offset to be specified when the first parameter is a model item.
838+
*
839+
* @error model-position-createAt-offset-required
840+
*/
841+
throw new CKEditorError(
842+
'model-position-createAt-offset-required: ' +
843+
'Position.createAt() requires the offset when the first parameter is a model item.' );
836844
}
837845

838846
return this.createFromParentAndOffset( node, offset );

src/model/range.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,7 @@ export default class Range {
835835
* or on the given {@link module:engine/model/item~Item item}.
836836
*
837837
* @param {module:engine/model/item~Item|module:engine/model/position~Position} itemOrPosition
838-
* @param {Number|'end'|'before'|'after'} [offset=0] Offset or one of the flags. Used only when
838+
* @param {Number|'end'|'before'|'after'} [offset] Offset or one of the flags. Used only when
839839
* first parameter is a {@link module:engine/model/item~Item model item}.
840840
*/
841841
static createCollapsedAt( itemOrPosition, offset ) {

src/model/schema.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1162,7 +1162,7 @@ export class SchemaContext {
11621162
* schema.checkChild( contextDefinition, childToCheck );
11631163
*
11641164
* // Also check in [ rootElement, blockQuoteElement, paragraphElement ].
1165-
* schema.checkChild( Position.createAt( paragraphElement ), 'foo' );
1165+
* schema.checkChild( Position.createAt( paragraphElement, 0 ), 'foo' );
11661166
*
11671167
* // Check in [ rootElement, paragraphElement ].
11681168
* schema.checkChild( [ rootElement, paragraphElement ], 'foo' );

src/model/selection.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ export default class Selection {
485485
*
486486
* @fires change:range
487487
* @param {module:engine/model/item~Item|module:engine/model/position~Position} itemOrPosition
488-
* @param {Number|'end'|'before'|'after'} [offset=0] Offset or one of the flags. Used only when
488+
* @param {Number|'end'|'before'|'after'} [offset] Offset or one of the flags. Used only when
489489
* first parameter is a {@link module:engine/model/item~Item model item}.
490490
*/
491491
setFocus( itemOrPosition, offset ) {
@@ -665,7 +665,7 @@ export default class Selection {
665665
const endBlock = getParentBlock( range.end, visited );
666666

667667
// #984. Don't return the end block if the range ends right at its beginning.
668-
if ( endBlock && !range.end.isTouching( Position.createAt( endBlock ) ) ) {
668+
if ( endBlock && !range.end.isTouching( Position.createAt( endBlock, 0 ) ) ) {
669669
yield endBlock;
670670
}
671671
}
@@ -683,7 +683,7 @@ export default class Selection {
683683
* @returns {Boolean}
684684
*/
685685
containsEntireContent( element = this.anchor.root ) {
686-
const limitStartPosition = Position.createAt( element );
686+
const limitStartPosition = Position.createAt( element, 0 );
687687
const limitEndPosition = Position.createAt( element, 'end' );
688688

689689
return limitStartPosition.isTouching( this.getFirstPosition() ) &&

src/model/utils/deletecontent.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ function replaceEntireContentWithParagraph( writer, selection ) {
208208
const limitElement = writer.model.schema.getLimitElement( selection );
209209

210210
writer.remove( Range.createIn( limitElement ) );
211-
insertParagraph( writer, Position.createAt( limitElement ), selection );
211+
insertParagraph( writer, Position.createAt( limitElement, 0 ), selection );
212212
}
213213

214214
// We want to replace the entire content with a paragraph when:

0 commit comments

Comments
 (0)