From 7e7befd7a31bdb10049d342f9a470d7f0d8c8629 Mon Sep 17 00:00:00 2001
From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com>
Date: Wed, 28 Oct 2026 16:59:25 +0100
Subject: [PATCH] fix: one box height per diagram row
---
scripts/sitediagrams.py | 21 ++++++++++++---------
tests/test_site_r2_wiki.py | 12 ++++++++----
2 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/scripts/sitediagrams.py b/scripts/sitediagrams.py
index 1d8b51835..f73cbe581 100644
--- a/scripts/sitediagrams.py
+++ b/scripts/sitediagrams.py
@@ -226,8 +226,9 @@ def flow(boxes: list[Box], vertical: bool, total: float) -> tuple[float, float,
if vertical:
width = total
y = 1.0
- for index, box in enumerate(boxes):
- title_lines, body, height = _box_height(box, width - 2)
+ measured = [_box_height(box, width - 2) for box in boxes]
+ height = max(m[2] for m in measured)
+ for index, (box, (title_lines, body, _)) in enumerate(zip(boxes, measured)):
out.extend(_draw_box(box, 1, y, width - 2, height, title_lines, body))
y += height
if index < len(boxes) - 1:
@@ -238,10 +239,11 @@ def flow(boxes: list[Box], vertical: bool, total: float) -> tuple[float, float,
width = (total - gap * (len(boxes) - 1) - 2) / len(boxes)
measured = [_box_height(box, width) for box in boxes]
height = max(m[2] for m in measured)
- for index, (box, (title_lines, body, own)) in enumerate(zip(boxes, measured)):
+ for index, (box, (title_lines, body, _)) in enumerate(zip(boxes, measured)):
x = 1 + index * (width + gap)
- # A box is as tall as its lines, centred on the row the arrows run along.
- out.extend(_draw_box(box, x, 1 + (height - own) / 2, width, own, title_lines, body))
+ # One height for the row: boxes as tall as their own lines made four
+ # sizes side by side.
+ out.extend(_draw_box(box, x, 1, width, height, title_lines, body))
if index < len(boxes) - 1:
mid = 1 + height / 2
out.extend(_line([(x + width, mid), (x + width + gap - 1, mid)]))
@@ -253,8 +255,9 @@ def columns(boxes: list[Box], vertical: bool, total: float) -> tuple[float, floa
out: list[str] = []
if vertical:
y = 1.0
- for box in boxes:
- title_lines, body, height = _box_height(box, total - 2)
+ measured = [_box_height(box, total - 2) for box in boxes]
+ height = max(m[2] for m in measured)
+ for box, (title_lines, body, _) in zip(boxes, measured):
out.extend(_draw_box(box, 1, y, total - 2, height, title_lines, body))
y += height + 12
return total, y - 11, out
@@ -262,8 +265,8 @@ def columns(boxes: list[Box], vertical: bool, total: float) -> tuple[float, floa
width = (total - gap * (len(boxes) - 1) - 2) / len(boxes)
measured = [_box_height(box, width) for box in boxes]
height = max(m[2] for m in measured)
- for index, (box, (title_lines, body, own)) in enumerate(zip(boxes, measured)):
- out.extend(_draw_box(box, 1 + index * (width + gap), 1, width, own, title_lines, body))
+ for index, (box, (title_lines, body, _)) in enumerate(zip(boxes, measured)):
+ out.extend(_draw_box(box, 1 + index * (width + gap), 1, width, height, title_lines, body))
return total, height + 2, out
diff --git a/tests/test_site_r2_wiki.py b/tests/test_site_r2_wiki.py
index 2c85a1f76..e2efe200e 100644
--- a/tests/test_site_r2_wiki.py
+++ b/tests/test_site_r2_wiki.py
@@ -328,10 +328,14 @@ class DiagramText(unittest.TestCase):
html = sitediagrams.figure_html("bios-chain")
self.assertRegex(html, r']*style="font-family: var\(--sl-font-mono[^>]*>/userdata/bios/')
- def test_boxes_take_the_height_of_their_lines(self):
- width, _height, body = sitediagrams.flow(sitediagrams._bios_chain_boxes(), False, sitediagrams.WIDE)
- heights = {float(h) for h in re.findall(r']*height="([\d.]+)"[^>]*class="rb-d-box', "".join(body))}
- self.assertGreater(len(heights), 1)
+ def test_boxes_of_a_row_share_one_height(self):
+ for layout in (sitediagrams.flow, sitediagrams.columns):
+ for vertical, total in ((False, sitediagrams.WIDE), (True, sitediagrams.NARROW)):
+ _width, _height, body = layout(sitediagrams._bios_chain_boxes(), vertical, total)
+ heights = {float(h) for h in re.findall(r']*height="([\d.]+)"[^>]*class="rb-d-box',
+ "".join(body))}
+ with self.subTest(layout=layout.__name__, vertical=vertical):
+ self.assertEqual(len(heights), 1)
class ExampleHashesStayOutOfSearch(unittest.TestCase):