documentToMap function
Serialize super_editor Document to a Map
Some nodes, metadata and attributions might not be mapped.
Implementation
Map<String, dynamic> documentToMap(
///The super_editor document that will be serialized
Document document, {
///Append a list of keys containing the order of nodes
///
/// This is useful if you are using something like Firebase Firestore with sorts data on creation
bool appendOrder = false,
///Will retain the node id found in the document
///
/// If `false` then nodes will be returned in a list
bool keepID = true,
}) {
assert(!(appendOrder && !keepID),
'AppendOrder is not available when keepID is false');
var nodes = keepID ? {} : List.empty(growable: true);
List<dynamic> order = List.empty(growable: true);
for (int i = 0; i < document.nodes.length; i++) {
final node = document.nodes.elementAt(i);
final id = '\$\$${node.id.replaceAll('-', '_')}';
order.add(id);
Map<String, dynamic>? data;
if (node is ImageNode) {
data = {
'altText': node.altText,
'imageUrl': node.imageUrl,
..._getMeta(node)
};
} else if (node is HorizontalRuleNode) {
data = _getMeta(node);
} else if (node is ListItemNode) {
data = {
'itemType': node.type.index,
'indent': node.indent,
..._getTextMeta(node),
};
} else if (node is ParagraphNode) {
data = _getTextMeta(node);
}
if (nodes is Map) {
nodes[id] = data;
} else if (nodes is List) {
nodes.add(data);
}
}
if (nodes is Map) {
if (appendOrder) {
return {
'\$nodes': nodes,
'\$order': order,
};
} else {
return Map<String, dynamic>.from(nodes);
}
} else {
return {
'\$nodes': nodes,
};
}
}