From c05a70a79051c5b968fc7afd758c81e9cbf173a4 Mon Sep 17 00:00:00 2001
From: Jake <j.vondoemming@stud.uni-goettingen.de>
Date: Sun, 2 Oct 2022 21:54:35 +0200
Subject: [PATCH] some refactoring for easier development of some other
 features

---
 theme/templates/base.html                    |  5 +-
 theme/templates/index.html                   |  2 +-
 theme/templates/macros/cards.html            |  4 +-
 theme/templates/macros/common.html           | 51 +++++++++++++++
 theme/templates/macros/content_renderer.html | 69 +++++++-------------
 theme/templates/macros/link.html             | 38 ++++++-----
 theme/templates/macros/nav.html              |  2 -
 theme/templates/macros/renderers.html        | 20 +-----
 theme/templates/page.html                    |  4 +-
 theme/templates/tag.html                     |  2 +-
 10 files changed, 105 insertions(+), 92 deletions(-)
 create mode 100644 theme/templates/macros/common.html

diff --git a/theme/templates/base.html b/theme/templates/base.html
index afead3a..79ecefc 100644
--- a/theme/templates/base.html
+++ b/theme/templates/base.html
@@ -1,11 +1,12 @@
 <!DOCTYPE html>
 
+{%- import 'macros/common.html' as common with context -%}
 {%- import 'macros/getters.html' as get with context -%}
 {%- import 'macros/link.html' as linkr with context -%}
+{%- import 'macros/nav.html' as nav with context -%}
 {%- import 'macros/cards.html' as cards with context -%}
-{%- import 'macros/renderers.html' as render with context -%}
 {%- import 'macros/content_renderer.html' as content_renderer with context -%}
-{%- import 'macros/nav.html' as nav with context -%}
+{%- import 'macros/renderers.html' as render with context -%}
 
 <html lang="{{ l }}" xmlns="http://www.w3.org/1999/xhtml">
 <head>
diff --git a/theme/templates/index.html b/theme/templates/index.html
index 2221724..2ec8668 100644
--- a/theme/templates/index.html
+++ b/theme/templates/index.html
@@ -7,7 +7,7 @@
 
 {% block page_header %}
 <header class="visuallyhidden">
-	<h1>{{ render.softbreak_span(page.title) }}</h1>
+	<h1>{{ common.softbreak_span(page.title) }}</h1>
 </header>
 <hr>
 {% endblock %}
diff --git a/theme/templates/macros/cards.html b/theme/templates/macros/cards.html
index 5e8a4fc..1e53b26 100644
--- a/theme/templates/macros/cards.html
+++ b/theme/templates/macros/cards.html
@@ -1,5 +1,3 @@
-{%- import 'macros/getters.html' as get with context -%}
-
 
 {%- macro open(id = None, classes = None) -%}
 	<ul {%- if id %} id="{{ id|e }}"{% endif %} class="cards {%- if classes %}{% for class in classes %} {{ class|e }}{% endfor %}{% endif %}">
@@ -29,7 +27,7 @@
 	{%- endif -%}
 	{%- for page in pages -%}
 		{%- if max is none or loop.index <= max -%}
-			{{ cards.card_from_page(page, lang) }}
+			{{ card_from_page(page, lang) }}
 		{%- endif -%}
 	{%- endfor -%}
 	{%- if standalone -%}
