Auto append new line after video

pull/307/head
Xin Yao 4 years ago
parent af3604e1c9
commit 01220d69a1
  1. 5
      example/assets/sample_data.json
  2. 25
      lib/src/models/documents/document.dart

@ -17,6 +17,11 @@
"style":"display: block; margin: auto;" "style":"display: block; margin: auto;"
} }
}, },
{
"insert": {
"video": "https://www.youtube.com/watch?v=V4hgdKhIqtc&list=PLbhaS_83B97s78HsDTtplRTEhcFsqSqIK&index=1"
}
},
{ {
"insert": { "insert": {
"video": "https://user-images.githubusercontent.com/122956/126238875-22e42501-ad41-4266-b1d6-3f89b5e3b79b.mp4" "video": "https://user-images.githubusercontent.com/122956/126238875-22e42501-ad41-4266-b1d6-3f89b5e3b79b.mp4"

@ -1,5 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'dart:collection';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -143,14 +142,16 @@ class Document {
} }
void compose(Delta delta, ChangeSource changeSource, void compose(Delta delta, ChangeSource changeSource,
{bool autoAppendNewlineAfterImage = true}) { {bool autoAppendNewlineAfterImage = true,
bool autoAppendNewlineAfterVideo = true}) {
assert(!_observer.isClosed); assert(!_observer.isClosed);
delta.trim(); delta.trim();
assert(delta.isNotEmpty); assert(delta.isNotEmpty);
var offset = 0; var offset = 0;
delta = _transform(delta, delta = _transform(delta,
autoAppendNewlineAfterImage: autoAppendNewlineAfterImage); autoAppendNewlineAfterImage: autoAppendNewlineAfterImage,
autoAppendNewlineAfterVideo: autoAppendNewlineAfterVideo);
final originalDelta = toDelta(); final originalDelta = toDelta();
for (final op in delta.toList()) { for (final op in delta.toList()) {
final style = final style =
@ -195,25 +196,29 @@ class Document {
bool get hasRedo => _history.hasRedo; bool get hasRedo => _history.hasRedo;
static Delta _transform(Delta delta, static Delta _transform(Delta delta,
{bool autoAppendNewlineAfterImage = true}) { {bool autoAppendNewlineAfterImage = true,
bool autoAppendNewlineAfterVideo = true}) {
final res = Delta(); final res = Delta();
final ops = delta.toList(); final ops = delta.toList();
for (var i = 0; i < ops.length; i++) { for (var i = 0; i < ops.length; i++) {
final op = ops[i]; final op = ops[i];
res.push(op); res.push(op);
if (autoAppendNewlineAfterImage) { if (autoAppendNewlineAfterImage) {
_autoAppendNewlineAfterImage(i, ops, op, res); _autoAppendNewlineAfterEmbeddable(i, ops, op, res, 'image');
}
if (autoAppendNewlineAfterVideo) {
_autoAppendNewlineAfterEmbeddable(i, ops, op, res, 'video');
} }
} }
return res; return res;
} }
static void _autoAppendNewlineAfterImage( static void _autoAppendNewlineAfterEmbeddable(
int i, List<Operation> ops, Operation op, Delta res) { int i, List<Operation> ops, Operation op, Delta res, String type) {
final nextOpIsImage = i + 1 < ops.length && final nextOpIsImage = i + 1 < ops.length &&
ops[i + 1].isInsert && ops[i + 1].isInsert &&
ops[i + 1].data is Map && ops[i + 1].data is Map &&
(ops[i + 1].data as Map).containsKey('image'); (ops[i + 1].data as Map).containsKey(type);
if (nextOpIsImage && if (nextOpIsImage &&
op.data is String && op.data is String &&
(op.data as String).isNotEmpty && (op.data as String).isNotEmpty &&
@ -222,13 +227,13 @@ class Document {
} }
// embed could be image or video // embed could be image or video
final opInsertImage = final opInsertImage =
op.isInsert && op.data is Map && (op.data as Map).containsKey('image'); op.isInsert && op.data is Map && (op.data as Map).containsKey(type);
final nextOpIsLineBreak = i + 1 < ops.length && final nextOpIsLineBreak = i + 1 < ops.length &&
ops[i + 1].isInsert && ops[i + 1].isInsert &&
ops[i + 1].data is String && ops[i + 1].data is String &&
(ops[i + 1].data as String).startsWith('\n'); (ops[i + 1].data as String).startsWith('\n');
if (opInsertImage && (i + 1 == ops.length - 1 || !nextOpIsLineBreak)) { if (opInsertImage && (i + 1 == ops.length - 1 || !nextOpIsLineBreak)) {
// automatically append '\n' for image // automatically append '\n' for embeddable
res.push(Operation.insert('\n')); res.push(Operation.insert('\n'));
} }
} }

Loading…
Cancel
Save