icinga2-checks/checker/markdown.py

56 lines
2.0 KiB
Python

def list_to_markdown_table(array, align: str = None):
"""
https://gist.github.com/OsKaR31415/955b166f4a286ed427f667cb21d57bfd
Args:
array: The array to make into a table. Mush be a rectangular array
(constant width and height).
align: The alignment of the cells : 'left', 'center' or 'right'.
"""
# make sure every elements are strings
array = [[str(elt) for elt in line] for line in array]
# get the width of each column
widths = [max(len(line[i]) for line in array) for i in range(len(array[0]))]
# make every width at least 3 colmuns, because the separator needs it
widths = [max(w, 3) for w in widths]
# center text according to the widths
array = [[elt.center(w) for elt, w in zip(line, widths)] for line in array]
# separate the header and the body
array_head, *array_body = array
header = '| ' + ' | '.join(array_head) + ' |'
# alignment of the cells
align = str(align).lower() # make sure `align` is a lowercase string
if align == 'none':
# we are just setting the position of the : in the table.
# here there are none
border_left = '| '
border_center = ' | '
border_right = ' |'
elif align == 'center':
border_left = '| '
border_center = ' | '
border_right = ' |'
elif align == 'left':
border_left = '| '
border_center = ' | '
border_right = ' |'
elif align == 'right':
border_left = '| '
border_center = ' | '
border_right = ' |'
else:
raise ValueError("align must be 'left', 'right' or 'center'.")
separator = border_left + border_center.join(['-' * w for w in widths]) + border_right
# body of the table
del array[0]
body = [''] * len(array) # empty string list that we fill after
for idx, line in enumerate(array):
# for each line, change the body at the correct index
body[idx] = '| ' + ' | '.join(line) + ' |'
body = '\n'.join(body)
return header + '\n' + separator + '\n' + body