sevgi-showcase 0.73.2 → 0.93.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ dark:
2
+ "#666": "#d8d8d8"
3
+ green: "#7bd88f"
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env -S ruby -S sevgi
2
+ # frozen_string_literal: true
3
+
4
+ SVG width: 100, height: 100 do
5
+ rect x: 0, y: 0, width: 100, height: 100, fill: "white"
6
+ circle cx: 50, cy: 50, r: 40, fill: "purple"
7
+ rect x: 10, y: 50, width: 80, height: 50, fill: "purple"
8
+
9
+ [ 25, 50 ].each do |x|
10
+ circle cx: x, cy: 40, r: 8, fill: "white"
11
+ end
12
+
13
+ path fill: "white", d: %w[
14
+ M11 100 l13 -15 l13 15 l13 -15
15
+ l13 15 l13 -15 l13 15 Z
16
+ ]
17
+ end.Save
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
3
+ <rect x="0" y="0" width="100" height="100" fill="white"/>
4
+ <circle cx="50" cy="50" r="40" fill="purple"/>
5
+ <rect x="10" y="50" width="80" height="50" fill="purple"/>
6
+ <circle cx="25" cy="40" r="8" fill="white"/>
7
+ <circle cx="50" cy="40" r="8" fill="white"/>
8
+ <path fill="white" d="M11 100 l13 -15 l13 15 l13 -15 l13 15 l13 -15 l13 15 Z"/>
9
+ </svg>
@@ -0,0 +1,3 @@
1
+ dark:
2
+ purple: "#e5c39c"
3
+ white: "#222222"
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env -S ruby -S sevgi
2
+ # frozen_string_literal: true
3
+
4
+ SVG :minimal, width: 200, height: 100 do
5
+ rect id: "frame", width: 200, height: 100, rx: 5, fill: "white"
6
+
7
+ circle id: "head", cx: 80, cy: 50, r: 40, fill: "purple"
8
+ circle id: "eye", cx: 90, cy: 28, r: 6, fill: "white"
9
+ polygon id: "mouth", points: %w[ 80,50 120,20 120,80 ], fill: "white"
10
+
11
+ symbol id: "dot" do
12
+ circle cx: 120, cy: 50, r: 6, fill: "purple"
13
+ end
14
+ g id: "dots" do
15
+ TileX "dot", n: 3, d: 18
16
+ end
17
+ end.Save
@@ -0,0 +1,14 @@
1
+ <svg width="200" height="100">
2
+ <rect id="frame" width="200" height="100" rx="5" fill="white"/>
3
+ <circle id="head" cx="80" cy="50" r="40" fill="purple"/>
4
+ <circle id="eye" cx="90" cy="28" r="6" fill="white"/>
5
+ <polygon id="mouth" points="80,50 120,20 120,80" fill="white"/>
6
+ <symbol id="dot">
7
+ <circle cx="120" cy="50" r="6" fill="purple"/>
8
+ </symbol>
9
+ <g id="dots">
10
+ <use id="dot-1" href="#dot" class="tile-col-1 tile-col-first"/>
11
+ <use id="dot-2" href="#dot" class="tile-col-2" x="18"/>
12
+ <use id="dot-3" href="#dot" class="tile-col-3 tile-col-last" x="36"/>
13
+ </g>
14
+ </svg>
@@ -0,0 +1,3 @@
1
+ dark:
2
+ purple: "#e5c39c"
3
+ white: "#222222"
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env -S ruby -S sevgi
2
+ # frozen_string_literal: true
3
+
4
+ WIDTH = 150 # 15 cm width (ruler's length)
5
+ HEIGHT = 20 # 2 cm height
6
+
7
+ STYLE = {
8
+ ".labels": { fill: "black", font: "3pt monospace" },
9
+ ".majors": { stroke: "black", "stroke-width": 0.2 },
10
+ ".halves": { stroke: "black", "stroke-width": 0.1 },
11
+ ".minors": { stroke: "black", "stroke-width": 0.1 },
12
+ ".frame": { stroke: "black", "stroke-width": 0.1, fill: "none" }
13
+ }.freeze
14
+
15
+ SVG width: "210mm", height: "50mm", viewBox: "0 0 210 50" do
16
+ css STYLE
17
+
18
+ rect id: "frame", width: WIDTH, height: HEIGHT, class: "frame"
19
+
20
+ layer id: "minors" do
21
+ length = 2
22
+
23
+ (0..WIDTH).step(1) do |x|
24
+ VLineBy x:, y: 0, length: length, class: "minors"
25
+ VLineBy x:, y: HEIGHT, length: -length, class: "minors"
26
+ end
27
+ end
28
+
29
+ layer id: "halves" do
30
+ length = 4
31
+
32
+ (0..WIDTH).step(5) do |x|
33
+ VLineBy x:, y: 0, length: length, class: "minors"
34
+ VLineBy x:, y: HEIGHT, length: -length, class: "minors"
35
+ end
36
+ end
37
+
38
+ layer id: "majors" do
39
+ length = 6
40
+
41
+ (10..(WIDTH - 10)).step(10) do |x|
42
+ VLineBy x:, y: 0, length: length, class: "minors"
43
+ VLineBy x:, y: HEIGHT, length: -length, class: "minors"
44
+ end
45
+
46
+ layer id: "labels" do
47
+ (10..(WIDTH - 10)).step(10).each_with_index do |x, i|
48
+ text (i + 1).to_s, "text-anchor": "middle", x:, y: length + 5.5, class: "labels"
49
+ end
50
+ end
51
+ end
52
+ end.Save
@@ -0,0 +1,443 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="210mm" height="50mm" viewBox="0 0 210 50">
3
+ <style type="text/css">
4
+ <![CDATA[
5
+ .labels {
6
+ fill: black;
7
+ font: 3pt monospace;
8
+ }
9
+ .majors {
10
+ stroke: black;
11
+ stroke-width: 0.2;
12
+ }
13
+ .halves {
14
+ stroke: black;
15
+ stroke-width: 0.1;
16
+ }
17
+ .minors {
18
+ stroke: black;
19
+ stroke-width: 0.1;
20
+ }
21
+ .frame {
22
+ stroke: black;
23
+ stroke-width: 0.1;
24
+ fill: none;
25
+ }
26
+ ]]>
27
+ </style>
28
+ <rect id="frame" width="150" height="20" class="frame"/>
29
+ <g id="minors">
30
+ <path d="M 0 0 v 2" class="minors"/>
31
+ <path d="M 0 20 v -2" class="minors"/>
32
+ <path d="M 1 0 v 2" class="minors"/>
33
+ <path d="M 1 20 v -2" class="minors"/>
34
+ <path d="M 2 0 v 2" class="minors"/>
35
+ <path d="M 2 20 v -2" class="minors"/>
36
+ <path d="M 3 0 v 2" class="minors"/>
37
+ <path d="M 3 20 v -2" class="minors"/>
38
+ <path d="M 4 0 v 2" class="minors"/>
39
+ <path d="M 4 20 v -2" class="minors"/>
40
+ <path d="M 5 0 v 2" class="minors"/>
41
+ <path d="M 5 20 v -2" class="minors"/>
42
+ <path d="M 6 0 v 2" class="minors"/>
43
+ <path d="M 6 20 v -2" class="minors"/>
44
+ <path d="M 7 0 v 2" class="minors"/>
45
+ <path d="M 7 20 v -2" class="minors"/>
46
+ <path d="M 8 0 v 2" class="minors"/>
47
+ <path d="M 8 20 v -2" class="minors"/>
48
+ <path d="M 9 0 v 2" class="minors"/>
49
+ <path d="M 9 20 v -2" class="minors"/>
50
+ <path d="M 10 0 v 2" class="minors"/>
51
+ <path d="M 10 20 v -2" class="minors"/>
52
+ <path d="M 11 0 v 2" class="minors"/>
53
+ <path d="M 11 20 v -2" class="minors"/>
54
+ <path d="M 12 0 v 2" class="minors"/>
55
+ <path d="M 12 20 v -2" class="minors"/>
56
+ <path d="M 13 0 v 2" class="minors"/>
57
+ <path d="M 13 20 v -2" class="minors"/>
58
+ <path d="M 14 0 v 2" class="minors"/>
59
+ <path d="M 14 20 v -2" class="minors"/>
60
+ <path d="M 15 0 v 2" class="minors"/>
61
+ <path d="M 15 20 v -2" class="minors"/>
62
+ <path d="M 16 0 v 2" class="minors"/>
63
+ <path d="M 16 20 v -2" class="minors"/>
64
+ <path d="M 17 0 v 2" class="minors"/>
65
+ <path d="M 17 20 v -2" class="minors"/>
66
+ <path d="M 18 0 v 2" class="minors"/>
67
+ <path d="M 18 20 v -2" class="minors"/>
68
+ <path d="M 19 0 v 2" class="minors"/>
69
+ <path d="M 19 20 v -2" class="minors"/>
70
+ <path d="M 20 0 v 2" class="minors"/>
71
+ <path d="M 20 20 v -2" class="minors"/>
72
+ <path d="M 21 0 v 2" class="minors"/>
73
+ <path d="M 21 20 v -2" class="minors"/>
74
+ <path d="M 22 0 v 2" class="minors"/>
75
+ <path d="M 22 20 v -2" class="minors"/>
76
+ <path d="M 23 0 v 2" class="minors"/>
77
+ <path d="M 23 20 v -2" class="minors"/>
78
+ <path d="M 24 0 v 2" class="minors"/>
79
+ <path d="M 24 20 v -2" class="minors"/>
80
+ <path d="M 25 0 v 2" class="minors"/>
81
+ <path d="M 25 20 v -2" class="minors"/>
82
+ <path d="M 26 0 v 2" class="minors"/>
83
+ <path d="M 26 20 v -2" class="minors"/>
84
+ <path d="M 27 0 v 2" class="minors"/>
85
+ <path d="M 27 20 v -2" class="minors"/>
86
+ <path d="M 28 0 v 2" class="minors"/>
87
+ <path d="M 28 20 v -2" class="minors"/>
88
+ <path d="M 29 0 v 2" class="minors"/>
89
+ <path d="M 29 20 v -2" class="minors"/>
90
+ <path d="M 30 0 v 2" class="minors"/>
91
+ <path d="M 30 20 v -2" class="minors"/>
92
+ <path d="M 31 0 v 2" class="minors"/>
93
+ <path d="M 31 20 v -2" class="minors"/>
94
+ <path d="M 32 0 v 2" class="minors"/>
95
+ <path d="M 32 20 v -2" class="minors"/>
96
+ <path d="M 33 0 v 2" class="minors"/>
97
+ <path d="M 33 20 v -2" class="minors"/>
98
+ <path d="M 34 0 v 2" class="minors"/>
99
+ <path d="M 34 20 v -2" class="minors"/>
100
+ <path d="M 35 0 v 2" class="minors"/>
101
+ <path d="M 35 20 v -2" class="minors"/>
102
+ <path d="M 36 0 v 2" class="minors"/>
103
+ <path d="M 36 20 v -2" class="minors"/>
104
+ <path d="M 37 0 v 2" class="minors"/>
105
+ <path d="M 37 20 v -2" class="minors"/>
106
+ <path d="M 38 0 v 2" class="minors"/>
107
+ <path d="M 38 20 v -2" class="minors"/>
108
+ <path d="M 39 0 v 2" class="minors"/>
109
+ <path d="M 39 20 v -2" class="minors"/>
110
+ <path d="M 40 0 v 2" class="minors"/>
111
+ <path d="M 40 20 v -2" class="minors"/>
112
+ <path d="M 41 0 v 2" class="minors"/>
113
+ <path d="M 41 20 v -2" class="minors"/>
114
+ <path d="M 42 0 v 2" class="minors"/>
115
+ <path d="M 42 20 v -2" class="minors"/>
116
+ <path d="M 43 0 v 2" class="minors"/>
117
+ <path d="M 43 20 v -2" class="minors"/>
118
+ <path d="M 44 0 v 2" class="minors"/>
119
+ <path d="M 44 20 v -2" class="minors"/>
120
+ <path d="M 45 0 v 2" class="minors"/>
121
+ <path d="M 45 20 v -2" class="minors"/>
122
+ <path d="M 46 0 v 2" class="minors"/>
123
+ <path d="M 46 20 v -2" class="minors"/>
124
+ <path d="M 47 0 v 2" class="minors"/>
125
+ <path d="M 47 20 v -2" class="minors"/>
126
+ <path d="M 48 0 v 2" class="minors"/>
127
+ <path d="M 48 20 v -2" class="minors"/>
128
+ <path d="M 49 0 v 2" class="minors"/>
129
+ <path d="M 49 20 v -2" class="minors"/>
130
+ <path d="M 50 0 v 2" class="minors"/>
131
+ <path d="M 50 20 v -2" class="minors"/>
132
+ <path d="M 51 0 v 2" class="minors"/>
133
+ <path d="M 51 20 v -2" class="minors"/>
134
+ <path d="M 52 0 v 2" class="minors"/>
135
+ <path d="M 52 20 v -2" class="minors"/>
136
+ <path d="M 53 0 v 2" class="minors"/>
137
+ <path d="M 53 20 v -2" class="minors"/>
138
+ <path d="M 54 0 v 2" class="minors"/>
139
+ <path d="M 54 20 v -2" class="minors"/>
140
+ <path d="M 55 0 v 2" class="minors"/>
141
+ <path d="M 55 20 v -2" class="minors"/>
142
+ <path d="M 56 0 v 2" class="minors"/>
143
+ <path d="M 56 20 v -2" class="minors"/>
144
+ <path d="M 57 0 v 2" class="minors"/>
145
+ <path d="M 57 20 v -2" class="minors"/>
146
+ <path d="M 58 0 v 2" class="minors"/>
147
+ <path d="M 58 20 v -2" class="minors"/>
148
+ <path d="M 59 0 v 2" class="minors"/>
149
+ <path d="M 59 20 v -2" class="minors"/>
150
+ <path d="M 60 0 v 2" class="minors"/>
151
+ <path d="M 60 20 v -2" class="minors"/>
152
+ <path d="M 61 0 v 2" class="minors"/>
153
+ <path d="M 61 20 v -2" class="minors"/>
154
+ <path d="M 62 0 v 2" class="minors"/>
155
+ <path d="M 62 20 v -2" class="minors"/>
156
+ <path d="M 63 0 v 2" class="minors"/>
157
+ <path d="M 63 20 v -2" class="minors"/>
158
+ <path d="M 64 0 v 2" class="minors"/>
159
+ <path d="M 64 20 v -2" class="minors"/>
160
+ <path d="M 65 0 v 2" class="minors"/>
161
+ <path d="M 65 20 v -2" class="minors"/>
162
+ <path d="M 66 0 v 2" class="minors"/>
163
+ <path d="M 66 20 v -2" class="minors"/>
164
+ <path d="M 67 0 v 2" class="minors"/>
165
+ <path d="M 67 20 v -2" class="minors"/>
166
+ <path d="M 68 0 v 2" class="minors"/>
167
+ <path d="M 68 20 v -2" class="minors"/>
168
+ <path d="M 69 0 v 2" class="minors"/>
169
+ <path d="M 69 20 v -2" class="minors"/>
170
+ <path d="M 70 0 v 2" class="minors"/>
171
+ <path d="M 70 20 v -2" class="minors"/>
172
+ <path d="M 71 0 v 2" class="minors"/>
173
+ <path d="M 71 20 v -2" class="minors"/>
174
+ <path d="M 72 0 v 2" class="minors"/>
175
+ <path d="M 72 20 v -2" class="minors"/>
176
+ <path d="M 73 0 v 2" class="minors"/>
177
+ <path d="M 73 20 v -2" class="minors"/>
178
+ <path d="M 74 0 v 2" class="minors"/>
179
+ <path d="M 74 20 v -2" class="minors"/>
180
+ <path d="M 75 0 v 2" class="minors"/>
181
+ <path d="M 75 20 v -2" class="minors"/>
182
+ <path d="M 76 0 v 2" class="minors"/>
183
+ <path d="M 76 20 v -2" class="minors"/>
184
+ <path d="M 77 0 v 2" class="minors"/>
185
+ <path d="M 77 20 v -2" class="minors"/>
186
+ <path d="M 78 0 v 2" class="minors"/>
187
+ <path d="M 78 20 v -2" class="minors"/>
188
+ <path d="M 79 0 v 2" class="minors"/>
189
+ <path d="M 79 20 v -2" class="minors"/>
190
+ <path d="M 80 0 v 2" class="minors"/>
191
+ <path d="M 80 20 v -2" class="minors"/>
192
+ <path d="M 81 0 v 2" class="minors"/>
193
+ <path d="M 81 20 v -2" class="minors"/>
194
+ <path d="M 82 0 v 2" class="minors"/>
195
+ <path d="M 82 20 v -2" class="minors"/>
196
+ <path d="M 83 0 v 2" class="minors"/>
197
+ <path d="M 83 20 v -2" class="minors"/>
198
+ <path d="M 84 0 v 2" class="minors"/>
199
+ <path d="M 84 20 v -2" class="minors"/>
200
+ <path d="M 85 0 v 2" class="minors"/>
201
+ <path d="M 85 20 v -2" class="minors"/>
202
+ <path d="M 86 0 v 2" class="minors"/>
203
+ <path d="M 86 20 v -2" class="minors"/>
204
+ <path d="M 87 0 v 2" class="minors"/>
205
+ <path d="M 87 20 v -2" class="minors"/>
206
+ <path d="M 88 0 v 2" class="minors"/>
207
+ <path d="M 88 20 v -2" class="minors"/>
208
+ <path d="M 89 0 v 2" class="minors"/>
209
+ <path d="M 89 20 v -2" class="minors"/>
210
+ <path d="M 90 0 v 2" class="minors"/>
211
+ <path d="M 90 20 v -2" class="minors"/>
212
+ <path d="M 91 0 v 2" class="minors"/>
213
+ <path d="M 91 20 v -2" class="minors"/>
214
+ <path d="M 92 0 v 2" class="minors"/>
215
+ <path d="M 92 20 v -2" class="minors"/>
216
+ <path d="M 93 0 v 2" class="minors"/>
217
+ <path d="M 93 20 v -2" class="minors"/>
218
+ <path d="M 94 0 v 2" class="minors"/>
219
+ <path d="M 94 20 v -2" class="minors"/>
220
+ <path d="M 95 0 v 2" class="minors"/>
221
+ <path d="M 95 20 v -2" class="minors"/>
222
+ <path d="M 96 0 v 2" class="minors"/>
223
+ <path d="M 96 20 v -2" class="minors"/>
224
+ <path d="M 97 0 v 2" class="minors"/>
225
+ <path d="M 97 20 v -2" class="minors"/>
226
+ <path d="M 98 0 v 2" class="minors"/>
227
+ <path d="M 98 20 v -2" class="minors"/>
228
+ <path d="M 99 0 v 2" class="minors"/>
229
+ <path d="M 99 20 v -2" class="minors"/>
230
+ <path d="M 100 0 v 2" class="minors"/>
231
+ <path d="M 100 20 v -2" class="minors"/>
232
+ <path d="M 101 0 v 2" class="minors"/>
233
+ <path d="M 101 20 v -2" class="minors"/>
234
+ <path d="M 102 0 v 2" class="minors"/>
235
+ <path d="M 102 20 v -2" class="minors"/>
236
+ <path d="M 103 0 v 2" class="minors"/>
237
+ <path d="M 103 20 v -2" class="minors"/>
238
+ <path d="M 104 0 v 2" class="minors"/>
239
+ <path d="M 104 20 v -2" class="minors"/>
240
+ <path d="M 105 0 v 2" class="minors"/>
241
+ <path d="M 105 20 v -2" class="minors"/>
242
+ <path d="M 106 0 v 2" class="minors"/>
243
+ <path d="M 106 20 v -2" class="minors"/>
244
+ <path d="M 107 0 v 2" class="minors"/>
245
+ <path d="M 107 20 v -2" class="minors"/>
246
+ <path d="M 108 0 v 2" class="minors"/>
247
+ <path d="M 108 20 v -2" class="minors"/>
248
+ <path d="M 109 0 v 2" class="minors"/>
249
+ <path d="M 109 20 v -2" class="minors"/>
250
+ <path d="M 110 0 v 2" class="minors"/>
251
+ <path d="M 110 20 v -2" class="minors"/>
252
+ <path d="M 111 0 v 2" class="minors"/>
253
+ <path d="M 111 20 v -2" class="minors"/>
254
+ <path d="M 112 0 v 2" class="minors"/>
255
+ <path d="M 112 20 v -2" class="minors"/>
256
+ <path d="M 113 0 v 2" class="minors"/>
257
+ <path d="M 113 20 v -2" class="minors"/>
258
+ <path d="M 114 0 v 2" class="minors"/>
259
+ <path d="M 114 20 v -2" class="minors"/>
260
+ <path d="M 115 0 v 2" class="minors"/>
261
+ <path d="M 115 20 v -2" class="minors"/>
262
+ <path d="M 116 0 v 2" class="minors"/>
263
+ <path d="M 116 20 v -2" class="minors"/>
264
+ <path d="M 117 0 v 2" class="minors"/>
265
+ <path d="M 117 20 v -2" class="minors"/>
266
+ <path d="M 118 0 v 2" class="minors"/>
267
+ <path d="M 118 20 v -2" class="minors"/>
268
+ <path d="M 119 0 v 2" class="minors"/>
269
+ <path d="M 119 20 v -2" class="minors"/>
270
+ <path d="M 120 0 v 2" class="minors"/>
271
+ <path d="M 120 20 v -2" class="minors"/>
272
+ <path d="M 121 0 v 2" class="minors"/>
273
+ <path d="M 121 20 v -2" class="minors"/>
274
+ <path d="M 122 0 v 2" class="minors"/>
275
+ <path d="M 122 20 v -2" class="minors"/>
276
+ <path d="M 123 0 v 2" class="minors"/>
277
+ <path d="M 123 20 v -2" class="minors"/>
278
+ <path d="M 124 0 v 2" class="minors"/>
279
+ <path d="M 124 20 v -2" class="minors"/>
280
+ <path d="M 125 0 v 2" class="minors"/>
281
+ <path d="M 125 20 v -2" class="minors"/>
282
+ <path d="M 126 0 v 2" class="minors"/>
283
+ <path d="M 126 20 v -2" class="minors"/>
284
+ <path d="M 127 0 v 2" class="minors"/>
285
+ <path d="M 127 20 v -2" class="minors"/>
286
+ <path d="M 128 0 v 2" class="minors"/>
287
+ <path d="M 128 20 v -2" class="minors"/>
288
+ <path d="M 129 0 v 2" class="minors"/>
289
+ <path d="M 129 20 v -2" class="minors"/>
290
+ <path d="M 130 0 v 2" class="minors"/>
291
+ <path d="M 130 20 v -2" class="minors"/>
292
+ <path d="M 131 0 v 2" class="minors"/>
293
+ <path d="M 131 20 v -2" class="minors"/>
294
+ <path d="M 132 0 v 2" class="minors"/>
295
+ <path d="M 132 20 v -2" class="minors"/>
296
+ <path d="M 133 0 v 2" class="minors"/>
297
+ <path d="M 133 20 v -2" class="minors"/>
298
+ <path d="M 134 0 v 2" class="minors"/>
299
+ <path d="M 134 20 v -2" class="minors"/>
300
+ <path d="M 135 0 v 2" class="minors"/>
301
+ <path d="M 135 20 v -2" class="minors"/>
302
+ <path d="M 136 0 v 2" class="minors"/>
303
+ <path d="M 136 20 v -2" class="minors"/>
304
+ <path d="M 137 0 v 2" class="minors"/>
305
+ <path d="M 137 20 v -2" class="minors"/>
306
+ <path d="M 138 0 v 2" class="minors"/>
307
+ <path d="M 138 20 v -2" class="minors"/>
308
+ <path d="M 139 0 v 2" class="minors"/>
309
+ <path d="M 139 20 v -2" class="minors"/>
310
+ <path d="M 140 0 v 2" class="minors"/>
311
+ <path d="M 140 20 v -2" class="minors"/>
312
+ <path d="M 141 0 v 2" class="minors"/>
313
+ <path d="M 141 20 v -2" class="minors"/>
314
+ <path d="M 142 0 v 2" class="minors"/>
315
+ <path d="M 142 20 v -2" class="minors"/>
316
+ <path d="M 143 0 v 2" class="minors"/>
317
+ <path d="M 143 20 v -2" class="minors"/>
318
+ <path d="M 144 0 v 2" class="minors"/>
319
+ <path d="M 144 20 v -2" class="minors"/>
320
+ <path d="M 145 0 v 2" class="minors"/>
321
+ <path d="M 145 20 v -2" class="minors"/>
322
+ <path d="M 146 0 v 2" class="minors"/>
323
+ <path d="M 146 20 v -2" class="minors"/>
324
+ <path d="M 147 0 v 2" class="minors"/>
325
+ <path d="M 147 20 v -2" class="minors"/>
326
+ <path d="M 148 0 v 2" class="minors"/>
327
+ <path d="M 148 20 v -2" class="minors"/>
328
+ <path d="M 149 0 v 2" class="minors"/>
329
+ <path d="M 149 20 v -2" class="minors"/>
330
+ <path d="M 150 0 v 2" class="minors"/>
331
+ <path d="M 150 20 v -2" class="minors"/>
332
+ </g>
333
+ <g id="halves">
334
+ <path d="M 0 0 v 4" class="minors"/>
335
+ <path d="M 0 20 v -4" class="minors"/>
336
+ <path d="M 5 0 v 4" class="minors"/>
337
+ <path d="M 5 20 v -4" class="minors"/>
338
+ <path d="M 10 0 v 4" class="minors"/>
339
+ <path d="M 10 20 v -4" class="minors"/>
340
+ <path d="M 15 0 v 4" class="minors"/>
341
+ <path d="M 15 20 v -4" class="minors"/>
342
+ <path d="M 20 0 v 4" class="minors"/>
343
+ <path d="M 20 20 v -4" class="minors"/>
344
+ <path d="M 25 0 v 4" class="minors"/>
345
+ <path d="M 25 20 v -4" class="minors"/>
346
+ <path d="M 30 0 v 4" class="minors"/>
347
+ <path d="M 30 20 v -4" class="minors"/>
348
+ <path d="M 35 0 v 4" class="minors"/>
349
+ <path d="M 35 20 v -4" class="minors"/>
350
+ <path d="M 40 0 v 4" class="minors"/>
351
+ <path d="M 40 20 v -4" class="minors"/>
352
+ <path d="M 45 0 v 4" class="minors"/>
353
+ <path d="M 45 20 v -4" class="minors"/>
354
+ <path d="M 50 0 v 4" class="minors"/>
355
+ <path d="M 50 20 v -4" class="minors"/>
356
+ <path d="M 55 0 v 4" class="minors"/>
357
+ <path d="M 55 20 v -4" class="minors"/>
358
+ <path d="M 60 0 v 4" class="minors"/>
359
+ <path d="M 60 20 v -4" class="minors"/>
360
+ <path d="M 65 0 v 4" class="minors"/>
361
+ <path d="M 65 20 v -4" class="minors"/>
362
+ <path d="M 70 0 v 4" class="minors"/>
363
+ <path d="M 70 20 v -4" class="minors"/>
364
+ <path d="M 75 0 v 4" class="minors"/>
365
+ <path d="M 75 20 v -4" class="minors"/>
366
+ <path d="M 80 0 v 4" class="minors"/>
367
+ <path d="M 80 20 v -4" class="minors"/>
368
+ <path d="M 85 0 v 4" class="minors"/>
369
+ <path d="M 85 20 v -4" class="minors"/>
370
+ <path d="M 90 0 v 4" class="minors"/>
371
+ <path d="M 90 20 v -4" class="minors"/>
372
+ <path d="M 95 0 v 4" class="minors"/>
373
+ <path d="M 95 20 v -4" class="minors"/>
374
+ <path d="M 100 0 v 4" class="minors"/>
375
+ <path d="M 100 20 v -4" class="minors"/>
376
+ <path d="M 105 0 v 4" class="minors"/>
377
+ <path d="M 105 20 v -4" class="minors"/>
378
+ <path d="M 110 0 v 4" class="minors"/>
379
+ <path d="M 110 20 v -4" class="minors"/>
380
+ <path d="M 115 0 v 4" class="minors"/>
381
+ <path d="M 115 20 v -4" class="minors"/>
382
+ <path d="M 120 0 v 4" class="minors"/>
383
+ <path d="M 120 20 v -4" class="minors"/>
384
+ <path d="M 125 0 v 4" class="minors"/>
385
+ <path d="M 125 20 v -4" class="minors"/>
386
+ <path d="M 130 0 v 4" class="minors"/>
387
+ <path d="M 130 20 v -4" class="minors"/>
388
+ <path d="M 135 0 v 4" class="minors"/>
389
+ <path d="M 135 20 v -4" class="minors"/>
390
+ <path d="M 140 0 v 4" class="minors"/>
391
+ <path d="M 140 20 v -4" class="minors"/>
392
+ <path d="M 145 0 v 4" class="minors"/>
393
+ <path d="M 145 20 v -4" class="minors"/>
394
+ <path d="M 150 0 v 4" class="minors"/>
395
+ <path d="M 150 20 v -4" class="minors"/>
396
+ </g>
397
+ <g id="majors">
398
+ <path d="M 10 0 v 6" class="minors"/>
399
+ <path d="M 10 20 v -6" class="minors"/>
400
+ <path d="M 20 0 v 6" class="minors"/>
401
+ <path d="M 20 20 v -6" class="minors"/>
402
+ <path d="M 30 0 v 6" class="minors"/>
403
+ <path d="M 30 20 v -6" class="minors"/>
404
+ <path d="M 40 0 v 6" class="minors"/>
405
+ <path d="M 40 20 v -6" class="minors"/>
406
+ <path d="M 50 0 v 6" class="minors"/>
407
+ <path d="M 50 20 v -6" class="minors"/>
408
+ <path d="M 60 0 v 6" class="minors"/>
409
+ <path d="M 60 20 v -6" class="minors"/>
410
+ <path d="M 70 0 v 6" class="minors"/>
411
+ <path d="M 70 20 v -6" class="minors"/>
412
+ <path d="M 80 0 v 6" class="minors"/>
413
+ <path d="M 80 20 v -6" class="minors"/>
414
+ <path d="M 90 0 v 6" class="minors"/>
415
+ <path d="M 90 20 v -6" class="minors"/>
416
+ <path d="M 100 0 v 6" class="minors"/>
417
+ <path d="M 100 20 v -6" class="minors"/>
418
+ <path d="M 110 0 v 6" class="minors"/>
419
+ <path d="M 110 20 v -6" class="minors"/>
420
+ <path d="M 120 0 v 6" class="minors"/>
421
+ <path d="M 120 20 v -6" class="minors"/>
422
+ <path d="M 130 0 v 6" class="minors"/>
423
+ <path d="M 130 20 v -6" class="minors"/>
424
+ <path d="M 140 0 v 6" class="minors"/>
425
+ <path d="M 140 20 v -6" class="minors"/>
426
+ <g id="labels">
427
+ <text text-anchor="middle" x="10" y="11.5" class="labels">1</text>
428
+ <text text-anchor="middle" x="20" y="11.5" class="labels">2</text>
429
+ <text text-anchor="middle" x="30" y="11.5" class="labels">3</text>
430
+ <text text-anchor="middle" x="40" y="11.5" class="labels">4</text>
431
+ <text text-anchor="middle" x="50" y="11.5" class="labels">5</text>
432
+ <text text-anchor="middle" x="60" y="11.5" class="labels">6</text>
433
+ <text text-anchor="middle" x="70" y="11.5" class="labels">7</text>
434
+ <text text-anchor="middle" x="80" y="11.5" class="labels">8</text>
435
+ <text text-anchor="middle" x="90" y="11.5" class="labels">9</text>
436
+ <text text-anchor="middle" x="100" y="11.5" class="labels">10</text>
437
+ <text text-anchor="middle" x="110" y="11.5" class="labels">11</text>
438
+ <text text-anchor="middle" x="120" y="11.5" class="labels">12</text>
439
+ <text text-anchor="middle" x="130" y="11.5" class="labels">13</text>
440
+ <text text-anchor="middle" x="140" y="11.5" class="labels">14</text>
441
+ </g>
442
+ </g>
443
+ </svg>
@@ -0,0 +1,3 @@
1
+ dark:
2
+ black: white
3
+ yellow: purple
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env -S ruby -S sevgi
2
+ # frozen_string_literal: true
3
+
4
+ WIDTH = 150 # 15 cm width (ruler's length)
5
+ HEIGHT = 20 # 2 cm height
6
+
7
+ STYLE = {
8
+ ".labels": { fill: "black", font: "3pt monospace" },
9
+ ".majors": { stroke: "black", "stroke-width": 0.2 },
10
+ ".halves": { stroke: "black", "stroke-width": 0.1 },
11
+ ".minors": { stroke: "black", "stroke-width": 0.1 },
12
+ ".frame": { stroke: "black", "stroke-width": 0.05, fill: "none" }
13
+ }.freeze
14
+
15
+ SVG width: "210mm", height: "50mm", viewBox: "0 0 210 50" do
16
+ css STYLE
17
+
18
+ rect id: "frame", width: WIDTH, height: HEIGHT, class: "frame"
19
+
20
+ layer id: "minors" do
21
+ length = 2
22
+
23
+ (0..WIDTH).step(1) do |x|
24
+ line x1: x, y1: 0, x2: x, y2: length, class: "minors"
25
+ line x1: x, y1: HEIGHT, x2: x, y2: HEIGHT - length, class: "minors"
26
+ end
27
+ end
28
+
29
+ layer id: "halves" do
30
+ length = 4
31
+
32
+ (0..WIDTH).step(5) do |x|
33
+ line x1: x, y1: 0, x2: x, y2: length, class: "halves"
34
+ line x1: x, y1: HEIGHT, x2: x, y2: HEIGHT - length, class: "halves"
35
+ end
36
+ end
37
+
38
+ layer id: "majors" do
39
+ length = 6
40
+
41
+ (10..(WIDTH - 10)).step(10) do |x|
42
+ line x1: x, y1: 0, x2: x, y2: length, class: "majors"
43
+ line x1: x, y1: HEIGHT, x2: x, y2: HEIGHT - length, class: "majors"
44
+ end
45
+
46
+ layer id: "labels" do
47
+ (10..(WIDTH - 10)).step(10).each_with_index do |x, i|
48
+ text (i + 1).to_s, "text-anchor": "middle", x:, y: length + 5.5, class: "labels"
49
+ end
50
+ end
51
+ end
52
+ end.Save