# -*- coding: utf-8 -*- from pathlib import Path from typing import Dict, List, Union import re from wireviz import __version__, APP_NAME, APP_URL, wv_colors from wireviz.DataClasses import Metadata, Options from wireviz.wv_helper import flatten2d, open_file_read, open_file_write, smart_file_resolve from wireviz.wv_gv_html import html_line_breaks def generate_html_output(filename: Union[str, Path], bom_list: List[List[str]], metadata: Metadata, options: Options): # load HTML template templatename = metadata.get('template',{}).get('name') if templatename: # if relative path to template was provided, check directory of YAML file first, fall back to built-in template directory templatefile = smart_file_resolve(f'{templatename}.html', [Path(filename).parent, Path(__file__).parent / 'templates']) else: # fall back to built-in simple template if no template was provided templatefile = Path(__file__).parent / 'templates/simple.html' with open_file_read(templatefile) as file: html = file.read() # embed SVG diagram with open_file_read(f'{filename}.svg') as file: svgdata = re.sub( '^<[?]xml [^?>]*[?]>[^<]*]*>', '', file.read(), 1) # generate BOM table bom = flatten2d(bom_list) # generate BOM header (may be at the top or bottom of the table) bom_header_html = ' \n' for item in bom[0]: th_class = f'bom_col_{item.lower()}' bom_header_html = f'{bom_header_html} {item}\n' bom_header_html = f'{bom_header_html} \n' # generate BOM contents bom_contents = [] for row in bom[1:]: row_html = ' \n' for i, item in enumerate(row): td_class = f'bom_col_{bom[0][i].lower()}' row_html = f'{row_html} {item}\n' row_html = f'{row_html} \n' bom_contents.append(row_html) bom_html = '\n' + bom_header_html + ''.join(bom_contents) + '
\n' bom_html_reversed = '\n' + ''.join(list(reversed(bom_contents))) + bom_header_html + '
\n' # prepare simple replacements replacements = { '': f'{APP_NAME} {__version__} - {APP_URL}', '': options.fontname, '': wv_colors.translate_color(options.bgcolor, "hex"), '': svgdata, '': bom_html, '': bom_html_reversed, '': '1', # TODO: handle multi-page documents '': '1', # TODO: handle multi-page documents } # prepare metadata replacements if metadata: for item, contents in metadata.items(): if isinstance(contents, (str, int, float)): replacements[f''] = html_line_breaks(str(contents)) elif isinstance(contents, Dict): # useful for authors, revisions for index, (category, entry) in enumerate(contents.items()): if isinstance(entry, Dict): replacements[f''] = str(category) for entry_key, entry_value in entry.items(): replacements[f''] = html_line_breaks(str(entry_value)) replacements['"sheetsize_default"'] = '"{}"'.format(metadata.get('template',{}).get('sheetsize', '')) # include quotes so no replacement happens within