From c7fb6784c4327409778fb15725b2dbbe2a70e77c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lera=20Elvo=C3=A9?= Date: Tue, 1 Jul 2025 01:30:51 +0300 Subject: [PATCH] port babycode transform function --- app/lib/babycode.py | 66 ++++++++++++++++++++++++++++++++++++++ app/lib/babycode_parser.py | 2 +- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 app/lib/babycode.py diff --git a/app/lib/babycode.py b/app/lib/babycode.py new file mode 100644 index 0000000..817deed --- /dev/null +++ b/app/lib/babycode.py @@ -0,0 +1,66 @@ +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 diff --git a/app/lib/babycode_parser.py b/app/lib/babycode_parser.py index 4a2b8c3..124f384 100644 --- a/app/lib/babycode_parser.py +++ b/app/lib/babycode_parser.py @@ -161,7 +161,7 @@ class Parser: if len(children) == 0: children.append(ch) else: - children[1] = children[1] + ch + children[0] = children[0] + ch else: element = self.parse_element(children)