refactored setup process
This commit is contained in:
		
							
								
								
									
										92
									
								
								src/core/utils.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/core/utils.typ
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| #let is-elmt(elmt) = { | ||||
|   if type(elmt) != dictionary { | ||||
|     return false | ||||
|   } | ||||
|   if "type" not in elmt { | ||||
|     return false | ||||
|   } | ||||
|   return true | ||||
| } | ||||
|  | ||||
| #let normalize-units(value) = { | ||||
|   if type(value) == int or type(value) == float { | ||||
|     return value | ||||
|   } | ||||
|   if type(value) == length { | ||||
|     return value / 1pt | ||||
|   } | ||||
|   panic("Unsupported type '" + str(type(value)) + "'") | ||||
| } | ||||
| #let get-participants-i(participants) = { | ||||
|   let pars-i = (:) | ||||
|   for (i, p) in participants.enumerate() { | ||||
|     pars-i.insert(p.name, i) | ||||
|   } | ||||
|   return pars-i | ||||
| } | ||||
|  | ||||
| #let get-group-span(participants, group) = { | ||||
|   let min-i = participants.len() - 1 | ||||
|   let max-i = 0 | ||||
|   let pars-i = get-participants-i(participants) | ||||
|  | ||||
|   for elmt in group.elmts { | ||||
|     if elmt.type == "seq" { | ||||
|       let i1 = pars-i.at(elmt.p1) | ||||
|       let i2 = pars-i.at(elmt.p2) | ||||
|       min-i = calc.min(min-i, i1, i2) | ||||
|       max-i = calc.max(max-i, i1, i2) | ||||
|     } else if elmt.type == "grp" { | ||||
|       let (i0, i1) = get-group-span(participants, elmt) | ||||
|       min-i = calc.min(min-i, i0) | ||||
|       max-i = calc.max(max-i, i1) | ||||
|     } else if elmt.type == "sync" { | ||||
|       let (i0, i1) = get-group-span(participants, elmt) | ||||
|       min-i = calc.min(min-i, i0) | ||||
|       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) | ||||
| } | ||||
|  | ||||
| #let get-style(base-name, mods) = { | ||||
|   let style = if base-name == "lifeline" {( | ||||
|     fill: white, | ||||
|     stroke: black + 1pt | ||||
|   )} | ||||
|  | ||||
|   if mods == auto { | ||||
|     return style | ||||
|   } | ||||
|   if type(mods) == dictionary { | ||||
|     return style + mods | ||||
|   } | ||||
|  | ||||
|   panic("Invalid type for parameter mods, expected auto or dictionary, got " + str(type(mods))) | ||||
| } | ||||
|  | ||||
| #let fit-canvas(canvas, width: auto) = layout(size => { | ||||
|   let m = measure(canvas) | ||||
|   let w = m.width | ||||
|   let h = m.height | ||||
|   let r = if w == 0pt {0} else { | ||||
|     if width == auto {1} | ||||
|     else if type(width) == length { | ||||
|       width / w | ||||
|     } else { | ||||
|       size.width * width / w | ||||
|     } | ||||
|   } | ||||
|   let new-w = w * r | ||||
|   let new-h = h * r | ||||
|   r *= 100% | ||||
|    | ||||
|   box( | ||||
|     width: new-w, | ||||
|     height: new-h, | ||||
|     scale(x: r, y: r, reflow: true, canvas) | ||||
|   ) | ||||
| }) | ||||
		Reference in New Issue
	
	Block a user