diff --git a/theme/templates/macros/common.html b/theme/templates/macros/common.html
new file mode 100644
index 0000000..1fdaeb3
--- /dev/null
+++ b/theme/templates/macros/common.html
@@ -0,0 +1,51 @@
+{%- macro softbreak_span(content) -%}
+	{%- set contentsplit = content.split('&shy;')-%}
+	<span>
+		{%- for s in contentsplit -%}
+			{%- if not loop.first -%}
+				&shy;
+			{%- endif -%}
+			{{ s|e }}
+		{%- endfor -%}
+	</span>
+{%- endmacro -%}
+
+{%- macro render_attr_extra(key, value, lang) %}
+	{%- if value != None -%}
+		{%- if value is mapping and value['value'] != None -%}
+			{%- if value['escape'] %} {{ key }}="{{ value['value']|e }}"
+			{%- else %} {{ key }}="{{ value['value'] }}"
+			{%- endif -%}
+		{%- elif value is string %} {{ key }}="{{ value }}"
+		{%- endif -%}
+	{%- endif -%}
+{%- endmacro -%}
+
+{%- macro render_attr(attr, lang, extra_classes = [], extra = {}, extra_style= {}) -%}
+	{%- set id = attr['id']|d("") -%}
+	{%- set classes = attr['classes']|d([]) + extra_classes -%}
+	{%- set attr_extra = attr['extra']|d({}) -%}
+	{%- set style = attr['style']|d({}) -%}
+
+	{%- if id %} id="{{ id }}"{%- endif -%}
+	{%- if classes|length %} class="{{ classes|join(' ') }}"{%- endif -%}
+	{%- for key, value in attr_extra.items() -%}
+		{%- if key not in extra -%}
+			{{ render_attr_extra(key, value, lang) }}
+		{%- endif -%}
+	{%- endfor -%}
+	{%- for key, value in extra.items() -%}
+		{{ render_attr_extra(key, value, lang) }}
+	{%- endfor -%}
+
+
+	{%- if style.items()|length or extra_style.items()|length %} style="
+		{%- for key, value in style.items() -%}
+			{{ key }}: {{ value }};
+		{%- endfor -%}
+		{%- for key, value in extra_style.items() -%}
+			{{ key }}: {{ value }};
+		{%- endfor -%}"
+	{%- endif -%}
+{%- endmacro -%}
+
diff --git a/theme/templates/macros/content_renderer.html b/theme/templates/macros/content_renderer.html
index 24cfb8a..ba7fa1d 100644
--- a/theme/templates/macros/content_renderer.html
+++ b/theme/templates/macros/content_renderer.html
@@ -5,43 +5,18 @@
 	{{ render_blocks(content, lang) }}
 {%- endmacro -%}
 
-{%- macro render_attr_extra(key, value, lang) %}
-	{%- if value != None -%}
-		{%- if value is mapping and value['value'] != None -%}
-			{%- if value['escape'] %} {{ key }}="{{ value['value']|e }}"
-			{%- else %} {{ key }}="{{ value['value'] }}"
+{%- macro render_link(link, content, lang, attr = None, title = None) -%}
+	{%- call(objtype, obj) linkr.render_raw(link, content, lang, attr, title) -%}
+		{%- if content is string or content is none -%}
+			{%- if content is string and content|length -%}
+				{{ common.softbreak_span(content) }}
+			{%- else -%}
+				{{ common.softbreak_span(obj.title) }}
 			{%- endif -%}
-		{%- elif value is string %} {{ key }}="{{ value }}"
+		{%- else -%}
+			{{ render_blocks_or_inlines(content, lang) }}
 		{%- endif -%}
-	{%- endif -%}
-{%- endmacro -%}
-
-{%- macro render_attr(attr, lang, extra_classes = [], extra = {}, extra_style= {}) -%}
-	{%- set id = attr['id']|d("") -%}
-	{%- set classes = attr['classes']|d([]) + extra_classes -%}
-	{%- set attr_extra = attr['extra']|d({}) -%}
-	{%- set style = attr['style']|d({}) -%}
-
-	{%- if id %} id="{{ id }}"{%- endif -%}
-	{%- if classes|length %} class="{{ classes|join(' ') }}"{%- endif -%}
-	{%- for key, value in attr_extra.items() -%}
-		{%- if key not in extra -%}
-			{{ render_attr_extra(key, value, lang) }}
-		{%- endif -%}
-	{%- endfor -%}
-	{%- for key, value in extra.items() -%}
-		{{ render_attr_extra(key, value, lang) }}
-	{%- endfor -%}
-
-
-	{%- if style.items()|length or extra_style.items()|length %} style="
-		{%- for key, value in style.items() -%}
-			{{ key }}: {{ value }};
-		{%- endfor -%}
-		{%- for key, value in extra_style.items() -%}
-			{{ key }}: {{ value }};
-		{%- endfor -%}"
-	{%- endif -%}
+	{%- endcall -%}
 {%- endmacro -%}
 
 {%- macro render_orderedlist_type(style, delim) -%}
@@ -64,7 +39,7 @@
 				{%- set ns.url = [siteurl, ns.url]|join("/") -%}
 			{%- endif -%}
 		{%- endif -%}
-		<img {{ render_attr(attr, lang, extra={"src": ns.url, "title": {"value":title, "escape": true}, "loading": "lazy"}) }} alt="
+		<img {{ common.render_attr(attr, lang, extra={"src": ns.url, "title": {"value":title, "escape": true}, "loading": "lazy"}) }} alt="
 			{%- if alt is string -%}
 				{{ alt|e }}
 			{%- else -%}
