import os import re import traceback import uuid from html import escape from typing import List, Union import aiohttp import ujson as json from tabulate import tabulate from config import Config web_render = Config('web_render') class ImageTable: def __init__(self, data, headers): self.data = data self.headers = headers async def image_table_render(table: Union[ImageTable, List[ImageTable]]): if not web_render: return False try: tblst = [] if isinstance(table, ImageTable): table = [table] max_width = 500 for tbl in table: d = [] for row in tbl.data: cs = [] for c in row: cs.append(re.sub(r'\n', '
', escape(c))) d.append(cs) w = len(tbl.headers) * 500 if w > max_width: max_width = w tblst.append(re.sub(r'|
', '', tabulate(d, tbl.headers, tablefmt='unsafehtml'))) tblst = '' + '\n'.join(tblst) + '
' css = """ """ html = {'content': tblst + css, 'width': w} picname = os.path.abspath(f'./cache/{str(uuid.uuid4())}.jpg') if os.path.exists(picname): os.remove(picname) async with aiohttp.ClientSession() as session: async with session.post(web_render, headers={ 'Content-Type': 'application/json', }, data=json.dumps(html)) as resp: with open(picname, 'wb+') as jpg: jpg.write(await resp.read()) return picname except Exception: traceback.print_exc() return False