From ea26116c8108463cdb3b9d1cef1d08cc6d5e1948 Mon Sep 17 00:00:00 2001 From: KV Date: Fri, 31 May 2024 22:24:45 +0200 Subject: [PATCH] Add HTML template placeholder for diagram_png_base64 (#371) This will enable users to replace the SVG diagram with an embedded PNG, that is an improved work-around when the SVG output from Graphviz is not looking good. Suggested as work-around for Graphviz bug in https://github.com/wireviz/WireViz/issues/175#issuecomment-2132206026 --- src/wireviz/svgembed.py | 14 ++++++++++++++ src/wireviz/wv_html.py | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/wireviz/svgembed.py b/src/wireviz/svgembed.py index ab6b9f1ed..c8d637c89 100644 --- a/src/wireviz/svgembed.py +++ b/src/wireviz/svgembed.py @@ -8,6 +8,20 @@ mime_subtype_replacements = {"jpg": "jpeg", "tif": "tiff"} +# TODO: Share cache and code between data_URI_base64() and embed_svg_images() +def data_URI_base64(file: Union[str, Path], media: str = "image") -> str: + """Return Base64-encoded data URI of input file.""" + file = Path(file) + b64 = base64.b64encode(file.read_bytes()).decode("utf-8") + uri = f"data:{media}/{get_mime_subtype(file)};base64, {b64}" + # print(f"data_URI_base64('{file}', '{media}') -> {len(uri)}-character URI") + if len(uri) > 65535: + print( + "data_URI_base64(): Warning: Browsers might have different URI length limitations" + ) + return uri + + def embed_svg_images(svg_in: str, base_path: Union[str, Path] = Path.cwd()) -> str: images_b64 = {} # cache of base64-encoded images diff --git a/src/wireviz/wv_html.py b/src/wireviz/wv_html.py index 6fde7cdd7..e939c6f2f 100644 --- a/src/wireviz/wv_html.py +++ b/src/wireviz/wv_html.py @@ -6,6 +6,7 @@ from wireviz import APP_NAME, APP_URL, __version__, wv_colors from wireviz.DataClasses import Metadata, Options +from wireviz.svgembed import data_URI_base64 from wireviz.wv_gv_html import html_line_breaks from wireviz.wv_helper import ( flatten2d, @@ -81,7 +82,7 @@ def generate_html_output( "": options.fontname, "": wv_colors.translate_color(options.bgcolor, "hex"), "": svgdata, - # TODO: "": base64 of png file + "": data_URI_base64(f"{filename}.png"), "": str(filename), "": Path(filename).stem, "": bom_html,