getTags method

List<String> getTags()

Implementation

List<String> getTags() {
  final OpAttributes attrs = op.attributes;

  // embeds
  if (!op.isText()) {
    return <String>[
      op.isVideo()
          ? 'iframe'
          : op.isImage()
              ? 'img'
              : 'span', // formula
    ];
  }

  // blocks
  final String positionTag = options.paragraphTag;
  final List<List<String>> blocks = <List<String>>[
    <String>['blockquote'],
    <String>['code-block', 'pre'],
    <String>['list', options.listItemTag],
    <String>['header'],
    <String>['align', positionTag],
    <String>['direction', positionTag],
    <String>['indent', positionTag],
  ];
  for (final List<String> item in blocks) {
    String firstItem = item[0];
    if (isTruthy(attrs[firstItem])) {
      final String? customTag = getCustomTag(firstItem);
      return isTruthy(customTag)
          ? <String>[customTag!]
          : firstItem == 'header'
              ? <String>['h${attrs[firstItem]}']
              : <String>[arr.preferSecond(item)!];
    }
  }

  if (op.isCustomTextBlock()) {
    final String? customTag = getCustomTag('renderAsBlock');
    return isTruthy(customTag) ? <String>[customTag!] : <String>[positionTag];
  }

  // inlines
  final Map<String, String> customTagsMap = attrs.attrs.keys.fold(<String, String>{}, (Map<String, String> res, String it) {
    final String? customTag = getCustomTag(it);
    if (isTruthy(customTag)) {
      res[it] = customTag!;
    }
    return res;
  });

  const List<List<String>> inlineTags = <List<String>>[
    <String>['link', 'a'],
    <String>['mentions', 'a'],
    <String>['script'],
    <String>['bold', 'strong'],
    <String>['italic', 'em'],
    <String>['strike', 's'],
    <String>['underline', 'u'],
    <String>['code'],
  ];

  final List<List<String>> tl = <List<String>>[
    ...inlineTags.where((List<String> item) => isTruthy(attrs[item[0]])),
    ...customTagsMap.keys
        .where((String t) => !inlineTags.any((List<String> it) => it[0] == t))
        .map((String t) => <String>[t, customTagsMap[t]!]),
  ];
  return tl.map((List<String> item) {
    final String? v = customTagsMap[item[0]];
    return isTruthy(v)
        ? v!
        : item[0] == 'script'
            ? attrs[item[0]] == ScriptType.subscript.value
                ? 'sub'
                : 'sup'
            : arr.preferSecond(item)!;
  }).toList();
}