livetext 0.9.26 → 0.9.31

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.lt3 +3 -2
  3. data/imports/bookish.rb +1 -1
  4. data/lib/livetext/expansion.rb +108 -0
  5. data/lib/livetext/formatter.rb +223 -0
  6. data/lib/livetext/functions.rb +9 -0
  7. data/lib/livetext/helpers.rb +44 -28
  8. data/lib/livetext/html.rb +73 -0
  9. data/lib/livetext/more.rb +24 -4
  10. data/lib/livetext/parser/general.rb +1 -1
  11. data/lib/livetext/parser/set.rb +10 -3
  12. data/lib/livetext/parser/string.rb +14 -5
  13. data/lib/livetext/processor.rb +5 -0
  14. data/lib/livetext/skeleton.rb +0 -4
  15. data/lib/livetext/standard.rb +78 -63
  16. data/lib/livetext/userapi.rb +52 -19
  17. data/lib/livetext/version.rb +1 -1
  18. data/lib/livetext.rb +1 -2
  19. data/plugin/bookish.rb +1 -1
  20. data/plugin/bootstrap_menu.rb +140 -0
  21. data/plugin/misc/navbar.rb +162 -0
  22. data/test/extra/README.txt +149 -0
  23. data/test/extra/bracketed.rb +121 -0
  24. data/test/extra/bracketed.txt +44 -0
  25. data/test/extra/double.rb +121 -0
  26. data/test/extra/double.txt +44 -0
  27. data/test/extra/functions.rb +148 -0
  28. data/test/extra/functions.txt +58 -0
  29. data/test/extra/single.rb +139 -0
  30. data/test/extra/single.txt +52 -0
  31. data/test/extra/testgen.rb +104 -0
  32. data/test/{snapshots/basic_formatting/actual-error.txt → extra/variables..rb} +0 -0
  33. data/test/extra/variables.rb +94 -0
  34. data/test/extra/variables.txt +35 -0
  35. data/test/snapshots/basic_formatting/expected-output.txt +2 -2
  36. data/test/snapshots/simple_vars/source.lt3 +1 -1
  37. data/test/snapshots/subset.txt +49 -49
  38. data/test/unit/all.rb +1 -3
  39. data/test/unit/parser/general.rb +2 -2
  40. data/test/unit/parser/set.rb +0 -9
  41. metadata +19 -27
  42. data/lib/livetext/formatline.rb +0 -408
  43. data/lib/livetext/funcall.rb +0 -168
  44. data/lib/livetext/lineparser.rb +0 -441
  45. data/test/snapshots/basic_formatting/actual-output.txt +0 -13
  46. data/test/snapshots/basic_formatting/err-sdiff.txt +0 -1
  47. data/test/snapshots/basic_formatting/out-sdiff.txt +0 -14
  48. data/test/snapshots/error_inc_line_num/README.txt +0 -20
  49. data/test/snapshots/error_invalid_name/foo +0 -5
  50. data/test/snapshots/more_functions/actual-error.txt +0 -0
  51. data/test/snapshots/more_functions/actual-output.txt +0 -37
  52. data/test/snapshots/more_functions/err-sdiff.txt +0 -1
  53. data/test/snapshots/more_functions/out-sdiff.txt +0 -38
  54. data/test/snapshots/simple_vars/actual-error.txt +0 -0
  55. data/test/snapshots/simple_vars/actual-output.txt +0 -6
  56. data/test/snapshots/simple_vars/err-sdiff.txt +0 -1
  57. data/test/snapshots/simple_vars/out-sdiff.txt +0 -7
  58. data/test/snapshots/var_into_func/actual-error.txt +0 -0
  59. data/test/snapshots/var_into_func/actual-output.txt +0 -16
  60. data/test/snapshots/var_into_func/err-sdiff.txt +0 -1
  61. data/test/snapshots/var_into_func/out-sdiff.txt +0 -17
  62. data/test/testlines.rb +0 -37
  63. data/test/unit/formatline.rb +0 -638
  64. data/test/unit/lineparser.rb +0 -650
  65. data/test/unit/tokenizer.rb +0 -534
