toMd method

String toMd({
  1. KeyValueBuilderDef? titleBuilder,
  2. KeyValueBuilderDef? listItemBuilder,
  3. int headingLevel = 1,
  4. bool metaDataToFrontMatter = true,
  5. String emojiKey = TSDefaults.emojiKey,
  6. String frontMatterKey = TSDefaults.metaDataKey,
  7. String nameKey = TSDefaults.nameKey,
  8. String descriptionKey = TSDefaults.descriptionKey,
  9. String valueKey = TSDefaults.valueKey,
  10. String valuesKey = TSDefaults.valuesKey,
  11. String itemsKey = TSDefaults.itemsKey,
})

Implementation

String toMd({
  KeyValueBuilderDef? titleBuilder,
  KeyValueBuilderDef? listItemBuilder,
  int headingLevel = 1,
  bool metaDataToFrontMatter = true,
  String emojiKey = TSDefaults.emojiKey,
  String frontMatterKey = TSDefaults.metaDataKey,
  String nameKey = TSDefaults.nameKey,
  String descriptionKey = TSDefaults.descriptionKey,
  String valueKey = TSDefaults.valueKey,
  String valuesKey = TSDefaults.valuesKey,
  String itemsKey = TSDefaults.itemsKey,
}) {
  final buffer = StringBuffer();
  if (metaDataToFrontMatter && headingLevel == 1) {
    final frontMatter = this[frontMatterKey];
    if (frontMatter is Map && frontMatter.isNotEmpty) {
      buffer.writeln('---');
      buffer.write(frontMatter.toYaml());
      buffer.writeln('---');
      buffer.writeln();
    }
    remove(frontMatterKey);
  }
  final headingPrefix = '#' * headingLevel;
  for (final entry in entries) {
    final key = entry.key.toString();
    final value = entry.value;
    if (value is Map) {
      final title = _mdTitle(
        emojiKey: emojiKey,
        nameKey: nameKey,
        map: value,
      );
      buffer.writeln('$headingPrefix $title');
      buffer.writeln();
      final remaining = Map.of(value)
        ..remove(nameKey)
        ..remove(emojiKey);
      _writeWellKnownBody(
        buffer: buffer,
        remaining: remaining,
        descriptionKey: descriptionKey,
        valueKey: valueKey,
        valuesKey: valuesKey,
        itemsKey: itemsKey,
        listItemBuilder: listItemBuilder,
      );
      if (remaining.isNotEmpty) {
        buffer.write(
          remaining.toMd(
            titleBuilder: titleBuilder,
            listItemBuilder: listItemBuilder,
            headingLevel: headingLevel + 1,
            metaDataToFrontMatter: metaDataToFrontMatter,
            emojiKey: emojiKey,
            frontMatterKey: frontMatterKey,
            nameKey: nameKey,
            descriptionKey: descriptionKey,
            valueKey: valueKey,
            valuesKey: valuesKey,
            itemsKey: itemsKey,
          ),
        );
      }
    } else if (value is List) {
      buffer.writeln('$headingPrefix ${key.toTitleCase()}');
      buffer.writeln();
      for (final item in value) {
        if (item is Map) {
          buffer.write(
            item.toMd(
              titleBuilder: titleBuilder,
              listItemBuilder: listItemBuilder,
              headingLevel: headingLevel + 1,
              metaDataToFrontMatter: metaDataToFrontMatter,
              emojiKey: emojiKey,
              frontMatterKey: frontMatterKey,
              nameKey: nameKey,
              descriptionKey: descriptionKey,
              valueKey: valueKey,
              valuesKey: valuesKey,
              itemsKey: itemsKey,
            ),
          );
        } else {
          buffer.writeln(listItemBuilder?.call(key, item) ?? '- $item');
        }
      }
      buffer.writeln();
    } else if (value == null) {
      buffer.writeln('$headingPrefix ${key.toTitleCase()}');
      buffer.writeln();
    } else {
      buffer.writeln('$headingPrefix ${key.toTitleCase()}');
      buffer.writeln();
      buffer.writeln(value);
      buffer.writeln();
    }
  }
  return buffer.toString();
}