railroad_diagrams 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/test.rb ADDED
@@ -0,0 +1,570 @@
1
+ add('test choice up',
2
+ Diagram.new(
3
+ Choice.new(
4
+ 2,
5
+ Group.new(
6
+ Choice.new(
7
+ 1,
8
+ Skip.new,
9
+ Group.new(
10
+ Stack.new(Skip.new, Skip.new),
11
+ 'inner'
12
+ )
13
+ ),
14
+ 'top'
15
+ ),
16
+ Group.new(
17
+ Choice.new(
18
+ 1,
19
+ Skip.new,
20
+ Group.new(
21
+ Stack.new(Skip.new, Skip.new),
22
+ 'inner'
23
+ )
24
+ ),
25
+ 'top'
26
+ ),
27
+ Skip.new
28
+ )
29
+ ))
30
+
31
+ add('test choice down',
32
+ Diagram.new(
33
+ Choice.new(
34
+ 0,
35
+ Group.new(
36
+ Choice.new(
37
+ 0,
38
+ Skip.new,
39
+ Group.new(
40
+ Stack.new(Terminal.new('abc'), Skip.new),
41
+ 'inner'
42
+ )
43
+ ),
44
+ 'top'
45
+ ),
46
+ Terminal.new('xyz')
47
+ )
48
+ ))
49
+
50
+ add('comment',
51
+ Diagram.new(
52
+ '/*',
53
+ ZeroOrMore.new(
54
+ NonTerminal.new('anything but * followed by /')
55
+ ),
56
+ '*/'
57
+ ))
58
+
59
+ add('newline', Diagram.new(Choice.new(0, '\\n', '\\r\\n', '\\r', '\\f')))
60
+
61
+ add('whitespace', Diagram.new(Choice.new(
62
+ 0, 'space', '\\t', NonTerminal.new('newline')
63
+ )))
64
+
65
+ add('hex digit', Diagram.new(NonTerminal.new('0-9 a-f or A-F')))
66
+
67
+ add('escape',
68
+ Diagram.new(
69
+ '\\',
70
+ Choice.new(
71
+ 0,
72
+ NonTerminal.new('not newline or hex digit'),
73
+ Sequence.new(
74
+ OneOrMore.new(NonTerminal.new('hex digit'), Comment.new('1-6 times')),
75
+ Optional.new(NonTerminal.new('whitespace'), 'skip')
76
+ )
77
+ )
78
+ ))
79
+
80
+ add('<whitespace-token>', Diagram.new(OneOrMore.new(NonTerminal.new('whitespace'))))
81
+
82
+ add('ws*', Diagram.new(ZeroOrMore.new(NonTerminal.new('<whitespace-token>'))))
83
+
84
+ add('<ident-token>',
85
+ Diagram.new(
86
+ Choice.new(0, Skip.new, '-'),
87
+ Choice.new(0, NonTerminal.new('a-z A-Z _ or non-ASCII'), NonTerminal.new('escape')),
88
+ ZeroOrMore.new(
89
+ Choice.new(
90
+ 0,
91
+ NonTerminal.new('a-z A-Z 0-9 _ - or non-ASCII'), NonTerminal.new('escape')
92
+ )
93
+ )
94
+ ))
95
+
96
+ add('<function-token>',
97
+ Diagram.new(
98
+ NonTerminal.new('<ident-token>'), '('
99
+ ))
100
+
101
+ add('<at-keyword-token>',
102
+ Diagram.new(
103
+ '@', NonTerminal.new('<ident-token>')
104
+ ))
105
+
106
+ add('<hash-token>',
107
+ Diagram.new(
108
+ '#',
109
+ OneOrMore.new(
110
+ Choice.new(
111
+ 0,
112
+ NonTerminal.new('a-z A-Z 0-9 _ - or non-ASCII'),
113
+ NonTerminal.new('escape')
114
+ )
115
+ )
116
+ ))
117
+
118
+ add('<string-token>',
119
+ Diagram.new(
120
+ Choice.new(
121
+ 0,
122
+ Sequence.new(
123
+ '"',
124
+ ZeroOrMore.new(
125
+ Choice.new(
126
+ 0,
127
+ NonTerminal.new('not " \\ or newline'),
128
+ NonTerminal.new('escape'),
129
+ Sequence.new('\\', NonTerminal.new('newline'))
130
+ )
131
+ ),
132
+ '"'
133
+ ),
134
+ Sequence.new(
135
+ '\'',
136
+ ZeroOrMore.new(
137
+ Choice.new(
138
+ 0,
139
+ NonTerminal.new("not ' \\ or newline"),
140
+ NonTerminal.new('escape'),
141
+ Sequence.new('\\', NonTerminal.new('newline'))
142
+ )
143
+ ),
144
+ '\''
145
+ )
146
+ )
147
+ ))
148
+
149
+ add('<url-token>',
150
+ Diagram.new(
151
+ NonTerminal.new('<ident-token "url">'),
152
+ '(',
153
+ NonTerminal.new('ws*'),
154
+ Optional.new(
155
+ Sequence.new(
156
+ Choice.new(0, NonTerminal.new('url-unquoted'), NonTerminal.new('STRING')),
157
+ NonTerminal.new('ws*')
158
+ )
159
+ ),
160
+ ')'
161
+ ))
162
+
163
+ add('url-unquoted',
164
+ Diagram.new(
165
+ OneOrMore.new(
166
+ Choice.new(
167
+ 0,
168
+ NonTerminal.new('not " \' ( ) \\ whitespace or non-printable'),
169
+ NonTerminal.new('escape')
170
+ )
171
+ )
172
+ ))
173
+
174
+ add('<number-token>',
175
+ Diagram.new(
176
+ Choice.new(1, '+', Skip.new, '-'),
177
+ Choice.new(
178
+ 0,
179
+ Sequence.new(
180
+ OneOrMore.new(NonTerminal.new('digit')),
181
+ '.',
182
+ OneOrMore.new(NonTerminal.new('digit'))
183
+ ),
184
+ OneOrMore.new(NonTerminal.new('digit')),
185
+ Sequence.new(
186
+ '.',
187
+ OneOrMore.new(NonTerminal.new('digit'))
188
+ )
189
+ ),
190
+ Choice.new(
191
+ 0,
192
+ Skip.new,
193
+ Sequence.new(
194
+ Choice.new(0, 'e', 'E'),
195
+ Choice.new(1, '+', Skip.new, '-'),
196
+ OneOrMore.new(NonTerminal.new('digit'))
197
+ )
198
+ )
199
+ ))
200
+
201
+ add('<dimension-token>',
202
+ Diagram.new(
203
+ NonTerminal.new('<number-token>'), NonTerminal.new('<ident-token>')
204
+ ))
205
+
206
+ add('<percentage-token>', Diagram.new(
207
+ NonTerminal.new('<number-token>'), '%'
208
+ ))
209
+
210
+ add(
211
+ '<unicode-range-token>',
212
+ Diagram.new(
213
+ Choice.new(
214
+ 0,
215
+ 'U',
216
+ 'u'
217
+ ),
218
+ '+',
219
+ Choice.new(
220
+ 0,
221
+ Sequence.new(
222
+ OneOrMore.new(
223
+ NonTerminal.new('hex digit'),
224
+ Comment.new('1-6 times')
225
+ )
226
+ ),
227
+ Sequence.new(
228
+ ZeroOrMore.new(NonTerminal.new('hex digit'), Comment.new('1-5 times')),
229
+ OneOrMore.new('?', Comment.new('1 to (6 - digits) times'))
230
+ ),
231
+ Sequence.new(
232
+ OneOrMore.new(NonTerminal.new('hex digit'), Comment.new('1-6 times')),
233
+ '-',
234
+ OneOrMore.new(NonTerminal.new('hex digit'), Comment.new('1-6 times'))
235
+ )
236
+ )
237
+ )
238
+ )
239
+
240
+ add(
241
+ 'Stylesheet',
242
+ Diagram.new(
243
+ ZeroOrMore.new(
244
+ Choice.new(
245
+ 3,
246
+ NonTerminal.new('<CDO-token>'), NonTerminal.new('<CDC-token>'), NonTerminal.new('<whitespace-token>'),
247
+ NonTerminal.new('Qualified rule'), NonTerminal.new('At-rule')
248
+ )
249
+ )
250
+ )
251
+ )
252
+
253
+ add(
254
+ 'Rule list',
255
+ Diagram.new(
256
+ ZeroOrMore.new(
257
+ Choice.new(
258
+ 1,
259
+ NonTerminal.new('<whitespace-token>'), NonTerminal.new('Qualified rule'), NonTerminal.new('At-rule')
260
+ )
261
+ )
262
+ )
263
+ )
264
+
265
+ add('At-rule',
266
+ Diagram.new(
267
+ NonTerminal.new('<at-keyword-token>'), ZeroOrMore.new(NonTerminal.new('Component value')),
268
+ Choice.new(0, NonTerminal.new('{} block'), ';')
269
+ ))
270
+
271
+ add('Qualified rule',
272
+ Diagram.new(
273
+ ZeroOrMore.new(NonTerminal.new('Component value')),
274
+ NonTerminal.new('{} block')
275
+ ))
276
+
277
+ add('Declaration list',
278
+ Diagram.new(
279
+ NonTerminal.new('ws*'),
280
+ Choice.new(
281
+ 0,
282
+ Sequence.new(
283
+ Optional.new(NonTerminal.new('Declaration')),
284
+ Optional.new(Sequence.new(';', NonTerminal.new('Declaration list')))
285
+ ),
286
+ Sequence.new(
287
+ NonTerminal.new('At-rule'),
288
+ NonTerminal.new('Declaration list')
289
+ )
290
+ )
291
+ ))
292
+
293
+ add('Declaration',
294
+ Diagram.new(
295
+ NonTerminal.new('<ident-token>'), NonTerminal.new('ws*'), ':',
296
+ ZeroOrMore.new(NonTerminal.new('Component value')), Optional.new(NonTerminal.new('!important'))
297
+ ))
298
+
299
+ add('!important',
300
+ Diagram.new(
301
+ '!', NonTerminal.new('ws*'), NonTerminal.new('<ident-token "important">'), NonTerminal.new('ws*')
302
+ ))
303
+
304
+ add('Component value',
305
+ Diagram.new(
306
+ Choice.new(
307
+ 0,
308
+ NonTerminal.new('Preserved token'),
309
+ NonTerminal.new('{} block'),
310
+ NonTerminal.new('() block'),
311
+ NonTerminal.new('[] block'),
312
+ NonTerminal.new('Function block')
313
+ )
314
+ ))
315
+
316
+ add('{} block', Diagram.new('{', ZeroOrMore.new(NonTerminal.new('Component value')), '}'))
317
+ add('() block', Diagram.new('(', ZeroOrMore.new(NonTerminal.new('Component value')), ')'))
318
+ add('[] block', Diagram.new('[', ZeroOrMore.new(NonTerminal.new('Component value')), ']'))
319
+
320
+ add('Function block',
321
+ Diagram.new(
322
+ NonTerminal.new('<function-token>'),
323
+ ZeroOrMore.new(NonTerminal.new('Component value')),
324
+ ')'
325
+ ))
326
+
327
+ add('glob pattern',
328
+ Diagram.new(
329
+ AlternatingSequence.new(
330
+ NonTerminal.new('ident'),
331
+ '*'
332
+ )
333
+ ))
334
+
335
+ add('SQL',
336
+ Diagram.new(
337
+ Stack.new(
338
+ Sequence.new(
339
+ 'SELECT',
340
+ Optional.new('DISTINCT', 'skip'),
341
+ Choice.new(
342
+ 0,
343
+ '*',
344
+ OneOrMore.new(
345
+ Sequence.new(
346
+ NonTerminal.new('expression'),
347
+ Optional.new(Sequence.new('AS', NonTerminal.new('output_name')))
348
+ ),
349
+ ','
350
+ )
351
+ ),
352
+ 'FROM',
353
+ OneOrMore.new(NonTerminal.new('from_item'), ','),
354
+ Optional.new(Sequence.new('WHERE', NonTerminal.new('condition')))
355
+ ),
356
+ Sequence.new(
357
+ Optional.new(Sequence.new('GROUP BY', NonTerminal.new('expression'))),
358
+ Optional.new(Sequence.new('HAVING', NonTerminal.new('condition'))),
359
+ Optional.new(
360
+ Sequence.new(
361
+ Choice.new(0, 'UNION', 'INTERSECT', 'EXCEPT'),
362
+ Optional.new('ALL'),
363
+ NonTerminal.new('select')
364
+ )
365
+ )
366
+ ),
367
+ Sequence.new(
368
+ Optional.new(
369
+ Sequence.new(
370
+ 'ORDER BY',
371
+ OneOrMore.new(Sequence.new(NonTerminal.new('expression'), Choice.new(0, Skip.new, 'ASC', 'DESC')),
372
+ ',')
373
+ )
374
+ ),
375
+ Optional.new(
376
+ Sequence.new(
377
+ 'LIMIT',
378
+ Choice.new(0, NonTerminal.new('count'), 'ALL')
379
+ )
380
+ ),
381
+ Optional.new(Sequence.new('OFFSET', NonTerminal.new('start'), Optional.new('ROWS')))
382
+ )
383
+ )
384
+ ))
385
+
386
+ add('Group example',
387
+ Diagram.new(
388
+ 'foo',
389
+ ZeroOrMore.new(
390
+ Group.new(
391
+ Stack.new('foo', 'bar'),
392
+ 'label'
393
+ )
394
+ ),
395
+ 'bar'
396
+ ))
397
+
398
+ add('Class example',
399
+ Diagram.new(
400
+ 'foo',
401
+ Terminal.new('blue', cls: 'blue'),
402
+ NonTerminal.new('blue', cls: 'blue'),
403
+ Comment.new('blue', cls: 'blue')
404
+ ))
405
+
406
+ add('rr-alternatingsequence',
407
+ Diagram.new(
408
+ AlternatingSequence.new(
409
+ 'foo',
410
+ 'bar'
411
+ )
412
+ ))
413
+
414
+ add('rr-choice',
415
+ Diagram.new(
416
+ Choice.new(
417
+ 1, '1', '2', '3'
418
+ )
419
+ ))
420
+
421
+ add('rr-group',
422
+ Diagram.new(
423
+ Terminal.new('foo'),
424
+ Group.new(
425
+ Choice.new(
426
+ 0, NonTerminal.new('option 1'), NonTerminal.new('or two')
427
+ )
428
+ ),
429
+ Terminal.new('bar')
430
+ ))
431
+
432
+ add('rr-horizontalchoice',
433
+ Diagram.new(
434
+ HorizontalChoice.new(
435
+ Choice.new(2, '0', '1', '2', '3', '4'),
436
+ Choice.new(2, '5', '6', '7', '8', '9'),
437
+ Choice.new(2, 'a', 'b', 'c', 'd', 'e')
438
+ )
439
+ ))
440
+
441
+ add('rr-multchoice',
442
+ Diagram.new(
443
+ MultipleChoice.new(1, 'all', '1', '2', '3')
444
+ ))
445
+
446
+ add('rr-oneormore',
447
+ Diagram.new(
448
+ OneOrMore.new('foo', 'bar')
449
+ ))
450
+
451
+ add('rr-optional',
452
+ Diagram.new(
453
+ Optional.new('foo'),
454
+ Optional.new('bar', true)
455
+ ))
456
+
457
+ add('rr-optionalsequence',
458
+ Diagram.new(
459
+ OptionalSequence.new('1', '2', '3')
460
+ ))
461
+
462
+ add('rr-sequence',
463
+ Diagram.new(
464
+ Sequence.new('1', '2', '3')
465
+ ))
466
+
467
+ add('rr-stack',
468
+ Diagram.new(
469
+ Stack.new(
470
+ '1',
471
+ '2',
472
+ '3'
473
+ )
474
+ ))
475
+
476
+ add('rr-title',
477
+ Diagram.new(
478
+ Stack.new(
479
+ Terminal.new('Generate'),
480
+ Terminal.new('some')
481
+ ),
482
+ OneOrMore.new(NonTerminal.new('railroad diagrams'), Comment.new('and more'))
483
+ ))
484
+
485
+ add('rr-zeroormore-1',
486
+ Diagram.new(
487
+ ZeroOrMore.new('foo', Comment.new('bar'))
488
+ ))
489
+
490
+ add('rr-zeroormore-2',
491
+ Diagram.new(
492
+ ZeroOrMore.new('foo', Comment.new('bar')),
493
+ ZeroOrMore.new('foo', Comment.new('bar'), true)
494
+ ))
495
+
496
+ add('complicated-horizontalchoice-1',
497
+ Diagram.new(
498
+ HorizontalChoice.new(
499
+ Choice.new(0, '1', '2', '3', '4', '5'),
500
+ Choice.new(4, '1', '2', '3', '4', '5'),
501
+ Choice.new(2, '1', '2', '3', '4', '5'),
502
+ Choice.new(3, '1', '2', '3', '4', '5'),
503
+ Choice.new(1, '1', '2', '3', '4', '5')
504
+ ),
505
+ HorizontalChoice.new('1', '2', '3', '4', '5')
506
+ ))
507
+
508
+ add('complicated-horizontalchoice-2',
509
+ Diagram.new(
510
+ HorizontalChoice.new(
511
+ Choice.new(0, '1', '2', '3', '4'),
512
+ '4',
513
+ Choice.new(3, '1', '2', '3', '4')
514
+ )
515
+ ))
516
+
517
+ add('complicated-horizontalchoice-3',
518
+ Diagram.new(
519
+ HorizontalChoice.new(
520
+ Choice.new(0, '1', '2', '3', '4'),
521
+ Stack.new('1', '2', '3'),
522
+ Choice.new(3, '1', '2', '3', '4')
523
+ )
524
+ ))
525
+
526
+ add('complicated-horizontalchoice-4',
527
+ Diagram.new(
528
+ HorizontalChoice.new(
529
+ Choice.new(0, '1', '2', '3', '4'),
530
+ Choice.new(3, '1', '2', '3', '4'),
531
+ Stack.new('1', '2', '3')
532
+ )
533
+ ))
534
+
535
+ add('complicated-horizontalchoice-5',
536
+ Diagram.new(
537
+ HorizontalChoice.new(
538
+ Stack.new('1', '2', '3'),
539
+ Choice.new(0, '1', '2', '3', '4'),
540
+ Choice.new(3, '1', '2', '3', '4')
541
+ )
542
+ ))
543
+
544
+ add('single-stack',
545
+ Diagram.new(
546
+ Stack.new('1')
547
+ ))
548
+
549
+ add('complicated-optionalsequence-1',
550
+ Diagram.new(
551
+ OptionalSequence.new('1', Choice.new(2, '2', '3', '4', '5'), Stack.new('6', '7', '8', '9', '10'), '11')
552
+ ))
553
+
554
+ add('labeled-start',
555
+ Diagram.new(
556
+ Start.new(label: 'Labeled Start'),
557
+ Sequence.new('1', '2', '3')
558
+ ))
559
+
560
+ add('complex',
561
+ Diagram.new(
562
+ Sequence.new('1', '2', '3'),
563
+ type: 'complex'
564
+ ))
565
+
566
+ add('simple',
567
+ Diagram.new(
568
+ Sequence.new('1', '2', '3'),
569
+ type: 'simple'
570
+ ))
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: railroad_diagrams
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yudai Takada
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 2025-01-31 00:00:00.000000000 Z
11
+ dependencies: []
12
+ description: Generate SVG railroad syntax diagrams, like on JSON.org.
13
+ email:
14
+ - t.yudai92@gmail.com
15
+ executables:
16
+ - railroad_diagrams
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - CHANGELOG.md
21
+ - LICENSE.txt
22
+ - MIT
23
+ - README.md
24
+ - Rakefile
25
+ - exe/railroad_diagrams
26
+ - lib/railroad_diagrams.rb
27
+ - lib/railroad_diagrams/alternating_sequence.rb
28
+ - lib/railroad_diagrams/choice.rb
29
+ - lib/railroad_diagrams/command.rb
30
+ - lib/railroad_diagrams/comment.rb
31
+ - lib/railroad_diagrams/diagram.rb
32
+ - lib/railroad_diagrams/diagram_item.rb
33
+ - lib/railroad_diagrams/diagram_multi_container.rb
34
+ - lib/railroad_diagrams/end.rb
35
+ - lib/railroad_diagrams/group.rb
36
+ - lib/railroad_diagrams/horizontal_choice.rb
37
+ - lib/railroad_diagrams/multiple_choice.rb
38
+ - lib/railroad_diagrams/non_terminal.rb
39
+ - lib/railroad_diagrams/one_or_more.rb
40
+ - lib/railroad_diagrams/optional.rb
41
+ - lib/railroad_diagrams/optional_sequence.rb
42
+ - lib/railroad_diagrams/path.rb
43
+ - lib/railroad_diagrams/sequence.rb
44
+ - lib/railroad_diagrams/skip.rb
45
+ - lib/railroad_diagrams/stack.rb
46
+ - lib/railroad_diagrams/start.rb
47
+ - lib/railroad_diagrams/style.rb
48
+ - lib/railroad_diagrams/terminal.rb
49
+ - lib/railroad_diagrams/text_diagram.rb
50
+ - lib/railroad_diagrams/version.rb
51
+ - lib/railroad_diagrams/zero_or_more.rb
52
+ - sample/sample.html
53
+ - test.rb
54
+ homepage: https://github.com/ydah/railroad_diagrams
55
+ licenses:
56
+ - MIT
57
+ metadata:
58
+ homepage_uri: https://github.com/ydah/railroad_diagrams
59
+ source_code_uri: https://github.com/ydah/railroad_diagrams
60
+ changelog_uri: https://github.com/ydah/railroad_diagrams/releases
61
+ bug_tracker_uri: https://github.com/ydah/railroad_diagrams/issues
62
+ rubygems_mfa_required: 'true'
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 3.1.0
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubygems_version: 3.7.0.dev
78
+ specification_version: 4
79
+ summary: "\U0001F6E4️ A tiny Ruby+SVG library for drawing railroad syntax diagrams
80
+ like JSON.org."
81
+ test_files: []