from .babycode_parser import Parser from markupsafe import escape import re def tag_code(children, attr): is_inline = children.find('\n') == -1 if is_inline: return f"{children}" else: t = children.strip() button = f"" return f"
{button}{t}
" def tag_list(children): list_body = re.sub(r" +\n", "
", children.strip()) list_body = re.sub(r"\n\n+", "\1", list_body) return " ".join([f"
  • {x}
  • " for x in list_body.split("\1") if x]) TAGS = { "b": lambda children, attr: f"{children}", "i": lambda children, attr: f"{children}", "s": lambda children, attr: f"{children}", "img": lambda children, attr: f"
    {children}
    ", "url": lambda children, attr: f"{children}", "quote": lambda children, attr: f"
    {children}
    ", "code": tag_code, "ul": lambda children, attr: f"", "ol": lambda children, attr: f"
      {tag_list(children)}
    ", } TEXT_ONLY = ["code"] def break_lines(text): text = re.sub(r" +\n", "
    ", text) text = re.sub(r"\n\n+", "

    ", text) return text def babycode_to_html(s): subj = escape(s.strip().replace('\r\n', '\n').replace('\r', '\n')) parser = Parser(subj) parser.valid_bbcode_tags = TAGS.keys() parser.bbcode_tags_only_text_children = TEXT_ONLY elements = parser.parse() out = "" def fold(element, nobr): if isinstance(element, str): if nobr: return element return break_lines(element) match element['type']: case "bbcode": c = "" for child in element['children']: _nobr = element['name'] == "code" or element['name'] == "ul" or element['name'] == "ol" c = c + fold(child, _nobr) res = TAGS[element['name']](c, element['attr']) return res case "link": return f"{element['url']}" case "rule": return "
    " for e in elements: out = out + fold(e, False) return out