@@ -134,7 +109,7 @@
 	{%- set level = block['level'] -%}
 	{%- set attr = block['attr'] -%}
 	{%- set content = block['content'] -%}
-	<header {{ render_attr(attr, lang) }}>
+	<header {{ common.render_attr(attr, lang) }}>
 		<h{{ level }}>{{ render_inlines(content, lang) }}</h{{ level }}>
 	</header>
 {%- endmacro -%}
@@ -163,7 +138,7 @@
 	{%- set attr = block['attr'] -%}
 	{%- set code = block['code'] -%}
 	{%- set code_lines = block['code_lines'] -%}
-	<pre {{ render_attr(attr, lang, extra_classes=["codeblock"]) }}>{{ code|e }}</pre>
+	<pre {{ common.render_attr(attr, lang, extra_classes=["codeblock"]) }}>{{ code|e }}</pre>
 {%- endmacro -%}
 
 {%- macro render_block_blockquote(block, lang) -%}
@@ -176,7 +151,7 @@
 {%- macro render_block_blockcontainer(block, lang) -%}
 	{%- set attr = block['attr'] -%}
 	{%- set content = block['content'] -%}
-	<div {{ render_attr(attr, lang) }}>
+	<div {{ common.render_attr(attr, lang) }}>
 		{{ render_blocks(content, lang) }}
 	</div>
 {%- endmacro -%}
@@ -221,7 +196,7 @@
 		{%- set ns.classes = [alignment_class] -%}
 	{%- endif -%}
 
-	<{% if is_header %}th{% else %}td{% endif %} {{ render_attr(attr, lang, extra_classes=ns.classes, extra={"rowspan": row_span, "colspan": column_span}, extra_style=ns.extra_style) }}>
+	<{% if is_header %}th{% else %}td{% endif %} {{ common.render_attr(attr, lang, extra_classes=ns.classes, extra={"rowspan": row_span, "colspan": column_span}, extra_style=ns.extra_style) }}>
 		{{ render_blocks(content, lang) }}
 	</{% if is_header %}th{% else %}td{% endif %}>
 {%- endmacro -%}
@@ -235,7 +210,7 @@
 {%- macro render_block_table_row(row, lang, num_headers, column_specs) -%}
 	{%- set attr = row['attr'] -%}
 	{%- set cells = row['cells'] -%}
-	<tr {{ render_attr(attr, lang) }}>
+	<tr {{ common.render_attr(attr, lang) }}>
 		{%- for cell in cells -%}
 			{%- if loop.index <= num_headers or num_headers == -1 -%}
 				{{ render_block_table_cell(cell,lang,is_header=true,column_spec=column_specs[loop.index0]) }}
