Allow columns to stretch if they end up with wide content. Apart from the hassle of having to manually update the calculations, having the columns wide enough to hold the widest thing they might ever have leads to tables with lots of whitespace in the results.
104 lines
2.9 KiB
Cheetah
104 lines
2.9 KiB
Cheetah
{#
|
|
# A set of macros for generating RST tables
|
|
#}
|
|
|
|
|
|
{#
|
|
# write a table for a list of parameters.
|
|
#
|
|
# 'rows' is the list of parameters. Each row should have the keys
|
|
# 'key', 'type', and 'desc'.
|
|
#}
|
|
{% macro paramtable(rows, titles=["Parameter", "Type", "Description"]) -%}
|
|
{{ split_paramtable({None: rows}, titles) }}
|
|
{% endmacro %}
|
|
|
|
|
|
{#
|
|
# write a table for the request parameters, split by location.
|
|
# 'rows_by_loc' is a map from location to a list of parameters.
|
|
#
|
|
# As a special case, if a key of 'rows_by_loc' is 'None', no title row is
|
|
# written for that location. This is used by the standard 'paramtable' macro.
|
|
#}
|
|
{% macro split_paramtable(rows_by_loc,
|
|
titles=["Parameter", "Type", "Description"]) -%}
|
|
|
|
{% set rowkeys = ['key', 'type', 'desc'] %}
|
|
{% set titlerow = {'key': titles[0], 'type': titles[1], 'desc': titles[2]} %}
|
|
|
|
{# We need the rows flattened into a single list. Abuse the 'sum' filter to
|
|
# join arrays instead of add numbers. -#}
|
|
{% set flatrows = rows_by_loc.values()|sum(start=[]) -%}
|
|
|
|
{# Figure out the widths of the columns. The last column is always 50 characters
|
|
# wide; the others default to 10, but stretch if there is wider text in the
|
|
# column. -#}
|
|
{% set fieldwidths = (([titlerow] + flatrows) |
|
|
fieldwidths(rowkeys[0:-1], [10, 10])) + [50] -%}
|
|
|
|
{{ tableheader(fieldwidths) }}
|
|
{{ tablerow(fieldwidths, titlerow, rowkeys) }}
|
|
{{ tableheader(fieldwidths) }}
|
|
{% for loc in rows_by_loc -%}
|
|
|
|
{% if loc != None -%}
|
|
{{ tablespan(fieldwidths, "*" ~ loc ~ " parameters*") }}
|
|
{% endif -%}
|
|
|
|
{% for row in rows_by_loc[loc] -%}
|
|
{{ tablerow(fieldwidths, row, rowkeys) }}
|
|
{% endfor -%}
|
|
{% endfor -%}
|
|
|
|
{{ tableheader(fieldwidths) }}
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{#
|
|
# Write a table header row, for the given column widths
|
|
#}
|
|
{% macro tableheader(widths) -%}
|
|
{% for arg in widths -%}
|
|
{{"="*arg}} {% endfor -%}
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{#
|
|
# Write a normal table row. Each of 'widths' and 'keys' should be sequences
|
|
# of the same length; 'widths' defines the column widths, and 'keys' the
|
|
# attributes of 'row' to look up for values to put in the columns.
|
|
#}
|
|
{% macro tablerow(widths, row, keys) -%}
|
|
{% for key in keys -%}
|
|
{% set value=row[key] -%}
|
|
{% if not loop.last -%}
|
|
{# the first few columns need space after them -#}
|
|
{{ value }}{{" "*(1+widths[loop.index0]-value|length) -}}
|
|
{% else -%}
|
|
{# the last column needs wrapping and indenting (by the sum of the widths of
|
|
the preceding columns, plus the number of preceding columns (for the
|
|
separators)) -#}
|
|
{{ value | wrap(widths[loop.index0]) |
|
|
indent_block(widths[0:-1]|sum + loop.index0) -}}
|
|
{% endif -%}
|
|
{% endfor -%}
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
|
|
{#
|
|
# write a tablespan row. This is a single value which spans the entire table.
|
|
#}
|
|
{% macro tablespan(widths, value) -%}
|
|
{{value}}
|
|
{# we write a trailing space to stop the separator being misinterpreted
|
|
# as a header line. -#}
|
|
{{"-"*(widths|sum + widths|length -1)}} {% endmacro %}
|
|
|
|
|
|
|
|
|