From bee1a0432936c228a15866e64b3696f40b99371b Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Wed, 10 Aug 2022 17:24:39 +0800 Subject: [PATCH] feat: compute string indexes --- .../flowy_editor/lib/src/document/text_delta.dart | 15 +++++++++++++++ .../packages/flowy_editor/test/delta_test.dart | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/frontend/app_flowy/packages/flowy_editor/lib/src/document/text_delta.dart b/frontend/app_flowy/packages/flowy_editor/lib/src/document/text_delta.dart index 6626ba7a86..03ae4ccc56 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/src/document/text_delta.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/src/document/text_delta.dart @@ -260,6 +260,7 @@ TextOperation? _textOperationFromJson(Map json) { class Delta extends Iterable { final List _operations; String? _rawString; + List? _runeIndexes; factory Delta.fromJson(List list) { final operations = []; @@ -477,9 +478,23 @@ class Delta extends Iterable { String toRawString() { _rawString ??= _operations.whereType().map((op) => op.content).join(); + _runeIndexes ??= stringIndexes(_rawString!); return _rawString!; } @override Iterator get iterator => _operations.iterator; } + +List stringIndexes(String content) { + final indexes = List.filled(content.length, 0); + final iterator = content.runes.iterator; + + while (iterator.moveNext()) { + for (var i = 0; i < iterator.currentSize; i++) { + indexes[iterator.rawIndex + i] = iterator.rawIndex; + } + } + + return indexes; +} diff --git a/frontend/app_flowy/packages/flowy_editor/test/delta_test.dart b/frontend/app_flowy/packages/flowy_editor/test/delta_test.dart index 7016da70e4..2b0d529414 100644 --- a/frontend/app_flowy/packages/flowy_editor/test/delta_test.dart +++ b/frontend/app_flowy/packages/flowy_editor/test/delta_test.dart @@ -279,4 +279,9 @@ void main() { expect(delta, expected); }); }); + test("stringIndexes", () { + final indexes = stringIndexes('😊'); + expect(indexes[0], 0); + expect(indexes[1], 0); + }); }