port babycode transform function
This commit is contained in:
parent
a7f9fbfe90
commit
c7fb6784c4
66
app/lib/babycode.py
Normal file
66
app/lib/babycode.py
Normal file
@ -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"<code class=\"inline_code\">{children}</code>"
|
||||||
|
else:
|
||||||
|
t = children.strip()
|
||||||
|
button = f"<button type=button class=\"copy-code\" value={t}>Copy</button>"
|
||||||
|
return f"<pre><span class=\"copy-code-container\">{button}</span><code>{t}</code></pre>"
|
||||||
|
|
||||||
|
def tag_list(children):
|
||||||
|
list_body = re.sub(r" +\n", "<br>", children.strip())
|
||||||
|
list_body = re.sub(r"\n\n+", "\1", list_body)
|
||||||
|
return " ".join([f"<li>{x}</li>" for x in list_body.split("\1") if x])
|
||||||
|
|
||||||
|
TAGS = {
|
||||||
|
"b": lambda children, attr: f"<strong>{children}</strong>",
|
||||||
|
"i": lambda children, attr: f"<em>{children}</em>",
|
||||||
|
"s": lambda children, attr: f"<del>{children}</del>",
|
||||||
|
"img": lambda children, attr: f"<div class=\"post-img-container\"><img class=\"block-img\" src={attr} alt={children}></div>",
|
||||||
|
"url": lambda children, attr: f"<a href={attr}>{children}</a>",
|
||||||
|
"quote": lambda children, attr: f"<blockquote>{children}</blockquote>",
|
||||||
|
"code": tag_code,
|
||||||
|
"ul": lambda children, attr: f"<ul>{tag_list(children)}</ul>",
|
||||||
|
"ol": lambda children, attr: f"<ol>{tag_list(children)}</ol>",
|
||||||
|
}
|
||||||
|
|
||||||
|
TEXT_ONLY = ["code"]
|
||||||
|
|
||||||
|
def break_lines(text):
|
||||||
|
text = re.sub(r" +\n", "<br>", text)
|
||||||
|
text = re.sub(r"\n\n+", "<br><br>", 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"<a href=\"{element['url']}\">{element['url']}</a>"
|
||||||
|
case "rule":
|
||||||
|
return "<hr>"
|
||||||
|
for e in elements:
|
||||||
|
out = out + fold(e, False)
|
||||||
|
return out
|
@ -161,7 +161,7 @@ class Parser:
|
|||||||
if len(children) == 0:
|
if len(children) == 0:
|
||||||
children.append(ch)
|
children.append(ch)
|
||||||
else:
|
else:
|
||||||
children[1] = children[1] + ch
|
children[0] = children[0] + ch
|
||||||
else:
|
else:
|
||||||
element = self.parse_element(children)
|
element = self.parse_element(children)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user