diff --git a/gallery/example1.pdf b/gallery/example1.pdf index a3c2da1..d58715e 100644 Binary files a/gallery/example1.pdf and b/gallery/example1.pdf differ diff --git a/gallery/example1.typ b/gallery/example1.typ index 902d151..9849119 100644 --- a/gallery/example1.typ +++ b/gallery/example1.typ @@ -42,4 +42,15 @@ Alice <-- Bob: Another authentication Response }) _seq("Alice", "Bob", comment: "Log attack end") }) +}) + +#chronos.diagram({ + import "/src/diagram.typ": * + _sep("Initialization") + _seq("Alice", "Bob", comment: "Authentication Request") + _seq("Bob", "Alice", comment: "Authentication Response", dashed: true) + + _sep("Repetition") + _seq("Alice", "Bob", comment: "Another authentication Request") + _seq("Bob", "Alice", comment: "another authentication Response", dashed: true) }) \ No newline at end of file diff --git a/src/diagram.typ b/src/diagram.typ index bbc9ea2..605d1de 100644 --- a/src/diagram.typ +++ b/src/diagram.typ @@ -48,11 +48,17 @@ ),) } +#let _sep(name) = { + return (( + type: "sep", + name: name + ),) +} + #let diagram(elements) = { let participants = () let elmts = elements let i = 0 - let a = elmts.len() while i < elmts.len() { let elmt = elmts.at(i) if elmt.type == "grp" { @@ -67,9 +73,6 @@ } i += 1 } - let b = elmts.len() - [#a / #b] - [#elmts.map(e => e.type)] for elmt in elmts { if elmt.type == "par" { diff --git a/src/renderer.typ b/src/renderer.typ index ab67726..50268a2 100644 --- a/src/renderer.typ +++ b/src/renderer.typ @@ -169,6 +169,37 @@ draw-group(x0, x1, start-y, y, group) y -= Y-SPACE + + } else if elmt.type == "sep" { + let x0 = x-pos.first() - 20 + let x1 = x-pos.last() + 20 + let m = measure( + box( + elmt.name, + inset: (left: 3pt, right: 3pt, top: 5pt, bottom: 5pt) + ) + ) + let w = m.width / 1pt + let h = m.height / 1pt + let cx = (x0 + x1) / 2 + let xl = cx - w / 2 + let xr = cx + w / 2 + + y -= h / 2 + draw.line((x0, y), (xl, y)) + draw.line((xr, y), (x1, y)) + y -= 3 + draw.line((x0, y), (xl, y)) + draw.line((xr, y), (x1, y)) + draw.content( + ((x0 + x1) / 2, y + 1.5), + elmt.name, + anchor: "center", + padding: (5pt, 3pt), + frame: "rect" + ) + y -= h / 2 + y -= Y-SPACE } }