diff --git a/theme/templates/macros/content_renderer.html b/theme/templates/macros/content_renderer.html index bc2d8bffcd3beb2b1567b122ad274e5a8b1dbaa4..a94c77d095ff7d2a598501472b240736fdc106a9 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'] -%}