port babycode transform function
This commit is contained in:
		
							
								
								
									
										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:
 | 
			
		||||
                    children.append(ch)
 | 
			
		||||
                else:
 | 
			
		||||
                    children[1] = children[1] + ch
 | 
			
		||||
                    children[0] = children[0] + ch
 | 
			
		||||
            else:
 | 
			
		||||
                element = self.parse_element(children)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user