diff --git a/src/wireviz/templates/index_table.html b/src/wireviz/templates/index_table.html new file mode 100644 index 0000000..acf9734 --- /dev/null +++ b/src/wireviz/templates/index_table.html @@ -0,0 +1,69 @@ + + + + +{% macro index_table_header_gen() -%} + + {% for item in index_table_header %} + {{ item }} + {% endfor %} + +{%- endmacro %} + + +
+ INDEX TABLE + + {{ index_table_header_gen() }} + + {% for row in index_table_content %} + + {% for item in row %} + + {% endfor %} + + {% endfor %} + +
{{ item }}
+
diff --git a/src/wireviz/templates/titlepage.html b/src/wireviz/templates/titlepage.html index 937ca19..415120a 100644 --- a/src/wireviz/templates/titlepage.html +++ b/src/wireviz/templates/titlepage.html @@ -14,4 +14,8 @@ {% if show_bom %} {{ bom }} {% endif %} + + {% if show_index_table %} + {{ index_table }} + {% endif %} {% endblock %} diff --git a/src/wireviz/wv_cli.py b/src/wireviz/wv_cli.py index 8f39d11..22656d7 100644 --- a/src/wireviz/wv_cli.py +++ b/src/wireviz/wv_cli.py @@ -14,8 +14,7 @@ import yaml import wireviz.wireviz as wv from wireviz import APP_NAME, __version__ -from wireviz.wv_bom import bom_list -from wireviz.wv_output import generate_pdf_output, generate_html_output, generate_shared_bom +from wireviz.wv_output import generate_pdf_output, generate_html_output, generate_shared_bom, generate_titlepage from wireviz.wv_dataclasses import AUTOGENERATED_PREFIX, Metadata, Options format_codes = { @@ -126,23 +125,29 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi # determine output formats output_formats = {format_codes[f] for f in formats if f in format_codes} harness_output_formats = output_formats.copy() - create_titlepage = False - # Only generate the global pdf if there's multiple files - if len(files) > 1 and 'pdf' in harness_output_formats: - harness_output_formats.remove('pdf') - create_titlepage = True - titlepage_path = (_output_dir / "titlepage").with_suffix(".html") - - harness = None shared_bom = {} - sheet_current = 1 - if create_titlepage: - sheet_current += 1 - output_names = [] + + extra_metadata = {} + extra_metadata["output_dir"] = _output_dir + extra_metadata["output_names"] = [] + extra_metadata["sheet_total"] = len(files) + extra_metadata["sheet_current"] = 1 + + # Only generate the global pdf if there's multiple files + create_titlepage = False + if extra_metadata["sheet_total"] > 1: + create_titlepage = True + extra_metadata["titlepage"] = Path("titlepage") + extra_metadata["sheet_current"] += 1 + extra_metadata["sheet_total"] += 1 + + if 'pdf' in harness_output_formats: + harness_output_formats.remove('pdf') + # run WireVIz on each input file for _file in files: _output_name = _file.stem if not output_name else output_name - output_names.append(_output_dir / _output_name) + extra_metadata["output_names"].append(_output_name) print("Input file: ", _file) print( @@ -150,13 +155,7 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi f"{_output_dir / _output_name}.[{'|'.join(output_formats)}]", ) - extra_metadata = {} extra_metadata["sheet_name"] = _output_name.upper() - extra_metadata["sheet_total"] = len(files) - if create_titlepage: - extra_metadata["sheet_total"] += 1 - extra_metadata["sheet_current"] = sheet_current - sheet_current += 1 file_dir = _file.parent @@ -171,6 +170,7 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi ) shared_bom = ret["shared_bom"] + shared_bom_base = None if "shared_bom" in output_formats: shared_bom_base, shared_bomlist = generate_shared_bom( @@ -181,37 +181,22 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi multiplier_file_name=multiplier_file_name, ) - # TODO: instead have a parse function that create a titlepage, not a harness if ('html' in output_formats) and create_titlepage: + # TODO: yaml data parsing shared yaml_data_str = "\n".join(f.open("r").read() for f in prepend) yaml_data = yaml.safe_load(yaml_data_str) - titlepage_metadata = { - **yaml_data.get("metadata", {}), - **extra_metadata, - "sheet_current": 1, - "sheet_name": "titlepage", - "output_name": "titlepage", - "bom_updated_position": "top: 20mm; left: 10mm", - "notes_width": "200mm", - } - titlepage_metadata['template']['name'] = 'titlepage' - titlepage_options = { - **yaml_data.get("options", {}), - "show_bom": True, - "show_notes": True, - } - generate_html_output( - titlepage_path, - bom = bom_list(shared_bom), - metadata = Metadata(**titlepage_metadata), # TBD what we need to add here - options = Options(**titlepage_options), - ) - if 'pdf' in output_formats and 'html' in output_formats and len(output_names) > 1: - if create_titlepage: - output_names.insert(0, titlepage_path) + generate_titlepage(yaml_data, extra_metadata, shared_bom) - generate_pdf_output(output_names) + if 'pdf' in output_formats: + extra_metadata["titlepage"] = extra_metadata["titlepage"].with_suffix('_for_pdf') + if create_titlepage: + extra_metadata["output_names"].insert(0, extra_metadata["titlepage"].with_suffix('.html')) + + generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=True) + + if 'pdf' in output_formats: + generate_pdf_output([_output_dir / p for p in extra_metadata["output_names"]]) print() # blank line after execution diff --git a/src/wireviz/wv_dataclasses.py b/src/wireviz/wv_dataclasses.py index 65278e0..a769e94 100644 --- a/src/wireviz/wv_dataclasses.py +++ b/src/wireviz/wv_dataclasses.py @@ -423,6 +423,7 @@ class BomEntry: class Options: fontname: PlainText = "arial" show_bom: bool = True + show_index_table: bool = False show_notes: bool = True notes_on_right: bool = True notes_width: str = "100mm" diff --git a/src/wireviz/wv_output.py b/src/wireviz/wv_output.py index 0218372..d40d789 100644 --- a/src/wireviz/wv_output.py +++ b/src/wireviz/wv_output.py @@ -156,6 +156,7 @@ def generate_html_output( "bgcolor": options.bgcolor.html, "show_bom": options.show_bom, "show_notes": options.show_notes, + "show_index_table": options.show_index_table, "notes_on_right": options.notes_on_right, "notes_width": options.notes_width, "diagram": svgdata, @@ -207,8 +208,70 @@ def generate_html_output( if "notes" in replacements: replacements["notes"] = get_template("notes.html").render(replacements) + # prepare index_table + replacements["index_table"] = get_template("index_table.html").render(replacements) + # generate page template page_rendered = get_template(template_name, ".html").render(replacements) # save generated file filename.with_suffix(".html").open("w").write(page_rendered) + +def generate_titlepage(yaml_data, extra_metadata, shared_bom, for_pdf=False): + print('Generating titlepage') + + index_table_content = [] + index_table_content.append(( + 1, extra_metadata['titlepage'], '' + )) + + for index, page_name in enumerate(extra_metadata['output_names']): + index_table_content.append(( + index+2, page_name, '' + )) + + + if not for_pdf: + index_table_content = [( + p[0], + f"{p[1]}", + p[2], + ) for p in index_table_content] + + + #if create_titlepage: + # extra_metadata["index_table_content"].append([ + # sheet_current, + # f"{extra_metadata['sheet_name']}", + # "", + # ]) + #index_table_content.insert(0, [ + # 1, + # f"Title Page", + # '' + #]) + + titlepage_metadata = { + **yaml_data.get("metadata", {}), + **extra_metadata, + "sheet_current": 1, + "sheet_name": "titlepage", + "output_name": "titlepage", + "index_table_header": ["Sheet", "Harness", "Notes"], + "index_table_content": index_table_content, + "bom_updated_position": "top: 20mm; left: 10mm", + "notes_width": "200mm", + } + titlepage_metadata['template']['name'] = 'titlepage' + titlepage_options = { + "show_bom": True, + "show_index_table": True, + "show_notes": True, + **yaml_data.get("options", {}), + } + generate_html_output( + extra_metadata['output_dir']/ extra_metadata['titlepage'], + bom = bom_list(shared_bom), + metadata = Metadata(**titlepage_metadata), # TBD what we need to add here + options = Options(**titlepage_options), + )