forked from HEL/chronos
		
	Compare commits
	
		
			8 Commits
		
	
	
		
			3beaad03d4
			...
			main
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6bf98ebcb8 | |||
| c46b345771 | |||
| 060e37e38e | |||
| 788c8999b1 | |||
| 3eadf63db3 | |||
| e57e617bb9 | |||
| dfb980e366 | |||
| e8d737ff00 | 
| @@ -15,7 +15,7 @@ This package lets you render sequence diagrams directly in Typst. The following | ||||
| <td> | ||||
|  | ||||
| ```typst | ||||
| #import "@preview/chronos:0.2.0" | ||||
| #import "@preview/chronos:0.2.1" | ||||
| #chronos.diagram({ | ||||
|   import chronos: * | ||||
|   _par("Alice") | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|   chronos: chronos | ||||
| ) | ||||
|  | ||||
| #let example(src, show-src: true, vertical: false, fill: true, wrap: true) = { | ||||
| #let example(src, show-src: true, vertical: false, fill: false, wrap: true) = { | ||||
|   src = src.text | ||||
|   let full-src = example-preamble + src | ||||
|   let body = eval(full-src, scope: example-scope) | ||||
| @@ -16,15 +16,15 @@ | ||||
|       box( | ||||
|         stroke: black + 1pt, | ||||
|         radius: .5em, | ||||
|         fill: if fill {color.white.darken(5%)} else {none}, | ||||
|         fill: if fill {color.white.darken(2%)} else {none}, | ||||
|         if show-src { | ||||
|           let src-block = align(left, raw(src, lang: "typc")) | ||||
|           let src-block = raw(src, block: true, lang: "typc") | ||||
|           table( | ||||
|             columns: if vertical {1} else {2}, | ||||
|             inset: 1em, | ||||
|             inset: 5pt, | ||||
|             align: horizon + center, | ||||
|             stroke: none, | ||||
|             img, | ||||
|             table.cell(inset: 1em, img), | ||||
|             if vertical {table.hline()} else {table.vline()}, src-block | ||||
|           ) | ||||
|         } else { | ||||
|   | ||||
| @@ -1,8 +1,23 @@ | ||||
| #import "example.typ": example | ||||
|  | ||||
| #let seq-return = example(``` | ||||
| _seq( | ||||
|   "Bob", "Alice", | ||||
|   comment: [hello], | ||||
|   enable-dst: true | ||||
| ) | ||||
| _seq( | ||||
|   "Alice", "Alice", | ||||
|   comment: [some action] | ||||
| ) | ||||
| _ret(comment: [bye]) | ||||
| ```) | ||||
|  | ||||
| #let seq-comm-align = example(``` | ||||
| _par("p1", display-name: "Start participant") | ||||
| _par("p2", display-name: "End participant") | ||||
| _par("p1", | ||||
|      display-name: "Start participant") | ||||
| _par("p2", | ||||
|      display-name: "End participant") | ||||
| let alignments = ( | ||||
|   "start", "end", | ||||
|   "left", "right", | ||||
| @@ -90,15 +105,15 @@ _par("a", display-name: "Alice") | ||||
| _par("b", display-name: "Bob") | ||||
|  | ||||
| _loop("default loop", { | ||||
|   _seq("a", "b", comment: "Are you here ?") | ||||
|   _seq("a", "b", comment: "Are you here?") | ||||
| }) | ||||
| _gap() | ||||
| _loop("min loop", min: 1, { | ||||
|   _seq("a", "b", comment: "Are you here ?") | ||||
|   _seq("a", "b", comment: "Are you here?") | ||||
| }) | ||||
| _gap() | ||||
| _loop("min-max loop", min: 1, max: 5, { | ||||
|   _seq("a", "b", comment: "Are you still here ?") | ||||
|   _seq("a", "b", comment: "Are you still here?") | ||||
| }) | ||||
| ```) | ||||
|  | ||||
| @@ -121,15 +136,58 @@ _sync({ | ||||
| }) | ||||
| ```) | ||||
|  | ||||
| #let gaps-seps = example(``` | ||||
| _par("alice", display-name: "Alice") | ||||
| _par("bob", display-name: "Bob") | ||||
| #let gaps = example(``` | ||||
| _par("a", display-name: "Alice") | ||||
| _par("b", display-name: "Bob") | ||||
|  | ||||
| _seq("alice", "bob", comment: "Hello") | ||||
| _gap(size: 10) | ||||
| _seq("bob", "alice", comment: "Hi") | ||||
| _sep("Another day") | ||||
| _seq("alice", "bob", comment: "Hello again") | ||||
| _seq("a", "b", comment: [message 1]) | ||||
| _seq("b", "a", comment: [ok], dashed: true) | ||||
| _gap() | ||||
| _seq("a", "b", comment: [message 2]) | ||||
| _seq("b", "a", comment: [ok], dashed: true) | ||||
| _gap(size: 40) | ||||
| _seq("a", "b", comment: [message 3]) | ||||
| _seq("b", "a", comment: [ok], dashed: true) | ||||
| ```) | ||||
|  | ||||
| #let seps = example(``` | ||||
| _par("a", display-name: "Alice") | ||||
| _par("b", display-name: "Bob") | ||||
|  | ||||
| _sep[Initialization] | ||||
| _seq("a", "b", comment: [Request 1]) | ||||
| _seq( | ||||
|   "b", "a", | ||||
|   comment: [Response 1], | ||||
|   dashed: true | ||||
| ) | ||||
|  | ||||
| _sep[Repetition] | ||||
| _seq("a", "b", comment: [Request 2]) | ||||
| _seq( | ||||
|   "b", "a", | ||||
|   comment: [Response 2], | ||||
|   dashed: true | ||||
| ) | ||||
| ```) | ||||
|  | ||||
| #let delays = example(``` | ||||
| _par("a", display-name: "Alice") | ||||
| _par("b", display-name: "Bob") | ||||
|  | ||||
| _seq("a", "b", comment: [Auth Request]) | ||||
| _delay() | ||||
| _seq( | ||||
|   "b", "a", | ||||
|   comment: [Auth Response], | ||||
|   dashed: true | ||||
| ) | ||||
| _delay(name: [5 minutes later]) | ||||
| _seq( | ||||
|   "b", "a", | ||||
|   comment: [Good Bye !], | ||||
|   dashed: true | ||||
| ) | ||||
| ```) | ||||
|  | ||||
| #let notes-shapes = example(``` | ||||
|   | ||||
| @@ -1,8 +1,15 @@ | ||||
| /// Creates a gap before the next element | ||||
| /// - size (int): Size of the gap | ||||
| #let _gap(size: 20) = {} | ||||
|  | ||||
| /// Creates a separator before the next element | ||||
| /// #examples.gaps-seps | ||||
| /// #examples.seps | ||||
| /// - name (content): Name to display in the middle of the separator | ||||
| #let _sep(name) = {} | ||||
|  | ||||
| /// Creates a delay before the next element | ||||
| /// #examples.delays | ||||
| /// - name (content, none): Name to display in the middle of the delay area | ||||
| /// - size (int): Size of the delay | ||||
| #let _delay(name: none, size: 30) = {} | ||||
|  | ||||
| /// Creates a gap before the next element | ||||
| /// #examples.gaps | ||||
| /// - size (int): Size of the gap | ||||
| #let _gap(size: 20) = {} | ||||
| @@ -42,6 +42,17 @@ | ||||
|   slant: none | ||||
| ) = {} | ||||
|  | ||||
| /// Creates a return sequence | ||||
| /// #examples.seq-return | ||||
| /// - comment (none, content): Optional comment to display along the arrow | ||||
| #let _ret(comment: none) = {} | ||||
|  | ||||
| /// Accepted values for `comment-align` argument of @@_seq() | ||||
| /// #examples.seq-comm-align | ||||
| #let comment-align = ( | ||||
|   "start", "end", "left", "center", "right" | ||||
| ) | ||||
|  | ||||
| /// Accepted values for `event` argument of @@_evt() | ||||
| ///  | ||||
| /// `EVENTS = ("create", "destroy", "enable", "disable")` | ||||
| @@ -52,9 +63,3 @@ | ||||
| #let tips = ( | ||||
|   "", ">", ">>", "\\", "\\\\", "/", "//", "x", "o", | ||||
| ) | ||||
|  | ||||
| /// Accepted values for `comment-align` argument of @@_seq() | ||||
| /// #examples.seq-comm-align | ||||
| #let comment-align = ( | ||||
|   "start", "end", "left", "center", "right" | ||||
| ) | ||||
							
								
								
									
										27
									
								
								gallery.bash
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								gallery.bash
									
									
									
									
									
								
							| @@ -1,27 +0,0 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
