Lucas.Xu 2 лет назад
Родитель
Сommit
6a527a6676

+ 54 - 4
frontend/app_flowy/packages/flowy_editor/README.md

@@ -11,15 +11,30 @@ and the Flutter guide for
 [developing packages and plugins](https://flutter.dev/developing-packages). 
 -->
 
-TODO: Put a short description of the package here that helps potential users
-know whether this package might be useful for them.
+一个可扩展,测试覆盖的 flutter 富文本编辑组件
 
 ## Features
 
 TODO: List what your package can do. Maybe include images, gifs, or videos.
 
+* 可扩展的
+    * 支持扩展不同样式的视图
+    * 支持定制快捷键解析
+    * 支持扩展toolbar/popup list样式(WIP)
+    * ...
+* 协同结构 ready
+    * 
+* 质量保证的
+    * 由于可扩展的结构,以及随着功能的增多,我们鼓励每个提交的文件或者代码段,都可以在test下增加对应的测试用例代码,尽可能得保证提交者不需要担心自己的代码影响了已有的逻辑。
+
+
 ## Getting started
 
+```shell
+flutter pub add flowy_editor
+flutter pub get
+```
+
 TODO: List prerequisites and provide or point to information on how to
 start using the package.
 
@@ -28,12 +43,47 @@ start using the package.
 TODO: Include short and useful examples for package users. Add longer examples
 to `/example` folder. 
 
+Empty document
 ```dart
-const like = 'sample';
+final editorState = EditorState.empty();
+final editor = FlowyEditor(
+    editorState: editorState,
+    keyEventHandlers: const [],
+    customBuilders: const {},
+);
 ```
 
-## Additional information
+从JSON文件中读取
+```dart
+final json = ...;
+final editorState = EditorState(StateTree.fromJson(data));
+final editor = FlowyEditor(
+    editorState: editorState,
+    keyEventHandlers: const [],
+    customBuilders: const {},
+);
+```
 
+For more. Run the example.
+```shell
+git clone https://github.com/AppFlowy-IO/AppFlowy.git
+cd frontend/app_flowy/packages/flowy_editor/example
+flutter run
+```
+
+## Examples
+
+## Documentation
+* 术语表
+
+## Additional information
 TODO: Tell users more about the package: where to find more information, how to 
 contribute to the package, how to file issues, what response they can expect 
 from the package authors, and more.
+
+目前正在完善更多的文档信息
+* Selection
+* 
+
+我们还有很多工作需要继续完成,
+Project checker link.

+ 3458 - 0
frontend/app_flowy/packages/flowy_editor/coverage/lcov.info

@@ -0,0 +1,3458 @@
+SF:lib/src/document/node.dart
+DA:17,9
+DA:19,18
+DA:20,12
+DA:22,8
+DA:27,20
+DA:29,14
+DA:31,11
+DA:37,13
+DA:38,2
+DA:42,1
+DA:43,3
+DA:46,1
+DA:47,1
+DA:48,1
+DA:49,2
+DA:50,2
+DA:52,1
+DA:54,1
+DA:55,1
+DA:56,2
+DA:57,1
+DA:65,1
+DA:66,1
+DA:67,2
+DA:68,1
+DA:74,1
+DA:81,2
+DA:82,1
+DA:88,5
+DA:89,20
+DA:91,17
+DA:95,10
+DA:98,11
+DA:99,33
+DA:103,22
+DA:106,11
+DA:107,11
+DA:111,44
+DA:114,9
+DA:115,18
+DA:117,18
+DA:118,9
+DA:119,18
+DA:120,9
+DA:124,16
+DA:126,8
+DA:127,24
+DA:128,0
+DA:129,0
+DA:131,0
+DA:135,9
+DA:137,18
+DA:138,9
+DA:141,18
+DA:144,0
+DA:146,0
+DA:147,0
+DA:150,0
+DA:153,4
+DA:155,4
+DA:157,8
+DA:158,4
+DA:161,2
+DA:162,2
+DA:163,2
+DA:165,4
+DA:166,5
+DA:168,4
+DA:169,2
+DA:174,10
+DA:175,10
+DA:179,30
+DA:180,10
+DA:183,9
+DA:185,40
+DA:188,1
+DA:189,1
+DA:190,4
+DA:192,1
+DA:193,0
+DA:194,0
+DA:195,0
+DA:204,10
+DA:210,27
+DA:212,2
+DA:213,6
+DA:214,2
+DA:216,2
+DA:217,2
+DA:220,9
+DA:221,9
+DA:224,5
+DA:225,5
+DA:226,5
+DA:229,1
+DA:231,1
+DA:232,3
+DA:236,1
+DA:242,1
+DA:243,1
+DA:244,1
+DA:245,0
+DA:246,0
+DA:249,3
+DA:251,3
+DA:252,3
+DA:253,3
+DA:254,6
+DA:255,6
+DA:257,3
+DA:258,0
+DA:259,0
+DA:260,0
+DA:265,27
+LF:114
+LH:99
+end_of_record
+SF:lib/src/document/state_tree.dart
+DA:11,11
+DA:15,1
+DA:16,3
+DA:18,2
+DA:19,1
+DA:20,1
+DA:23,7
+DA:24,14
+DA:27,3
+DA:28,3
+DA:31,6
+DA:32,23
+DA:35,0
+DA:36,0
+DA:39,0
+DA:40,0
+DA:46,9
+DA:47,3
+DA:48,3
+DA:54,5
+DA:55,5
+DA:58,10
+DA:59,5
+DA:62,15
+DA:66,4
+DA:67,4
+DA:70,8
+DA:71,4
+DA:72,4
+DA:73,4
+DA:74,4
+DA:79,5
+DA:80,5
+DA:83,10
+DA:87,5
+LF:35
+LH:31
+end_of_record
+SF:lib/src/document/path.dart
+DA:7,10
+DA:8,10
+LF:2
+LH:2
+end_of_record
+SF:lib/src/document/position.dart
+DA:9,10
+DA:14,10
+DA:16,10
+DA:19,60
+DA:22,1
+DA:24,2
+DA:25,2
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:35,9
+DA:36,27
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+LF:17
+LH:9
+end_of_record
+SF:lib/src/document/selection.dart
+DA:14,6
+DA:25,7
+DA:29,7
+DA:30,7
+DA:33,6
+DA:40,40
+DA:41,54
+DA:42,8
+DA:43,80
+DA:44,48
+DA:45,6
+DA:46,60
+DA:47,20
+DA:49,0
+DA:50,0
+DA:51,0
+DA:56,12
+DA:58,1
+DA:60,3
+DA:62,3
+DA:66,5
+DA:67,5
+DA:68,5
+DA:69,5
+DA:73,20
+DA:75,0
+DA:76,0
+DA:77,0
+DA:78,0
+DA:82,9
+DA:84,9
+DA:90,18
+DA:93,0
+DA:94,0
+DA:96,9
+DA:97,27
+LF:36
+LH:27
+end_of_record
+SF:lib/src/document/text_delta.dart
+DA:13,21
+DA:17,4
+DA:26,10
+DA:28,9
+DA:30,18
+DA:33,10
+DA:35,10
+DA:38,5
+DA:40,5
+DA:43,15
+DA:44,15
+DA:47,0
+DA:49,0
+DA:50,0
+DA:51,0
+DA:52,0
+DA:55,1
+DA:57,1
+DA:58,1
+DA:60,1
+DA:62,3
+DA:72,7
+DA:76,7
+DA:78,14
+DA:81,7
+DA:83,7
+DA:86,0
+DA:87,0
+DA:90,6
+DA:92,6
+DA:95,1
+DA:97,1
+DA:100,6
+DA:103,0
+DA:105,0
+DA:106,0
+DA:109,1
+DA:111,1
+DA:112,1
+DA:114,1
+DA:116,3
+DA:125,6
+DA:127,6
+DA:129,6
+DA:132,1
+DA:133,1
+DA:136,1
+DA:138,1
+DA:141,3
+DA:144,0
+DA:146,0
+DA:149,1
+DA:151,1
+DA:152,1
+DA:162,7
+DA:163,7
+DA:165,6
+DA:166,12
+DA:169,6
+DA:170,24
+DA:174,18
+DA:177,6
+DA:178,24
+DA:179,18
+DA:180,18
+DA:185,6
+DA:188,24
+DA:189,4
+DA:192,18
+DA:194,6
+DA:195,6
+DA:196,12
+DA:197,6
+DA:198,12
+DA:199,6
+DA:201,10
+DA:203,6
+DA:204,4
+DA:207,6
+DA:208,5
+DA:210,5
+DA:214,6
+DA:215,6
+DA:216,18
+DA:217,6
+DA:221,0
+DA:224,5
+DA:225,5
+DA:226,5
+DA:227,4
+DA:228,3
+DA:230,2
+DA:231,2
+DA:232,2
+DA:233,6
+DA:234,2
+DA:235,2
+DA:236,4
+DA:241,1
+DA:244,2
+DA:245,1
+DA:247,2
+DA:248,2
+DA:249,1
+DA:251,2
+DA:252,2
+DA:253,2
+DA:270,2
+DA:271,2
+DA:273,3
+DA:274,1
+DA:276,1
+DA:280,2
+DA:283,19
+DA:285,2
+DA:286,4
+DA:289,7
+DA:290,7
+DA:293,6
+DA:295,12
+DA:296,10
+DA:297,7
+DA:298,3
+DA:301,15
+DA:302,10
+DA:303,12
+DA:308,5
+DA:309,4
+DA:310,4
+DA:311,4
+DA:314,6
+DA:315,0
+DA:321,12
+DA:327,7
+DA:328,7
+DA:329,14
+DA:332,13
+DA:334,6
+DA:335,10
+DA:337,11
+DA:338,6
+DA:341,12
+DA:349,3
+DA:350,6
+DA:357,7
+DA:358,14
+DA:361,18
+DA:364,5
+DA:365,10
+DA:366,15
+DA:370,6
+DA:371,12
+DA:372,12
+DA:373,6
+DA:375,6
+DA:377,6
+DA:378,5
+DA:379,5
+DA:381,20
+DA:382,8
+DA:383,4
+DA:384,4
+DA:386,15
+DA:387,12
+DA:391,6
+DA:392,12
+DA:393,10
+DA:394,3
+DA:395,3
+DA:396,10
+DA:397,1
+DA:398,1
+DA:401,15
+DA:402,5
+DA:403,5
+DA:404,5
+DA:405,15
+DA:406,15
+DA:408,5
+DA:409,1
+DA:410,5
+DA:411,10
+DA:415,5
+DA:419,5
+DA:420,10
+DA:421,15
+DA:422,10
+DA:423,10
+DA:425,8
+DA:426,2
+DA:431,6
+DA:435,5
+DA:436,10
+DA:437,10
+DA:438,6
+DA:439,6
+DA:441,5
+DA:444,7
+DA:445,14
+DA:448,6
+DA:449,12
+DA:450,16
+DA:451,6
+DA:455,1
+DA:457,1
+DA:460,3
+DA:463,0
+DA:465,0
+DA:469,7
+DA:470,7
+DA:471,20
+DA:472,6
+DA:473,6
+DA:474,11
+DA:475,10
+DA:476,10
+DA:477,7
+DA:478,5
+DA:479,10
+DA:480,10
+DA:481,5
+DA:482,4
+DA:483,4
+DA:484,4
+DA:485,6
+DA:488,5
+DA:492,7
+DA:495,2
+DA:496,8
+DA:506,2
+DA:507,2
+DA:508,2
+DA:510,2
+DA:511,6
+DA:512,6
+DA:513,6
+DA:523,2
+DA:524,2
+DA:525,6
+DA:526,1
+DA:528,6
+DA:530,10
+DA:531,6
+DA:532,4
+DA:536,2
+DA:539,10
+DA:540,10
+DA:541,60
+DA:542,10
+DA:545,10
+DA:546,20
+DA:549,2
+DA:550,4
+DA:551,4
+DA:553,2
+DA:554,6
+DA:555,8
+LF:257
+LH:241
+end_of_record
+SF:lib/src/document/attributes.dart
+DA:3,0
+DA:4,0
+DA:5,0
+DA:8,6
+DA:9,0
+DA:10,2
+DA:11,23
+DA:12,20
+DA:13,10
+DA:17,18
+DA:18,24
+DA:19,3
+DA:25,7
+DA:27,5
+DA:28,5
+DA:29,14
+DA:32,21
+DA:35,14
+DA:36,14
+DA:37,15
+DA:41,7
+LF:21
+LH:17
+end_of_record
+SF:lib/src/editor_state.dart
+DA:17,24
+DA:23,12
+DA:57,10
+DA:58,10
+DA:61,9
+DA:64,9
+DA:65,24
+DA:67,9
+DA:72,10
+DA:75,20
+DA:82,7
+DA:85,13
+DA:86,6
+DA:89,21
+DA:90,14
+DA:93,7
+DA:94,14
+DA:95,14
+DA:96,7
+DA:97,7
+DA:98,14
+DA:100,14
+DA:101,7
+DA:102,1
+DA:103,1
+DA:104,2
+DA:105,2
+DA:106,2
+DA:107,3
+DA:111,7
+DA:112,7
+DA:115,0
+DA:116,0
+DA:117,0
+DA:118,0
+DA:119,0
+DA:120,0
+DA:121,0
+DA:126,6
+DA:127,6
+DA:128,8
+DA:129,6
+DA:130,16
+DA:131,5
+DA:132,15
+DA:133,5
+DA:134,20
+LF:47
+LH:40
+end_of_record
+SF:lib/src/operation/operation.dart
+DA:5,0
+DA:6,0
+DA:7,0
+DA:8,0
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:17,0
+DA:20,8
+DA:29,0
+DA:30,0
+DA:32,0
+DA:33,0
+DA:36,6
+DA:38,1
+DA:39,2
+DA:41,1
+DA:42,1
+DA:44,1
+DA:46,1
+DA:47,1
+DA:48,1
+DA:52,1
+DA:54,1
+DA:56,2
+DA:57,4
+DA:66,0
+DA:67,0
+DA:68,0
+DA:69,0
+DA:70,0
+DA:73,4
+DA:77,4
+DA:79,0
+DA:81,0
+DA:82,0
+DA:84,0
+DA:85,0
+DA:87,0
+DA:89,0
+DA:90,0
+DA:91,0
+DA:92,0
+DA:96,0
+DA:98,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:110,0
+DA:111,0
+DA:113,0
+DA:114,0
+DA:117,4
+DA:120,4
+DA:122,3
+DA:123,6
+DA:125,3
+DA:126,3
+DA:128,1
+DA:130,3
+DA:133,1
+DA:135,1
+DA:137,2
+DA:138,4
+DA:147,0
+DA:148,0
+DA:149,0
+DA:150,0
+DA:151,0
+DA:154,6
+DA:158,6
+DA:160,3
+DA:161,3
+DA:162,6
+DA:164,3
+DA:165,3
+DA:167,1
+DA:169,4
+DA:172,0
+DA:174,0
+DA:176,0
+DA:177,0
+DA:178,0
+DA:183,4
+DA:184,12
+DA:187,8
+DA:191,13
+DA:192,3
+DA:196,12
+DA:197,8
+DA:198,4
+DA:199,12
+DA:200,4
+DA:201,6
+DA:203,4
+DA:205,4
+DA:209,6
+DA:210,6
+DA:211,6
+DA:212,2
+DA:213,6
+DA:214,16
+DA:215,4
+LF:106
+LH:57
+end_of_record
+SF:lib/src/operation/transaction.dart
+DA:21,8
+DA:27,1
+DA:28,1
+DA:29,4
+DA:31,1
+DA:32,0
+DA:34,1
+DA:35,0
+LF:8
+LH:6
+end_of_record
+SF:lib/src/operation/transaction_builder.dart
+DA:23,8
+DA:26,7
+DA:27,7
+DA:28,14
+DA:32,2
+DA:33,4
+DA:37,2
+DA:38,6
+DA:39,12
+DA:43,4
+DA:44,12
+DA:46,8
+DA:47,8
+DA:48,4
+DA:49,8
+DA:55,4
+DA:56,8
+DA:59,3
+DA:60,6
+DA:66,4
+DA:67,4
+DA:70,4
+DA:71,12
+DA:72,4
+DA:73,8
+DA:74,24
+DA:75,4
+DA:78,24
+DA:81,6
+DA:82,18
+DA:83,6
+DA:85,6
+DA:87,12
+DA:89,12
+DA:92,0
+DA:93,0
+DA:96,2
+DA:98,4
+DA:99,4
+DA:100,2
+DA:102,4
+DA:103,2
+DA:104,4
+DA:105,6
+DA:107,4
+DA:108,2
+DA:109,2
+DA:118,1
+DA:121,1
+DA:123,0
+DA:125,1
+DA:127,2
+DA:128,1
+DA:129,1
+DA:134,2
+DA:135,4
+DA:139,1
+DA:140,1
+DA:142,2
+DA:143,1
+DA:144,1
+DA:145,2
+DA:149,3
+DA:150,3
+DA:152,6
+DA:153,3
+DA:154,3
+DA:155,3
+DA:156,9
+DA:159,1
+DA:163,3
+DA:164,1
+DA:165,0
+DA:168,1
+DA:170,2
+DA:171,1
+DA:172,1
+DA:173,1
+DA:175,2
+DA:176,1
+DA:177,1
+DA:178,2
+DA:188,8
+DA:189,28
+DA:191,6
+DA:192,4
+DA:193,3
+DA:194,0
+DA:195,0
+DA:196,0
+DA:197,0
+DA:199,0
+DA:203,30
+DA:204,18
+DA:206,20
+DA:209,14
+DA:213,8
+DA:214,8
+DA:215,16
+DA:216,8
+DA:217,8
+LF:101
+LH:92
+end_of_record
+SF:lib/src/render/selection/selectable.dart
+DA:24,0
+DA:28,0
+DA:43,0
+LF:3
+LH:0
+end_of_record
+SF:lib/src/service/editor_service.dart
+DA:19,27
+DA:20,9
+DA:21,9
+DA:22,9
+DA:23,9
+DA:24,9
+DA:25,9
+DA:26,9
+DA:30,9
+DA:35,9
+DA:45,9
+DA:46,9
+DA:50,27
+DA:52,9
+DA:54,9
+DA:56,36
+DA:59,0
+DA:61,0
+DA:63,0
+DA:64,0
+DA:68,9
+DA:70,9
+DA:71,27
+DA:72,9
+DA:73,27
+DA:74,9
+DA:75,9
+DA:76,27
+DA:77,9
+DA:78,9
+DA:79,27
+DA:80,9
+DA:81,9
+DA:82,18
+DA:84,9
+DA:85,9
+DA:86,27
+DA:87,9
+DA:89,36
+DA:90,9
+DA:92,27
+DA:93,9
+DA:102,18
+DA:103,9
+DA:104,9
+DA:105,9
+DA:106,18
+LF:47
+LH:43
+end_of_record
+SF:lib/src/service/render_plugin_service.dart
+DA:39,9
+DA:45,0
+DA:50,0
+DA:51,0
+DA:52,0
+DA:53,0
+DA:59,9
+DA:63,9
+DA:69,9
+DA:71,9
+DA:73,30
+DA:74,18
+DA:75,18
+DA:76,9
+DA:77,9
+DA:78,9
+DA:80,0
+DA:81,0
+DA:83,0
+DA:87,9
+DA:89,27
+DA:90,9
+DA:91,18
+DA:94,9
+DA:96,18
+DA:99,0
+DA:101,0
+DA:102,0
+DA:105,9
+DA:108,18
+DA:109,9
+DA:110,9
+DA:111,9
+DA:112,9
+DA:113,9
+DA:114,18
+DA:115,9
+DA:120,9
+DA:121,9
+DA:122,9
+DA:123,9
+DA:124,9
+DA:125,18
+DA:126,9
+DA:131,9
+DA:132,18
+DA:137,9
+DA:138,9
+DA:139,18
+DA:140,0
+DA:142,18
+DA:143,0
+LF:52
+LH:39
+end_of_record
+SF:lib/src/service/service.dart
+DA:8,9
+DA:9,18
+DA:10,27
+DA:11,18
+DA:16,8
+DA:17,16
+DA:18,24
+DA:19,16
+DA:26,1
+DA:27,2
+DA:28,3
+DA:29,2
+DA:39,9
+DA:40,18
+DA:41,27
+DA:42,18
+DA:49,9
+DA:50,18
+DA:51,27
+DA:52,18
+LF:20
+LH:20
+end_of_record
+SF:lib/src/service/selection_service.dart
+DA:80,9
+DA:86,9
+DA:93,9
+DA:94,9
+DA:113,27
+DA:115,9
+DA:117,9
+DA:119,18
+DA:120,27
+DA:123,0
+DA:125,0
+DA:128,0
+DA:129,0
+DA:133,9
+DA:135,9
+DA:136,18
+DA:137,27
+DA:139,9
+DA:142,9
+DA:144,9
+DA:145,9
+DA:146,9
+DA:147,9
+DA:148,9
+DA:149,9
+DA:150,9
+DA:151,18
+DA:161,5
+DA:164,21
+DA:166,21
+DA:167,10
+DA:168,15
+DA:169,15
+DA:172,20
+DA:173,5
+DA:176,6
+DA:179,0
+DA:182,9
+DA:184,18
+DA:185,9
+DA:188,9
+DA:190,21
+DA:191,14
+DA:194,15
+DA:195,5
+DA:199,18
+DA:200,18
+DA:203,9
+DA:205,18
+DA:206,18
+DA:209,9
+DA:210,19
+DA:211,9
+DA:213,9
+DA:214,23
+DA:215,9
+DA:217,36
+DA:220,0
+DA:223,0
+DA:224,0
+DA:228,0
+DA:232,0
+DA:234,0
+DA:235,0
+DA:237,0
+DA:240,0
+DA:243,0
+DA:245,0
+DA:247,0
+DA:251,0
+DA:252,0
+DA:254,0
+DA:256,0
+DA:259,0
+DA:260,0
+DA:261,0
+DA:262,0
+DA:264,0
+DA:267,0
+DA:269,0
+DA:272,0
+DA:273,0
+DA:274,0
+DA:275,0
+DA:277,0
+DA:280,0
+DA:281,0
+DA:282,0
+DA:284,0
+DA:286,0
+DA:289,0
+DA:290,0
+DA:292,0
+DA:293,0
+DA:295,0
+DA:298,0
+DA:299,0
+DA:303,0
+DA:305,0
+DA:306,0
+DA:308,0
+DA:309,0
+DA:311,0
+DA:312,0
+DA:317,0
+DA:318,0
+DA:320,0
+DA:321,0
+DA:322,0
+DA:323,0
+DA:324,0
+DA:327,0
+DA:330,0
+DA:334,5
+DA:335,5
+DA:337,5
+DA:344,11
+DA:345,5
+DA:347,9
+DA:348,10
+DA:350,15
+DA:351,5
+DA:352,5
+DA:357,5
+DA:367,5
+DA:368,5
+DA:369,10
+DA:370,15
+DA:371,10
+DA:373,4
+DA:374,4
+DA:375,4
+DA:380,5
+DA:381,10
+DA:384,5
+DA:386,15
+DA:388,5
+DA:389,10
+DA:390,10
+DA:391,5
+DA:395,10
+DA:399,20
+DA:402,15
+DA:403,10
+DA:407,7
+DA:408,35
+DA:411,0
+DA:415,14
+DA:417,7
+DA:420,7
+DA:421,7
+DA:422,7
+DA:424,7
+DA:425,14
+DA:426,7
+DA:428,14
+DA:429,7
+DA:433,14
+DA:434,21
+DA:435,28
+DA:437,7
+DA:441,7
+DA:442,22
+DA:445,9
+DA:446,36
+DA:447,9
+DA:448,18
+DA:449,9
+DA:453,18
+DA:455,36
+DA:456,9
+DA:457,9
+DA:461,18
+DA:462,1
+DA:463,0
+DA:464,1
+DA:465,5
+DA:467,18
+DA:468,8
+DA:469,15
+DA:474,0
+DA:476,0
+DA:481,0
+DA:482,0
+DA:483,0
+DA:484,0
+DA:485,0
+DA:487,0
+DA:490,0
+DA:491,0
+DA:492,0
+DA:493,0
+DA:494,0
+DA:498,0
+DA:504,0
+DA:505,0
+DA:506,0
+DA:509,9
+DA:510,36
+DA:511,45
+DA:514,9
+DA:515,9
+DA:518,0
+DA:521,0
+DA:523,0
+DA:524,0
+DA:525,0
+DA:526,0
+DA:527,0
+DA:531,0
+DA:532,0
+DA:533,0
+DA:534,0
+DA:535,0
+DA:536,0
+DA:538,0
+DA:539,0
+DA:543,0
+DA:544,0
+DA:548,0
+DA:550,0
+LF:221
+LH:122
+end_of_record
+SF:lib/src/service/scroll_service.dart
+DA:21,9
+DA:24,9
+DA:28,9
+DA:29,9
+DA:39,9
+DA:40,27
+DA:42,1
+DA:44,3
+DA:45,2
+DA:48,1
+DA:49,3
+DA:51,1
+DA:52,3
+DA:54,1
+DA:56,1
+DA:57,3
+DA:58,3
+DA:63,9
+DA:65,9
+DA:66,9
+DA:67,9
+DA:68,9
+DA:70,9
+DA:71,18
+DA:76,5
+DA:78,15
+DA:79,5
+DA:80,15
+DA:81,15
+DA:86,1
+DA:88,1
+DA:89,4
+DA:92,1
+DA:94,1
+DA:95,4
+DA:98,0
+DA:99,0
+DA:100,0
+DA:101,0
+LF:39
+LH:35
+end_of_record
+SF:lib/src/service/keyboard_service.dart
+DA:19,9
+DA:24,9
+DA:30,9
+DA:31,9
+DA:40,9
+DA:42,9
+DA:43,9
+DA:44,9
+DA:45,9
+DA:46,18
+DA:50,9
+DA:52,18
+DA:54,9
+DA:57,1
+DA:59,1
+DA:60,2
+DA:63,0
+DA:65,0
+DA:66,0
+DA:69,8
+DA:71,24
+DA:73,8
+DA:77,24
+DA:80,24
+DA:83,8
+DA:85,7
+DA:87,7
+DA:95,1
+DA:96,3
+DA:99,0
+DA:100,0
+DA:104,0
+LF:32
+LH:26
+end_of_record
+SF:lib/src/service/input_service.dart
+DA:18,9
+DA:22,9
+DA:27,9
+DA:28,9
+DA:36,27
+DA:38,9
+DA:40,9
+DA:42,36
+DA:43,18
+DA:46,9
+DA:48,9
+DA:49,36
+DA:50,18
+DA:52,9
+DA:55,9
+DA:57,9
+DA:58,18
+DA:62,9
+DA:64,18
+DA:74,9
+DA:75,9
+DA:76,9
+DA:79,1
+DA:82,2
+DA:83,1
+DA:85,1
+DA:86,1
+DA:87,0
+DA:88,0
+DA:89,0
+DA:90,0
+DA:91,0
+DA:95,1
+DA:96,1
+DA:97,1
+DA:98,4
+DA:99,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:105,2
+DA:110,1
+DA:111,3
+DA:112,2
+DA:116,1
+DA:117,2
+DA:118,2
+DA:119,1
+DA:121,1
+DA:122,1
+DA:124,1
+DA:130,0
+DA:131,0
+DA:132,0
+DA:136,0
+DA:137,0
+DA:138,0
+DA:139,0
+DA:140,0
+DA:141,0
+DA:147,0
+DA:148,0
+DA:149,0
+DA:153,0
+DA:154,0
+DA:155,0
+DA:156,0
+DA:157,0
+DA:158,0
+DA:159,0
+DA:165,9
+DA:167,18
+DA:168,9
+DA:171,0
+DA:176,0
+DA:178,0
+DA:180,0
+DA:182,0
+DA:184,0
+DA:189,0
+DA:194,0
+DA:199,0
+DA:204,0
+DA:209,0
+DA:214,0
+DA:219,0
+DA:221,0
+DA:223,0
+DA:226,0
+DA:231,9
+DA:232,36
+DA:233,9
+DA:235,45
+DA:237,9
+DA:238,9
+DA:239,27
+DA:240,9
+DA:241,9
+DA:243,9
+DA:244,18
+DA:245,18
+DA:247,9
+DA:250,18
+DA:251,16
+DA:260,8
+DA:261,8
+DA:264,7
+DA:265,7
+DA:267,7
+DA:268,7
+DA:269,14
+DA:271,7
+DA:272,7
+DA:273,7
+LF:114
+LH:70
+end_of_record
+SF:lib/src/document/node_iterator.dart
+DA:14,5
+DA:18,5
+DA:20,5
+DA:21,10
+DA:22,5
+DA:26,5
+DA:31,15
+DA:32,5
+DA:36,10
+DA:37,0
+DA:38,5
+DA:39,10
+DA:41,0
+DA:42,0
+DA:44,0
+DA:46,0
+DA:50,5
+DA:53,0
+DA:54,0
+DA:55,0
+DA:60,5
+DA:62,5
+DA:65,5
+DA:66,5
+DA:68,5
+DA:69,10
+LF:26
+LH:18
+end_of_record
+SF:lib/src/extensions/path_extensions.dart
+DA:6,8
+DA:7,22
+DA:8,16
+DA:9,24
+DA:16,6
+DA:17,18
+DA:18,12
+DA:19,18
+DA:26,1
+DA:27,1
+DA:28,1
+DA:31,1
+DA:33,1
+DA:34,2
+LF:14
+LH:14
+end_of_record
+SF:lib/src/undo_manager.dart
+DA:19,7
+DA:26,0
+DA:27,0
+DA:30,10
+DA:32,0
+DA:33,0
+DA:36,7
+DA:37,14
+DA:41,1
+DA:42,1
+DA:43,5
+DA:44,2
+DA:45,1
+DA:46,1
+DA:48,2
+DA:49,2
+DA:50,1
+DA:58,10
+DA:60,7
+DA:61,28
+DA:62,0
+DA:64,14
+DA:67,1
+DA:68,2
+DA:71,2
+DA:73,2
+DA:78,0
+DA:79,0
+DA:82,15
+DA:84,21
+DA:86,0
+DA:94,10
+DA:95,10
+DA:96,10
+DA:98,7
+DA:99,14
+DA:100,7
+DA:101,14
+DA:104,10
+DA:105,5
+DA:106,0
+DA:107,0
+DA:108,0
+DA:114,1
+DA:115,2
+DA:116,1
+DA:120,2
+DA:124,1
+DA:125,1
+DA:133,1
+DA:134,2
+DA:135,1
+DA:139,2
+DA:143,1
+DA:144,1
+LF:55
+LH:44
+end_of_record
+SF:lib/src/extensions/color_extension.dart
+DA:6,0
+DA:7,0
+DA:8,0
+DA:13,0
+DA:16,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:24,0
+DA:30,0
+DA:33,0
+DA:34,0
+LF:15
+LH:0
+end_of_record
+SF:lib/src/extensions/node_extensions.dart
+DA:9,9
+DA:10,36
+DA:12,3
+DA:13,36
+DA:15,0
+DA:16,0
+DA:17,0
+DA:19,0
+DA:23,9
+DA:24,9
+DA:25,18
+DA:26,27
+LF:12
+LH:8
+end_of_record
+SF:lib/src/extensions/object_extensions.dart
+DA:2,9
+DA:3,9
+LF:2
+LH:2
+end_of_record
+SF:lib/src/extensions/text_node_extensions.dart
+DA:9,1
+DA:10,1
+DA:12,1
+DA:13,1
+DA:15,1
+DA:16,1
+DA:18,1
+DA:19,1
+DA:21,2
+DA:22,4
+DA:24,6
+DA:26,6
+DA:28,4
+DA:29,2
+DA:32,2
+DA:33,6
+DA:34,2
+DA:35,4
+DA:36,6
+DA:40,2
+DA:45,1
+DA:46,2
+DA:48,3
+DA:50,3
+DA:52,2
+DA:53,1
+DA:56,1
+DA:57,3
+DA:58,1
+DA:59,2
+DA:60,3
+DA:64,1
+DA:71,0
+DA:72,0
+DA:74,0
+DA:75,0
+DA:77,0
+DA:78,0
+DA:80,0
+DA:81,0
+DA:83,1
+DA:84,1
+DA:87,2
+DA:88,2
+DA:90,3
+DA:91,1
+DA:93,5
+DA:94,1
+DA:95,4
+DA:97,3
+DA:98,4
+DA:99,1
+DA:100,2
+DA:103,1
+DA:104,2
+DA:105,4
+DA:108,1
+LF:57
+LH:49
+end_of_record
+SF:lib/src/render/rich_text/rich_text_style.dart
+DA:46,0
+DA:53,3
+DA:69,6
+DA:70,2
+DA:71,2
+DA:72,2
+DA:73,2
+DA:74,2
+DA:79,2
+DA:80,6
+DA:81,2
+DA:86,2
+DA:87,2
+DA:88,6
+DA:93,0
+DA:94,0
+DA:97,0
+DA:98,0
+DA:104,1
+DA:105,3
+DA:106,1
+DA:111,9
+DA:112,9
+DA:113,0
+DA:118,4
+DA:119,12
+DA:120,4
+DA:127,9
+DA:128,13
+DA:131,9
+DA:132,13
+DA:135,9
+DA:136,9
+DA:137,4
+DA:140,9
+DA:141,9
+DA:142,4
+DA:145,9
+DA:146,13
+DA:147,2
+DA:148,4
+DA:154,9
+DA:155,9
+DA:156,0
+DA:157,0
+DA:158,0
+DA:164,0
+DA:169,9
+DA:170,9
+DA:171,0
+DA:179,9
+DA:185,4
+DA:186,12
+DA:192,27
+DA:194,4
+DA:198,9
+DA:199,9
+DA:200,9
+DA:201,9
+DA:202,9
+DA:203,9
+DA:204,9
+DA:205,9
+DA:206,9
+DA:207,9
+DA:210,9
+DA:214,9
+DA:215,9
+DA:216,0
+DA:217,0
+DA:218,0
+DA:219,0
+DA:220,0
+DA:226,9
+DA:227,18
+DA:234,9
+DA:235,9
+DA:236,34
+DA:237,2
+DA:240,18
+DA:241,2
+DA:243,9
+DA:247,9
+DA:248,18
+DA:251,9
+DA:252,18
+DA:255,18
+DA:258,9
+DA:259,18
+DA:260,0
+DA:261,18
+DA:262,0
+DA:268,9
+DA:273,9
+DA:274,18
+DA:276,0
+DA:277,0
+LF:97
+LH:77
+end_of_record
+SF:lib/src/infra/flowy_svg.dart
+DA:5,8
+DA:12,8
+DA:20,8
+DA:22,8
+DA:23,8
+DA:24,8
+DA:28,8
+DA:29,8
+DA:30,8
+DA:31,8
+DA:32,8
+DA:33,16
+DA:34,8
+DA:39,1
+DA:41,2
+DA:42,1
+DA:44,2
+DA:45,2
+DA:48,0
+LF:19
+LH:18
+end_of_record
+SF:lib/src/infra/html_converter.dart
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:54,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:61,0
+DA:62,0
+DA:63,0
+DA:64,0
+DA:65,0
+DA:66,0
+DA:67,0
+DA:68,0
+DA:69,0
+DA:70,0
+DA:71,0
+DA:72,0
+DA:73,0
+DA:74,0
+DA:77,0
+DA:78,0
+DA:80,0
+DA:82,0
+DA:83,0
+DA:85,0
+DA:88,0
+DA:91,0
+DA:92,0
+DA:97,0
+DA:98,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:109,0
+DA:110,0
+DA:111,0
+DA:114,0
+DA:116,0
+DA:117,0
+DA:118,0
+DA:119,0
+DA:120,0
+DA:121,0
+DA:122,0
+DA:123,0
+DA:124,0
+DA:125,0
+DA:126,0
+DA:127,0
+DA:128,0
+DA:129,0
+DA:130,0
+DA:131,0
+DA:133,0
+DA:134,0
+DA:135,0
+DA:136,0
+DA:139,0
+DA:142,0
+DA:144,0
+DA:145,0
+DA:146,0
+DA:150,0
+DA:151,0
+DA:156,0
+DA:157,0
+DA:158,0
+DA:159,0
+DA:162,0
+DA:168,0
+DA:170,0
+DA:171,0
+DA:172,0
+DA:174,0
+DA:176,0
+DA:177,0
+DA:179,0
+DA:180,0
+DA:181,0
+DA:186,0
+DA:188,0
+DA:191,0
+DA:194,0
+DA:196,0
+DA:197,0
+DA:200,0
+DA:201,0
+DA:204,0
+DA:207,0
+DA:208,0
+DA:209,0
+DA:210,0
+DA:211,0
+DA:212,0
+DA:213,0
+DA:218,0
+DA:219,0
+DA:220,0
+DA:221,0
+DA:222,0
+DA:223,0
+DA:226,0
+DA:228,0
+DA:229,0
+DA:230,0
+DA:231,0
+DA:232,0
+DA:233,0
+DA:234,0
+DA:235,0
+DA:236,0
+DA:237,0
+DA:239,0
+DA:247,0
+DA:249,0
+DA:251,0
+DA:254,0
+DA:257,0
+DA:259,0
+DA:260,0
+DA:263,0
+DA:265,0
+DA:266,0
+DA:267,0
+DA:269,0
+DA:274,0
+DA:276,0
+DA:277,0
+DA:282,0
+DA:283,0
+DA:284,0
+DA:286,0
+DA:288,0
+DA:291,0
+DA:292,0
+DA:293,0
+DA:294,0
+DA:295,0
+DA:300,0
+DA:301,0
+DA:302,0
+DA:303,0
+DA:304,0
+DA:305,0
+DA:310,0
+DA:314,0
+DA:315,0
+DA:316,0
+DA:318,0
+DA:322,0
+DA:324,0
+DA:325,0
+DA:326,0
+DA:327,0
+DA:328,0
+DA:354,0
+DA:356,0
+DA:358,0
+DA:359,0
+DA:360,0
+DA:361,0
+DA:362,0
+DA:365,0
+DA:366,0
+DA:367,0
+DA:368,0
+DA:370,0
+DA:371,0
+DA:372,0
+DA:377,0
+DA:378,0
+DA:379,0
+DA:381,0
+DA:382,0
+DA:383,0
+DA:384,0
+DA:386,0
+DA:391,0
+DA:392,0
+DA:393,0
+DA:395,0
+DA:398,0
+DA:399,0
+DA:402,0
+DA:403,0
+DA:404,0
+DA:405,0
+DA:407,0
+DA:409,0
+DA:410,0
+DA:411,0
+DA:413,0
+DA:417,0
+DA:418,0
+DA:419,0
+DA:420,0
+DA:424,0
+DA:425,0
+DA:426,0
+DA:427,0
+DA:431,0
+DA:434,0
+DA:435,0
+DA:436,0
+DA:437,0
+DA:439,0
+DA:440,0
+DA:443,0
+DA:446,0
+DA:447,0
+DA:448,0
+DA:449,0
+DA:450,0
+DA:452,0
+DA:454,0
+DA:455,0
+DA:456,0
+DA:458,0
+DA:460,0
+DA:461,0
+DA:464,0
+DA:465,0
+DA:466,0
+DA:469,0
+DA:470,0
+DA:472,0
+DA:475,0
+DA:476,0
+DA:477,0
+DA:478,0
+DA:481,0
+DA:501,0
+DA:504,0
+DA:507,0
+DA:510,0
+DA:512,0
+DA:513,0
+DA:515,0
+DA:517,0
+DA:518,0
+DA:519,0
+DA:521,0
+DA:523,0
+DA:526,0
+DA:530,0
+DA:531,0
+DA:532,0
+DA:534,0
+DA:535,0
+DA:536,0
+DA:537,0
+DA:538,0
+DA:539,0
+DA:540,0
+DA:541,0
+DA:542,0
+DA:543,0
+DA:544,0
+DA:545,0
+DA:546,0
+DA:547,0
+DA:548,0
+DA:549,0
+DA:550,0
+DA:551,0
+DA:552,0
+DA:554,0
+DA:555,0
+DA:556,0
+DA:557,0
+DA:559,0
+DA:560,0
+DA:563,0
+DA:568,0
+DA:569,0
+DA:570,0
+DA:571,0
+DA:573,0
+DA:574,0
+DA:576,0
+DA:577,0
+DA:578,0
+DA:579,0
+DA:581,0
+DA:582,0
+DA:585,0
+DA:586,0
+DA:587,0
+DA:594,0
+DA:595,0
+DA:596,0
+DA:599,0
+DA:600,0
+LF:299
+LH:0
+end_of_record
+SF:lib/src/render/editor/editor_entry.dart
+DA:8,9
+DA:10,9
+DA:11,18
+DA:12,9
+DA:13,9
+DA:17,9
+DA:18,9
+DA:19,18
+DA:24,9
+DA:28,9
+DA:33,9
+DA:35,9
+DA:37,18
+DA:38,9
+DA:39,9
+DA:40,36
+DA:41,9
+DA:42,9
+DA:45,9
+DA:47,0
+DA:50,0
+DA:54,9
+LF:22
+LH:20
+end_of_record
+SF:lib/src/render/rich_text/bulleted_list_text.dart
+DA:12,3
+DA:14,3
+DA:15,6
+DA:16,3
+DA:17,3
+DA:21,3
+DA:22,3
+DA:28,3
+DA:32,3
+DA:37,3
+DA:39,3
+DA:53,3
+DA:55,6
+DA:57,3
+DA:59,12
+DA:61,3
+DA:63,3
+DA:64,3
+DA:65,3
+DA:67,3
+DA:68,3
+DA:69,3
+DA:70,6
+DA:72,6
+DA:75,3
+DA:76,3
+DA:77,3
+DA:79,6
+DA:80,6
+LF:29
+LH:29
+end_of_record
+SF:lib/src/render/rich_text/default_selectable.dart
+DA:11,18
+DA:12,18
+DA:13,30
+DA:14,10
+DA:15,30
+DA:21,0
+DA:22,0
+DA:24,18
+DA:25,72
+DA:27,10
+DA:28,5
+DA:29,20
+DA:30,5
+DA:32,0
+DA:33,0
+DA:35,60
+DA:37,0
+DA:38,0
+DA:40,15
+DA:42,15
+LF:20
+LH:14
+end_of_record
+SF:lib/src/render/rich_text/flowy_rich_text.dart
+DA:19,9
+DA:28,9
+DA:38,9
+DA:39,9
+DA:48,9
+DA:49,27
+DA:51,2
+DA:52,6
+DA:54,9
+DA:56,9
+DA:59,5
+DA:60,20
+DA:62,5
+DA:63,5
+DA:64,35
+DA:66,7
+DA:68,14
+DA:70,14
+DA:71,14
+DA:72,14
+DA:73,4
+DA:76,7
+DA:77,35
+DA:78,7
+DA:79,14
+DA:85,0
+DA:87,0
+DA:88,0
+DA:89,0
+DA:92,0
+DA:94,0
+DA:95,0
+DA:96,0
+DA:97,0
+DA:98,0
+DA:99,0
+DA:102,5
+DA:104,25
+DA:105,30
+DA:107,5
+DA:108,10
+DA:109,10
+DA:111,5
+DA:112,5
+DA:113,15
+DA:114,5
+DA:117,0
+DA:119,0
+DA:120,0
+DA:121,0
+DA:122,0
+DA:123,0
+DA:124,0
+DA:130,9
+DA:131,9
+DA:133,36
+DA:134,2
+DA:135,2
+DA:136,2
+DA:137,2
+DA:140,9
+DA:144,2
+DA:145,2
+DA:146,2
+DA:147,2
+DA:150,4
+DA:151,6
+DA:156,9
+DA:157,9
+DA:158,9
+DA:159,9
+DA:162,18
+DA:163,12
+DA:169,0
+DA:170,0
+DA:172,0
+DA:173,0
+DA:174,0
+DA:175,0
+DA:176,0
+DA:177,0
+DA:178,0
+DA:181,0
+DA:185,0
+DA:190,9
+DA:192,18
+DA:195,18
+DA:196,27
+DA:197,9
+DA:198,27
+DA:199,17
+DA:200,9
+DA:201,9
+DA:202,9
+DA:203,9
+DA:206,6
+DA:207,2
+DA:208,4
+DA:209,2
+DA:212,2
+DA:213,2
+LF:101
+LH:72
+end_of_record
+SF:lib/src/render/rich_text/checkbox_text.dart
+DA:13,4
+DA:15,4
+DA:16,8
+DA:17,4
+DA:18,4
+DA:22,4
+DA:23,4
+DA:24,8
+DA:29,4
+DA:33,4
+DA:38,4
+DA:39,4
+DA:51,4
+DA:53,8
+DA:55,4
+DA:57,16
+DA:58,4
+DA:60,0
+DA:64,4
+DA:65,16
+DA:66,16
+DA:67,4
+DA:69,4
+DA:70,4
+DA:71,4
+DA:73,4
+DA:74,4
+DA:75,4
+DA:76,4
+DA:77,8
+DA:78,4
+DA:79,4
+DA:82,1
+DA:83,2
+DA:84,3
+DA:85,4
+DA:88,1
+DA:91,4
+DA:92,4
+DA:93,4
+DA:95,8
+DA:96,4
+DA:97,4
+DA:98,8
+DA:106,0
+DA:107,0
+DA:109,0
+DA:110,0
+DA:111,0
+DA:112,0
+DA:116,0
+DA:117,0
+DA:118,0
+DA:119,0
+DA:120,0
+DA:121,0
+DA:122,0
+DA:125,0
+DA:127,0
+DA:130,0
+DA:134,0
+DA:142,4
+DA:143,4
+DA:144,4
+DA:145,4
+DA:146,4
+DA:147,8
+DA:148,4
+DA:149,16
+DA:150,8
+DA:152,8
+DA:154,8
+DA:155,12
+DA:158,3
+DA:159,4
+DA:162,4
+LF:76
+LH:58
+end_of_record
+SF:lib/src/render/rich_text/heading_text.dart
+DA:11,2
+DA:13,2
+DA:14,4
+DA:15,2
+DA:16,2
+DA:20,2
+DA:21,2
+DA:22,4
+DA:27,2
+DA:31,2
+DA:36,2
+DA:37,2
+DA:44,0
+DA:50,2
+DA:52,4
+DA:54,2
+DA:56,4
+DA:59,2
+DA:61,2
+DA:62,2
+DA:63,2
+DA:66,2
+DA:68,2
+DA:69,2
+DA:71,2
+DA:72,2
+DA:73,4
+DA:74,4
+DA:80,2
+DA:81,2
+DA:82,2
+DA:83,2
+DA:84,2
+DA:85,4
+DA:86,2
+DA:87,4
+DA:88,8
+DA:90,2
+DA:93,2
+DA:97,0
+DA:98,0
+DA:99,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:103,0
+DA:104,0
+DA:105,0
+DA:107,0
+DA:110,0
+LF:50
+LH:38
+end_of_record
+SF:lib/src/render/rich_text/number_list_text.dart
+DA:12,1
+DA:14,1
+DA:15,2
+DA:16,1
+DA:17,1
+DA:21,1
+DA:22,1
+DA:23,2
+DA:28,1
+DA:32,1
+DA:37,1
+DA:39,1
+DA:53,1
+DA:55,2
+DA:57,1
+DA:59,4
+DA:60,1
+DA:61,1
+DA:62,1
+DA:64,1
+DA:66,1
+DA:67,1
+DA:68,1
+DA:69,2
+DA:71,2
+DA:72,4
+DA:74,1
+DA:75,1
+DA:76,1
+DA:78,2
+DA:79,2
+LF:31
+LH:31
+end_of_record
+SF:lib/src/render/rich_text/quoted_text.dart
+DA:12,2
+DA:14,2
+DA:15,4
+DA:16,2
+DA:17,2
+DA:21,2
+DA:22,2
+DA:28,2
+DA:32,2
+DA:37,2
+DA:38,2
+DA:52,2
+DA:54,4
+DA:56,2
+DA:58,8
+DA:59,2
+DA:61,2
+DA:62,2
+DA:63,2
+DA:65,2
+DA:66,2
+DA:67,2
+DA:68,6
+DA:70,4
+DA:73,2
+DA:74,2
+DA:75,2
+DA:77,4
+DA:78,4
+DA:86,2
+DA:88,16
+DA:89,6
+LF:32
+LH:32
+end_of_record
+SF:lib/src/render/rich_text/rich_text.dart
+DA:12,8
+DA:14,8
+DA:15,16
+DA:16,8
+DA:17,8
+DA:21,8
+DA:22,8
+DA:28,8
+DA:32,8
+DA:37,8
+DA:38,8
+DA:45,8
+DA:50,8
+DA:52,16
+DA:54,8
+DA:56,8
+DA:58,8
+DA:59,8
+DA:60,8
+DA:61,8
+DA:62,16
+DA:63,16
+LF:22
+LH:22
+end_of_record
+SF:lib/src/render/selection/cursor_widget.dart
+DA:6,7
+DA:12,7
+DA:19,7
+DA:20,7
+DA:27,7
+DA:29,7
+DA:31,14
+DA:34,7
+DA:36,14
+DA:37,7
+DA:40,7
+DA:41,7
+DA:42,35
+DA:43,2
+DA:44,4
+DA:45,4
+DA:51,4
+DA:52,8
+DA:53,4
+DA:55,8
+DA:56,8
+DA:59,7
+DA:61,7
+DA:62,14
+DA:63,7
+DA:64,14
+DA:65,21
+DA:69,7
+DA:70,7
+DA:71,21
+LF:30
+LH:30
+end_of_record
+SF:lib/src/render/selection/selection_widget.dart
+DA:4,5
+DA:9,5
+DA:15,5
+DA:16,5
+DA:20,5
+DA:22,5
+DA:23,10
+DA:24,5
+DA:25,10
+DA:26,15
+DA:30,5
+DA:31,5
+DA:32,10
+LF:13
+LH:13
+end_of_record
+SF:lib/src/render/selection/toolbar_widget.dart
+DA:12,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:16,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:26,0
+DA:38,5
+DA:44,5
+DA:51,5
+DA:52,5
+DA:68,5
+DA:70,5
+DA:71,15
+DA:72,15
+DA:73,5
+DA:74,10
+DA:76,10
+DA:77,5
+DA:82,5
+DA:84,5
+DA:85,5
+DA:88,5
+DA:89,5
+DA:90,10
+DA:92,5
+DA:93,5
+DA:94,5
+DA:96,5
+DA:97,5
+DA:98,5
+DA:99,5
+DA:100,5
+DA:101,5
+DA:102,5
+DA:103,5
+DA:104,5
+DA:105,5
+DA:106,5
+DA:113,5
+DA:114,5
+DA:116,5
+DA:117,5
+DA:118,0
+DA:122,5
+DA:124,5
+DA:128,5
+DA:129,0
+DA:130,5
+DA:132,10
+DA:133,10
+DA:134,5
+DA:135,5
+DA:136,5
+DA:144,0
+DA:146,0
+DA:148,0
+DA:150,0
+DA:151,0
+DA:152,0
+DA:154,0
+DA:155,0
+DA:156,0
+DA:158,0
+DA:159,0
+DA:160,0
+DA:161,0
+DA:164,0
+DA:165,0
+DA:166,0
+DA:169,0
+DA:170,0
+DA:171,0
+DA:177,0
+DA:179,0
+DA:180,0
+DA:187,0
+DA:188,0
+DA:198,0
+DA:201,0
+DA:202,0
+DA:203,0
+DA:206,0
+LF:89
+LH:45
+end_of_record
+SF:lib/src/service/default_text_operations/format_rich_text_style.dart
+DA:11,0
+DA:12,0
+DA:18,0
+DA:19,0
+DA:24,0
+DA:25,0
+DA:31,0
+DA:32,0
+DA:37,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:45,0
+DA:46,0
+DA:47,0
+DA:49,0
+DA:50,0
+DA:52,0
+DA:54,0
+DA:56,0
+DA:57,0
+DA:59,0
+DA:65,0
+DA:66,0
+DA:69,0
+DA:70,0
+DA:76,0
+DA:77,0
+DA:82,0
+DA:83,0
+DA:89,0
+DA:90,0
+DA:95,0
+DA:96,0
+DA:97,0
+DA:99,0
+DA:103,0
+DA:105,0
+DA:107,0
+DA:109,0
+DA:110,0
+DA:111,0
+DA:112,0
+DA:114,0
+DA:115,0
+DA:116,0
+DA:117,0
+DA:122,0
+DA:126,1
+DA:127,1
+DA:130,1
+DA:131,1
+DA:134,1
+DA:135,1
+DA:138,1
+DA:139,1
+DA:142,1
+DA:143,4
+DA:144,3
+DA:145,2
+DA:147,1
+DA:151,1
+DA:152,1
+DA:156,1
+DA:159,1
+DA:160,4
+DA:161,3
+DA:167,1
+DA:168,1
+DA:170,2
+DA:171,1
+DA:175,1
+DA:180,5
+DA:181,1
+DA:182,1
+DA:183,2
+DA:184,5
+DA:188,3
+DA:189,1
+DA:191,2
+DA:192,3
+DA:193,2
+DA:194,5
+DA:195,5
+DA:196,2
+DA:198,1
+DA:207,1
+LF:87
+LH:39
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/default_key_event_handlers.dart
+DA:13,27
+DA:14,9
+DA:15,9
+DA:16,9
+DA:17,9
+DA:18,9
+DA:19,9
+DA:20,9
+DA:21,9
+DA:22,9
+DA:23,9
+LF:11
+LH:11
+end_of_record
+SF:lib/src/service/toolbar_service.dart
+DA:16,9
+DA:20,9
+DA:25,9
+DA:26,9
+DA:34,5
+DA:36,5
+DA:38,10
+DA:39,10
+DA:40,5
+DA:41,10
+DA:43,10
+DA:47,20
+DA:50,9
+DA:52,28
+DA:53,14
+DA:54,9
+DA:57,9
+DA:59,9
+DA:60,18
+DA:64,9
+DA:66,9
+DA:68,9
+LF:22
+LH:22
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/arrow_keys_handler.dart
+DA:5,0
+DA:6,0
+DA:7,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:16,0
+DA:18,0
+DA:19,0
+DA:24,0
+DA:25,0
+DA:27,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:37,0
+DA:42,0
+DA:43,0
+DA:45,0
+DA:50,0
+DA:51,0
+DA:52,0
+DA:55,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:61,0
+DA:62,0
+DA:63,0
+DA:66,0
+DA:67,0
+DA:68,0
+DA:69,0
+DA:72,2
+DA:73,2
+DA:78,4
+DA:79,0
+DA:80,0
+DA:82,0
+DA:84,4
+DA:85,0
+DA:86,0
+DA:88,0
+DA:90,4
+DA:91,0
+DA:92,0
+DA:94,0
+DA:96,4
+DA:97,0
+DA:98,0
+DA:100,0
+DA:106,24
+DA:107,6
+DA:108,2
+DA:111,6
+DA:116,10
+DA:117,0
+DA:118,0
+DA:120,0
+DA:124,0
+DA:127,10
+DA:128,0
+DA:129,0
+DA:131,0
+DA:134,0
+DA:137,10
+DA:138,0
+DA:139,0
+DA:140,0
+DA:142,10
+DA:143,0
+DA:144,0
+DA:145,0
+LF:75
+LH:14
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/copy_paste_handler.dart
+DA:8,0
+DA:9,0
+DA:10,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:25,0
+DA:30,0
+DA:31,0
+DA:33,0
+DA:35,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:44,0
+DA:45,0
+DA:50,0
+DA:52,0
+DA:53,0
+DA:57,0
+DA:58,0
+DA:60,0
+DA:62,0
+DA:63,0
+DA:64,0
+DA:65,0
+DA:66,0
+DA:67,0
+DA:70,0
+DA:71,0
+DA:72,0
+DA:73,0
+DA:74,0
+DA:79,0
+DA:82,0
+DA:84,0
+DA:86,0
+DA:87,0
+DA:89,0
+DA:93,0
+DA:95,0
+DA:97,0
+DA:98,0
+DA:99,0
+DA:100,0
+DA:101,0
+DA:103,0
+DA:104,0
+DA:105,0
+DA:106,0
+DA:107,0
+DA:108,0
+DA:109,0
+DA:110,0
+DA:113,0
+DA:116,0
+DA:117,0
+DA:121,0
+DA:122,0
+DA:123,0
+DA:126,0
+DA:127,0
+DA:129,0
+DA:130,0
+DA:134,0
+DA:136,0
+DA:137,0
+DA:141,0
+DA:142,0
+DA:143,0
+DA:146,0
+DA:147,0
+DA:152,0
+DA:153,0
+DA:154,0
+DA:155,0
+DA:156,0
+DA:158,0
+DA:159,0
+DA:160,0
+DA:161,0
+DA:162,0
+DA:163,0
+DA:168,0
+DA:169,0
+DA:170,0
+DA:172,0
+DA:176,0
+DA:177,0
+DA:178,0
+DA:180,0
+DA:181,0
+DA:182,0
+DA:185,0
+DA:186,0
+DA:192,0
+DA:193,0
+DA:199,0
+DA:200,0
+DA:201,0
+DA:203,0
+DA:205,0
+DA:207,0
+DA:209,0
+DA:210,0
+DA:211,0
+DA:213,0
+DA:214,0
+DA:219,0
+DA:220,0
+DA:222,0
+DA:224,0
+DA:225,0
+DA:226,0
+DA:227,0
+DA:229,0
+DA:231,0
+DA:232,0
+DA:234,0
+DA:236,0
+DA:237,0
+DA:238,0
+DA:239,0
+DA:241,0
+DA:242,0
+DA:245,0
+DA:246,0
+DA:252,0
+DA:253,0
+DA:254,0
+DA:255,0
+DA:258,0
+DA:259,0
+DA:260,0
+DA:263,0
+DA:264,0
+DA:265,0
+DA:266,0
+DA:268,0
+DA:269,0
+DA:270,0
+DA:272,0
+DA:273,0
+DA:274,0
+DA:275,0
+DA:276,0
+DA:279,0
+DA:281,0
+DA:282,0
+DA:283,0
+DA:284,0
+DA:286,0
+DA:287,0
+DA:288,0
+DA:289,0
+DA:290,0
+DA:292,0
+DA:293,0
+DA:294,0
+DA:300,0
+DA:303,0
+DA:304,0
+DA:307,24
+DA:308,12
+DA:309,0
+DA:312,12
+DA:313,0
+DA:316,12
+DA:317,0
+LF:178
+LH:4
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/delete_text_handler.dart
+DA:6,2
+DA:7,8
+DA:11,6
+DA:12,6
+DA:13,4
+DA:15,4
+DA:16,6
+DA:20,2
+DA:21,4
+DA:22,1
+DA:23,4
+DA:24,2
+DA:26,1
+DA:28,2
+DA:31,2
+DA:32,1
+DA:33,1
+DA:40,1
+DA:41,2
+DA:42,1
+DA:44,1
+DA:45,1
+DA:46,2
+DA:47,1
+DA:48,1
+DA:49,2
+DA:57,1
+DA:58,1
+DA:61,3
+DA:64,1
+DA:66,2
+DA:67,5
+DA:72,2
+DA:75,4
+DA:76,2
+DA:82,1
+DA:83,4
+DA:87,3
+DA:88,3
+DA:89,2
+DA:91,2
+DA:92,3
+DA:96,1
+DA:97,2
+DA:98,1
+DA:99,5
+DA:100,2
+DA:101,1
+DA:105,1
+DA:106,1
+DA:108,1
+DA:110,4
+DA:111,1
+DA:112,1
+DA:114,2
+DA:115,3
+DA:118,1
+DA:120,2
+DA:121,5
+DA:126,1
+DA:129,1
+DA:134,2
+DA:136,2
+DA:137,2
+DA:138,4
+DA:139,8
+DA:143,4
+DA:144,2
+DA:147,4
+DA:148,4
+DA:153,26
+DA:154,16
+DA:155,2
+DA:157,16
+DA:158,1
+LF:75
+LH:75
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/enter_without_shift_in_text_node_handler.dart
+DA:21,18
+DA:22,5
+DA:23,11
+DA:27,4
+DA:28,3
+DA:32,1
+DA:33,1
+DA:34,2
+DA:36,2
+DA:38,3
+DA:43,1
+DA:44,1
+DA:46,4
+DA:47,1
+DA:48,4
+DA:50,1
+DA:51,1
+DA:52,1
+DA:53,2
+DA:54,3
+DA:56,1
+DA:57,1
+DA:58,1
+DA:60,2
+DA:62,1
+DA:63,1
+DA:68,2
+DA:72,1
+DA:76,4
+DA:77,3
+DA:78,1
+DA:79,2
+DA:81,1
+DA:82,1
+DA:84,1
+DA:85,1
+DA:86,1
+DA:88,1
+DA:89,1
+DA:91,1
+DA:92,3
+DA:94,1
+DA:95,1
+DA:96,1
+DA:97,1
+DA:99,1
+DA:100,1
+DA:107,1
+DA:108,3
+DA:109,2
+DA:110,1
+DA:112,2
+DA:113,1
+DA:114,1
+DA:117,1
+DA:118,3
+DA:120,1
+DA:121,1
+DA:122,2
+DA:123,1
+DA:125,4
+DA:128,1
+DA:130,2
+DA:131,5
+DA:133,1
+DA:134,1
+LF:66
+LH:66
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/redo_undo_handler.dart
+DA:5,24
+DA:6,12
+DA:7,1
+DA:8,2
+DA:10,2
+LF:5
+LH:5
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/slash_handler.dart
+DA:14,1
+DA:15,1
+DA:17,3
+DA:18,1
+DA:20,1
+DA:21,1
+DA:22,0
+DA:23,0
+DA:26,1
+DA:28,1
+DA:29,1
+DA:30,0
+DA:31,0
+DA:33,1
+DA:35,1
+DA:36,1
+DA:37,0
+DA:38,0
+DA:40,1
+DA:42,1
+DA:43,1
+DA:44,0
+DA:45,0
+DA:47,1
+DA:49,1
+DA:50,1
+DA:51,0
+DA:59,1
+DA:61,1
+DA:62,1
+DA:63,0
+DA:70,25
+DA:71,14
+DA:75,3
+DA:76,1
+DA:77,2
+DA:81,4
+DA:82,1
+DA:83,1
+DA:84,1
+DA:88,3
+DA:89,1
+DA:92,1
+DA:93,3
+DA:94,6
+DA:95,1
+DA:98,3
+DA:101,3
+DA:102,1
+DA:103,3
+DA:104,1
+DA:106,3
+DA:108,3
+DA:114,1
+DA:116,0
+DA:117,1
+DA:118,2
+DA:119,1
+DA:120,1
+DA:121,1
+DA:123,1
+DA:128,2
+DA:131,1
+DA:136,3
+DA:139,4
+DA:148,1
+DA:151,3
+DA:152,3
+DA:157,1
+DA:162,1
+DA:168,1
+DA:169,1
+DA:180,0
+DA:181,0
+DA:182,0
+DA:184,0
+DA:185,0
+DA:186,0
+DA:187,0
+DA:188,0
+DA:190,0
+DA:191,0
+DA:192,0
+DA:195,0
+DA:198,0
+DA:199,0
+DA:201,0
+DA:202,0
+DA:203,0
+DA:208,1
+DA:210,1
+DA:212,3
+DA:214,3
+DA:215,2
+DA:219,1
+DA:221,2
+DA:223,1
+DA:226,1
+DA:228,1
+DA:229,1
+DA:230,1
+DA:231,1
+DA:232,1
+DA:234,1
+DA:235,1
+DA:238,1
+DA:241,1
+DA:243,2
+DA:244,0
+DA:245,1
+DA:247,3
+DA:253,0
+DA:268,1
+DA:269,1
+DA:270,1
+DA:271,3
+DA:272,5
+DA:273,2
+DA:277,1
+DA:279,2
+DA:280,2
+DA:281,1
+DA:282,1
+DA:285,1
+DA:286,2
+DA:290,1
+DA:295,0
+DA:296,0
+DA:297,0
+DA:301,0
+DA:308,0
+DA:309,0
+DA:310,0
+DA:311,0
+DA:314,0
+DA:315,0
+DA:317,0
+DA:318,0
+DA:319,0
+DA:321,0
+DA:323,0
+DA:325,0
+DA:326,0
+DA:327,0
+DA:328,0
+DA:332,0
+DA:333,0
+DA:334,0
+DA:335,0
+DA:336,0
+DA:337,0
+DA:338,0
+DA:339,0
+DA:340,0
+DA:342,0
+DA:343,0
+DA:344,0
+DA:351,0
+DA:353,0
+DA:355,0
+DA:356,0
+DA:358,0
+DA:359,0
+DA:360,0
+DA:361,0
+DA:364,0
+DA:368,0
+DA:370,0
+DA:372,0
+DA:373,0
+DA:375,0
+DA:376,0
+DA:377,0
+DA:378,0
+DA:381,0
+DA:387,1
+DA:392,1
+DA:398,1
+DA:400,1
+DA:402,1
+DA:404,1
+DA:405,2
+DA:406,1
+DA:408,1
+DA:411,1
+DA:412,1
+DA:413,1
+DA:415,1
+DA:416,2
+DA:423,0
+DA:424,0
+DA:433,1
+DA:448,2
+DA:449,1
+LF:194
+LH:113
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/update_text_style_by_command_x_handler.dart
+DA:8,22
+DA:9,4
+DA:13,8
+DA:14,6
+DA:15,4
+DA:17,1
+DA:21,2
+DA:22,1
+DA:24,2
+DA:25,1
+DA:27,2
+DA:28,1
+DA:30,2
+DA:31,1
+DA:32,1
+LF:15
+LH:15
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/whitespace_handler.dart
+DA:12,1
+DA:14,1
+DA:16,1
+DA:23,21
+DA:24,6
+DA:32,4
+DA:33,1
+DA:37,3
+DA:38,1
+DA:39,2
+DA:43,1
+DA:44,1
+DA:45,3
+DA:46,1
+DA:47,2
+DA:48,1
+DA:49,2
+DA:50,1
+DA:56,1
+DA:57,2
+DA:60,1
+DA:61,1
+DA:62,2
+DA:65,2
+DA:66,1
+DA:67,1
+DA:71,1
+DA:75,1
+DA:76,2
+DA:81,1
+DA:82,3
+DA:83,1
+DA:84,1
+DA:87,1
+DA:88,3
+DA:89,1
+DA:93,1
+DA:94,2
+DA:95,2
+DA:99,2
+DA:100,1
+DA:101,1
+DA:105,1
+DA:109,1
+DA:111,1
+DA:112,1
+DA:115,1
+DA:116,3
+DA:119,1
+DA:120,1
+DA:121,2
+DA:125,2
+DA:126,1
+DA:127,1
+DA:131,1
+DA:135,1
+DA:136,2
+DA:137,5
+LF:58
+LH:58
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/select_all_handler.dart
+DA:5,1
+DA:6,4
+DA:9,4
+DA:10,4
+DA:12,1
+DA:13,2
+DA:15,2
+DA:16,2
+DA:17,2
+DA:21,21
+DA:22,5
+DA:23,1
+LF:12
+LH:12
+end_of_record
+SF:lib/src/service/internal_key_event_handlers/page_up_down_handler.dart
+DA:5,20
+DA:6,4
+DA:7,3
+DA:8,2
+DA:10,3
+DA:13,4
+DA:14,3
+DA:15,2
+DA:17,3
+LF:9
+LH:9
+end_of_record
+SF:lib/src/service/selection/selection_gesture.dart
+DA:10,9
+DA:19,9
+DA:21,9
+DA:23,9
+DA:43,9
+DA:45,9
+DA:47,9
+DA:49,9
+DA:50,18
+DA:51,9
+DA:53,27
+DA:54,27
+DA:55,27
+DA:59,9
+DA:60,18
+DA:61,9
+DA:62,18
+DA:66,18
+DA:70,0
+DA:71,0
+DA:72,0
+DA:73,0
+DA:74,0
+DA:75,0
+DA:76,0
+DA:78,0
+DA:79,0
+DA:80,0
+DA:81,0
+DA:82,0
+DA:83,0
+DA:85,0
+DA:87,0
+DA:88,0
+DA:91,0
+DA:92,0
+DA:93,0
+DA:94,0
+DA:95,0
+DA:98,0
+DA:99,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:107,9
+DA:109,9
+DA:110,9
+DA:111,9
+LF:48
+LH:22
+end_of_record

+ 14 - 0
frontend/app_flowy/packages/flowy_editor/documentation/contributing.md

@@ -0,0 +1,14 @@
+# Contributing
+
+## Reporting Bugs
+补充截图,在 Appflowy 仓库增加一个 editor bug 的截图
+
+## 技术讨论与支持
+补充discord截图,editor那个群
+
+## 提交PR
+我们很欢迎和appreciate大家提交的PR。我们也有很多first-contributor-welcome or help-wanted 的 issue 欢迎大家一起来实现。
+
+BTW: 正如ReadMe所说,我们想保证大家提交的代码不会影响到现有的代码逻辑和功能,所以每次提交PR请附上对应的test,建议在test加上对测试用例,范围的简单描述。更多细节请看test.md
+
+最后,重复一句,由于我们是社区驱动的开源编辑器,所以我们会认真对待每一个PR以及每一次的PR,非常感觉大家的贡献。

+ 129 - 0
frontend/app_flowy/packages/flowy_editor/documentation/testing.md

@@ -0,0 +1,129 @@
+# Testing
+
+目前测试文件的目录结构与代码文件的目录结构是保持一致的,这样方便我们查找新增文件的测试情况,以及方便检索对应文件的测试代码路径。
+
+## 提供的测试方法
+
+
+构造测试的文档数据
+```dart
+const text = 'Welcome to Appflowy 😁';
+// 获取编辑器
+final editor = tester.editor;
+// 插入空的文本节点
+editor.insertEmptyTextNode();
+// 插入带信息的文本节点
+editor.insertTextNode(text);
+// 插入样式heading的文本节点
+editor.insertTextNode(text, attributes: {
+    StyleKey.subtype: StyleKey.heading,
+    StyleKey.heading: StyleKey.h1,
+});
+// 插入样式bulleted list的加粗的文本节点
+editor.insertTextNode(
+    '',
+    attributes: {
+        StyleKey.subtype: StyleKey.bulletedList,
+    },
+    delta: Delta([
+        TextInsert(text, {StyleKey.bold: true}),
+    ]),
+);
+```
+
+在测试前必须调用
+```dart
+await editor.startTesting();
+```
+
+获取当前渲染的节点数量
+```dart
+final length = editor.documentLength;
+print(length);
+```
+
+获取节点
+```dart
+// 获取上述文档结构中的第一个文本节点
+final firstTextNode = editor.nodeAtPath([0]) as TextNode;
+```
+
+更新选区信息
+```dart
+await editor.updateSelection(
+    Selection.single(path: firstTextNode.path, startOffset: 0),
+);
+```
+
+获取选区信息
+```dart
+final selection = editor.documentSelection;
+print(selection);
+```
+
+模拟快捷键输入
+```dart
+// 输入 command + A
+await editor.pressLogicKey(LogicalKeyboardKey.keyA, isMetaPressed: true);
+// 输入 command + shift + S
+await editor.pressLogicKey(
+    LogicalKeyboardKey.keyS, 
+    isMetaPressed: true, 
+    isShiftPressed: true,
+);
+```
+
+模拟文字输入
+```dart
+// 在第一个节点的最起始位置插入'Hello World'
+editor.insertText(firstTextNode, 'Hello World', 0);
+```
+
+获取文本节点的信息
+```dart
+// 获取纯文字
+final textAfterInserted = firstTextNode.toRawString();
+print(textAfterInserted);
+// 获取文字的描述信息
+final attributes = firstTextNode.attributes;
+print(attributes);
+```
+
+## Example
+例如,目前需要测试 select_all_handler.dart 的文件
+
+完整的例子
+```dart
+import 'package:flowy_editor/flowy_editor.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import '../../infra/test_editor.dart';
+
+void main() async {
+  setUpAll(() {
+    TestWidgetsFlutterBinding.ensureInitialized();
+  });
+
+  group('select_all_handler_test.dart', () {
+    testWidgets('Presses Command + A in the document', (tester) async {
+        const lines = 100;
+        const text = 'Welcome to Appflowy 😁';
+        final editor = tester.editor;
+        for (var i = 0; i < lines; i++) {
+            editor.insertTextNode(text);
+        }
+        await editor.startTesting();
+        await editor.pressLogicKey(LogicalKeyboardKey.keyA, isMetaPressed: true);
+
+        expect(
+            editor.documentSelection,
+            Selection(
+            start: Position(path: [0], offset: 0),
+            end: Position(path: [lines - 1], offset: text.length),
+            ),
+        );
+    });
+}
+```
+
+其余关于测试的,例如模拟点击等信息请参考 [An introduction to widget testing](https://docs.flutter.dev/cookbook/testing/widget/introduction) 

+ 6 - 34
frontend/app_flowy/packages/flowy_editor/example/lib/main.dart

@@ -1,4 +1,3 @@
-import 'dart:collection';
 import 'dart:convert';
 
 import 'package:flutter/material.dart';
@@ -77,8 +76,6 @@ class _MyHomePageState extends State<MyHomePage> {
     } else if (page == 1) {
       return _buildFlowyEditorWithEmptyDocument();
     } else if (page == 2) {
-      return _buildTextField();
-    } else if (page == 3) {
       return _buildFlowyEditorWithBigDocument();
     }
     return Container();
@@ -115,37 +112,18 @@ class _MyHomePageState extends State<MyHomePage> {
           },
           icon: const Icon(Icons.text_fields),
         ),
-        ActionButton(
-          onPressed: () {
-            if (page == 3) return;
-            setState(() {
-              page = 3;
-            });
-          },
-          icon: const Icon(Icons.email),
-        ),
       ],
     );
   }
 
   Widget _buildFlowyEditorWithEmptyDocument() {
-    return _buildFlowyEditor(
-      EditorState(
-        document: StateTree(
-          root: Node(
-            type: 'editor',
-            children: LinkedList()
-              ..add(
-                TextNode.empty()
-                  ..delta = Delta(
-                    [TextInsert('')],
-                  ),
-              ),
-            attributes: {},
-          ),
-        ),
-      ),
+    final editorState = EditorState.empty();
+    final editor = FlowyEditor(
+      editorState: editorState,
+      keyEventHandlers: const [],
+      customBuilders: const {},
     );
+    return editor;
   }
 
   Widget _buildFlowyEditorWithExample() {
@@ -198,10 +176,4 @@ class _MyHomePageState extends State<MyHomePage> {
       ),
     );
   }
-
-  Widget _buildTextField() {
-    return const Center(
-      child: TextField(),
-    );
-  }
 }

+ 13 - 0
frontend/app_flowy/packages/flowy_editor/lib/src/document/state_tree.dart

@@ -12,6 +12,19 @@ class StateTree {
     required this.root,
   });
 
+  factory StateTree.empty() {
+    return StateTree(
+      root: Node.fromJson({
+        'type': 'editor',
+        'children': [
+          {
+            'type': 'text',
+          }
+        ]
+      }),
+    );
+  }
+
   factory StateTree.fromJson(Attributes json) {
     assert(json['document'] is Map);
 

+ 4 - 0
frontend/app_flowy/packages/flowy_editor/lib/src/editor_state.dart

@@ -75,6 +75,10 @@ class EditorState {
     undoManager.state = this;
   }
 
+  factory EditorState.empty() {
+    return EditorState(document: StateTree.empty());
+  }
+
   /// Apply the transaction to the state.
   ///
   /// The options can be used to determine whether the editor