Skip to content

Instantly share code, notes, and snippets.

@Tuhin-thinks
Last active May 27, 2023 06:44
Show Gist options
  • Save Tuhin-thinks/d74ab87bbe3588a2740e7967eea78a24 to your computer and use it in GitHub Desktop.
Save Tuhin-thinks/d74ab87bbe3588a2740e7967eea78a24 to your computer and use it in GitHub Desktop.
from typing import Literal, List, Any, Union
from browser import document, prompt, html, window
def print_formatted(_header: List[str], _items: List[List[Union[str, Any]]],
padding=10, alignment="^"):
"""
Function to print header along with list of list in tabular format.
:param alignment: ^ -center alignment;
< -left alignment;
> -right alignment
:param _header: header strings for the table
:param _items: list of list, representing collection of rows
:param padding: padding count
:return:
"""
header_formatter = ""
for _ in _header:
header_formatter += "{:_" + alignment + str(padding) + "}"
print(header_formatter.format(*[_head for _head in _header]))
for item_info in _items:
format_row = ("{:" + alignment + str(padding) + "}") * len(item_info)
print(format_row.format(*item_info))
def get_md_table(_header: List[str], _items: List[List[Union[str, Any]]],
padding=10, fill_char="",
alignment: Literal['left', 'right', 'center'] = "center"):
"""
To generate a table for markdown.
:param _header:
:param _items:
:param padding:
:param fill_char:
:param alignment:
:return:
"""
def __get_padding_line():
sep_formatter = "|{:" + fill_char + str(padding) + "}"
header_separator = ""
for_center = lambda: ":" + "-" * (padding - 2) + ":"
for_right = lambda: "-" * (padding - 1) + ":"
for_left = lambda: ":" + "-" * (padding - 1)
# this is also responsible for adding the padding line & alignment of cell contents
fill_char_list = for_center() if alignment == "center" else for_left() if alignment == "left" else for_right()
for _ in _header:
header_separator += sep_formatter
header_separator += "|"
header_separator = header_separator.format(*[fill_char_list for _ in _header])
return header_separator
header_formatter = ""
if alignment == "center":
align_char = "^"
elif alignment == "right":
align_char = ">"
else:
align_char = "<"
for _head in _header:
_str = "|{:^" + str(padding) + "}"
header_formatter += _str.format(_head)
header_formatter += "|"
# header = header_formatter.format(*[_head for _head in _header])
row_formatter = ""
for _ in _header:
row_formatter += "|{:" + align_char + str(padding) + "}"
row_formatter = row_formatter + "|"
rows = ""
for item_info in _items:
# if there is item missing add an empty string at the end
padded_item_info = item_info + [""] * (len(_header) - len(item_info))
rows += row_formatter.format(*padded_item_info)
rows += "\n"
return header_formatter + "\n" + __get_padding_line() + "\n" + rows
def convert_md_table():
"""
Function to convert JSON data into markdown table.
"""
header = document['header'].value.split(",")
# load items from json input, text area
items = window.JSON.parse(document['items'].value)
# load padding from input
padding = int(document['padding'].value)
# load alignment from input
alignment = document['alignment'].value
# get the markdown table
md_table = get_md_table(_header=header, _items=items,
padding=padding, alignment=alignment)
# set the markdown table to the output text area
document['md'].value = md_table
def clear_input():
document['md'].value = ""
document['convert-md'].bind('click', lambda ev: convert_md_table())
document['clear'].bind('click', lambda ev: clear_input())
# if __name__ == '__main__':
# price_list = ["01", "Banana", 5.00, "unit", "02", "Mango", 20.00, "kg", " 03", "Apple", 15.00, "kg", " 04",
# "Papaya", 25.00, "unit", "5", "Guava", 15.00]
# header = ['Item no', 'Item name', 'Price', 'Unit']
# row_width = 4 # max number of items in each row
# clustered_price_list = [price_list[n:n + row_width]
# for n in range(0, len(price_list), row_width)]
# print_formatted(_items=clustered_price_list, _header=header, padding=20)
# md_table = get_md_table(_header=header, _items=clustered_price_list,
# padding=20, alignment="center")
# print(md_table)
# with open("table.md", "w") as f:
# f.write(md_table)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment