diff --git a/tests/data/html/dynamic_table.html b/tests/data/html/dynamic_table.html
index e585f17..198a629 100644
--- a/tests/data/html/dynamic_table.html
+++ b/tests/data/html/dynamic_table.html
@@ -1 +1,94 @@
-
| Name | Email | Company | Date of contact | Deal Status | Mode of Payment | Agreement |
| Life Meditech | l@gmail.com | Life Meditech Pvt Ltd | 2024-11-05 | In progress | Cash | true |
| Genios | genios@email.io | Genio Inc. Corp | 2024-11-22 | Complete | Bank Transfer | false |
| Smart MediTech Device Manufacturer | smart@gmail.com | Smart MediTech Device Manufacturer GmbH | 2024-11-29 | On hold | Bitcoin | false |
| microsoft | microsoft@gmail.com | microsoft | 2024-11-06 | In progress | Cash | true |
| google | google@gmail.com | google | 2024-11-20 | Complete | Bank Transfer | true |
| MTech | mtech@yahoo.com | Mtech | 2024-11-04 | In progress | Cash | true |
| CertHub | certhub@certhub.de | certhub | 2024-11-05 | In progress | Bank Transfer | true |
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Name |
+
+ Email |
+
+ Company |
+
+ Date of contact |
+
+ Deal Status |
+
+ Mode of Payment |
+
+ Agreement |
+
+
+
+
+ | Life Meditech |
+ l@gmail.com |
+ Life Meditech Pvt Ltd |
+ 2024-11-05 |
+ In progress |
+ Cash |
+ true |
+
+
+ | Genios |
+ genios@email.io |
+ Genio Inc. Corp |
+ 2024-11-22 |
+ Complete |
+ Bank Transfer |
+ false |
+
+
+ | Smart MediTech Device Manufacturer |
+ smart@gmail.com |
+ Smart MediTech Device Manufacturer GmbH |
+ 2024-11-29 |
+ On hold |
+ Bitcoin |
+ false |
+
+
+ | microsoft |
+ microsoft@gmail.com |
+ microsoft |
+ 2024-11-06 |
+ In progress |
+ Cash |
+ true |
+
+
+ | google |
+ google@gmail.com |
+ google |
+ 2024-11-20 |
+ Complete |
+ Bank Transfer |
+ true |
+
+
+ | MTech |
+ mtech@yahoo.com |
+ Mtech |
+ 2024-11-04 |
+ In progress |
+ Cash |
+ true |
+
+
+ | CertHub |
+ certhub@certhub.de |
+ certhub |
+ 2024-11-05 |
+ In progress |
+ Bank Transfer |
+ true |
+
+
+
diff --git a/tests/data/html/table.html b/tests/data/html/table.html
index 63d5440..27c09a6 100644
--- a/tests/data/html/table.html
+++ b/tests/data/html/table.html
@@ -1 +1,195 @@
-Name | Email | Company | Date of contact | Deal Status | Mode of Payment | Agreement |
|---|
Life Meditech | l@gmail.com | Life Meditech Pvt Ltd | 2024-11-05 | In progress | Cash | true |
Genios | genios@email.io | Genio Inc. Corp | 2024-11-22 | Complete | Bank Transfer | false |
Smart MediTech Device Manufacturer | smart@gmail.com | Smart MediTech Device Manufacturer GmbH | 2024-11-29 | On hold | Bitcoin | false |
microsoft | microsoft@gmail.com | microsoft | 2024-11-06 | In progress | Cash | true |
google | google@gmail.com | google | 2024-11-20 | Complete | Bank Transfer | true |
MTech | mtech@yahoo.com | Mtech | 2024-11-04 | In progress | Cash | true |
CertHub | certhub@certhub.de | certhub | 2024-11-05 | In progress | Bank Transfer | true |
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+ |
+ Name
+ |
+
+ Email
+ |
+
+ Company
+ |
+
+ Date of contact
+ |
+
+ Deal Status
+ |
+
+ Mode of Payment
+ |
+
+ Agreement
+ |
+
+
+ |
+ Life Meditech
+ |
+
+ l@gmail.com
+ |
+
+ Life Meditech Pvt Ltd
+ |
+
+ 2024-11-05
+ |
+
+ In progress
+ |
+
+ Cash
+ |
+
+ true
+ |
+
+
+ |
+ Genios
+ |
+
+ genios@email.io
+ |
+
+ Genio Inc. Corp
+ |
+
+ 2024-11-22
+ |
+
+ Complete
+ |
+
+ Bank Transfer
+ |
+
+ false
+ |
+
+
+ |
+ Smart MediTech Device Manufacturer
+ |
+
+ smart@gmail.com
+ |
+
+ Smart MediTech Device Manufacturer GmbH
+ |
+
+ 2024-11-29
+ |
+
+ On hold
+ |
+
+ Bitcoin
+ |
+
+ false
+ |
+
+
+ |
+ microsoft
+ |
+
+ microsoft@gmail.com
+ |
+
+ microsoft
+ |
+
+ 2024-11-06
+ |
+
+ In progress
+ |
+
+ Cash
+ |
+
+ true
+ |
+
+
+ |
+ google
+ |
+
+ google@gmail.com
+ |
+
+ google
+ |
+
+ 2024-11-20
+ |
+
+ Complete
+ |
+
+ Bank Transfer
+ |
+
+ true
+ |
+
+
+ |
+ MTech
+ |
+
+ mtech@yahoo.com
+ |
+
+ Mtech
+ |
+
+ 2024-11-04
+ |
+
+ In progress
+ |
+
+ Cash
+ |
+
+ true
+ |
+
+
+ |
+ CertHub
+ |
+
+ certhub@certhub.de
+ |
+
+ certhub
+ |
+
+ 2024-11-05
+ |
+
+ In progress
+ |
+
+ Bank Transfer
+ |
+
+ true
+ |
+
+
diff --git a/tiptapy/templates/dynamicTable.html b/tiptapy/templates/dynamicTable.html
index dda3326..65fb5f0 100644
--- a/tiptapy/templates/dynamicTable.html
+++ b/tiptapy/templates/dynamicTable.html
@@ -1,83 +1,131 @@
+{%- set MAX_TABLE_WIDTH = 670 -%}
+{%- set FLEX_COL_WEIGHT = 25 -%}
{%- set visible_columns = [] -%}
-{%- set rows = node.attrs.content.rows if node.attrs.content and node.attrs.content.rows else [] -%}
+{%- set rows = node.attrs.content.rows if node.attrs.content and node.attrs.content.rows is iterable and
+node.attrs.content.rows is not string else [] -%}
{%- set grid_columns = node.attrs.gridState.columns if node.attrs.gridState and node.attrs.gridState.columns else {} -%}
-{%- set visibility_model = grid_columns.columnVisibilityModel if grid_columns and grid_columns.columnVisibilityModel else {} -%}
+{%- set grid_dimensions = grid_columns.dimensions if grid_columns and grid_columns.dimensions else {} -%}
+{%- set visibility_model = grid_columns.columnVisibilityModel if grid_columns and grid_columns.columnVisibilityModel
+else {} -%}
{%- set ordered_fields = grid_columns.orderedFields if grid_columns and grid_columns.orderedFields else [] -%}
{%- set configured_columns = node.attrs.columns if node.attrs.columns else {} -%}
+{%- set table_settings = node.attrs.tableSettings if node.attrs.tableSettings else {} -%}
+{%- set column_font_size = table_settings.columnFontSize if table_settings.columnFontSize else '12px' -%}
+{%- set row_font_size = table_settings.rowFontSize if table_settings.rowFontSize else '12px' -%}
{%- if rows|length == 0 -%}
No content found
{%- else -%}
-
- {%- if node.attrs.content and node.attrs.content.headers -%}
- {%- for header in ordered_fields -%}
- {%- if header in node.attrs.content.headers -%}
- {%- set props = configured_columns.get(header, {}) -%}
- {%- set is_visible = props.visible if props.visible is defined else visibility_model.get(header, True) -%}
- {%- if is_visible -%}
- {%- set _ = visible_columns.append((header, {
- "originalName": props.originalName|default(header),
- "alias": props.alias|default(None),
- "visible": True,
- "order": props.order|default(loop.index0),
- "width": props.width|default(None)
- })) -%}
- {%- endif -%}
- {%- endif -%}
- {%- endfor -%}
- {%- for header in node.attrs.content.headers -%}
- {%- if header not in ordered_fields -%}
- {%- set props = configured_columns.get(header, {}) -%}
- {%- set is_visible = props.visible if props.visible is defined else visibility_model.get(header, True) -%}
- {%- if is_visible -%}
- {%- set _ = visible_columns.append((header, {
- "originalName": props.originalName|default(header),
- "alias": props.alias|default(None),
- "visible": True,
- "order": props.order|default(visible_columns|length),
- "width": props.width|default(None)
- })) -%}
- {%- endif -%}
+{%- if node.attrs.content and node.attrs.content.headers -%}
+{%- for header in ordered_fields -%}
+{%- if header in node.attrs.content.headers -%}
+{%- set props = configured_columns.get(header, {}) -%}
+{%- set dim_width = grid_dimensions.get(header, {}).get('width') if grid_dimensions else none -%}
+{%- set is_visible = props.visible if props.visible is defined else visibility_model.get(header, True) -%}
+{%- if is_visible -%}
+{%- set col_w = props.width if props.width else dim_width -%}
+{%- set _ = visible_columns.append((header, {
+"originalName": props.originalName|default(header),
+"alias": props.alias|default(None),
+"visible": True,
+"order": props.order|default(loop.index0),
+"width": col_w|int if col_w else none
+})) -%}
+{%- endif -%}
+{%- endif -%}
+{%- endfor -%}
+{%- for header in node.attrs.content.headers -%}
+{%- if header not in ordered_fields -%}
+{%- set props = configured_columns.get(header, {}) -%}
+{%- set dim_width = grid_dimensions.get(header, {}).get('width') if grid_dimensions else none -%}
+{%- set is_visible = props.visible if props.visible is defined else visibility_model.get(header, True) -%}
+{%- if is_visible -%}
+{%- set col_w = props.width if props.width else dim_width -%}
+{%- set _ = visible_columns.append((header, {
+"originalName": props.originalName|default(header),
+"alias": props.alias|default(None),
+"visible": True,
+"order": props.order|default(visible_columns|length),
+"width": col_w|int if col_w else none
+})) -%}
+{%- endif -%}
+{%- endif -%}
+{%- endfor -%}
+{%- endif -%}
+{%- set sorted_columns = visible_columns|sort(attribute='1.order') -%}
+{%- set width_ns = namespace(total=0, defined_count=0) -%}
+{%- for header, props in sorted_columns -%}
+{%- if props.width -%}
+{%- set width_ns.total = width_ns.total + props.width -%}
+{%- set width_ns.defined_count = width_ns.defined_count + 1 -%}
+{%- endif -%}
+{%- endfor -%}
+{%- set has_missing = (sorted_columns|length == 0) or (width_ns.defined_count < sorted_columns|length) -%} {%- set
+ all_defined=(sorted_columns|length> 0) and (width_ns.defined_count == sorted_columns|length) and (width_ns.total >
+ 0) -%}
+ {%- set overflows = width_ns.total > MAX_TABLE_WIDTH -%}
+ {%- if has_missing or (all_defined and overflows) or (sorted_columns|length == 0) -%}
+ {%- set table_width_css = 'width: 100%; max-width: 100%; table-layout: fixed;' -%}
+ {%- else -%}
+ {%- set table_width_css = 'width: ' ~ width_ns.total ~ 'px; max-width: 100%; table-layout: fixed;' -%}
{%- endif -%}
+ {%- set use_percentages = overflows -%}
+ {%- set pct_ns = namespace(total=0) -%}
+ {%- if use_percentages -%}
+ {%- for header, props in sorted_columns -%}
+ {%- set pct_ns.total = pct_ns.total + (props.width if props.width else FLEX_COL_WEIGHT) -%}
{%- endfor -%}
{%- endif -%}
-
-
- {%- for header, props in visible_columns|sort(attribute='1.order') -%}
- {% set header_text = props.alias if props.alias else props.originalName %}
- {% set header_text = props.alias if props.alias else props.originalName|default(header) %}
- {% set ns = namespace(text=header_text) %}
- {%- for mark in node.marks if node.marks -%}
- {%- set ns.text -%}
- {%- with template='marks/' + mark.type + '.html', text=ns.text, mark=mark -%}
- {%- include template -%}
- {%- endwith -%}
- {%- endset -%}
- {%- endfor -%}
- | {{ns.text | safe_html }} |
- {%- endfor -%}
-
-
-
- {%- for row in rows -%}
-
- {%- for header, props in visible_columns|sort(attribute='1.order') -%}
- {%- if header in node.attrs.content.headers -%}
- {% set cell_index = node.attrs.content.headers.index(header) %}
- {% set ns = namespace(text=row[cell_index]) %}
+
+
+ {%- for header, props in sorted_columns -%}
+ {%- if use_percentages and pct_ns.total > 0 -%}
+
+ {%- elif props.width -%}
+
{%- else -%}
- {% set ns = namespace(text='') %}
+
{%- endif -%}
- {%- for mark in node.marks if node.marks -%}
- {%- set ns.text -%}
- {%- with template='marks/' + mark.type + '.html', text=ns.text, mark=mark -%}
- {%- include template -%}
- {%- endwith -%}
- {%- endset -%}
{%- endfor -%}
- | {{ns.text | safe_html }} |
+
+
+
+ {%- for header, props in sorted_columns -%}
+ {% set header_text = props.alias if props.alias else props.originalName %}
+ {% set header_text = props.alias if props.alias else props.originalName|default(header) %}
+ {% set ns = namespace(text=header_text) %}
+ {%- for mark in node.marks if node.marks -%}
+ {%- set ns.text -%}
+ {%- with template='marks/' + mark.type + '.html', text=ns.text, mark=mark -%}
+ {%- include template -%}
+ {%- endwith -%}
+ {%- endset -%}
+ {%- endfor -%}
+ | {{ns.text | safe_html }} |
+ {%- endfor -%}
+
+
+
+ {%- for row in rows -%}
+
+ {%- for header, props in sorted_columns -%}
+ {%- if header in node.attrs.content.headers -%}
+ {% set cell_index = node.attrs.content.headers.index(header) %}
+ {% set ns = namespace(text=row[cell_index]) %}
+ {%- else -%}
+ {% set ns = namespace(text='') %}
+ {%- endif -%}
+ {%- for mark in node.marks if node.marks -%}
+ {%- set ns.text -%}
+ {%- with template='marks/' + mark.type + '.html', text=ns.text, mark=mark -%}
+ {%- include template -%}
+ {%- endwith -%}
+ {%- endset -%}
+ {%- endfor -%}
+ | {{ns.text | safe_html }} |
+ {%- endfor -%}
+
{%- endfor -%}
-
- {%- endfor -%}
-
-
-{%- endif -%}
+
+
+ {%- endif -%}
diff --git a/tiptapy/templates/dynamic_table.html b/tiptapy/templates/dynamic_table.html
index dda3326..65fb5f0 100644
--- a/tiptapy/templates/dynamic_table.html
+++ b/tiptapy/templates/dynamic_table.html
@@ -1,83 +1,131 @@
+{%- set MAX_TABLE_WIDTH = 670 -%}
+{%- set FLEX_COL_WEIGHT = 25 -%}
{%- set visible_columns = [] -%}
-{%- set rows = node.attrs.content.rows if node.attrs.content and node.attrs.content.rows else [] -%}
+{%- set rows = node.attrs.content.rows if node.attrs.content and node.attrs.content.rows is iterable and
+node.attrs.content.rows is not string else [] -%}
{%- set grid_columns = node.attrs.gridState.columns if node.attrs.gridState and node.attrs.gridState.columns else {} -%}
-{%- set visibility_model = grid_columns.columnVisibilityModel if grid_columns and grid_columns.columnVisibilityModel else {} -%}
+{%- set grid_dimensions = grid_columns.dimensions if grid_columns and grid_columns.dimensions else {} -%}
+{%- set visibility_model = grid_columns.columnVisibilityModel if grid_columns and grid_columns.columnVisibilityModel
+else {} -%}
{%- set ordered_fields = grid_columns.orderedFields if grid_columns and grid_columns.orderedFields else [] -%}
{%- set configured_columns = node.attrs.columns if node.attrs.columns else {} -%}
+{%- set table_settings = node.attrs.tableSettings if node.attrs.tableSettings else {} -%}
+{%- set column_font_size = table_settings.columnFontSize if table_settings.columnFontSize else '12px' -%}
+{%- set row_font_size = table_settings.rowFontSize if table_settings.rowFontSize else '12px' -%}
{%- if rows|length == 0 -%}
No content found
{%- else -%}
-
- {%- if node.attrs.content and node.attrs.content.headers -%}
- {%- for header in ordered_fields -%}
- {%- if header in node.attrs.content.headers -%}
- {%- set props = configured_columns.get(header, {}) -%}
- {%- set is_visible = props.visible if props.visible is defined else visibility_model.get(header, True) -%}
- {%- if is_visible -%}
- {%- set _ = visible_columns.append((header, {
- "originalName": props.originalName|default(header),
- "alias": props.alias|default(None),
- "visible": True,
- "order": props.order|default(loop.index0),
- "width": props.width|default(None)
- })) -%}
- {%- endif -%}
- {%- endif -%}
- {%- endfor -%}
- {%- for header in node.attrs.content.headers -%}
- {%- if header not in ordered_fields -%}
- {%- set props = configured_columns.get(header, {}) -%}
- {%- set is_visible = props.visible if props.visible is defined else visibility_model.get(header, True) -%}
- {%- if is_visible -%}
- {%- set _ = visible_columns.append((header, {
- "originalName": props.originalName|default(header),
- "alias": props.alias|default(None),
- "visible": True,
- "order": props.order|default(visible_columns|length),
- "width": props.width|default(None)
- })) -%}
- {%- endif -%}
+{%- if node.attrs.content and node.attrs.content.headers -%}
+{%- for header in ordered_fields -%}
+{%- if header in node.attrs.content.headers -%}
+{%- set props = configured_columns.get(header, {}) -%}
+{%- set dim_width = grid_dimensions.get(header, {}).get('width') if grid_dimensions else none -%}
+{%- set is_visible = props.visible if props.visible is defined else visibility_model.get(header, True) -%}
+{%- if is_visible -%}
+{%- set col_w = props.width if props.width else dim_width -%}
+{%- set _ = visible_columns.append((header, {
+"originalName": props.originalName|default(header),
+"alias": props.alias|default(None),
+"visible": True,
+"order": props.order|default(loop.index0),
+"width": col_w|int if col_w else none
+})) -%}
+{%- endif -%}
+{%- endif -%}
+{%- endfor -%}
+{%- for header in node.attrs.content.headers -%}
+{%- if header not in ordered_fields -%}
+{%- set props = configured_columns.get(header, {}) -%}
+{%- set dim_width = grid_dimensions.get(header, {}).get('width') if grid_dimensions else none -%}
+{%- set is_visible = props.visible if props.visible is defined else visibility_model.get(header, True) -%}
+{%- if is_visible -%}
+{%- set col_w = props.width if props.width else dim_width -%}
+{%- set _ = visible_columns.append((header, {
+"originalName": props.originalName|default(header),
+"alias": props.alias|default(None),
+"visible": True,
+"order": props.order|default(visible_columns|length),
+"width": col_w|int if col_w else none
+})) -%}
+{%- endif -%}
+{%- endif -%}
+{%- endfor -%}
+{%- endif -%}
+{%- set sorted_columns = visible_columns|sort(attribute='1.order') -%}
+{%- set width_ns = namespace(total=0, defined_count=0) -%}
+{%- for header, props in sorted_columns -%}
+{%- if props.width -%}
+{%- set width_ns.total = width_ns.total + props.width -%}
+{%- set width_ns.defined_count = width_ns.defined_count + 1 -%}
+{%- endif -%}
+{%- endfor -%}
+{%- set has_missing = (sorted_columns|length == 0) or (width_ns.defined_count < sorted_columns|length) -%} {%- set
+ all_defined=(sorted_columns|length> 0) and (width_ns.defined_count == sorted_columns|length) and (width_ns.total >
+ 0) -%}
+ {%- set overflows = width_ns.total > MAX_TABLE_WIDTH -%}
+ {%- if has_missing or (all_defined and overflows) or (sorted_columns|length == 0) -%}
+ {%- set table_width_css = 'width: 100%; max-width: 100%; table-layout: fixed;' -%}
+ {%- else -%}
+ {%- set table_width_css = 'width: ' ~ width_ns.total ~ 'px; max-width: 100%; table-layout: fixed;' -%}
{%- endif -%}
+ {%- set use_percentages = overflows -%}
+ {%- set pct_ns = namespace(total=0) -%}
+ {%- if use_percentages -%}
+ {%- for header, props in sorted_columns -%}
+ {%- set pct_ns.total = pct_ns.total + (props.width if props.width else FLEX_COL_WEIGHT) -%}
{%- endfor -%}
{%- endif -%}
-
-
- {%- for header, props in visible_columns|sort(attribute='1.order') -%}
- {% set header_text = props.alias if props.alias else props.originalName %}
- {% set header_text = props.alias if props.alias else props.originalName|default(header) %}
- {% set ns = namespace(text=header_text) %}
- {%- for mark in node.marks if node.marks -%}
- {%- set ns.text -%}
- {%- with template='marks/' + mark.type + '.html', text=ns.text, mark=mark -%}
- {%- include template -%}
- {%- endwith -%}
- {%- endset -%}
- {%- endfor -%}
- | {{ns.text | safe_html }} |
- {%- endfor -%}
-
-
-
- {%- for row in rows -%}
-
- {%- for header, props in visible_columns|sort(attribute='1.order') -%}
- {%- if header in node.attrs.content.headers -%}
- {% set cell_index = node.attrs.content.headers.index(header) %}
- {% set ns = namespace(text=row[cell_index]) %}
+
+
+ {%- for header, props in sorted_columns -%}
+ {%- if use_percentages and pct_ns.total > 0 -%}
+
+ {%- elif props.width -%}
+
{%- else -%}
- {% set ns = namespace(text='') %}
+
{%- endif -%}
- {%- for mark in node.marks if node.marks -%}
- {%- set ns.text -%}
- {%- with template='marks/' + mark.type + '.html', text=ns.text, mark=mark -%}
- {%- include template -%}
- {%- endwith -%}
- {%- endset -%}
{%- endfor -%}
- | {{ns.text | safe_html }} |
+
+
+
+ {%- for header, props in sorted_columns -%}
+ {% set header_text = props.alias if props.alias else props.originalName %}
+ {% set header_text = props.alias if props.alias else props.originalName|default(header) %}
+ {% set ns = namespace(text=header_text) %}
+ {%- for mark in node.marks if node.marks -%}
+ {%- set ns.text -%}
+ {%- with template='marks/' + mark.type + '.html', text=ns.text, mark=mark -%}
+ {%- include template -%}
+ {%- endwith -%}
+ {%- endset -%}
+ {%- endfor -%}
+ | {{ns.text | safe_html }} |
+ {%- endfor -%}
+
+
+
+ {%- for row in rows -%}
+
+ {%- for header, props in sorted_columns -%}
+ {%- if header in node.attrs.content.headers -%}
+ {% set cell_index = node.attrs.content.headers.index(header) %}
+ {% set ns = namespace(text=row[cell_index]) %}
+ {%- else -%}
+ {% set ns = namespace(text='') %}
+ {%- endif -%}
+ {%- for mark in node.marks if node.marks -%}
+ {%- set ns.text -%}
+ {%- with template='marks/' + mark.type + '.html', text=ns.text, mark=mark -%}
+ {%- include template -%}
+ {%- endwith -%}
+ {%- endset -%}
+ {%- endfor -%}
+ | {{ns.text | safe_html }} |
+ {%- endfor -%}
+
{%- endfor -%}
-
- {%- endfor -%}
-
-
-{%- endif -%}
+
+
+ {%- endif -%}
diff --git a/tiptapy/templates/table.html b/tiptapy/templates/table.html
index 0bf2aa4..84c13a6 100644
--- a/tiptapy/templates/table.html
+++ b/tiptapy/templates/table.html
@@ -1,25 +1,81 @@
-
- {%- for row in node.content -%}
-
- {%- for cell in row.content -%}
- {%- if cell.type == 'tableHeader' -%}
- | 1 %}colspan="{{ cell.attrs.colspan }}"{% endif %}>
- {%- for content in cell.content -%}
- {%- with template=content.type + '.html', node=content -%}
- {%- include template -%}
- {%- endwith -%}
- {%- endfor %}
- |
- {%- else -%}
- 1 %}colspan="{{ cell.attrs.colspan }}"{% endif %}>
- {%- for content in cell.content -%}
- {%- with template=content.type + '.html', node=content -%}
- {%- include template -%}
- {%- endwith -%}
- {%- endfor %}
- |
+{#- TipTap table column widths (editor px). Cap matches ~A4 content width. -#}
+{%- set MAX_TABLE_WIDTH = 670 -%}
+{%- set FLEX_COL_WEIGHT = 25 -%}
+{%- set first_row = node.content[0] if node.content else none -%}
+{%- set col_widths = [] -%}
+{%- if first_row -%}
+{%- for cell in first_row.content -%}
+{%- set colspan = cell.attrs.colspan if cell.attrs.colspan else 1 -%}
+{%- for col_index in range(colspan) -%}
+{%- set col_width = none -%}
+{%- if cell.attrs.colwidth and (cell.attrs.colwidth|length) > col_index and cell.attrs.colwidth[col_index] -%}
+{%- set col_width = cell.attrs.colwidth[col_index]|int -%}
+{%- endif -%}
+{%- set _ = col_widths.append(col_width) -%}
+{%- endfor -%}
+{%- endfor -%}
+{%- endif -%}
+{%- set width_ns = namespace(total=0, defined_count=0) -%}
+{%- for w in col_widths -%}
+{%- if w -%}
+{%- set width_ns.total = width_ns.total + w -%}
+{%- set width_ns.defined_count = width_ns.defined_count + 1 -%}
+{%- endif -%}
+{%- endfor -%}
+{%- set has_missing = (col_widths|length == 0) or (width_ns.defined_count < col_widths|length) -%} {%- set
+ all_defined=(col_widths|length> 0) and (width_ns.defined_count == col_widths|length) and (width_ns.total > 0) -%}
+ {%- set overflows = width_ns.total > MAX_TABLE_WIDTH -%}
+ {#-
+ 1. Any missing col width → table 100%; fixed cols keep px (or % if fixed sum overflows).
+ 2. All cols have width → table = sum px (or 100% + % cols if sum overflows).
+ -#}
+ {%- if has_missing or (all_defined and overflows) or (col_widths|length == 0) -%}
+ {%- set table_width_css = 'width: 100%; max-width: 100%; table-layout: fixed;' -%}
+ {%- else -%}
+ {%- set table_width_css = 'width: ' ~ width_ns.total ~ 'px; max-width: 100%; table-layout: fixed;' -%}
+ {%- endif -%}
+ {%- set use_percentages = overflows -%}
+ {%- set pct_ns = namespace(total=0) -%}
+ {%- if use_percentages -%}
+ {%- for w in col_widths -%}
+ {%- set pct_ns.total = pct_ns.total + (w if w else FLEX_COL_WEIGHT) -%}
+ {%- endfor -%}
+ {%- endif -%}
+
+ {%- if col_widths -%}
+
+ {%- for w in col_widths -%}
+ {%- if use_percentages and pct_ns.total > 0 -%}
+
+ {%- elif w -%}
+
+ {%- else -%}
+
+ {%- endif -%}
+ {%- endfor -%}
+
{%- endif -%}
+ {%- for row in node.content -%}
+
+ {%- for cell in row.content -%}
+ {%- if cell.type == 'tableHeader' -%}
+ | 1 %}colspan="{{ cell.attrs.colspan }}"{% endif %}>
+ {%- for content in cell.content -%}
+ {%- with template=content.type + '.html', node=content -%}
+ {%- include template -%}
+ {%- endwith -%}
+ {%- endfor %}
+ |
+ {%- else -%}
+ 1 %}colspan="{{ cell.attrs.colspan }}"{% endif %}>
+ {%- for content in cell.content -%}
+ {%- with template=content.type + '.html', node=content -%}
+ {%- include template -%}
+ {%- endwith -%}
+ {%- endfor %}
+ |
+ {%- endif -%}
+ {%- endfor -%}
+
{%- endfor -%}
-
- {%- endfor -%}
-
+