livetext 0.9.27 → 0.9.30

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