diff --git a/src/wireviz/DataClasses.py b/src/wireviz/DataClasses.py index d14e445..8cce386 100644 --- a/src/wireviz/DataClasses.py +++ b/src/wireviz/DataClasses.py @@ -23,6 +23,7 @@ CableMultiplier = ( PlainText # = Literal['wirecount', 'terminations', 'length', 'total_length'] ) ImageScale = PlainText # = Literal['false', 'true', 'width', 'height', 'both'] +ImageAlignment = PlainText # = Literal['under', 'above', 'left', 'right'] # Type combinations Pin = Union[int, PlainText] # Pin identifier @@ -86,6 +87,7 @@ class Image: height: Optional[int] = None fixedsize: Optional[bool] = None bgcolor: Optional[Color] = None + alignment: Optional[ImageAlignment] = None # Contents of the text cell just below the image cell: caption: Optional[MultilineHypertext] = None # See also HTML doc at https://graphviz.org/doc/info/shapes.html#html diff --git a/src/wireviz/Harness.py b/src/wireviz/Harness.py index c4af236..367e2c2 100644 --- a/src/wireviz/Harness.py +++ b/src/wireviz/Harness.py @@ -191,6 +191,12 @@ class Harness: connector.ports_left = True # Use left side pins. html = [] + + image_rows = [] + if connector.image: + image_rows = [[html_image(connector.image)], + [html_caption(connector.image)]] + # fmt: off rows = [[f'{html_bgcolor(connector.bgcolor_title)}{remove_links(connector.name)}' if connector.show_name else None], @@ -202,13 +208,20 @@ class Harness: f'{connector.pincount}-pin' if connector.show_pincount else None, translate_color(connector.color, self.options.color_mode) if connector.color else None, html_colorbar(connector.color)], - '' if connector.style != 'simple' else None, - [html_image(connector.image)], - [html_caption(connector.image)]] + '' if connector.style != 'simple' else None] # fmt: on + imagetable='' + if connector.image: + if connector.image.alignment == 'under' or connector.image.alignment is None: + rows += image_rows + elif connector.image.alignment == 'above': + rows = image_rows + rows + else: + imagetable = ''.join(nested_html_table(image_rows, html_bgcolor_attr(connector.bgcolor))) rows.extend(get_additional_component_table(self, connector)) rows.append([html_line_breaks(connector.notes)]) + html.extend(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor))) if connector.style != "simple": @@ -217,11 +230,16 @@ class Harness: '' ) - for pinindex, (pinname, pinlabel, pincolor) in enumerate( - zip_longest( + firstpin = True + pincount = len(connector.pins) + if len(connector.pinlabels) > pincount: + pincount = len(connector.pinlabels) + if len(connector.pincolors) > pincount: + pincount = len(connector.pincolors) + + for pinindex, (pinname, pinlabel, pincolor) in enumerate(zip_longest( connector.pins, connector.pinlabels, connector.pincolors - ) - ): + )): if ( connector.hide_disconnected_pins and not connector.visible_pins.get(pinname, False) @@ -229,6 +247,11 @@ class Harness: continue pinhtml.append(" ") + + if firstpin and connector.image and connector.image.alignment == 'left': + firstpin = False + pinhtml.append(f'') + if connector.ports_left: pinhtml.append(f' ') if pinlabel: @@ -248,6 +271,11 @@ class Harness: if connector.ports_right: pinhtml.append(f' ') + + if firstpin and connector.image and connector.image.alignment == 'right': + firstpin = False + pinhtml.append( + f'') pinhtml.append(" ") pinhtml.append("
{imagetable}{pinname}{pinname}{imagetable}
")