mapToDocument function
Deserialize a Map into a super_editor MutableDocument
Some nodes, metadata and attributions might not be mapped.
Implementation
MutableDocument mapToDocument(Map<String, dynamic> map) {
bool hasOrder = map.containsKey('\$order');
bool hasNodes = map.containsKey('\$nodes');
var nodes = hasNodes ? map['\$nodes'] : map;
if (hasOrder && nodes is Map) {
final List order = map['\$order'];
Map<String, dynamic> tempNodes = {};
for (var i = 0; i < order.length; i++) {
final orderItem = order.elementAt(i).toString();
tempNodes[orderItem] = nodes[orderItem];
}
if (tempNodes.length != nodes.length) {
for (var i = 0; i < nodes.length; i++) {
final node = nodes.entries.elementAt(i);
tempNodes.putIfAbsent(node.key, () => node.value);
}
}
nodes = tempNodes;
}
if (nodes is List) {
nodes = nodes.asMap().map((key, value) => MapEntry('$key', value));
}
List<DocumentNode>? content = List.empty(growable: true);
for (final node in (nodes as Map<String, dynamic>).entries) {
final key = node.key;
final value = node.value;
final id = key.startsWith('\$\$')
? key.replaceAll('\$\$', '').replaceAll('_', '-')
: DocumentEditor.createNodeId();
if (value is! Map<String, dynamic>) break;
final nodeType = value['type'];
switch (nodeType) {
case 'ParagraphNode':
content.add(
ParagraphNode(
id: id,
text: AttributedText(value['text'], _setSpans(value['spans'])),
metadata: _setMeta(value['metadata']),
),
);
break;
case 'HorizontalRuleNode':
content.add(
HorizontalRuleNode(
id: id,
),
);
break;
case 'ImageNode':
content.add(
ImageNode(
id: id,
imageUrl: value['imageUrl'],
altText: value['altText'],
metadata: _setMeta(value['metadata']),
),
);
break;
case 'ListItemNode':
content.add(
ListItemNode(
id: id,
itemType: ListItemType.values.elementAt(value['itemType']),
indent: value['indent'],
text: AttributedText(value['text'], _setSpans(value['spans'])),
metadata: _setMeta(value['metadata']),
),
);
break;
default:
break;
}
}
return MutableDocument(nodes: content);
}