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

@@ -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,12 +19,12 @@ 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]
@@ -46,11 +46,11 @@ def render_wiki_url(tag_name,value,options,parent,context):
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)
@@ -74,21 +74,21 @@ 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>"
@@ -96,13 +96,13 @@ 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):
@@ -275,38 +275,66 @@ def render_wiki_image(tag_name: str, value, options, parent, context):
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):
def render_table_header(tag_name: str, value, options, parent, context) -> str:
extra_attributes = [] extra_attributes = []
classes = [] classes = []
if "colspan" in options: if "colspan" in options:
@@ -315,12 +343,21 @@ def render_table_header(tag_name:str,value,options,parent,context):
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:
@@ -329,7 +366,16 @@ def render_table_data(tag_name:str,value,options,parent,context):
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>"
@@ -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>'