mapToDocument function

MutableDocument mapToDocument(
  1. Map<String, dynamic> map
)

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);
}