{#
 # 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 be a TypeTableRow.
 #}
{% macro paramtable(rows, titles=["Parameter", "Type", "Description"], caption="") -%}
{{ split_paramtable({None: rows}, titles, caption) }}
{% 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"], caption="") -%}

{% set rowkeys = ['key', 'title', 'desc'] %}
{% set titlerow = {'key': titles[0], 'title': 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] -%}

{{".. table:: "}}{{ caption }}
{{"  :widths: auto"}}
{{""}}
{{ 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 + 2) -}}
{% 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 %}




