From 72176677f747700aa54e77e4b323858735c1daed Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Tue, 28 Mar 2023 16:07:33 -0400 Subject: [PATCH 1/9] .gitignore: ignore outputs --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1d7dd18..523f96d 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ __pycache__ # Built examples examples/* tutorial/* +outputs/* !examples/*.yml !tutorial/*.yml !tutorial/*.md From 1ecbe6d23cfe4662f154fc7de3361e79bad302ed Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Tue, 28 Mar 2023 17:26:11 -0400 Subject: [PATCH 2/9] pdf: underlying commands - no converter included --- src/wireviz/tools/build_examples.py | 4 ++-- src/wireviz/wv_cli.py | 6 ++++++ src/wireviz/wv_harness.py | 5 ++--- src/wireviz/wv_output.py | 24 +++++++++++++++++++++++- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/wireviz/tools/build_examples.py b/src/wireviz/tools/build_examples.py index a95a0c3..0bc001c 100755 --- a/src/wireviz/tools/build_examples.py +++ b/src/wireviz/tools/build_examples.py @@ -37,7 +37,7 @@ groups = { input_extensions = [".yml"] extensions_not_containing_graphviz_output = [".gv", ".bom.tsv"] -extensions_containing_graphviz_output = [".png", ".svg", ".html"] +extensions_containing_graphviz_output = [".png", ".svg", ".html", ".pdf"] generated_extensions = ( extensions_not_containing_graphviz_output + extensions_containing_graphviz_output ) @@ -68,7 +68,7 @@ def build_generated(groupkeys): try: res = cli([ "--formats", - "ghpst", + "ghpstPb", str(yaml_file), "--prepend", yaml_file.parent / "metadata.yml" diff --git a/src/wireviz/wv_cli.py b/src/wireviz/wv_cli.py index 7f10e5b..9be3738 100644 --- a/src/wireviz/wv_cli.py +++ b/src/wireviz/wv_cli.py @@ -14,6 +14,7 @@ from wireviz import APP_NAME, __version__ from wireviz.wv_bom import bom_list from wireviz.wv_utils import bom2tsv from wireviz.wv_harness_quantity import HarnessQuantity +from wireviz.wv_output import generate_pdf_output format_codes = { "c": "csv", @@ -126,9 +127,11 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi harness = None shared_bom = {} sheet_current = 1 + output_names = [] # 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) print("Input file: ", _file) print( @@ -155,6 +158,9 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi ) shared_bom = ret["shared_bom"] + if 'pdf' in output_formats and 'html' in output_formats: + generate_pdf_output(output_names) + # TODO: move shared bom generation to a method? if "shared_bom" in output_formats: shared_bom_file = (_output_dir / "shared_bom").with_suffix(".tsv") diff --git a/src/wireviz/wv_harness.py b/src/wireviz/wv_harness.py index 90d538f..61071fa 100644 --- a/src/wireviz/wv_harness.py +++ b/src/wireviz/wv_harness.py @@ -30,7 +30,7 @@ from wireviz.wv_graphviz import ( parse_arrow_str, set_dot_basics, ) -from wireviz.wv_output import embed_svg_images_file, generate_html_output +from wireviz.wv_output import embed_svg_images_file, generate_html_output, generate_pdf_output from wireviz.wv_utils import bom2tsv @@ -394,8 +394,7 @@ class Harness: generate_html_output(filename, bomlist, self.metadata, self.options) # PDF output if "pdf" in fmt: - # TODO: implement PDF output - print("PDF output is not yet supported") + generate_pdf_output(filename) # delete SVG if not needed if "html" in fmt and not "svg" in fmt: # SVG file was just needed to generate HTML diff --git a/src/wireviz/wv_output.py b/src/wireviz/wv_output.py index f966241..93ec230 100644 --- a/src/wireviz/wv_output.py +++ b/src/wireviz/wv_output.py @@ -3,7 +3,7 @@ import base64 import re from pathlib import Path -from typing import List, Union +from typing import Dict, List, Union import wireviz # for doing wireviz.__file__ from wireviz.wv_dataclasses import Metadata, Options @@ -56,6 +56,28 @@ def embed_svg_images_file( filename_out.replace(filename_in) +def generate_pdf_output( + filename_list: List[Path], + options: Dict=None, +): + #options = options if options is not None else {} + # TODO: pass intelligent options + options = { + 'options': { + 'page-size': 'A3', + 'orientation': 'landscape', + } + } + if isinstance(filename_list, Path): + filename_list = [filename_list] + output_path = filename_list[0].with_suffix('.pdf') + else: + output_dir = filename_list[0].parent + output_path = (output_dir / output_dir.name).with_suffix('.pdf') + + filepath_list = [f.with_suffix('.html') for f in filename_list] + + print(f'Generating pdf output: {output_path}') def generate_html_output( filename: Path, From 275d4b596e34944fceff199d2888fb7dd942665f Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Tue, 28 Mar 2023 18:12:15 -0400 Subject: [PATCH 3/9] wv_cli: output combined html only if more than 1 file --- src/wireviz/wv_cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wireviz/wv_cli.py b/src/wireviz/wv_cli.py index 9be3738..335ed9d 100644 --- a/src/wireviz/wv_cli.py +++ b/src/wireviz/wv_cli.py @@ -158,7 +158,7 @@ def cli(files, formats, prepend, output_dir, output_name, version, use_qty_multi ) shared_bom = ret["shared_bom"] - if 'pdf' in output_formats and 'html' in output_formats: + if 'pdf' in output_formats and 'html' in output_formats and len(output_names) > 1: generate_pdf_output(output_names) # TODO: move shared bom generation to a method? From 77770027ac5699061b83d9574d28c7fdb4f0c1bd Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Tue, 28 Mar 2023 18:13:00 -0400 Subject: [PATCH 4/9] pdf: add support using weasyprint --- requirements.txt | 2 ++ src/wireviz/wv_output.py | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/requirements.txt b/requirements.txt index 8e752be..3227196 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +# need to install pango > 1.44.0 click graphviz pillow @@ -5,3 +6,4 @@ pyyaml setuptools tabulate jinja2 +weasyprint diff --git a/src/wireviz/wv_output.py b/src/wireviz/wv_output.py index 93ec230..78fccbf 100644 --- a/src/wireviz/wv_output.py +++ b/src/wireviz/wv_output.py @@ -4,6 +4,9 @@ import base64 import re from pathlib import Path from typing import Dict, List, Union +import logging + +from weasyprint import HTML, CSS import wireviz # for doing wireviz.__file__ from wireviz.wv_dataclasses import Metadata, Options @@ -72,12 +75,18 @@ def generate_pdf_output( filename_list = [filename_list] output_path = filename_list[0].with_suffix('.pdf') else: + logging.warn('Multiple file pdf conversion is not supported!') + return output_dir = filename_list[0].parent output_path = (output_dir / output_dir.name).with_suffix('.pdf') filepath_list = [f.with_suffix('.html') for f in filename_list] print(f'Generating pdf output: {output_path}') + html = HTML(filename=filepath_list[0]) + #html.write_pdf(output_path) + css = CSS(string='@page { size: A3 landscape; margin: 1cm; }') + html.write_pdf(output_path, stylesheets=[css]) def generate_html_output( filename: Path, From 19a6c04496105a9d2f27c64df4f2c9dac648f6e4 Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Tue, 11 Apr 2023 17:02:04 -0400 Subject: [PATCH 5/9] templates: remove calc, do all through jinja --- src/wireviz/templates/bom.html | 2 +- src/wireviz/templates/din-6771.html | 11 +++++++++-- src/wireviz/templates/notes.html | 8 ++++---- src/wireviz/templates/titleblock.html | 4 ++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/wireviz/templates/bom.html b/src/wireviz/templates/bom.html index 380762d..dbf7ef3 100644 --- a/src/wireviz/templates/bom.html +++ b/src/wireviz/templates/bom.html @@ -1,7 +1,7 @@ @@ -111,7 +110,7 @@ {{ description }} -
+
{{ diagram }}
From b013369e3c14388fad850bd8172021adf1760e56 Mon Sep 17 00:00:00 2001 From: Laurier Loiselle Date: Tue, 11 Apr 2023 18:53:12 -0400 Subject: [PATCH 9/9] wv_output: support multiple-pages pdf --- src/wireviz/wv_output.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wireviz/wv_output.py b/src/wireviz/wv_output.py index 93d4661..20c80e3 100644 --- a/src/wireviz/wv_output.py +++ b/src/wireviz/wv_output.py @@ -6,7 +6,7 @@ from pathlib import Path from typing import Dict, List, Union import logging -from weasyprint import HTML, CSS +from weasyprint import HTML import wireviz # for doing wireviz.__file__ from wireviz.wv_dataclasses import Metadata, Options @@ -70,16 +70,16 @@ def generate_pdf_output( filename_list = [filename_list] output_path = filename_list[0].with_suffix('.pdf') else: - logging.warn('Multiple file pdf conversion is not supported!') - return output_dir = filename_list[0].parent output_path = (output_dir / output_dir.name).with_suffix('.pdf') filepath_list = [f.with_suffix('.html') for f in filename_list] print(f'Generating pdf output: {output_path}') - html = HTML(filename=filepath_list[0]) - html.write_pdf(output_path) + files_html = [HTML(path) for path in filepath_list] + documents = [f.render() for f in files_html] + all_pages = [p for doc in documents for p in doc.pages] + documents[0].copy(all_pages).write_pdf(output_path) def generate_html_output(