2025.12.25 15:47:21 (cachyos.cmoser.eu)

This commit is contained in:
2025-12-25 15:47:21 +01:00
parent c2e431e43b
commit 3d578129d1
6 changed files with 123 additions and 74 deletions

View File

@@ -68,7 +68,7 @@
<div class="col-lg-3 pt-6 px-4 d-none d-lg-block" > <div class="col-lg-3 pt-6 px-4 d-none d-lg-block" >
{% block left_sidebar %} {% block left_sidebar %}
{{ tinywiki_sidebar }} {{ tinywiki_sidebar }}
{% enblock left_sidebar %} {% endblock left_sidebar %}
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
<main> <main>

View File

@@ -2,9 +2,9 @@ from django.http import HttpRequest
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from .models import SidebarSection from .models import SidebarSection
def sidebar(request: HttpRequest): def sidebar(request: HttpRequest = None):
sections = [ sections = [
section.widget section.widget
for section in SidebarSection.objects.filter(is_visible=True).order_by('-priority'): for section in SidebarSection.objects.filter(is_visible=True).order_by('-priority')
] ]
return {'tinywiki_sidebar': mark_safe("\n".join(sections))} return {'tinywiki_sidebar': mark_safe("\n".join(sections))}

View File

@@ -89,4 +89,5 @@ class Migration(migrations.Migration):
] ]
operations = [ operations = [
migrations.RunPython(create_tinywiki_sections),
] ]

View File

