From fa8d16c52b9227d44810f4edbacd7e7854e83b6c Mon Sep 17 00:00:00 2001
From: Jake <j.vondoemming@stud.uni-goettingen.de>
Date: Wed, 31 Aug 2022 23:42:51 +0200
Subject: [PATCH] render tables

---
 theme/templates/macros/content_renderer.html | 98 +++++++++++++++++++-
 1 file changed, 96 insertions(+), 2 deletions(-)

diff --git a/theme/templates/macros/content_renderer.html b/theme/templates/macros/content_renderer.html
index bc2d8bf..a94c77d 100644
--- a/theme/templates/macros/content_renderer.html
+++ b/theme/templates/macros/content_renderer.html
@@ -16,7 +16,7 @@
 	{%- endif -%}
 {%- endmacro -%}
 
-{%- macro render_attr(attr, lang, extra_classes = [], extra = {}) -%}
+{%- 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({}) -%}
@@ -34,9 +34,12 @@
 	{%- endfor -%}
 
 
-	{%- if style.items()|length %} style="
+	{%- 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 -%}
@@ -118,6 +121,8 @@
 		{{ render_block_rawblock(block, lang) }}
 	{%- elif etype == "orderedlist" -%}
 		{{ render_block_orderedlist(block, lang) }}
+	{%- elif etype == "table" -%}
+		{{ render_block_table(block, lang) }}
 	{%- elif etype == "definitionlist" -%}
 		{{ render_block_definitionlist(block, lang) }}
 	{%- else -%}
@@ -196,6 +201,95 @@
 	{%- endif -%}
 {%- endmacro -%}
 
+{%- macro render_block_table_cell(cell, lang, is_header, column_spec) -%}
+	{%- set attr = cell['attr'] -%}
+	{%- set cell_alignment = cell['alignment'] -%}
+	{%- set row_span = cell['row_span'] -%}
+	{%- set column_span = cell['column_span'] -%}
+	{%- set content = cell['content'] -%}
+
+	{%- set column_alignment = column_spec.alignment -%}
+	{%- set ns = namespace(alignment=column_alignment,classes=[],extra_style={}) -%}
+
+	{%- if cell_alignment != "default" -%}
+		{%- set ns.alignment=cell_alignment -%}
+	{%- endif -%}
+
+	{%- set alignment_class = ["align", ns.alignment]|join('_') -%}
+
+	{%- if column_spec.has_width-%}
+		{%- set ns.classes = [alignment_class, "has_recommended_width"] -%}
+		{%- set ns.extra_style = {"--recommended_width": [column_spec.width.percentage, "%"]|join('')} -%}
+		{#- set ns.extra_style = {"width": [column_spec.width.percentage, "%"]|join('')} -#}
+	{%- else -%}
+		{%- 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) }}>
+		{{ render_blocks(content, lang) }}
+	</{% if is_header %}th{% else %}td{% endif %}>
+{%- endmacro -%}
+
+{%- macro render_block_table_rows(rows, lang, num_headers,column_specs) -%}
+	{%- for row in rows -%}
+		{{ render_block_table_row(row,lang,num_headers=num_headers,column_specs=column_specs) }}
+	{%- endfor -%}
+{%- endmacro -%}
+
+{%- macro render_block_table_row(row, lang, num_headers, column_specs) -%}
+	{%- set attr = row['attr'] -%}
+	{%- set cells = row['cells'] -%}
+	<tr {{ 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]) }}
+			{%- else -%}
+				{{ render_block_table_cell(cell,lang,is_header=false,column_spec=column_specs[loop.index0]) }}
+			{%- endif -%}
+		{%- endfor -%}
+	</tr>
+{%- endmacro -%}
+
+{%- macro render_block_table(block, lang) -%}
+	{#- https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table -#}
+	{%- set attr = block['attr'] -%}
+	{%- set caption = block['caption'] -%}
+	{%- set column_specs = block['column_specs'] -%}
+	{%- set head = block['head'] -%}
+	{%- set bodies = block['bodies'] -%}
+	{%- set foot = block['foot'] -%}
+
+	<table>
+		{%- if caption|length -%}
+			<caption>{{ render_blocks(caption, lang) }}</caption>
+		{%- endif -%}
+
+		{#- TODO: Maybe add colgroup? -#}
+
+		{%- if head.rows|length -%}
+		<thead {{ 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) }}>
+				{%- if body.intermediate_head|length -%}
+					{{ render_block_table_rows(body.intermediate_head,lang,num_headers=-1,column_specs=column_specs) }}
+				{%- endif -%}
+				{{ render_block_table_rows(body.intermediate_body,lang,num_headers=body.row_head_columns,column_specs=column_specs) }}
+			</tbody>
+		{%- endfor -%}
+
+
+		{%- if foot.rows|length -%}
+		<tfoot {{ 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 -%}
+	</table>
+{%- endmacro -%}
+
 {%- macro render_block_orderedlist(block, lang) -%}
 	{%- set items = block['items'] -%}
 	{%- set count = block['count'] -%}
-- 
GitLab