@@ -1,534 +0,0 @@
1
- require 'minitest/autorun'
2
-
3
- require_relative '../../lib/livetext'
4
-
5
- class TestingLivetext < MiniTest::Test
6
-
7
- LineParser = Livetext::LineParser
8
-
9
- def perform_test(recv, sym, msg, src, exp)
10
- actual = recv.send(sym, src)
11
- if exp[0] == "/"
12
- exp = Regexp.compile(exp[1..-2]) # skip slashes
13
- $testme = false
14
- assert_match(exp, actual, msg)
15
- else
16
- $testme = false
17
- assert_equal(exp, actual, msg)
18
- end
19
- end
20
-
21
- def invoke_test(msg, src, exp)
22
- actual = LineParser.parse!(src)
23
- if exp[0] == "/"
24
- exp = Regexp.compile(exp[1..-2]) # skip slashes
25
- $testme = false
26
- assert_match(exp, actual, msg)
27
- else
28
- $testme = false
29
- assert_equal(exp, actual, msg)
30
- end
31
- end
32
-
33
- def test_tokenizer_simple_string
34
- parse = LineParser.new("only testing")
35
- tokens = parse.tokenize
36
- assert_equal tokens, [[:str, "only testing"]], "Tokens were: #{tokens.inspect}"
37
- end
38
-
39
- def test_tokenizer_variable_interpolation
40
- parse = LineParser.new("File is $File and user is $User")
41
- tokens = parse.tokenize
42
- expected_tokens = [[:str, "File is "],
43
- [:var, "File"],
44
- [:str, " and user is "],
45
- [:var, "User"]]
46
- assert_equal expected_tokens, tokens
47
- end
48
-
49
- def test_tokenizer_func_expansion
50
- parse = LineParser.new("myfunc() results in $$myfunc apparently.")
51
- tokens = parse.tokenize
52
- expected_tokens = [[:str, "myfunc() results in "],
53
- [:func, "myfunc"],
54
- [:str, " apparently."]]
55
- assert_equal expected_tokens, tokens
56
- end
57
-
58
- def test_tokenizer_func_2
59
- str = "Today is $$date"
60
- parse = LineParser.new(str)
61
- tokens_expected = [[:str, "Today is "], [:func, "date"]]
62
- tokens = parse.tokenize
63
- assert_equal tokens_expected, tokens, "Tokens were: #{tokens.inspect}"
64
- end
65
-
66
- def test_tokenizer_var_before_comma
67
- str = "User name is $User, and all is well"
68
- parse = LineParser.new(str)
69
- tokens_expected = [[:str, "User name is "], [:var, "User"], [:str, ", and all is well"]]
70
- tokens = parse.tokenize
71
- assert_equal tokens_expected, tokens, "Tokens were: #{tokens.inspect}"
72
- end
73
-
74
- def test_tokenizer_var_at_EOS
75
- str = "File name is $File"
76
- parse = LineParser.new(str)
77
- tokens_expected = [[:str, "File name is "], [:var, "File"]]
78
- tokens = parse.tokenize
79
- assert_equal tokens_expected, tokens
80
- end
81
-
82
- def test_tokenizer_var_starts_string
83
- str = "$File is my file name"
84
- parse = LineParser.new(str)
85
- tokens_expected = [[:var, "File"], [:str, " is my file name"]]
86
- tokens = parse.tokenize
87
- assert_equal tokens_expected, tokens
88
- end
89
-
90
- # Next one is/will be a problem...
91
- # I permit periods *inside* variable names
92
-
93
- def test_tokenizer_var_before_period
94
- str = "This is $File\\." # FIXME escaped for now...
95
- parse = LineParser.new(str)
96
- tokens_expected = [[:str, "This is "], [:var, "File"], [:str, "."]]
97
- tokens = parse.tokenize
98
- assert_equal tokens_expected, tokens
99
- end
100
-
101
- def test_tokenizer_func_needing_parameter_colon_eos # colon, param, EOS
102
- str = "Square root of 225 is $$isqrt:225"
103
- parse = LineParser.new(str)
104
- tokens_expected = [[:str, "Square root of 225 is "], [:func, "isqrt"], [:colon, "225"]]
105
- tokens = parse.tokenize
106
- assert_equal tokens_expected, tokens
107
- end
108
-
109
- def test_tokenizer_func_needing_parameter_colon # colon, param, more chars
110
- str = "Answer is $$isqrt:225 today"
111
- parse = LineParser.new(str)
112
- tokens_expected = [[:str, "Answer is "],
113
- [:func, "isqrt"],
114
- [:colon, "225"],
115
- [:str, " today"]]
116
- tokens = parse.tokenize
117
- assert_equal tokens_expected, tokens
118
- end
119
-
120
- # isqrt: Not real tests??
121
-
122
- def test_tokenizer_isqrt_empty_colon_param
123
- str = "Calculate $$isqrt:"
124
- parse = LineParser.new(str)
125
- tokens_expected = [[:str, "Calculate "],
126
- [:func, "isqrt"] # , [:colon, ""]
127
- ]
128
- # If param is null, we don't get [:colon, value]!
129
- # ^ FIXME function should be more like: [:func, name, param]
130
- tokens = parse.tokenize
131
- assert_equal tokens_expected, tokens
132
- end
133
-
134
- def test_tokenizer_isqrt_empty_bracket_param
135
- str = "Calculate $$isqrt[]"
136
- parse = LineParser.new(str)
137
- tokens_expected = [[:str, "Calculate "],
138
- [:func, "isqrt"] # , [:colon, ""]
139
- ]
140
- # If param is null, we don't get [:colon, value]!
141
- # ^ FIXME function should be more like: [:func, name, param]
142
- tokens = parse.tokenize
143
- assert_equal tokens_expected, tokens
144
- end
145
-
146
- def test_tokenizer_isqrt_malformed_number
147
- str = "Calculate $$isqrt[3a5]"
148
- parse = LineParser.new(str)
149
- tokens_expected = [[:str, "Calculate "],
150
- [:func, "isqrt"],
151
- [:brackets, "3a5"]
152
- ]
153
- # ^ FIXME function should be more like: [:func, name, param]
154
- tokens = parse.tokenize
155
- assert_equal tokens_expected, tokens
156
- end
157
-
158
- # ...end of this group
159
-
160
- def test_tokenizer_func_with_colon
161
- parse = LineParser.new("Calling $$myfunc:foo here.")
162
- tokens = parse.tokenize
163
- assert_equal tokens, [[:str, "Calling "],
164
- [:func, "myfunc"],
165
- [:colon, "foo"],
166
- [:str, " here."]
167
- ]
168
- end
169
-
170
- def test_tokenizer_func_with_brackets
171
- parse = LineParser.new("Calling $$myfunc2[foo bar] here.")
172
- tokens = parse.tokenize
173
- assert_kind_of Array, tokens
174
- assert_equal 4, tokens.size
175
- expected_tokens = [[:str, "Calling "],
176
- [:func, "myfunc2"],
177
- [:brackets, "foo bar"],
178
- [:str, " here."]]
179
- assert_equal expected_tokens, tokens
180
- end
181
-
182
- def test_tokenizer_parse_formatting
183
- msg, src, exp = <<~STUFF.split("\n")
184
- Check simple formatting
185
- This is *bold and _italics ...
186
- This is <b>bold</b> and <i>italics</i> ...
187
- STUFF
188
- invoke_test(msg, src, exp)
189
- end
190
-
191
- def test_tokenizer_formatting_01 # Check output of $$date
192
- msg, src, exp = <<~STUFF.split("\n")
193
- Check output of $$date
194
- Today is $$date, I guess
195
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
196
- STUFF
197
- invoke_test(msg, src, exp)
198
- end
199
-
200
- def test_tokenizer_formatting_02 # Check output of $$date
201
- msg, src, exp = <<~STUFF.split("\n")
202
- Check output of $$date
203
- Today is $$date, I guess
204
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
205
- STUFF
206
- invoke_test(msg, src, exp)
207
- end
208
-
209
- def test_tokenizer_formatting_03 # Check output of $$date
210
- msg, src, exp = <<~STUFF.split("\n")
211
- Check output of $$date
212
- Today is $$date, I guess
213
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
214
- STUFF
215
- invoke_test(msg, src, exp)
216
- end
217
-
218
- def test_tokenizer_formatting_04 # Check output of $$date
219
- msg, src, exp = <<~STUFF.split("\n")
220
- Check output of $$date
221
- Today is $$date, I guess
222
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
223
- STUFF
224
- invoke_test(msg, src, exp)
225
- end
226
-
227
- def test_tokenizer_formatting_05 # Check output of $$date
228
- msg, src, exp = <<~STUFF.split("\n")
229
- Check output of $$date
230
- Today is $$date, I guess
231
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
232
- STUFF
233
- invoke_test(msg, src, exp)
234
- end
235
-
236
- def test_tokenizer_formatting_06 # Check output of $$date
237
- msg, src, exp = <<~STUFF.split("\n")
238
- Check output of $$date
239
- Today is $$date, I guess
240
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
241
- STUFF
242
- invoke_test(msg, src, exp)
243
-
244
- actual = LineParser.parse!(src)
245
- if exp[0] == "/"
246
- exp = Regexp.compile(exp[1..-2]) # skip slashes
247
- assert_match(exp, actual, msg)
248
- else
249
- assert_equal(exp, actual, msg)
250
- end
251
- end
252
-
253
- def test_tokenizer_formatting_07 # Check output of $$date
254
- msg, src, exp = <<~STUFF.split("\n")
255
- Check output of $$date
256
- Today is $$date, I guess
257
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
258
- STUFF
259
- invoke_test(msg, src, exp)
260
-
261
- actual = LineParser.parse!(src)
262
- if exp[0] == "/"
263
- exp = Regexp.compile(exp[1..-2]) # skip slashes
264
- assert_match(exp, actual, msg)
265
- else
266
- assert_equal(exp, actual, msg)
267
- end
268
- end
269
-
270
- def test_tokenizer_formatting_08 # Check output of $$date
271
- msg, src, exp = <<~STUFF.split("\n")
272
- Check output of $$date
273
- Today is $$date, I guess
274
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
275
- STUFF
276
- invoke_test(msg, src, exp)
277
- end
278
-
279
- def test_tokenizer_formatting_09 # Check output of $$date
280
- msg, src, exp = <<~STUFF.split("\n")
281
- Check output of $$date
282
- Today is $$date, I guess
283
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
284
- STUFF
285
- invoke_test(msg, src, exp)
286
- end
287
-
288
- def test_tokenizer_formatting_10 # Check output of $$date
289
- msg, src, exp = <<~STUFF.split("\n")
290
- Check output of $$date
291
- Today is $$date, I guess
292
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
293
- STUFF
294
- invoke_test(msg, src, exp)
295
- end
296
-
297
- def test_tokenizer_formatting_11 # Check output of $$date
298
- msg, src, exp = <<~STUFF.split("\n")
299
- Check output of $$date
300
- Today is $$date, I guess
301
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
302
- STUFF
303
- invoke_test(msg, src, exp)
304
- end
305
-
306
- def test_tokenizer_formatting_12 # Check output of $$date
307
- msg, src, exp = <<~STUFF.split("\n")
308
- Check output of $$date
309
- Today is $$date, I guess
310
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
311
- STUFF
312
- invoke_test(msg, src, exp)
313
- end
314
-
315
- def test_tokenizer_formatting_13 # Check output of $$date
316
- msg, src, exp = <<~STUFF.split("\n")
317
- Check output of $$date
318
- Today is $$date, I guess
319
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
320
- STUFF
321
- invoke_test(msg, src, exp)
322
- end
323
-
324
- def test_tokenizer_formatting_14 # Check output of $$date
325
- msg, src, exp = <<~STUFF.split("\n")
326
- Check output of $$date
327
- Today is $$date, I guess
328
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
329
- STUFF
330
- invoke_test(msg, src, exp)
331
- end
332
-
333
- def test_tokenizer_formatting_15 # Check output of $$date
334
- msg, src, exp = <<~STUFF.split("\n")
335
- Check output of $$date
336
- Today is $$date, I guess
337
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
338
- STUFF
339
- invoke_test(msg, src, exp)
340
- end
341
-
342
- def test_tokenizer_formatting_16 # Check output of $$date
343
- msg, src, exp = <<~STUFF.split("\n")
344
- Check output of $$date
345
- Today is $$date, I guess
346
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
347
- STUFF
348
- invoke_test(msg, src, exp)
349
- end
350
-
351
- def test_tokenizer_formatting_17 # Check output of $$date
352
- msg, src, exp = <<~STUFF.split("\n")
353
- Check output of $$date
354
- Today is $$date, I guess
355
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
356
- STUFF
357
- invoke_test(msg, src, exp)
358
- end
359
-
360
- def test_tokenizer_formatting_18 # Check output of $$date
361
- msg, src, exp = <<~STUFF.split("\n")
362
- Check output of $$date
363
- Today is $$date, I guess
364
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
365
- STUFF
366
- invoke_test(msg, src, exp)
367
- end
368
-
369
- def test_tokenizer_formatting_19 # Check output of $$date
370
- msg, src, exp = <<~STUFF.split("\n")
371
- Check output of $$date
372
- Today is $$date, I guess
373
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
374
- STUFF
375
- invoke_test(msg, src, exp)
376
- end
377
-
378
- def test_tokenizer_formatting_20 # Check output of $$date
379
- $testme = true
380
- msg, src, exp = <<~STUFF.split("\n")
381
- Check output of $$date
382
- Today is $$date, I guess
383
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
384
- STUFF
385
- invoke_test(msg, src, exp)
386
- $testme = false
387
- end
388
-
389
- def test_tokenizer_formatting_21 # Check output of $$date
390
- msg, src, exp = <<~STUFF.split("\n")
391
- Check output of $$date
392
- Today is $$date, I guess
393
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
394
- STUFF
395
- invoke_test(msg, src, exp)
396
- end
397
-
398
- def test_tokenizer_formatting_22 # Check output of $$date
399
- msg, src, exp = <<~STUFF.split("\n")
400
- Check output of $$date
401
- Today is $$date, I guess
402
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
403
- STUFF
404
- invoke_test(msg, src, exp)
405
- end
406
-
407
- def test_tokenizer_formatting_23 # Check output of $$date
408
- msg, src, exp = <<~STUFF.split("\n")
409
- Check output of $$date
410
- Today is $$date, I guess
411
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
412
- STUFF
413
- invoke_test(msg, src, exp)
414
- end
415
-
416
- def test_tokenizer_formatting_24 # Check output of $$date
417
- msg, src, exp = <<~STUFF.split("\n")
418
- Check output of $$date
419
- Today is $$date, I guess
420
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
421
- STUFF
422
- invoke_test(msg, src, exp)
423
- end
424
-
425
- def test_tokenizer_formatting_25 # Check output of $$date
426
- msg, src, exp = <<~STUFF.split("\n")
427
- Check output of $$date
428
- Today is $$date, I guess
429
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
430
- STUFF
431
- invoke_test(msg, src, exp)
432
- end
433
-
434
- def test_tokenizer_formatting_26 # Check output of $$date
435
- msg, src, exp = <<~STUFF.split("\n")
436
- Check output of $$date
437
- Today is $$date, I guess
438
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
439
- STUFF
440
- invoke_test(msg, src, exp)
441
- end
442
-
443
- def test_tokenizer_formatting_27 # Check output of $$date
444
- msg, src, exp = <<~STUFF.split("\n")
445
- Check output of $$date
446
- Today is $$date, I guess
447
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
448
- STUFF
449
- invoke_test(msg, src, exp)
450
- end
451
-
452
- def test_tokenizer_formatting_28 # Check output of $$date
453
- msg, src, exp = <<~STUFF.split("\n")
454
- Check output of $$date
455
- Today is $$date, I guess
456
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
457
- STUFF
458
- invoke_test(msg, src, exp)
459
- end
460
-
461
- def test_tokenizer_formatting_29 # Check output of $$date
462
- msg, src, exp = <<~STUFF.split("\n")
463
- Check output of $$date
464
- Today is $$date, I guess
465
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
466
- STUFF
467
- invoke_test(msg, src, exp)
468
- end
469
-
470
- def test_tokenizer_formatting_30 # Check output of $$date
471
- msg, src, exp = <<~STUFF.split("\n")
472
- Check output of $$date
473
- Today is $$date, I guess
474
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
475
- STUFF
476
- invoke_test(msg, src, exp)
477
- end
478
-
479
- def test_tokenizer_formatting_31 # Check output of $$date
480
- msg, src, exp = <<~STUFF.split("\n")
481
- Check output of $$date
482
- Today is $$date, I guess
483
- /Today is \\d\\d\\d\\d-\\d\\d-\\d\\d, I guess/
484
- STUFF
485
- invoke_test(msg, src, exp)
486
- end
487
-
488
- def test_tokenizer_formatting_32 # Check "real" dollar signs
489
- msg, src, exp = <<~STUFF.split("\n")
490
- Check "real" dollar signs
491
- You paid $75 for that item.
492
- You paid $75 for that item.
493
- STUFF
494
- invoke_test(msg, src, exp)
495
- end
496
-
497
- def test_tokenizer_formatting_33 # Check dollar-space
498
- msg, src, exp = <<~STUFF.split("\n")
499
- Check dollar-space
500
- He paid $ 76 for it...
501
- He paid $ 76 for it...
502
- STUFF
503
- invoke_test(msg, src, exp)
504
- end
505
-
506
- def test_tokenizer_formatting_34 # Check escaped dollar signs
507
- msg, src, exp = <<~STUFF.split("\n")
508
- Check escaped dollar signs
509
- Paid \\$78 yo
510
- Paid $78 yo
511
- STUFF
512
- invoke_test(msg, src, exp)
513
- end
514
-
515
- def test_tokenizer_formatting_35 # Check ignored function param (bug or feature?)
516
- msg, src, exp = <<~STUFF.split("\n")
517
- Check ignored function param (bug or feature?)
518
- Today is $$date:foobar, apparently.
519
- /Today is \\d\\d\\d\\d.\\d\\d.\\d\\d apparently./
520
- STUFF
521
- invoke_test(msg, src, exp)
522
- end
523
-
524
- def test_tokenizer_formatting_36 # Check ignored function bracket param (bug or feature?)
525
- msg, src, exp = <<~STUFF.split("\n")
526
- Check ignored function bracket param (bug or feature?)
527
- Today is $$date[a useless parameter], apparently.
528
- /Today is \\d\\\d\\d\\d.\\d\\d.\\d\\d, apparently./
529
- STUFF
530
- invoke_test(msg, src, exp)
531
- end
532
-
533
- end
534
-