{# # 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"]) -%} {{ 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', '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] -%} {{ 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 %}