From 046a1c2ea624ee945960b0d9e7af74a4729b762b Mon Sep 17 00:00:00 2001 From: Daniel Rojas Date: Sun, 17 Oct 2021 16:12:36 +0200 Subject: [PATCH] Refactor connector node generation --- src/wireviz/DataClasses.py | 3 + src/wireviz/Harness.py | 4 +- src/wireviz/wv_gv_html.py | 109 ++++++++++++----------------------- src/wireviz/wv_table_util.py | 15 +++-- 4 files changed, 52 insertions(+), 79 deletions(-) diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index cdefddd..b7d3f71 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -169,6 +169,9 @@ class Connector: def is_autogenerated(self): return self.name.startswith(AUTOGENERATED_PREFIX) + def should_show_pin(self, pin_name): + return not self.hide_disconnected_pins or self.visible_pins.get(pin_name, False) + def __post_init__(self) -> None: if isinstance(self.image, dict): diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index c72ab17..0eb98ce 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -35,7 +35,6 @@ from wireviz.wv_colors import get_color_hex, translate_color from wireviz.wv_gv_html import ( gv_connector_loops, gv_node_connector, - gv_pin, html_bgcolor, html_bgcolor_attr, html_caption, @@ -177,6 +176,7 @@ class Harness: dot.attr("edge", style="bold", fontname=self.options.fontname) for connector in self.connectors.values(): + # generate connector node gv_html = gv_node_connector(connector, self.options) _default_fillcolor = translate_color(self.options.bgcolor_connector, "HEX") dot.node( @@ -186,7 +186,7 @@ class Harness: style="filled", fillcolor=_default_fillcolor, ) - + # generate edges for connector loops if len(connector.loops) > 0: dot.attr("edge", color="#000000:#ffffff:#000000") loops = gv_connector_loops(connector) diff --git a/src/wireviz/wv_gv_html.py b/src/wireviz/wv_gv_html.py index 92c29a5..88e3ea4 100644 --- a/src/wireviz/wv_gv_html.py +++ b/src/wireviz/wv_gv_html.py @@ -19,10 +19,10 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: if not (connector.ports_left or connector.ports_right): connector.ports_left = True # Use left side pins by default - html = [] + # generate all rows to be shown in the node if connector.show_name: row_name = [ - f"{html_bgcolor(connector.bgcolor_title)}" f"{remove_links(connector.name)}" + f"{html_bgcolor(connector.bgcolor_title)}{remove_links(connector.name)}" ] else: row_name = [] @@ -42,17 +42,33 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: html_colorbar(connector.color), ] - if connector.style != "simple": - row_connector_table = "" - else: - row_connector_table = None - row_image = [html_image(connector.image)] row_image_caption = [html_caption(connector.image)] row_notes = [html_line_breaks(connector.notes)] # row_additional_component_table = get_additional_component_table(self, connector) row_additional_component_table = None + if connector.style != "simple": + pin_tuples = zip_longest( + connector.pins, + connector.pinlabels, + connector.pincolors, + ) + + pin_rows = [] + for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): + if connector.should_show_pin(pinname): + pin_rows.append( + gv_pin_row(pinindex, pinname, pinlabel, pincolor, connector) + ) + + table_attribs = Attribs( + {"border": 0, "cellspacing": 0, "cellpadding": 3, "cellborder": 1} + ) + row_connector_table = str(Table(pin_rows, attribs=table_attribs)) + else: + row_connector_table = None + rows = [ row_name, row_pn, @@ -64,75 +80,26 @@ def gv_node_connector(connector: Connector, harness_options: Options) -> str: row_notes, ] - html.extend(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor))) - - if connector.style != "simple": - pinhtml = [] - # fmt: off - # pinhtml.append('') - # fmt: on - - pin_tuples = zip_longest( - connector.pins, - connector.pinlabels, - connector.pincolors, - ) - - contents = [] - for pinindex, (pinname, pinlabel, pincolor) in enumerate(pin_tuples): - if connector.hide_disconnected_pins and not connector.visible_pins.get( - pinname, False - ): - continue - - contents.append(gv_pin(pinindex, pinname, pinlabel, pincolor, connector)) - - table_attribs = { - "border": 0, - "cellspacing": 0, - "cellpadding": 3, - "cellborder": 1, - } - pinhtml.append(str(Table(contents, attribs=Attribs(table_attribs)))) - - pin_html_joined = "\n".join(pinhtml) - - html = [ - row.replace("", pin_html_joined) for row in html - ] - - html = "\n".join(html) + html = "\n".join(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor))) return html -def gv_pin(pinindex, pinname, pinlabel, pincolor, connector): - pinhtml = [] - pinhtml.append(" ") - if connector.ports_left: - pinhtml.append(f' ') - if pinlabel: - pinhtml.append(f" ") - if connector.pincolors: - if pincolor in wv_colors._color_hex.keys(): - # fmt: off - pinhtml.append(f' ') - pinhtml.append( ' ') - # fmt: on - else: - pinhtml.append(' ') +def gv_pin_row(pin_index, pin_name, pin_label, pin_color, connector): + cell_pin_left = Td( + pin_name, attribs=Attribs({"port": f"p{pin_index+1}l"}), flat=True + ) + cell_pin_label = Td(pin_label, flat=True) + cell_pin_right = Td( + pin_name, attribs=Attribs({"port": f"p{pin_index+1}r"}), flat=True + ) - if connector.ports_right: - pinhtml.append(f' ') - pinhtml.append(" ") - - pinhtml = "\n".join(pinhtml) - - return pinhtml + cells = [ + cell_pin_left if connector.ports_left else None, + cell_pin_label, + cell_pin_right if connector.ports_right else None, + ] + return Tr(cells) def gv_connector_loops(connector: Connector) -> List: diff --git a/src/wireviz/wv_table_util.py b/src/wireviz/wv_table_util.py index eb76408..a3264c7 100644 --- a/src/wireviz/wv_table_util.py +++ b/src/wireviz/wv_table_util.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- +from collections.abc import Iterable from dataclasses import dataclass, field from typing import Dict, List, Optional -from collections.abc import Iterable class Attribs(Dict): @@ -23,21 +23,24 @@ class Attribs(Dict): class Tag: contents: str attribs: Attribs = field(default_factory=Attribs) - one_line: bool = False + flat: bool = False @property def tagname(self): return type(self).__name__.lower() def get_contents(self): - if isinstance(self.contents, Iterable): - return "\n".join([str(c) for c in self.contents]) + # import pudb; pudb.set_trace() + separator = "" if self.flat else "\n" + if isinstance(self.contents, Iterable) and not isinstance(self.contents, str): + return separator.join([str(c) for c in self.contents if c is not None]) + elif self.contents is None: + return "" else: return str(self.contents) - def __repr__(self): - separator = "" if self.one_line else "\n" + separator = "" if self.flat else "\n" html = [ f"<{self.tagname}{str(self.attribs)}>", self.get_contents(),
{pinname}{pinlabel}{translate_color(pincolor, harness_options.color_mode)}') - pinhtml.append( ' ') - pinhtml.append(f' ') - pinhtml.append( '
') - pinhtml.append( '
{pinname}