|
|
@@ -8,7 +8,7 @@
|
|
|
CKEDITOR.define( [
|
|
|
'document/deltas/delta',
|
|
|
'document/deltas/register',
|
|
|
- 'document/operations/changeoperation',
|
|
|
+ 'document/operation/changeoperation',
|
|
|
'document/range',
|
|
|
'document/attribute'
|
|
|
], ( Delta, register, ChangeOperation, Range, Attribute ) => {
|
|
|
@@ -17,8 +17,13 @@ CKEDITOR.define( [
|
|
|
*/
|
|
|
class ChangeDelta extends Delta {}
|
|
|
|
|
|
- register( 'setAttr', ( doc, transaction, key, value, range ) => {
|
|
|
- var ops = [];
|
|
|
+ register( 'setAttr', change );
|
|
|
+
|
|
|
+ register( 'removeAttr', ( doc, transaction, key, range ) => {
|
|
|
+ change( doc, transaction, key, null, range );
|
|
|
+ } );
|
|
|
+
|
|
|
+ function change( doc, transaction, key, value, range ) {
|
|
|
var lastSplitPosition = range.start;
|
|
|
|
|
|
var position;
|
|
|
@@ -28,17 +33,14 @@ CKEDITOR.define( [
|
|
|
var iterator = range[ Symbol.iterator ]();
|
|
|
var next = iterator.next();
|
|
|
|
|
|
+ var delta = new ChangeDelta();
|
|
|
+
|
|
|
while ( !next.done ) {
|
|
|
valueAfter = next.value.node.getAttr( key );
|
|
|
|
|
|
if ( position && valueBefore != valueAfter ) {
|
|
|
if ( valueBefore != value ) {
|
|
|
- ops.push( new ChangeOperation(
|
|
|
- new Range( lastSplitPosition, position ),
|
|
|
- valueBefore ? new Attribute( key, valueBefore ) : null,
|
|
|
- new Attribute( key, value ),
|
|
|
- doc.version + ops.length
|
|
|
- ) );
|
|
|
+ split();
|
|
|
}
|
|
|
|
|
|
lastSplitPosition = position;
|
|
|
@@ -51,22 +53,22 @@ CKEDITOR.define( [
|
|
|
}
|
|
|
|
|
|
if ( position != lastSplitPosition && valueBefore != value ) {
|
|
|
- ops.push( new ChangeOperation(
|
|
|
- new Range( lastSplitPosition, position ),
|
|
|
- valueBefore ? new Attribute( key, valueBefore ) : null,
|
|
|
- new Attribute( key, value ),
|
|
|
- doc.version + ops.length
|
|
|
- ) );
|
|
|
+ split();
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- return new ChangeDelta( transaction, ops );
|
|
|
- } );
|
|
|
-
|
|
|
- register( 'removeAttr', ( doc, transaction, key, range ) => {
|
|
|
- return new ChangeDelta( transaction, {} );
|
|
|
- } );
|
|
|
+ transaction.addDelta( delta );
|
|
|
+
|
|
|
+ function split() {
|
|
|
+ var operation = new ChangeOperation(
|
|
|
+ new Range( lastSplitPosition, position ),
|
|
|
+ valueBefore ? new Attribute( key, valueBefore ) : null,
|
|
|
+ value ? new Attribute( key, value ) : null,
|
|
|
+ doc.version
|
|
|
+ );
|
|
|
+ doc.applyOperation( operation );
|
|
|
+ delta.addOperation( operation );
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return ChangeDelta;
|
|
|
} );
|