|  | ||||
| echo | ||||
| echo "Generating gallery PDFs" | ||||
|  | ||||
| set -- ./gallery/*.typ | ||||
| cnt="$#" | ||||
| i=1 | ||||
| for f | ||||
| do | ||||
|     f2="${f/typ/pdf}" | ||||
|     echo "($i/$cnt) $f -> $f2" | ||||
|     typst c --root ./ "$f" "$f2" | ||||
|     i=$((i+1)) | ||||
| done | ||||
|  | ||||
| set -- ./gallery/readme/*.typ | ||||
| cnt="$#" | ||||
| i=1 | ||||
| for f | ||||
| do | ||||
|     f2="${f/typ/png}" | ||||
|     echo "($i/$cnt) $f -> $f2" | ||||
|     typst c --root ./ "$f" "$f2" | ||||
|     i=$((i+1)) | ||||
| done | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										12
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| # Local Variables: | ||||
| # mode: makefile | ||||
| # End: | ||||
| gallery_dir := "./gallery" | ||||
| set shell := ["bash", "-uc"] | ||||
|  | ||||
| manual: | ||||
|   typst c manual.typ manual.pdf | ||||
|  | ||||
| gallery: | ||||
|   for f in "{{gallery_dir}}"/*.typ; do typst c --root . "$f" "${f%typ}pdf"; done | ||||
|   for f in "{{gallery_dir}}"/readme/*.typ; do typst c --root . "$f" "${f%typ}png"; done | ||||
							
								
								
									
										
											BIN
										
									
								
								manual.pdf
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								manual.pdf
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										76
									
								
								manual.typ
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								manual.typ
									
									
									
									
									
								
							| @@ -1,4 +1,6 @@ | ||||
| #import "@preview/tidy:0.3.0" | ||||
| #import "@preview/tidy:0.4.2" | ||||
| #import "@preview/codly:1.2.0": codly-init, codly | ||||
| #import "@preview/codly-languages:0.1.8": codly-languages | ||||
| #import "src/lib.typ" as chronos | ||||
| #import "src/participant.typ" as mod-par | ||||
| #import "docs/examples.typ" | ||||
| @@ -6,25 +8,41 @@ | ||||
|  | ||||
| #let TYPST = image("gallery/typst.png", width: 1.5cm, height: 1.5cm, fit: "contain") | ||||
|  | ||||
| #let doc-ref(target, full: false, var: false) = { | ||||
|   let (module, func) = target.split(".") | ||||
|   let label-name = module + func | ||||
|   let display-name = func | ||||
|   if full { | ||||
|     display-name = target | ||||
|   } | ||||
|   if not var { | ||||
|     label-name += "()" | ||||
|     display-name += "()" | ||||
|   } | ||||
|   link(label(label-name))[#display-name] | ||||
| } | ||||
| #show: codly-init | ||||
| #codly( | ||||
|   languages: codly-languages | ||||
| ) | ||||
|  | ||||
| #set text(font: "Source Sans 3") | ||||
|  | ||||
| #set heading(numbering: (..num) => if num.pos().len() < 4 { | ||||
|   numbering("1.1", ..num) | ||||
| }) | ||||
|  | ||||
| #align(center)[ | ||||
|   #v(2cm) | ||||
|   #text(size: 2em)[*Chronos*] | ||||
|    | ||||
|   _v#chronos.version;_ | ||||
|   #v(1cm) | ||||
|   #chronos.diagram({ | ||||
|     import chronos: * | ||||
|     _par("u", display-name: [User], shape: "actor") | ||||
|     _par("wa", display-name: [Web App]) | ||||
|     _par("tu", display-name: [Typst Universe], shape: "database") | ||||
|  | ||||
|     _seq("u", "wa", comment: [Compile document], enable-dst: true) | ||||
|     _seq("wa", "tu", comment: [Fetch Chronos]) | ||||
|     _seq("tu", "wa", dashed: true, slant: 10) | ||||
|     _seq("wa", "wa", comment: [Render]) | ||||
|     _ret(comment: [Nice sequence diagram]) | ||||
|   }) | ||||
| ] | ||||
|  | ||||
| #pagebreak() | ||||
|  | ||||
| #{ | ||||
|   outline(indent: true, depth: 3) | ||||
|   outline(indent: auto, depth: 3) | ||||
| } | ||||
| #show link: set text(fill: blue) | ||||
|  | ||||
| @@ -40,14 +58,16 @@ This package lets you create nice sequence diagrams using the CeTZ package. | ||||
|  | ||||
| = Usage | ||||
|  | ||||
| #let import-stmt = "#import \"@preview/chronos:" + str(chronos.version) + "\"" | ||||
|  | ||||
| Simply import #link("https://typst.app/universe/package/chronos/")[chronos] and call the `diagram` function: | ||||
| #pad(left: 1em)[```typ | ||||
| #import "@preview/chronos:0.1.0" | ||||
| #raw(block:true, lang: "typ", ```typ | ||||
| $import | ||||
| #chronos.diagram({ | ||||
|   import chronos: * | ||||
|   ... | ||||
| }) | ||||
| ```] | ||||
| ```.text.replace("$import", import-stmt)) | ||||
|  | ||||
| = Examples | ||||
|  | ||||
| @@ -121,7 +141,11 @@ chronos.diagram({ | ||||
| == Custom images | ||||
|  | ||||
| #example(``` | ||||
| let load-img(path) = image(path, width: 1.5cm, height: 1.5cm, fit:"contain") | ||||
| let load-img(path) = image( | ||||
|   path, | ||||
|   width: 1.5cm, height: 1.5cm, | ||||
|   fit:"contain" | ||||
| ) | ||||
| let TYPST = load-img("../gallery/typst.png") | ||||
| let FERRIS = load-img("../gallery/ferris.png") | ||||
| let ME = load-img("../gallery/me.jpg") | ||||
| @@ -148,11 +172,11 @@ chronos.diagram({ | ||||
|   read("docs/participants.typ"), | ||||
|   name: "Participants", | ||||
|   require-all-parameters: true, | ||||
|   old-syntax: true, | ||||
|   scope: ( | ||||
|     chronos: chronos, | ||||
|     mod-par: mod-par, | ||||
|     TYPST: TYPST, | ||||
|     doc-ref: doc-ref | ||||
|     TYPST: TYPST | ||||
|   ) | ||||
| ) | ||||
| #tidy.show-module(par-docs, show-outline: false, sort-functions: none) | ||||
| @@ -163,9 +187,9 @@ chronos.diagram({ | ||||
|   read("docs/sequences.typ"), | ||||
|   name: "Sequences", | ||||
|   require-all-parameters: true, | ||||
|   old-syntax: true, | ||||
|   scope: ( | ||||
|     chronos: chronos, | ||||
|     doc-ref: doc-ref, | ||||
|     examples: examples | ||||
|   ) | ||||
| ) | ||||
| @@ -177,9 +201,9 @@ chronos.diagram({ | ||||
|   read("docs/groups.typ"), | ||||
|   name: "Groups", | ||||
|   require-all-parameters: true, | ||||
|   old-syntax: true, | ||||
|   scope: ( | ||||
|     chronos: chronos, | ||||
|     doc-ref: doc-ref, | ||||
|     examples: examples | ||||
|   ) | ||||
| ) | ||||
| @@ -191,13 +215,13 @@ chronos.diagram({ | ||||
|   read("docs/gaps_seps.typ"), | ||||
|   name: "Gaps and separators", | ||||
|   require-all-parameters: true, | ||||
|   old-syntax: true, | ||||
|   scope: ( | ||||
|     chronos: chronos, | ||||
|     doc-ref: doc-ref, | ||||
|     examples: examples | ||||
|   ) | ||||
| ) | ||||
| #tidy.show-module(gap-sep-docs, show-outline: false) | ||||
| #tidy.show-module(gap-sep-docs, show-outline: false, sort-functions: none) | ||||
|  | ||||
| #pagebreak(weak: true) | ||||
|  | ||||
| @@ -205,9 +229,9 @@ chronos.diagram({ | ||||
|   read("docs/notes.typ"), | ||||
|   name: "Notes", | ||||
|   require-all-parameters: true, | ||||
|   old-syntax: true, | ||||
|   scope: ( | ||||
|     chronos: chronos, | ||||
|     doc-ref: doc-ref, | ||||
|     examples: examples | ||||
|   ) | ||||
| ) | ||||
|   | ||||
| @@ -46,7 +46,6 @@ | ||||
|   while i < elmts.len() { | ||||
|     let elmt = elmts.at(i) | ||||
|     if elmt.type == "grp" { | ||||
|       let grp-elmts = elmt.elmts | ||||
|       elmt.elmts = elmt.elmts.map(e => { | ||||
|         if e.type == "seq" { | ||||
|           if e.p1 == "?" { | ||||
| @@ -60,12 +59,17 @@ | ||||
|       elmts.at(i) = elmt | ||||
|       elmts = ( | ||||
|         elmts.slice(0, i + 1) + | ||||
|         grp-elmts + | ||||
|         elmt.elmts + | ||||
|         (( | ||||
|           type: "grp-end" | ||||
|           type: "grp-end", | ||||
|           start-i: i | ||||
|         ),) + | ||||
|         elmts.slice(i+1) | ||||
|       ) | ||||
|     } else if elmt.type == "grp-end" { | ||||
|       // Put back elements in group because they might have changed | ||||
|       elmts.at(elmt.start-i).elmts = elmts.slice(elmt.start-i + 1, i) | ||||
|  | ||||
|     } else if elmt.type == "seq" { | ||||
|       if elmt.enable-dst { | ||||
|         activation-history.push(elmt) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #import "@preview/cetz:0.3.3": draw | ||||
| #import "/src/cetz.typ": draw | ||||
| #import "consts.typ": * | ||||
|  | ||||
| #let _grp(name, desc: none, type: "default", elmts) = { | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #let version = version(0, 2, 0) | ||||
| #let version = version(0, 2, 1) | ||||
| #import "diagram.typ": diagram, from-plantuml, _gap, _evt, _col | ||||
|  | ||||
| #import "sequence.typ": _seq, _ret | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #import "@preview/cetz:0.3.3": draw | ||||
| #import "/src/cetz.typ": draw | ||||
| #import "consts.typ": * | ||||
|  | ||||
| #let SIDES = ( | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #import "@preview/cetz:0.3.3": draw | ||||
| #import "/src/cetz.typ": draw | ||||
| #import "consts.typ": * | ||||
|  | ||||
| #let PAR-SPECIALS = "?[]" | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #import "@preview/cetz:0.3.3": canvas, draw | ||||
| #import "/src/cetz.typ": canvas, draw | ||||
| #import "utils.typ": get-participants-i, get-style, normalize-units | ||||
| #import "group.typ" | ||||
| #import "participant.typ" | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #import "@preview/cetz:0.3.3": draw | ||||
| #import "/src/cetz.typ": draw | ||||
| #import "consts.typ": * | ||||
|  | ||||
| #let _sep(name) = { | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #import "@preview/cetz:0.3.3": draw, vector | ||||
| #import "/src/cetz.typ": draw, vector | ||||
| #import "consts.typ": * | ||||
| #import "participant.typ" | ||||
| #import "note.typ" | ||||
|   | ||||
| @@ -36,6 +36,9 @@ | ||||
|       max-i = calc.max(max-i, i1) | ||||
|     } | ||||
|   } | ||||
|   if max-i < min-i { | ||||
|     (min-i, max-i) = (max-i, min-i) | ||||
|   } | ||||
|   return (min-i, max-i) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| [package] | ||||
| name = "chronos" | ||||
| version = "0.2.1" | ||||
| compiler = "0.13.0" | ||||
| compiler = "0.13.1" | ||||
| repository = "https://git.kb28.ch/HEL/chronos" | ||||
| entrypoint = "src/lib.typ" | ||||
| authors = [ | ||||
| @@ -11,4 +11,4 @@ categories = ["visualization"] | ||||
| license = "Apache-2.0" | ||||
| description = "A package to draw sequence diagrams with CeTZ" | ||||
| keywords = ["sequence", "diagram", "plantuml"] | ||||
| exclude = [ "gallery", "gallery.bash", "docs" ] | ||||
| exclude = [ "gallery", "justfile", "docs" ] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user