From ba8afc5c5b12ceb9c1c95a403c6c6c35f294790d Mon Sep 17 00:00:00 2001 From: Christian Moser Date: Mon, 22 Dec 2025 18:39:25 +0100 Subject: [PATCH] 2025.12.22 18:39:25 (cachyos.cmoser.eu) --- static/icons/favicon.ico | Bin 0 -> 1150 bytes tinywiki/parser/bbcode/formatters.py | 73 ++++++--- tinywiki/parser/bbcode/text_formatters.py | 175 +++++++++++---------- tinywiki/templates/tinywiki/home/home.html | 2 +- 4 files changed, 144 insertions(+), 106 deletions(-) create mode 100644 static/icons/favicon.ico diff --git a/static/icons/favicon.ico b/static/icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2d2d6009727c316e5c439f73097d11d61c829a2d GIT binary patch literal 1150 zcmeHHyJ`Ya6dWOCh-+hGgp?`sEwM|bxO=hm3&hHNib)qNZ2bf~%XC`!Vtt?>>Skv3 zz-lD5Lhdp<=gv8^dpR5~kmBQc;QI-cJ0J_-nV>}Fpp&k0?H#`N0Y0`q3TubF9a1s% zFX3EQEq$NzMh?-=p~ARL42d~CWAcRP#RxDxYIE*Y)0RhG!Tu=@i%8GP$kf?3dg_8= zY09a_)+N8?#O6kvoz&SL~bHZzi|I@ P$W&QTtNjhDU37sTax~el literal 0 HcmV?d00001 diff --git a/tinywiki/parser/bbcode/formatters.py b/tinywiki/parser/bbcode/formatters.py index 858ec7b..d540a1f 100644 --- a/tinywiki/parser/bbcode/formatters.py +++ b/tinywiki/parser/bbcode/formatters.py @@ -17,29 +17,58 @@ from .text_formatters import ( render_youtube_video, ) -from .simple_formatters import SIMPLE_FORMATTERS +from .simple_formatters import SIMPLE_FORMATTERS # noqa: F401 # a list of tuples containig an tuple args and a dict of kwargs -#a list of tuples containing an tuple of args and a dict of kwargs +# a list of tuples containing an tuple of args and a dict of kwargs FORMATTERS=[ - (('url',render_url),{'strip':True,'swallow_trailing_newline':True,'same_tag_closes':True}), - (('wiki-url',render_wiki_url),{'strip':True,'swallow_trailing_newline':True,'same_tag_closes':True}), - (('wiki',render_wiki_link),{'strip':True,'swallow_tailin_newline':True,'standalone':True}), - (('codeblock',render_codeblock),{'strip':True,'swallow_trailing_newline':False,'same_tag_closes':False,"render_embedded":False}), - (('ol',render_ordered_list),{}), - (('ul',render_unordered_list),{}), - (('li',render_list_item),{}), - (('p',render_paragraph),{'same_tag_closes':False}), - (('image',render_image),{'same_tag_closes':True}), - (('img',render_image),{'same_tag_closes':True}), - (('wiki-image',render_wiki_image),{'standalone':True}), - (('wimg',render_wiki_image),{'standalone':True}), - (('table',render_table),{}), - (('table-row',render_table_row),{}), - (('tr',render_table_row),{}), - (('table-header',render_table_header),{}), - (('th',render_table_header),{}), - (('table-data',render_table_data),{}), - (('td',render_table_data),{}), - (('youtube',render_youtube_video),{'same_tag_closes':True}), + ( + ('url', render_url), + { + 'strip': True, + 'swallow_trailing_newline': True, + 'same_tag_closes': True + } + ), + ( + ('wiki-url', render_wiki_url), + { + 'strip': True, + 'swallow_trailing_newline': True, + 'same_tag_closes': True + } + ), + ( + ('wiki', render_wiki_link), + { + 'strip': True, + 'swallow_tailin_newline': True, + 'standalone': True + } + ), + ( + ('codeblock', render_codeblock), + { + 'strip': True, + 'swallow_trailing_newline': False, + 'same_tag_closes': False, + 'render_embedded': False + } + ), + (('ol', render_ordered_list), {}), + (('ul', render_unordered_list), {}), + (('li', render_list_item), {}), + (('p', render_paragraph), {'same_tag_closes': False}), + (('image', render_image), {'same_tag_closes': True}), + (('img', render_image), {'same_tag_closes': True}), + (('wiki-image', render_wiki_image), {'standalone': True}), + (('wimg', render_wiki_image),{'standalone': True}), + (('table', render_table), {}), + (('table-row', render_table_row), {}), + (('tr', render_table_row), {}), + (('table-header', render_table_header), {}), + (('th', render_table_header), {}), + (('table-data', render_table_data), {}), + (('td', render_table_data), {}), + (('youtube', render_youtube_video), {'same_tag_closes': True}), ] diff --git a/tinywiki/parser/bbcode/text_formatters.py b/tinywiki/parser/bbcode/text_formatters.py index 4bd2f3c..c64abb1 100644 --- a/tinywiki/parser/bbcode/text_formatters.py +++ b/tinywiki/parser/bbcode/text_formatters.py @@ -7,21 +7,23 @@ from ... import settings from ... import models import bbcode + def render_url(tag_name:str,value,options,parent,context): try: url = options['url'] except KeyError: url = value - + if not url.startswith('/') and '://' not in url: url = "http://" + url - + if settings.USE_BOOTSTRAP: if ['noicon in options']: return f"{value}" return f"{value}" return f"{value}" + def render_wiki_url(tag_name,value,options,parent,context): if tag_name in options: url = reverse("tinywiki:page",kwargs={'slug':options[tag_name]}) @@ -30,11 +32,11 @@ def render_wiki_url(tag_name,value,options,parent,context): page = models.Page.objects.get(slug=slug) except models.Page.DoesNotExist: page = None - + else: url = reverse('tinywiki:home') slug=None - + if settings.USE_BOOTSTRAP: href = settings.settings.STATIC_URL+"tinywiki/icons/bootstrap-icons.svg" if page: @@ -69,61 +71,66 @@ def render_wiki_link(tag_name,value,options,parent,context): title = _("Home") url = reverse("tinywiki:home") svg = "house" - + if settings.USE_BOOTSTRAP: href = settings.settings.STATIC_URL + "tinywiki/icons/bootstrap-icons.svg" return f"{title}" return f"{value}" + def render_codeblock(tag_name:str,value,options,parent,context)->str: if tag_name in options: return f"
{value}
" return f"
{value}
" + def render_ordered_list(tag_name:str,value,options,parent,context)->str: return f"
    {value}
" + def render_unordered_list(tag_name:str,value,options,parent,context)->str: return f"" + def render_list_item(tag_name:str,value,options,parent,context)->str: return f"
  • {value}
  • " - -def render_paragraph(tag_name:str,value,options,parent,context): + +def render_paragraph(tag_name: str, value, options, parent, context): if settings.USE_BOOTSTRAP: return f"

    {value}

    " return f"

    {value}

    " -def render_image(tag_name:str,value,options,parent,context): + +def render_image(tag_name: str, value, options, parent, context): if tag_name not in options: return "" - + if 'alt' in options: - alt=options['alt'] + alt = options['alt'] else: - alt="" - + alt = "" + if settings.USE_BOOTSTRAP: - classes=["img-fluid","figure-img","rounded"] - fig_classes=["figure","my-1"] - styles=[] - fig_styles=[] + classes = ["img-fluid", "figure-img", "rounded"] + fig_classes = ["figure", "my-1"] + styles = [] + fig_styles = [] else: - styles=["max-width:100%;"] - classes=[] - fig_classes=[] - fig_styles=[] - + styles = ["max-width:100%;"] + classes = [] + fig_classes = [] + fig_styles = [] + if 'width' in options: _w = options['width'] if _w.endswith('px') or _w.endswith('em') or _w.endswith('rem'): fig_styles.append(f"width:{_w};") - else: + else: if _w.endswith('%'): _w = _w[:-1] if _w.isdigit(): - _w=int(_w) + _w = int(_w) if _w > 100: _w = 100 if settings.USE_BOOTSTRAP: @@ -138,7 +145,7 @@ def render_image(tag_name:str,value,options,parent,context): _h = options['width'] if _h.endswith('px') or _h.endswith('em') or _h.endswith('rem'): fig_styles.append(f"height:{_h};") - else: + else: if _h.endswith('%'): _h= _h[:-1] if _h.isdigit(): @@ -152,15 +159,15 @@ def render_image(tag_name:str,value,options,parent,context): height = ((_h // 25) * 25) if height > 100: height = 100 - + fig_classes.append(f'h-{height}') else: fig_styles.append(f"height:{_h}%;") - + if "position" in options: pos = options['position'] if settings.USE_BOOTSTRAP: - if pos == "left" or pos=="start": + if pos == "left" or pos == "start": fig_classes += ["float-start","me-2"] classes += ["float-start","me-2"] elif pos == "right" or pos == "end": @@ -169,46 +176,47 @@ def render_image(tag_name:str,value,options,parent,context): elif pos == "center": fig_classes += ["mx-auto","d-block"] classes += ["mx-auto","d-block"] - + if styles: - style=f"style=\"{"".join(styles)}\"" + style = f"style=\"{"".join(styles)}\"" else: - style="" - + style = "" + if fig_styles: - fig_style=f'style="{"".join(fig_styles)}"' + fig_style = f'style="{"".join(fig_styles)}"' else: - fig_style="" + fig_style = "" if settings.USE_BOOTSTRAP: return f'
    {alt}
    { value }
    ' else: return f'
    {value}
    ' -def render_wiki_image(tag_name:str,value,options,parent,context): + +def render_wiki_image(tag_name: str, value, options, parent, context): if tag_name not in options: return "" - + try: image = models.Image.objects.get(slug=options[tag_name]) except models.Image.DoesNotExist: return "" - + if settings.USE_BOOTSTRAP: - classes=["img-fluid","figure-img","rounded"] - fig_classes=["figure","my-1"] - styles=[] - fig_styles=[] + classes = ["img-fluid","figure-img","rounded"] + fig_classes = ["figure","my-1"] + styles = [] + fig_styles = [] else: - styles=["max-width:100%;"] - classes=[] - fig_classes=[] - fig_styles=[] - + styles = ["max-width:100%;"] + classes = [] + fig_classes = [] + fig_styles = [] + if 'width' in options: _w = options['width'] if _w.endswith('px') or _w.endswith('em') or _w.endswith('rem'): fig_styles.append(f"width:{_w};") - else: + else: if _w.endswith('%'): _w = _w[:-1] if _w.isdigit(): @@ -227,7 +235,7 @@ def render_wiki_image(tag_name:str,value,options,parent,context): _h = options['width'] if _h.endswith('px') or _h.endswith('em') or _h.endswith('rem'): fig_styles.append(f"height:{_h};") - else: + else: if _h.endswith('%'): _h= _h[:-1] if _h.isdigit(): @@ -241,11 +249,11 @@ def render_wiki_image(tag_name:str,value,options,parent,context): height = ((_h // 25) * 25) if height > 100: height = 100 - + fig_classes.append(f'h-{height}') else: fig_styles.append(f"height:{_h}%;") - + if "position" in options: pos = options['position'] if settings.USE_BOOTSTRAP: @@ -255,22 +263,23 @@ def render_wiki_image(tag_name:str,value,options,parent,context): fig_classes += ["float-end","ms-2"] elif pos == "center": fig_classes += ["mx-auto","d-block"] - + if styles: style=f"style=\"{"".join(styles)}\"" else: style="" - + if fig_styles: fig_style=f'style="{"".join(fig_styles)}"' else: fig_style="" - + if settings.USE_BOOTSTRAP: return f'
    {image.alt}
    {image.description_html}
    ' else: return f'
    {image.alt}
    {image.description}
    ' - + + def render_table(tag_name:str,value,options,parent,context): if settings.USE_BOOTSTRAP: classes=["table"] @@ -279,13 +288,13 @@ def render_table(tag_name:str,value,options,parent,context): classes.append("table-bordered") if options["bordered"] in ("primary","secondary","info","warning","danger","success","light","dark"): classes.append(f"border-{options['bordered']}") - + if tag_name in options: if options[tag_name] in ("primary","secondary","info","warning","danger","success","light","dark"): classes.append(f"table-{options[tag_name]}") - + return f"{value}
    " - + return f"{value}
    " def render_table_row(tag_name:str,value,options,parent,context): @@ -322,37 +331,37 @@ def render_table_data(tag_name:str,value,options,parent,context): if tag_name in options: if options[tag_name] in ("primary","secondary","info","warning","danger","success","light","dark"): classes.append(f"table-{options[tag_name]}") - class_attr=f"class=\"{" ".join(classes)}\"" if classes else "" - return f"{value}" + class_attr = f"class=\"{" ".join(classes)}\"" if classes else "" + return f"{value}" -def render_youtube_video(tag_name:str,value,options,parent,context): +def render_youtube_video(tag_name: str, value, options, parent, context): if tag_name not in options: return "" - + if 'alt' in options: - alt=options['alt'] + alt = options['alt'] else: - alt="" - + alt = "" + if settings.USE_BOOTSTRAP: - styles=[] - classes=["w-100"] - div_classes=["my-1"] - div_styles=[] + styles = [] + classes = ["w-100"] + div_classes = ["my-1"] + div_styles = [] else: - styles=["max-width:100%;"] - classes=[] - div_classes=[] - div_styles=[] - - + styles = ["max-width:100%;"] + classes = [] + div_classes = [] + div_styles = [] + + if 'width' in options: _w = options['width'] if _w.endswith('px') or _w.endswith('em') or _w.endswith('rem'): if settings.USE_BOOTSTRAP: div_styles.append(f"width:{_w};") styles.append(f"width:{_w};") - else: + else: if _w.endswith('%'): _w = _w[:-1] if _w.isdigit(): @@ -374,7 +383,7 @@ def render_youtube_video(tag_name:str,value,options,parent,context): div_styles.append(f"height:{_h};") else: styles.append(f"height:{_h};") - else: + else: if _h.endswith('%'): _h= _h[:-1] if _h.isdigit(): @@ -388,11 +397,11 @@ def render_youtube_video(tag_name:str,value,options,parent,context): height = ((_h // 25) * 25) if height > 100: height = 100 - + div_classes.append(f'h-{height}') else: styles.append(f"height:{_h}%;") - + if "position" in options: pos = options['position'] if settings.USE_BOOTSTRAP: @@ -405,16 +414,16 @@ def render_youtube_video(tag_name:str,value,options,parent,context): elif pos == "center": div_classes += ["mx-auto","d-block"] #classes += ["mx-auto","d-block"] - + if styles: - style=f"style=\"{"".join(styles)}\"" + style = f"style=\"{"".join(styles)}\"" else: - style="" - + style = "" + if div_styles: - div_style=f'style="{"".join(div_styles)}"' + div_style = f'style="{"".join(div_styles)}"' else: - div_style="" + div_style = "" if settings.USE_BOOTSTRAP: return f'
    ' else: diff --git a/tinywiki/templates/tinywiki/home/home.html b/tinywiki/templates/tinywiki/home/home.html index ac60c72..050c72b 100644 --- a/tinywiki/templates/tinywiki/home/home.html +++ b/tinywiki/templates/tinywiki/home/home.html @@ -32,4 +32,4 @@ {% block extra_scripts %} -{% endblock %} \ No newline at end of file +{% endblock %}