@@ -21,6 +21,8 @@ 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 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=[ FORMATTERS=[
( (
('url', render_url), ('url', render_url),

View File

@@ -1,16 +1,16 @@
SIMPLE_FORMATTERS = [ SIMPLE_FORMATTERS = [
(('h1',"<h1>%(value)s</h1>"),{}), (('h1', "<h1>%(value)s</h1>"), {}),
(('h2',"<h2>%(value)s</h2>"),{}), (('h2', "<h2>%(value)s</h2>"), {}),
(('h3',"<h3>%(value)s</h3>"),{}), (('h3', "<h3>%(value)s</h3>"), {}),
(('h4',"<h4>%(value)s</h4>"),{}), (('h4', "<h4>%(value)s</h4>"), {}),
(('h5',"<h5>%(value)s</h5>"),{}), (('h5', "<h5>%(value)s</h5>"), {}),
(('h6',"<h6>%(value)s</h6>"),{}), (('h6', "<h6>%(value)s</h6>"), {}),
(('mark',"<mark>%(value)s</mark>"),{}), (('mark', "<mark>%(value)s</mark>"), {}),
(("strong","<strong>%(value)s</strong>"),{}), (("strong","<strong>%(value)s</strong>"), {}),
(("em","<em>%(value)s</em>"),{}), (("em", "<em>%(value)s</em>"), {}),
(("br","<br>"),{"standalone":True}), (("br", "<br>"), {"standalone":True}),
(('copy',"&copy;"),{'standalone':True}), (('copy', "&copy;"), {'standalone':True}),
(('reg',"&reg;"),{'standalone':True}), (('reg', "&reg;"), {'standalone':True}),
(('trade',"&trade;"),{'standalone':True}), (('trade', "&trade;"), {'standalone':True}),
] ]

View File

@@ -5,10 +5,10 @@ from django.utils.translation import gettext as _
from ... import settings from ... import settings
from ... import models from ... import models
import bbcode #import bbcode
def render_url(tag_name:str,value,options,parent,context): def render_url(tag_name: str, value, options, parent, context) -> str:
try: try:
url = options['url'] url = options['url']
except KeyError: except KeyError:
@@ -19,15 +19,15 @@ def render_url(tag_name:str,value,options,parent,context):
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
if ['noicon in options']: if ['noicon in options']:
return f"<a href=\"{url}\" referrer-policy=\"no-referrer\" rel=\"noreferrer noopener\">{value}</a>" return f"<a href=\"{url}\" referrer-policy=\"no-referrer\" rel=\"noreferrer noopener\">{value}</a>" # noqa: E501
return f"<a href=\"{url}\" class=\"icon-link icon-link-hover\" referrer-policy=\"no-referrer\" rel=\"noreferrer noopener\">{value}<svg class=\"bi\"><use xlink:href=\"{settings.settings.STATIC_URL + "tinywiki/icons/bootstrap-icons.svg"}#box-arrow-up-right\"></use></svg></a>" return f"<a href=\"{url}\" class=\"icon-link icon-link-hover\" referrer-policy=\"no-referrer\" rel=\"noreferrer noopener\">{value}<svg class=\"bi\"><use xlink:href=\"{settings.settings.STATIC_URL + "tinywiki/icons/bootstrap-icons.svg"}#box-arrow-up-right\"></use></svg></a>" # noqa: E501
return f"<a href=\"{url}\" referrer-policy=\"no-referrer\" rel=\"noreferrer noopener\">{value}</a>" return f"<a href=\"{url}\" referrer-policy=\"no-referrer\" rel=\"noreferrer noopener\">{value}</a>" # noqa: E501
def render_wiki_url(tag_name,value,options,parent,context): def render_wiki_url(tag_name: str, value, options, parent, context) -> str:
if tag_name in options: if tag_name in options:
url = reverse("tinywiki:page",kwargs={'slug':options[tag_name]}) url = reverse("tinywiki:page", kwargs={'slug': options[tag_name]})
slug=options[tag_name] slug = options[tag_name]
try: try:
page = models.Page.objects.get(slug=slug) page = models.Page.objects.get(slug=slug)
except models.Page.DoesNotExist: except models.Page.DoesNotExist:
@@ -35,7 +35,7 @@ def render_wiki_url(tag_name,value,options,parent,context):
else: else:
url = reverse('tinywiki:home') url = reverse('tinywiki:home')
slug=None slug = None
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
href = settings.settings.STATIC_URL+"tinywiki/icons/bootstrap-icons.svg" href = settings.settings.STATIC_URL+"tinywiki/icons/bootstrap-icons.svg"
@@ -45,15 +45,15 @@ def render_wiki_url(tag_name,value,options,parent,context):
elif page.slug: elif page.slug:
svg = "book" svg = "book"
else: else:
svg=href + "file-earmark-x" svg = href + "file-earmark-x"
return f"<a href=\"{url}\" class=\"icon-link icon-link-hover\">{value}<svg class=\"bi\"><use xlink:href=\"{href}#{svg}\"></use></svg></a>" return f"<a href=\"{url}\" class=\"icon-link icon-link-hover\">{value}<svg class=\"bi\"><use xlink:href=\"{href}#{svg}\"></use></svg></a>" # noqa: E501
return f"<a href=\"{url}\">{value}</a>" return f"<a href=\"{url}\">{value}</a>"
def render_wiki_link(tag_name,value,options,parent,context): def render_wiki_link(tag_name: str, value, options, parent, context):
if tag_name in options: if tag_name in options:
slug = options[tag_name] slug = options[tag_name]
print("slug",slug) print("slug", slug)
try: try:
page = models.Page.objects.get(slug=slug) page = models.Page.objects.get(slug=slug)
title = page.title title = page.title
@@ -65,7 +65,7 @@ def render_wiki_link(tag_name,value,options,parent,context):
page = None page = None
title = _("Page not found") title = _("Page not found")
svg = "file-earmark-x" svg = "file-earmark-x"
url = reverse("tinywiki:page",kwargs={'slug':slug}) url = reverse("tinywiki:page", kwargs={'slug': slug})
else: else:
slug = None slug = None
title = _("Home") title = _("Home")
@@ -74,35 +74,35 @@ def render_wiki_link(tag_name,value,options,parent,context):
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
href = settings.settings.STATIC_URL + "tinywiki/icons/bootstrap-icons.svg" href = settings.settings.STATIC_URL + "tinywiki/icons/bootstrap-icons.svg"
return f"<a href=\"{url}\" class=\"icon-link icon-link-hover\">{title}<svg class=\"bi\"><use xlink:href=\"{href}#{svg}\"></use></svg></a>" return f"<a href=\"{url}\" class=\"icon-link icon-link-hover\">{title}<svg class=\"bi\"><use xlink:href=\"{href}#{svg}\"></use></svg></a>" # noqa: E501
return f"<a href=\"{url}\">{value}</a>" return f"<a href=\"{url}\">{value}</a>"
def render_codeblock(tag_name:str,value,options,parent,context)->str: def render_codeblock(tag_name: str, value, options, parent, context) -> str:
if tag_name in options: if tag_name in options:
return f"<pre style=\"overflow-x:auto;\"><code class=\"language-{options[tag_name]}\">{value}</pre></code>" return f"<pre style=\"overflow-x:auto;\"><code class=\"language-{options[tag_name]}\">{value}</code></pre>" # noqa: E501
return f"<pre style=\"overflow-x:auto;\"><code>{value}</pre></code>" return f"<pre style=\"overflow-x:auto;\"><code>{value}</code></pre>"
def render_ordered_list(tag_name:str,value,options,parent,context)->str: def render_ordered_list(tag_name: str, value, options, parent, context) -> str:
return f"<ol>{value}</ol>" return f"<ol>{value}</ol>"
def render_unordered_list(tag_name:str,value,options,parent,context)->str: def render_unordered_list(tag_name: str, value, options, parent, context) -> str: # noqa: E501
return f"<ul>{value}</ul>" return f"<ul>{value}</ul>"
def render_list_item(tag_name:str,value,options,parent,context)->str: def render_list_item(tag_name: str, value, options, parent, context) -> str:
return f"<li>{value}</li>" return f"<li>{value}</li>"
def render_paragraph(tag_name: str, value, options, parent, context): def render_paragraph(tag_name: str, value, options, parent, context) -> str:
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
return f"<p style=\"text-align:justify;\">{value}</p>" return f"<p style=\"text-align:justify;\">{value}</p>"
return f"<p>{value}</p>" return f"<p>{value}</p>"
def render_image(tag_name: str, value, options, parent, context): def render_image(tag_name: str, value, options, parent, context) -> str:
if tag_name not in options: if tag_name not in options:
return "" return ""
@@ -187,9 +187,9 @@ def render_image(tag_name: str, value, options, parent, context):
else: else:
fig_style = "" fig_style = ""
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
return f'<figure class="{" ".join(fig_classes)} {fig_style}"><img src="{options[tag_name]}" class="{' '.join(classes)}" alt="{alt}" {style}><figcaption class="figure-caption text-end">{ value }</figcaption></figure>' return f'<figure class="{" ".join(fig_classes)} {fig_style}"><img src="{options[tag_name]}" class="{' '.join(classes)}" alt="{alt}" {style}><figcaption class="figure-caption text-end">{value}</figcaption></figure>' # noqa: E501
else: else:
return f'<figure {fig_style}><img src="{options[tag_name]}" {style}><figcaption>{value}</figcaption></figure>' return f'<figure {fig_style}><img src="{options[tag_name]}" {style}><figcaption>{value}</figcaption></figure>' # noqa: E501
def render_wiki_image(tag_name: str, value, options, parent, context): def render_wiki_image(tag_name: str, value, options, parent, context):
@@ -202,8 +202,8 @@ def render_wiki_image(tag_name: str, value, options, parent, context):
return "" return ""
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
classes = ["img-fluid","figure-img","rounded"] classes = ["img-fluid", "figure-img", "rounded"]
fig_classes = ["figure","my-1"] fig_classes = ["figure", "my-1"]
styles = [] styles = []
fig_styles = [] fig_styles = []
else: else:
@@ -237,9 +237,9 @@ def render_wiki_image(tag_name: str, value, options, parent, context):
fig_styles.append(f"height:{_h};") fig_styles.append(f"height:{_h};")
else: else:
if _h.endswith('%'): if _h.endswith('%'):
_h= _h[:-1] _h = _h[:-1]
if _h.isdigit(): if _h.isdigit():
_h=int(_w) _h = int(_w)
if _h > 100: if _h > 100:
_h = 100 _h = 100
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
@@ -257,79 +257,125 @@ def render_wiki_image(tag_name: str, value, options, parent, context):
if "position" in options: if "position" in options:
pos = options['position'] pos = options['position']
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
if pos == "left" or pos=="start": if pos == "left" or pos == "start":
fig_classes += ["float-start","me-2"] fig_classes += ["float-start", "me-2"]
elif pos == "right" or pos == "end": elif pos == "right" or pos == "end":
fig_classes += ["float-end","ms-2"] fig_classes += ["float-end", "ms-2"]
elif pos == "center": elif pos == "center":
fig_classes += ["mx-auto","d-block"] fig_classes += ["mx-auto", "d-block"]
if styles: if styles:
style=f"style=\"{"".join(styles)}\"" style = f"style=\"{"".join(styles)}\""
else: else:
style="" style = ""
if fig_styles: if fig_styles:
fig_style=f'style="{"".join(fig_styles)}"' fig_style = f'style="{"".join(fig_styles)}"'
else: else:
fig_style="" fig_style = ""
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
return f'<figure class="{" ".join(fig_classes)}" {fig_style}><img src="{image.image.url}" alt="{image.alt}" class="{' '.join(classes)}" {style}><figcaption class="figure-caption text-end">{image.description_html}</figcaption></figure>' return f'<figure class="{" ".join(fig_classes)}" {fig_style}><img src="{image.image.url}" alt="{image.alt}" class="{' '.join(classes)}" {style}><figcaption class="figure-caption text-end">{image.description_html}</figcaption></figure>' # noqa: E501
else: else:
return f'<figure {fig_style}><img src="{image.image.url}" alt="{image.alt}" {style}><figcaption>{image.description}</figcaption></figure>' return f'<figure {fig_style}><img src="{image.image.url}" alt="{image.alt}" {style}><figcaption>{image.description}</figcaption></figure>' # noqa: E501
def render_table(tag_name:str,value,options,parent,context): def render_table(tag_name: str, value, options, parent, context) -> str:
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
classes=["table"] classes = ["table"]
if "bordered" in options: if "bordered" in options:
if options["bordered"] not in ("0","n","no","false","off"): if options["bordered"] not in ("0", "n", "no", "false", "off"):
classes.append("table-bordered") classes.append("table-bordered")
if options["bordered"] in ("primary","secondary","info","warning","danger","success","light","dark"): if options["bordered"] in (
"primary",
"secondary",
"info",
"warning",
"danger",
"success",
"light",
"dark"
):
classes.append(f"border-{options['bordered']}") classes.append(f"border-{options['bordered']}")
if tag_name in options: if tag_name in options:
if options[tag_name] in ("primary","secondary","info","warning","danger","success","light","dark"): if options[tag_name] in (
"primary",
"secondary",
"info",
"warning",
"danger",
"success",
"light",
"dark"
):
classes.append(f"table-{options[tag_name]}") classes.append(f"table-{options[tag_name]}")
return f"<table class=\"{" ".join(classes)}\">{value}</table>" return f"<table class=\"{" ".join(classes)}\">{value}</table>"
return f"<table>{value}</table>" return f"<table>{value}</table>"
def render_table_row(tag_name:str,value,options,parent,context): def render_table_row(tag_name: str, value, options, parent, context) -> str:
classes=[] classes=[]
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
if tag_name in options: if tag_name in options:
if options[tag_name] in ("primary","secondary","info","warning","danger","success","light","dark"): if options[tag_name] in (
"primary",
"secondary",
"info",
"warning",
"danger",
"success",
"light",
"dark"
):
classes.append(f"table-{options[tag_name]}") classes.append(f"table-{options[tag_name]}")
class_attr=f"class=\"{" ".join(classes)}\"" if classes else "" class_attr = f"class=\"{" ".join(classes)}\"" if classes else ""
return f"<tr {class_attr}>{value}</tr>" return f"<tr {class_attr}>{value}</tr>"
def render_table_header(tag_name:str,value,options,parent,context):
extra_attributes=[] def render_table_header(tag_name: str, value, options, parent, context) -> str:
classes=[] extra_attributes = []
classes = []
if "colspan" in options: if "colspan" in options:
extra_attributes.append(f"colspan=\"{options['colspan']}\"") extra_attributes.append(f"colspan=\"{options['colspan']}\"")
if "rowspan" in options: if "rowspan" in options:
extra_attributes.append(f"rowspan=\"{options['rowspan']}\"") extra_attributes.append(f"rowspan=\"{options['rowspan']}\"")
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
if tag_name in options: if tag_name in options:
if options[tag_name] in ("primary","secondary","info","warning","danger","success","light","dark"): if options[tag_name] in (
"primary",
"secondary",
"info",
"warning",
"danger",
"success",
"light",
"dark"
):
classes.append(f"table-{options[tag_name]}") classes.append(f"table-{options[tag_name]}")
class_attr=f"class=\"{" ".join(classes)}\"" if classes else "" class_attr = f"class=\"{" ".join(classes)}\"" if classes else ""
return f"<th {class_attr} {" ".join(extra_attributes)}>{value}</th>" return f"<th {class_attr} {" ".join(extra_attributes)}>{value}</th>"
def render_table_data(tag_name:str,value,options,parent,context): def render_table_data(tag_name: str, value, options, parent, context) -> str:
extra_attributes=[] extra_attributes = []
classes=[] classes = []
if "colspan" in options: if "colspan" in options:
extra_attributes.append(f"colspan=\"{options['colspan']}\"") extra_attributes.append(f"colspan=\"{options['colspan']}\"")
if "rowspan" in options: if "rowspan" in options:
extra_attributes.append(f"rowspan=\"{options['rowspan']}\"") extra_attributes.append(f"rowspan=\"{options['rowspan']}\"")
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
if tag_name in options: if tag_name in options:
if options[tag_name] in ("primary","secondary","info","warning","danger","success","light","dark"): if options[tag_name] in (
"primary",
"secondary",
"info",
"warning",
"danger",
"success",
"light",
"dark"
):
classes.append(f"table-{options[tag_name]}") classes.append(f"table-{options[tag_name]}")
class_attr = f"class=\"{" ".join(classes)}\"" if classes else "" class_attr = f"class=\"{" ".join(classes)}\"" if classes else ""
return f"<td {class_attr} {" ".join(extra_attributes)}>{value}</td>" return f"<td {class_attr} {" ".join(extra_attributes)}>{value}</td>"
@@ -369,7 +415,7 @@ def render_youtube_video(tag_name: str, value, options, parent, context):
if _w.endswith('%'): if _w.endswith('%'):
_w = _w[:-1] _w = _w[:-1]
if _w.isdigit(): if _w.isdigit():
_w=int(_w) _w = int(_w)
if _w > 100: if _w > 100:
_w = 100 _w = 100
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
@@ -430,7 +476,7 @@ def render_youtube_video(tag_name: str, value, options, parent, context):
div_style = "" div_style = ""
if settings.USE_BOOTSTRAP: if settings.USE_BOOTSTRAP:
return f"""<div class=""{' '.join(div_classes)}" {div_style}> return f"""<div class=""{' '.join(div_classes)}" {div_style}>
<iframe class={" ".join(classes)}" src="https://www.youtube.com/embed/{options[tag_name]}?rel=0" allowfullscreen></iframe> <iframe class="{' '.join(classes)}" src="https://www.youtube.com/embgit ed/{options[tag_name]}?rel=0" allowfullscreen></iframe>
</div>""" </div>"""
else: else:
return f'<div {div_style}><iframe src="https://www.youtube.com/embed/{options[tag_name]}?rel=0" allowfullscreen></iframe></div>' return f'<div {div_style}><iframe src="https://www.youtube.com/embed/{options[tag_name]}?rel=0" allowfullscreen></iframe></div>'