{#- Siehe https://gitlab.gwdg.de/GAUMI-fginfo/fg-website/-/blob/better-content-renderer/docs/content.md -#} {%- macro render_content(content, lang) -%} {{ 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'] }}" {%- 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 -%} {%- macro render_orderedlist_type(style, delim) -%} {#- TODO also use delim: default | period | one_parenthesis | two_parentheses -#} {%- if style == "default" -%}1 {%- elif style == "lower_alpha" -%}a {%- elif style == "upper_alpha" -%}A {%- elif style == "lower_roman" -%}i {%- elif style == "upper_roman" -%}I {%- elif style == "example" -%}1 {%- else -%}1 {%- endif -%} {%- endmacro -%} {%- macro render_image(link, alt, lang, attr = None, title = None) -%} {%- call(resolvedlink, objtype, obj) linkr.resolve(link) -%} {%- set ns = namespace(url=resolvedlink.urlwithanchor) -%} {%- if not resolvedlink.is_external -%} {%- if resolvedlink.url|length -%} {%- set ns.url = [siteurl, ns.url]|join("/") -%} {%- endif -%} {%- endif -%} 
			{%- if alt is string -%}
				{{ alt|e }}
			{%- else -%}
				{{ render_inlines(alt, lang)|striptags|e }}
			{%- endif -%}
		{%- endcall -%} {%- endmacro -%} {%- macro render_blocks_or_inlines(bsois, lang) -%} {%- for boi in bsois -%} {{ render_block_or_inline(boi, lang) }} {%- endfor -%} {%- endmacro -%} {%- macro render_block_or_inline(boi, lang) -%} {%- set eclass = boi['eclass'] -%} {%- if eclass == "block" -%} {{ render_block(boi,lang) }} {%- elif eclass == "inline" -%} {{ render_inline(boi,lang) }} {%- else -%}
ERROR: Cannot render block or inline: '{{ boi|e }}'
{%- endif -%} {%- endmacro -%} {#- ############################ BLOCKS ################################### -#} {%- macro render_blocks(blocks, lang) -%} {%- for block in blocks -%} {{ render_block(block,lang) }} {%- endfor -%} {%- endmacro -%} {%- macro render_block(block, lang) -%} {%- set etype = block['etype'] -%} {%- if etype == "header" -%} {{ render_block_header(block, lang) }} {%- elif etype == "paragraph" -%} {{ render_block_paragraph(block, lang) }} {%- elif etype == "bulletlist" -%} {{ render_block_bulletlist(block, lang) }} {%- elif etype == "plain" -%} {{ render_block_plain(block, lang) }} {%- elif etype == "codeblock" -%} {{ render_block_codeblock(block, lang) }} {%- elif etype == "blockquote" -%} {{ render_block_blockquote(block, lang) }} {%- elif etype == "blockcontainer" -%} {{ render_block_blockcontainer(block, lang) }} {%- elif etype == "horizontalrule" -%} {{ render_block_horizontalrule(block, lang) }} {%- elif etype == "rawblock" -%} {{ 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 -%}
ERROR: Unhandled block type: '{{ etype|e }}'
{%- endif -%} {%- endmacro -%} {%- macro render_block_header(block, lang) -%} {%- set level = block['level'] -%} {%- set attr = block['attr'] -%} {%- set content = block['content'] -%}
{{ render_inlines(content, lang) }}
{%- endmacro -%} {%- macro render_block_paragraph(block, lang) -%} {%- set content = block['content'] -%}

{{ render_inlines(content, lang) }}

{%- endmacro -%} {%- macro render_block_bulletlist(block, lang) -%} {%- set items = block['items'] -%} {%- set count = block['count'] -%} {%- endmacro -%} {%- macro render_block_plain(block, lang) -%} {%- set content = block['content'] -%} {{ render_inlines(content, lang) }} {%- endmacro -%} {%- macro render_block_codeblock(block, lang) -%} {%- set attr = block['attr'] -%} {%- set code = block['code'] -%} {%- set code_lines = block['code_lines'] -%}
{{ code|e }}
{%- endmacro -%} {%- macro render_block_blockquote(block, lang) -%} {%- set content = block['content'] -%}
{{ render_blocks(content, lang) }}
{%- endmacro -%} {%- macro render_block_blockcontainer(block, lang) -%} {%- set attr = block['attr'] -%} {%- set content = block['content'] -%}
{{ render_blocks(content, lang) }}
{%- endmacro -%} {%- macro render_block_horizontalrule(block, lang) -%}
{%- endmacro -%} {%- macro render_block_rawblock(block, lang) -%} {%- set format = block['format'] -%} {%- set raw = block['raw'] -%} {%- if format == "html" -%} {#-
-#} {{ raw }} {#-
-#} {%- else -%}
{{ raw | e }}
{%- 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) }} {%- 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'] -%} {%- 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 -%} {%- 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'] -%} {%- if caption|length -%} {%- endif -%} {#- TODO: Maybe add colgroup? -#} {%- if head.rows|length -%} {{ render_block_table_rows(head.rows,lang,num_headers=-1,column_specs=column_specs) }} {%- endif -%} {%- for body in bodies -%} {%- 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) }} {%- endfor -%} {%- if foot.rows|length -%} {{ render_block_table_rows(foot.rows,lang,num_headers=bodies[0].row_head_columns,column_specs=column_specs) }} {%- endif -%}
{{ render_blocks(caption, lang) }}
{%- endmacro -%} {%- macro render_block_orderedlist(block, lang) -%} {%- set items = block['items'] -%} {%- set count = block['count'] -%} {%- set start = block['start'] -%} {%- set style = block['style'] -%} {%- set delim = block['delim'] -%} {#- ol start="{{ start|e }}" style="list-style-type: {{ render_orderedlist_type(style, delim) }};" -#}
    {%- for item in items -%}
  1. {{ render_blocks(item, lang) }}
  2. {%- endfor -%}
{%- endmacro -%} {%- macro render_block_definitionlist(block, lang) -%} {%- set items = block['items'] -%}
{%- for item in items -%} {%- set term = item['term'] -%} {%- set definitions = item['definitions'] -%}
{{ render_inlines(term, lang) }}
{%- for def in definitions -%}
{{ render_blocks(def, lang) }}
{%- endfor -%} {%- endfor -%}
{%- endmacro -%} {#- ############################ INLINES ################################## -#} {%- macro render_inlines(inlines, lang) -%} {%- for inline in inlines -%} {{ render_inline(inline,lang) }} {%- endfor -%} {%- endmacro -%} {%- macro render_inline(inline, lang) -%} {%- set etype = inline['etype'] -%} {%- if etype == "space" -%} {{ render_inline_space(inline, lang) }} {%- elif etype == "string" -%} {{ render_inline_string(inline, lang) }} {%- elif etype == "linebreak" -%} {{ render_inline_linebreak(inline, lang) }} {%- elif etype == "strong" -%}{{ render_inline_simple(inline, lang, "b") }} {%- elif etype == "emph" -%}{{ render_inline_simple(inline, lang, "i") }} {%- elif etype == "strikeout" -%}{{ render_inline_simple(inline, lang, "s") }} {%- elif etype == "superscript" -%}{{ render_inline_simple(inline, lang, "sup") }} {%- elif etype == "subscript" -%}{{ render_inline_simple(inline, lang, "sub") }} {%- elif etype == "underline" -%}{{ render_inline_underline(inline, lang) }} {%- elif etype == "smallcaps" -%}{{ render_inline_smallcaps(inline, lang) }} {%- elif etype == "inlinecontainer" -%} {{ render_inline_inlinecontainer(inline, lang) }} {%- elif etype == "rawinline" -%} {{ render_inline_rawinline(inline, lang) }} {%- elif etype == "code" -%} {{ render_inline_code(inline, lang) }} {%- elif etype == "quoted" -%} {{ render_inline_quoted(inline, lang) }} {%- elif etype == "footnote" -%} {{ render_inline_footnote(inline, lang) }} {%- elif etype == "link" -%} {{ render_inline_link(inline, lang) }} {%- elif etype == "image" -%} {{ render_inline_image(inline, lang) }} {%- elif etype == "math" -%} {{ render_inline_math(inline, lang) }} {%- elif etype == "softbreak" -%} {{ render_inline_softbreak(inline, lang) }} {%- else -%}
ERROR: Unhandled inline type: '{{ etype|e }}'
{%- endif -%} {%- endmacro -%} {%- macro render_inline_space(inline, lang) %} {% endmacro -%} {%- macro render_inline_string(inline, lang) -%} {%- set text = inline['text'] -%} {{ text|e }} {%- endmacro -%} {%- macro render_inline_linebreak(inline, lang) -%}
{%- endmacro -%} {%- macro render_inline_simple(inline, lang, tag) -%} {%- set content = inline['content'] -%} <{{ tag }}>{{ render_inlines(content, lang) }} {%- endmacro -%} {%- macro render_inline_underline(inline, lang) -%} {%- set content = inline['content'] -%} {{ render_inlines(content, lang) }} {%- endmacro -%} {%- macro render_inline_smallcaps(inline, lang) -%} {%- set content = inline['content'] -%} {{ render_inlines(content, lang) }} {%- endmacro -%} {%- macro render_inline_inlinecontainer(inline, lang) -%} {%- set attr = inline['attr'] -%} {%- set content = inline['content'] -%} {{ render_inlines(content, lang) }} {%- endmacro -%} {%- macro render_inline_rawinline(inline, lang) -%} {%- set format = inline['format'] -%} {%- set raw = inline['raw'] -%} {%- if format == "html" -%} {#- -#} {{ raw }} {#- -#} {%- else -%} {{ raw | e }} {%- endif -%} {%- endmacro -%} {%- macro render_inline_code(inline, lang) -%} {%- set attr = inline['attr'] -%} {%- set code = inline['code'] -%} {%- set code_lines = inline['code_lines'] -%} {{ code|e }} {%- endmacro -%} {%- macro render_inline_quoted(inline, lang) -%} {%- set quotetype = inline['quotetype'] -%} {%- set content = inline['content'] -%} {%- if quotetype == "single" -%} {{ t[lang].quotations.single.left }}{{ render_inlines(content, lang) }}{{ t[lang].quotations.single.right }} {%- elif quotetype == "double" -%} {{ t[lang].quotations.double.left }}{{ render_inlines(content, lang) }}{{ t[lang].quotations.double.right }} {%- else -%} "{{ render_inlines(content, lang) }}" {%- endif -%} {%- endmacro -%} {%- macro render_inline_footnote(inline, lang) -%} {%- set content = inline['content'] -%} [TODO FOOTNOTES] {%- endmacro -%} {%- macro render_inline_link(inline, lang) -%} {%- set attr = inline['attr'] -%} {%- set content = inline['content'] -%} {%- set link = inline['link'] -%} {%- set title = inline['title'] -%} {{ linkr.render(link, content, lang, attr, title) }} {%- endmacro -%} {%- macro render_inline_image(inline, lang) -%} {%- set attr = inline['attr'] -%} {%- set alt = inline['alt'] -%} {%- set link = inline['link'] -%} {%- set title = inline['title'] -%} {{ render_image(link, alt, lang, attr, title) }} {%- endmacro -%} {%- macro render_inline_math(inline, lang) -%} {%- set mathtype = inline['mathtype'] -%} {%- set math = inline['math'] -%} {%- if mathtype == "inline" -%} \({{ math|e }}\) {%- elif mathtype == "display" -%} \[{{ math|e }}\] {%- else -%}
ERROR: Unhandled mathtype: '{{ mathtype|e }}'
{%- endif -%} {%- endmacro -%} {%- macro render_inline_softbreak(inline, lang) -%} ­ {%- endmacro -%}