@@ -263,13 +238,13 @@
 		{#- TODO: Maybe add colgroup? -#}
 
 		{%- if head.rows|length -%}
-		<thead {{ render_attr(head.attr, lang) }}>
+		<thead {{ common.render_attr(head.attr, lang) }}>
 			{{ render_block_table_rows(head.rows,lang,num_headers=-1,column_specs=column_specs) }}
 		</thead>
 		{%- endif -%}
 
 		{%- for body in bodies -%}
-			<tbody {{ render_attr(body.attr, lang) }}>
+			<tbody {{ common.render_attr(body.attr, lang) }}>
 				{%- if body.intermediate_head|length -%}
 					{{ render_block_table_rows(body.intermediate_head,lang,num_headers=-1,column_specs=column_specs) }}
 				{%- endif -%}
@@ -279,7 +254,7 @@
 
 
 		{%- if foot.rows|length -%}
-		<tfoot {{ render_attr(foot.attr, lang) }}>
+		<tfoot {{ common.render_attr(foot.attr, lang) }}>
 			{{ render_block_table_rows(foot.rows,lang,num_headers=bodies[0].row_head_columns,column_specs=column_specs) }}
 		</tfoot>
 		{%- endif -%}
@@ -390,7 +365,7 @@
 {%- macro render_inline_inlinecontainer(inline, lang) -%}
 	{%- set attr = inline['attr'] -%}
 	{%- set content = inline['content'] -%}
-	<span {{ render_attr(attr, lang) }}>{{ render_inlines(content, lang) }}</span>
+	<span {{ common.render_attr(attr, lang) }}>{{ render_inlines(content, lang) }}</span>
 {%- endmacro -%}
 
 {%- macro render_inline_rawinline(inline, lang) -%}
@@ -409,7 +384,7 @@
 	{%- set attr = inline['attr'] -%}
 	{%- set code = inline['code'] -%}
 	{%- set code_lines = inline['code_lines'] -%}
-	<code {{ render_attr(attr, lang, extra_classes=["codeinline"]) }}>{{ code|e }}</code>
+	<code {{ common.render_attr(attr, lang, extra_classes=["codeinline"]) }}>{{ code|e }}</code>
 {%- endmacro -%}
 
 {%- macro render_inline_quoted(inline, lang) -%}
@@ -434,7 +409,7 @@
 	{%- set content = inline['content'] -%}
 	{%- set link = inline['link'] -%}
 	{%- set title = inline['title'] -%}
-	{{ linkr.render(link, content, lang, attr, title) }}
+	{{ render_link(link, content, lang, attr, title) }}
 {%- endmacro -%}
 
 {%- macro render_inline_image(inline, lang) -%}
diff --git a/theme/templates/macros/link.html b/theme/templates/macros/link.html
index 19a4cb4..2d143d7 100644
--- a/theme/templates/macros/link.html
+++ b/theme/templates/macros/link.html
@@ -1,6 +1,3 @@
-{%- import 'macros/content_renderer.html' as content_renderer with context -%}
-{%- import 'macros/renderers.html' as renderm with context -%}
-
 
 {%- macro resolve(link) -%}
 	{%- set ns = namespace(alias=link, objtype=link.type, obj=None) -%}
@@ -30,8 +27,25 @@
 
 
 {%- macro render(link, content, lang, attr = None, title = None) -%}
+	{%- call(objtype, obj) render_raw(link, content, lang, attr, title) -%}
+		{%- if content is string or content is none -%}
+			{%- if content is string and content|length -%}
+				{{ common.softbreak_span(content) }}
+			{%- else -%}
+				{{ common.softbreak_span(obj.title) }}
+			{%- endif -%}
+		{%- else -%}
+			<strong>ERROR: Cannot render link with formatted content here.</strong>
+		{%- endif -%}
+	{%- endcall -%}
+{%- endmacro -%}
+
+{%- macro render_raw(link, content, lang, attr, title) -%}
+	{%- set ns = namespace(relation=None, url=None, objtype=None, obj=None) -%}
 	{%- call(resolvedlink, objtype, obj) resolve(link) -%}
-		{%- set ns = namespace(relation=None, url=resolvedlink.urlwithanchor) -%}
+		{%- set ns.url = resolvedlink.urlwithanchor -%}
+		{%- set ns.objtype = objtype -%}
+		{%- set ns.obj = obj -%}
 		{%- if resolvedlink.is_external -%}
 			{%- set ns.relation = "external" -%}
 		{%- else -%}
@@ -40,19 +54,11 @@
 				{%- set ns.url = [siteurl, ns.url]|join("/") -%}
 			{%- endif -%}
 		{%- endif -%}
-		{%- set target = config.link_target[ns.relation] -%}
-		<a {{ content_renderer.render_attr(attr, lang, extra_classes=[ns.relation], extra={"href": ns.url, "title": {"value":title, "escape": true}, "target": target}) }}>
-			{%- if content is string or content is none -%}
-				{%- if content is string and content|length -%}
-					{{ renderm.softbreak_span(content) }}
-				{%- else -%}
-					{{ renderm.softbreak_span(obj.title) }}
-				{%- endif -%}
-			{%- else -%}
-				{{ content_renderer.render_blocks_or_inlines(content, lang) }}
-			{%- endif -%}
-		</a>
 	{%- endcall -%}
+	{%- set target = config.link_target[ns.relation] -%}
+	<a {{ common.render_attr(attr, lang, extra_classes=[ns.relation], extra={"href": ns.url, "title": {"value":title, "escape": true}, "target": target}) }}>
+		{{- caller(ns.objtype, ns.obj) -}}
+	</a>
 {%- endmacro -%}
 
 {%- macro render_tag(tag, lang) -%}
diff --git a/theme/templates/macros/nav.html b/theme/templates/macros/nav.html
index f4dd2c0..e01d3e6 100644
--- a/theme/templates/macros/nav.html
+++ b/theme/templates/macros/nav.html
@@ -1,5 +1,3 @@
-{%- import 'macros/link.html' as linkr with context -%}
-
 {%- macro render_menu(items, lang) -%}
 	<nav>
 		<ul>
diff --git a/theme/templates/macros/renderers.html b/theme/templates/macros/renderers.html
index a328ffd..7bf4d29 100644
--- a/theme/templates/macros/renderers.html
+++ b/theme/templates/macros/renderers.html
@@ -1,19 +1,3 @@
-{%- import 'macros/getters.html' as get with context -%}
-{%- import 'macros/cards.html' as cards with context -%}
-{%- import 'macros/content_renderer.html' as content_renderer with context -%}
-
-{%- macro softbreak_span(content) -%}
-	{%- set contentsplit = content.split('&shy;')-%}
-	<span>
-		{%- for s in contentsplit -%}
-			{%- if not loop.first -%}
-				&shy;
-			{%- endif -%}
-			{{ s|e }}
-		{%- endfor -%}
-	</span>
-{%- endmacro -%}
-
 
 {%- macro section_news(s, lang) -%}
 	{{ cards.cards_from_pages(pages_modified[lang], max=s.num|d(None)) }}
@@ -30,7 +14,7 @@
 {%- macro section_tag(s, lang) -%}
 	{%- if s.title is not defined -%}
 		<header>
-			<h2 {% if s.id is defined -%}id="{{ s.id }}"{%- endif %}>{{ softbreak_span(s.tag.title) }}</h2>
+			<h2 {% if s.id is defined -%}id="{{ s.id }}"{%- endif %}>{{ common.softbreak_span(s.tag.title) }}</h2>
 		</header>
 	{%- endif -%}
 	{{ cards.cards_from_pages(s.tag.pages, lang, max=s.num|d(None)) }}
@@ -43,7 +27,7 @@
 {%- macro section(s, lang) -%}
 	{%- if s.title is defined -%}
 		<header>
-			<h2 {% if s.id is defined -%}id="{{ s.id }}"{%- endif %}>{{ softbreak_span(s.title[lang]) }}</h2>
+			<h2 {% if s.id is defined -%}id="{{ s.id }}"{%- endif %}>{{ common.softbreak_span(s.title[lang]) }}</h2>
 		</header>
 	{%- endif -%}
 	{%- if s.type == "news" -%}
diff --git a/theme/templates/page.html b/theme/templates/page.html
index cf7e1c9..14f9953 100644
--- a/theme/templates/page.html
+++ b/theme/templates/page.html
@@ -1,6 +1,6 @@
 {% extends "base.html" %}
 
-{% block title %}{{ t[l].title_prefix }}{{ render.softbreak_span(page.title)|striptags }}{{ t[l].title_seperator }}{{ render.softbreak_span(page.category.title)|striptags }}{{ t[l].title_seperator }}{{ t[l].sitename }}{{ t[l].title_suffix }}{% endblock %}
+{% block title %}{{ t[l].title_prefix }}{{ common.softbreak_span(page.title)|striptags }}{{ t[l].title_seperator }}{{ common.softbreak_span(page.category.title)|striptags }}{{ t[l].title_seperator }}{{ t[l].sitename }}{{ t[l].title_suffix }}{% endblock %}
 
 {% block extra_head %}
 {% endblock %}
@@ -13,7 +13,7 @@
 	<article>
 		{% block page_header %}
 		<header>
-			<h1>{{ render.softbreak_span(page.title) }}</h1>
+			<h1>{{ common.softbreak_span(page.title) }}</h1>
 		</header>
 		{% endblock %}
 		{% block page_content %}
diff --git a/theme/templates/tag.html b/theme/templates/tag.html
index ddeabb9..1ee3be5 100644
--- a/theme/templates/tag.html
+++ b/theme/templates/tag.html
@@ -1,6 +1,6 @@
 {% extends "base.html" %}
 
-{% block title %}{{ t[l].title_prefix }}{{ render.softbreak_span(tag.title)|striptags }}{{ t[l].title_seperator }}{{ t[l].sitename }}{{ t[l].title_suffix }}{% endblock %}
+{% block title %}{{ t[l].title_prefix }}{{ common.softbreak_span(tag.title)|striptags }}{{ t[l].title_seperator }}{{ t[l].sitename }}{{ t[l].title_suffix }}{% endblock %}
 
 {% block breadcrumb %}
 	{{ nav.render_breadcrumb_menu(tag, l) }}
-- 
GitLab