|
@@ -60,10 +60,8 @@ class TextRetain extends TextOperation {
|
|
int _length;
|
|
int _length;
|
|
final Attributes? _attributes;
|
|
final Attributes? _attributes;
|
|
|
|
|
|
- TextRetain({
|
|
|
|
- required length,
|
|
|
|
- attributes,
|
|
|
|
- }) : _length = length,
|
|
|
|
|
|
+ TextRetain(length, [Attributes? attributes])
|
|
|
|
+ : _length = length,
|
|
_attributes = attributes;
|
|
_attributes = attributes;
|
|
|
|
|
|
@override
|
|
@override
|
|
@@ -103,9 +101,7 @@ class TextRetain extends TextOperation {
|
|
class TextDelete extends TextOperation {
|
|
class TextDelete extends TextOperation {
|
|
int _length;
|
|
int _length;
|
|
|
|
|
|
- TextDelete({
|
|
|
|
- required int length,
|
|
|
|
- }) : _length = length;
|
|
|
|
|
|
+ TextDelete(int length) : _length = length;
|
|
|
|
|
|
@override
|
|
@override
|
|
bool get isEmpty {
|
|
bool get isEmpty {
|
|
@@ -167,7 +163,7 @@ class _OpIterator {
|
|
length ??= _maxInt;
|
|
length ??= _maxInt;
|
|
|
|
|
|
if (_index >= _operations.length) {
|
|
if (_index >= _operations.length) {
|
|
- return TextRetain(length: _maxInt);
|
|
|
|
|
|
+ return TextRetain(_maxInt);
|
|
}
|
|
}
|
|
|
|
|
|
final nextOp = _operations[_index];
|
|
final nextOp = _operations[_index];
|
|
@@ -182,15 +178,13 @@ class _OpIterator {
|
|
_offset += length;
|
|
_offset += length;
|
|
}
|
|
}
|
|
if (nextOp is TextDelete) {
|
|
if (nextOp is TextDelete) {
|
|
- return TextDelete(
|
|
|
|
- length: length,
|
|
|
|
- );
|
|
|
|
|
|
+ return TextDelete(length);
|
|
}
|
|
}
|
|
|
|
|
|
if (nextOp is TextRetain) {
|
|
if (nextOp is TextRetain) {
|
|
return TextRetain(
|
|
return TextRetain(
|
|
- length: length,
|
|
|
|
- attributes: nextOp.attributes,
|
|
|
|
|
|
+ length,
|
|
|
|
+ nextOp.attributes,
|
|
);
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -201,7 +195,7 @@ class _OpIterator {
|
|
);
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
- return TextRetain(length: _maxInt);
|
|
|
|
|
|
+ return TextRetain(_maxInt);
|
|
}
|
|
}
|
|
|
|
|
|
List<TextOperation> rest() {
|
|
List<TextOperation> rest() {
|
|
@@ -221,10 +215,52 @@ class _OpIterator {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Attributes? _attributesFromJSON(Map<String, dynamic>? json) {
|
|
|
|
+ if (json == null) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ final result = <String, dynamic>{};
|
|
|
|
+
|
|
|
|
+ for (final entry in json.entries) {
|
|
|
|
+ result[entry.key] = entry.value;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+TextOperation? _textOperationFromJson(Map<String, dynamic> json) {
|
|
|
|
+ TextOperation? result;
|
|
|
|
+
|
|
|
|
+ if (json['insert'] is String) {
|
|
|
|
+ result = TextInsert(json['insert'] as String,
|
|
|
|
+ _attributesFromJSON(json['attributes'] as Map<String, dynamic>?));
|
|
|
|
+ } else if (json['retain'] is int) {
|
|
|
|
+ result = TextRetain(json['retain'] as int,
|
|
|
|
+ _attributesFromJSON(json['attributes'] as Map<String, Object>?));
|
|
|
|
+ } else if (json['delete'] is int) {
|
|
|
|
+ result = TextDelete(json['delete'] as int);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
|
// basically copy from: https://github.com/quilljs/delta
|
|
// basically copy from: https://github.com/quilljs/delta
|
|
class Delta {
|
|
class Delta {
|
|
final List<TextOperation> operations;
|
|
final List<TextOperation> operations;
|
|
|
|
|
|
|
|
+ factory Delta.fromJson(List<dynamic> list) {
|
|
|
|
+ final operations = <TextOperation>[];
|
|
|
|
+
|
|
|
|
+ for (final obj in list) {
|
|
|
|
+ final op = _textOperationFromJson(obj as Map<String, dynamic>);
|
|
|
|
+ if (op != null) {
|
|
|
|
+ operations.add(op);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return Delta(operations);
|
|
|
|
+ }
|
|
|
|
+
|
|
Delta([List<TextOperation>? ops]) : operations = ops ?? <TextOperation>[];
|
|
Delta([List<TextOperation>? ops]) : operations = ops ?? <TextOperation>[];
|
|
|
|
|
|
Delta add(TextOperation textOp) {
|
|
Delta add(TextOperation textOp) {
|
|
@@ -288,12 +324,12 @@ class Delta {
|
|
}
|
|
}
|
|
|
|
|
|
Delta retain(int length, [Attributes? attributes]) {
|
|
Delta retain(int length, [Attributes? attributes]) {
|
|
- final op = TextRetain(length: length, attributes: attributes);
|
|
|
|
|
|
+ final op = TextRetain(length, attributes);
|
|
return add(op);
|
|
return add(op);
|
|
}
|
|
}
|
|
|
|
|
|
Delta delete(int length) {
|
|
Delta delete(int length) {
|
|
- final op = TextDelete(length: length);
|
|
|
|
|
|
+ final op = TextDelete(length);
|
|
return add(op);
|
|
return add(op);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -341,7 +377,7 @@ class Delta {
|
|
if (otherOp is TextRetain && otherOp.length > 0) {
|
|
if (otherOp is TextRetain && otherOp.length > 0) {
|
|
TextOperation? newOp;
|
|
TextOperation? newOp;
|
|
if (thisOp is TextRetain) {
|
|
if (thisOp is TextRetain) {
|
|
- newOp = TextRetain(length: length, attributes: attributes);
|
|
|
|
|
|
+ newOp = TextRetain(length, attributes);
|
|
} else if (thisOp is TextInsert) {
|
|
} else if (thisOp is TextInsert) {
|
|
newOp = TextInsert(thisOp.content, attributes);
|
|
newOp = TextInsert(thisOp.content, attributes);
|
|
}
|
|
}
|