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' | {pinname} | ')
- if pinlabel:
- pinhtml.append(f" {pinlabel} | ")
- if connector.pincolors:
- if pincolor in wv_colors._color_hex.keys():
- # fmt: off
- pinhtml.append(f' {translate_color(pincolor, harness_options.color_mode)} | ')
- pinhtml.append( ' ')
- pinhtml.append( ' ')
- pinhtml.append(f' | ')
- pinhtml.append( ' ')
- 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' {pinname} | ')
- 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(),