mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
refactor: move attributes to core/document
This commit is contained in:
parent
11eca2b3d9
commit
cbb6b2d9b0
@ -9,7 +9,7 @@ export 'src/document/position.dart';
|
||||
export 'src/document/selection.dart';
|
||||
export 'src/document/state_tree.dart';
|
||||
export 'src/document/text_delta.dart';
|
||||
export 'src/document/attributes.dart';
|
||||
export 'src/core/document/attributes.dart';
|
||||
export 'src/document/built_in_attribute_keys.dart';
|
||||
export 'src/editor_state.dart';
|
||||
export 'src/operation/operation.dart';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:appflowy_editor/src/commands/format_text.dart';
|
||||
import 'package:appflowy_editor/src/commands/text_command_infra.dart';
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/document/built_in_attribute_keys.dart';
|
||||
import 'package:appflowy_editor/src/core/document/node.dart';
|
||||
import 'package:appflowy_editor/src/document/path.dart';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:appflowy_editor/src/commands/text_command_infra.dart';
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/node.dart';
|
||||
import 'package:appflowy_editor/src/document/path.dart';
|
||||
import 'package:appflowy_editor/src/document/selection.dart';
|
||||
|
@ -23,21 +23,27 @@ Attributes? composeAttributes(
|
||||
return attributes.isNotEmpty ? attributes : null;
|
||||
}
|
||||
|
||||
Attributes invertAttributes(Attributes? base, Attributes? other) {
|
||||
base ??= {};
|
||||
other ??= {};
|
||||
final Attributes attributes = base.keys.fold({}, (previousValue, key) {
|
||||
if (other!.containsKey(key) && other[key] != base![key]) {
|
||||
previousValue[key] = base[key];
|
||||
Attributes invertAttributes(Attributes? from, Attributes? to) {
|
||||
from ??= {};
|
||||
to ??= {};
|
||||
final attributes = Attributes.from({});
|
||||
|
||||
// key in from but not in to, or value is different
|
||||
for (final entry in from.entries) {
|
||||
if ((!to.containsKey(entry.key) && entry.value != null) ||
|
||||
to[entry.key] != entry.value) {
|
||||
attributes[entry.key] = entry.value;
|
||||
}
|
||||
return previousValue;
|
||||
});
|
||||
return other.keys.fold(attributes, (previousValue, key) {
|
||||
if (!base!.containsKey(key) && other![key] != base[key]) {
|
||||
previousValue[key] = null;
|
||||
}
|
||||
|
||||
// key in to but not in from, or value is different
|
||||
for (final entry in to.entries) {
|
||||
if (!from.containsKey(entry.key) && entry.value != null) {
|
||||
attributes[entry.key] = null;
|
||||
}
|
||||
return previousValue;
|
||||
});
|
||||
}
|
||||
|
||||
return attributes;
|
||||
}
|
||||
|
||||
int hashAttributes(Attributes base) => Object.hashAllUnordered(
|
@ -2,7 +2,7 @@ import 'dart:collection';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/document/built_in_attribute_keys.dart';
|
||||
import 'package:appflowy_editor/src/document/path.dart';
|
||||
import 'package:appflowy_editor/src/document/text_delta.dart';
|
||||
|
@ -3,7 +3,7 @@ import 'dart:math';
|
||||
import 'package:appflowy_editor/src/core/document/node.dart';
|
||||
import 'package:appflowy_editor/src/document/path.dart';
|
||||
import 'package:appflowy_editor/src/document/text_delta.dart';
|
||||
import './attributes.dart';
|
||||
import '../core/document/attributes.dart';
|
||||
|
||||
class StateTree {
|
||||
final Node root;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'dart:collection';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
// constant number: 2^53 - 1
|
||||
|
@ -1,4 +1,4 @@
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/document/built_in_attribute_keys.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'dart:collection';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/node.dart';
|
||||
import 'package:appflowy_editor/src/document/text_delta.dart';
|
||||
import 'package:appflowy_editor/src/extensions/color_extension.dart';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'dart:collection';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/node.dart';
|
||||
import 'package:appflowy_editor/src/document/path.dart';
|
||||
import 'package:appflowy_editor/src/document/position.dart';
|
||||
|
@ -1,4 +1,4 @@
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/node.dart';
|
||||
import 'package:appflowy_editor/src/document/position.dart';
|
||||
import 'package:appflowy_editor/src/document/selection.dart';
|
||||
|
@ -2,7 +2,7 @@ import 'package:appflowy_editor/src/document/selection.dart';
|
||||
import 'package:appflowy_editor/src/editor_state.dart';
|
||||
import 'package:appflowy_editor/src/document/built_in_attribute_keys.dart';
|
||||
import 'package:appflowy_editor/src/operation/transaction_builder.dart';
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
|
||||
void makeFollowingNodesIncremental(
|
||||
EditorState editorState, List<int> insertPath, Selection afterSelection,
|
||||
|
@ -0,0 +1,59 @@
|
||||
import 'package:appflowy_editor/appflowy_editor.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
void main() async {
|
||||
group('attributes.dart', () {
|
||||
test('composeAttributes', () {
|
||||
final base = {
|
||||
'a': 1,
|
||||
'b': 2,
|
||||
};
|
||||
final other = {
|
||||
'b': 3,
|
||||
'c': 4,
|
||||
'd': null,
|
||||
};
|
||||
expect(composeAttributes(base, other, keepNull: false), {
|
||||
'a': 1,
|
||||
'b': 3,
|
||||
'c': 4,
|
||||
});
|
||||
expect(composeAttributes(base, other, keepNull: true), {
|
||||
'a': 1,
|
||||
'b': 3,
|
||||
'c': 4,
|
||||
'd': null,
|
||||
});
|
||||
expect(composeAttributes(null, other, keepNull: false), {
|
||||
'b': 3,
|
||||
'c': 4,
|
||||
});
|
||||
expect(composeAttributes(base, null, keepNull: false), {
|
||||
'a': 1,
|
||||
'b': 2,
|
||||
});
|
||||
});
|
||||
|
||||
test('invertAttributes', () {
|
||||
final base = {
|
||||
'a': 1,
|
||||
'b': 2,
|
||||
};
|
||||
final other = {
|
||||
'b': 3,
|
||||
'c': 4,
|
||||
'd': null,
|
||||
};
|
||||
expect(invertAttributes(base, other), {
|
||||
'a': 1,
|
||||
'b': 2,
|
||||
'c': null,
|
||||
});
|
||||
expect(invertAttributes(other, base), {
|
||||
'a': null,
|
||||
'b': 3,
|
||||
'c': 4,
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
@ -147,5 +147,68 @@ void main() async {
|
||||
expect(identical(node.children, base.children), false);
|
||||
expect(identical(node.children.first, base.children.first), false);
|
||||
});
|
||||
|
||||
test('test insert', () {
|
||||
final base = Node(
|
||||
type: 'base',
|
||||
);
|
||||
|
||||
// insert at the front
|
||||
final childA = Node(
|
||||
type: 'child',
|
||||
);
|
||||
base.insert(childA, index: -1);
|
||||
expect(
|
||||
identical(base.childAtIndex(0), childA),
|
||||
true,
|
||||
);
|
||||
|
||||
// insert at the last
|
||||
final childB = Node(
|
||||
type: 'child',
|
||||
);
|
||||
base.insert(childB, index: 1000);
|
||||
expect(
|
||||
identical(base.childAtIndex(base.children.length - 1), childB),
|
||||
true,
|
||||
);
|
||||
|
||||
// insert at the last
|
||||
final childC = Node(
|
||||
type: 'child',
|
||||
);
|
||||
base.insert(childC);
|
||||
expect(
|
||||
identical(base.childAtIndex(base.children.length - 1), childC),
|
||||
true,
|
||||
);
|
||||
});
|
||||
|
||||
test('test fromJson', () {
|
||||
final node = Node.fromJson({
|
||||
'type': 'example',
|
||||
'attributes': {
|
||||
'example': 'example',
|
||||
},
|
||||
'children': [
|
||||
{
|
||||
'type': 'example',
|
||||
'attributes': {
|
||||
'example': 'example',
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
expect(node.type, 'example');
|
||||
expect(node.attributes, {'example': 'example'});
|
||||
expect(node.children.length, 1);
|
||||
expect(node.children.first.type, 'example');
|
||||
expect(node.children.first.attributes, {'example': 'example'});
|
||||
});
|
||||
|
||||
test('test toPlainText', () {
|
||||
final textNode = TextNode.empty()..delta = (Delta()..insert('AppFlowy'));
|
||||
expect(textNode.toPlainText(), 'AppFlowy');
|
||||
});
|
||||
});
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import 'package:appflowy_editor/src/document/attributes.dart';
|
||||
import 'package:appflowy_editor/src/core/document/attributes.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:appflowy_editor/src/document/text_delta.dart';
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user