forked from HEL/circuiteria
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
| /// Predefined color palette
 | |
| /// #let w = 4
 | |
| /// #box(width: 100%, align(center)[
 | |
| ///   #canvas(length: 2em, {
 | |
| ///     for (i, color) in util.colors.pairs().enumerate() {
 | |
| ///       let x = calc.rem(i, w) * 2
 | |
| ///       let y = calc.floor(i / w) * 2
 | |
| ///       draw.rect((x, -y), (x + 1, -y - 1), fill: color.last(), stroke: none)
 | |
| ///       draw.content((x + 0.5, -y - 1.25), color.first())
 | |
| ///     }
 | |
| ///   })
 | |
| /// ])
 | |
| #let colors = (
 | |
|   orange: rgb(245, 180, 147),
 | |
|   yellow: rgb(250, 225, 127),
 | |
|   green: rgb(127, 200, 172),
 | |
|   pink: rgb(236, 127, 178),
 | |
|   purple: rgb(189, 151, 255),
 | |
|   blue: rgb(127, 203, 235)
 | |
| )
 | |
| 
 | |
| /// Pads a string on the left with 0s to the given length
 | |
| ///
 | |
| /// #example(`#util.lpad("0100", 8)`, mode: "markup")
 | |
| ///
 | |
| /// - string (str): The string to pad
 | |
| /// - len (int): The target length
 | |
| /// -> str
 | |
| #let lpad(string, len) = {
 | |
|   let res = "0" * len + string
 | |
|   return res.slice(-len)
 | |
| }
 | |
| 
 | |
| /// Returns the anchor on the opposite side of the given one
 | |
| ///
 | |
| /// #example(`#util.opposite-anchor("west")`, mode: "markup")
 | |
| ///
 | |
| /// - anchor (str): The input anchor
 | |
| /// -> str
 | |
| #let opposite-anchor(anchor) = {
 | |
|   return (
 | |
|     north: "south",
 | |
|     east: "west",
 | |
|     south: "north",
 | |
|     west: "east",
 | |
| 
 | |
|     north-west: "south-east",
 | |
|     north-east: "south-west",
 | |
|     south-east: "north-west",
 | |
|     south-west: "north-east"
 | |
|   ).at(anchor)
 | |
| }
 | |
| 
 | |
| /// Returns the anchor rotated 90 degrees clockwise relative to the given one
 | |
| ///
 | |
| /// #example(`#util.rotate-anchor("west")`, mode: "markup")
 | |
| /// - anchor (str): The anchor to rotate
 | |
| /// -> str
 | |
| #let rotate-anchor(anchor) = {
 | |
|   return (
 | |
|     north: "east",
 | |
|     east: "south",
 | |
|     south: "west",
 | |
|     west: "north",
 | |
| 
 | |
|     north-west: "north-east",
 | |
|     north-east: "south-east",
 | |
|     south-east: "south-west",
 | |
|     south-west: "north-west"
 | |
|   ).at(anchor)
 | |
| }
 | |
| 
 | |
| #let valid-anchors = (
 | |
|   "center", "north", "east", "west", "south",
 | |
|   "north-east", "north-west", "south-east", "south-west"
 | |
| )
 | |
| 
 | |
| #let get-port-side(element, port) = {
 | |
|   for (side, ports) in element.ports {
 | |
|     for p in ports {
 | |
|       if p.id == port {
 | |
|         return side
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   panic("Unknown port " + port + " on element " + element.id)
 | |
| } |