documentToMap function

Map<String, dynamic> documentToMap(
  1. Document document, {
  2. bool appendOrder = false,
  3. bool keepID = true,
})

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