livetext 0.8.78 → 0.8.79

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.
@@ -1,297 +0,0 @@
1
- class FormatLine
2
-
3
- EOL = :eol
4
- Alpha = /[a-z]/
5
- Alpha2 = /[a-z0-9_]/
6
- Other = Object
7
-
8
- SimpleFormats = {}
9
- SimpleFormats[:b] = %w[<b> </b>]
10
- SimpleFormats[:i] = %w[<i> </i>]
11
- SimpleFormats[:t] = ["<font size=+1><tt>", "</tt></font>"]
12
- SimpleFormats[:s] = %w[<strike> </strike>]
13
-
14
- def initialize
15
- @buffer, @vname, @fname, @param, @substr = "", "", "", "", ""
16
- end
17
-
18
- def peek
19
- @enum.peek
20
- rescue StopIteration
21
- EOL
22
- end
23
-
24
- def grab
25
- @enum.next
26
- rescue StopIteration
27
- EOL
28
- end
29
-
30
- def skip
31
- @enum.next
32
- @enum.peek
33
- rescue StopIteration
34
- EOL
35
- end
36
-
37
- def keep(initial = "")
38
- @buffer << initial
39
- @buffer << @enum.next
40
- rescue StopIteration
41
- EOL
42
- end
43
-
44
- def emit(str = "")
45
- @buffer << str
46
- end
47
-
48
- def funcall(name, param)
49
- if self.respond_to?("func_" + name.to_s)
50
- self.send("func_" + name.to_s, param)
51
- else
52
- fobj = ::Livetext::Functions.new
53
- ::Livetext::Functions.param = param # is this
54
- ::Livetext::Functions.context = @context # screwed up???
55
- fobj.send(name)
56
- end
57
- end
58
-
59
- def vsub
60
- @buffer << Livetext::Vars[@vname]
61
- @vname = ""
62
- end
63
-
64
- def fcall
65
- @buffer << funcall(@fname, @param)
66
- @fname, @param = "", ""
67
- end
68
-
69
- # FIXME Much of this should be done via CSS
70
- # FIXME In particular, strike is deprecated.
71
-
72
- def bold
73
- d0, d1 = SimpleFormats[:b]
74
- @buffer << "#{d0}#@substr#{d1}"
75
- @substr = ""
76
- end
77
-
78
- def ttype
79
- d0, d1 = SimpleFormats[:t]
80
- @buffer << "#{d0}#@substr#{d1}"
81
- @substr = ""
82
- end
83
-
84
- def italics
85
- d0, d1 = SimpleFormats[:i]
86
- @buffer << "#{d0}#@substr#{d1}"
87
- @substr = ""
88
- end
89
-
90
- def strike
91
- d0, d1 = SimpleFormats[:s]
92
- @buffer << "#{d0}#@substr#{d1}"
93
- @substr = ""
94
- end
95
-
96
- def parse(line, context = nil)
97
- context ||= binding
98
- @context = context
99
- @enum = line.chomp.each_char
100
- @buffer = ""
101
- @substr = ""
102
- @fname = ""
103
- @vname = ""
104
- @param = ""
105
-
106
- # FIXME - refactor, generalize, clarify
107
-
108
- loop do # starting state
109
- char = peek
110
- case char
111
- when "\\"
112
- char = skip
113
- case char
114
- when "$", "*", "_", "`", "~"
115
- emit(char)
116
- skip
117
- when " "
118
- emit("\\ ")
119
- skip
120
- when EOL
121
- emit("\\")
122
- break
123
- when Other
124
- emit("\\") # logic??
125
- end
126
- when EOL
127
- break
128
- when "$" # var or func or $
129
- case skip
130
- when EOL
131
- emit("$")
132
- break
133
- when Alpha
134
- loop { ch = peek; break if ch == EOL; @vname << grab; break unless Alpha2 === peek }
135
- vsub
136
- when "$"
137
- case skip
138
- when EOL
139
- emit("$$")
140
- break
141
- when Alpha
142
- loop { ch = peek; break if ch == EOL; @fname << grab; break unless Alpha2 === peek }
143
- case peek
144
- when " " # no param - just call
145
- @param = nil
146
- fcall # no param? Hmm
147
- when "[" # long param
148
- skip
149
- loop do
150
- if peek == "\\"
151
- skip
152
- @param << grab
153
- end
154
- break if ["]", EOL].include?(peek)
155
- @param << grab
156
- end
157
- skip
158
- fcall
159
- when ":" # param (single token or to-eol)
160
- case skip
161
- when ":" # param to eol
162
- skip
163
- loop { break if peek == EOL; @param << grab }
164
- when Other # grab until space or eol
165
- loop { @param << grab; break if [" ", EOL].include?(peek) }
166
- fcall
167
- end
168
- when Other # no param - just call
169
- fcall
170
- end
171
- when Other
172
- emit "$$"
173
- end
174
- when Other
175
- emit "$"
176
- end
177
- when "*"
178
- case skip
179
- when EOL
180
- emit "*"
181
- when " "
182
- emit "*"
183
- when "["
184
- skip
185
- loop do
186
- if peek == "\\"
187
- skip
188
- @substr << grab
189
- next
190
- end
191
- break if ["]", EOL].include?(peek)
192
- @substr << grab
193
- end
194
- skip
195
- bold
196
- when Other
197
- loop { @substr << grab; break if [" ", EOL].include?(peek) }
198
- bold
199
- end
200
- when "_"
201
- case skip
202
- when EOL
203
- emit "_"
204
- when " "
205
- emit "_"
206
- when "["
207
- skip
208
- loop do
209
- if peek == "\\"
210
- skip
211
- @substr << grab
212
- next
213
- end
214
- break if ["]", EOL].include?(peek)
215
- @substr << grab
216
- end
217
- skip
218
- italics
219
- when "_" # doubled...
220
- skip
221
- loop do
222
- if peek == "\\"
223
- skip
224
- @substr << grab
225
- next
226
- end
227
- break if [".", ",", ")", EOL].include?(peek)
228
- @substr << grab
229
- end
230
- italics
231
- when Other
232
- loop { @substr << grab; break if [" ", EOL].include?(peek) }
233
- italics
234
- end
235
- when "`"
236
- case skip
237
- when EOL
238
- emit "`"
239
- when " "
240
- emit "`"
241
- when "["
242
- skip
243
- loop do
244
- if peek == "\\"
245
- skip
246
- @substr << grab
247
- next
248
- end
249
- break if ["]", EOL].include?(peek)
250
- @substr << grab
251
- end
252
- skip
253
- ttype
254
- when "`" # doubled...
255
- skip
256
- loop { break if [".", ",", ")", EOL].include?(peek); @substr << grab } # ";" ?? FIXME
257
- ttype
258
- when Other
259
- loop { @substr << grab; break if [" ", EOL].include?(peek) }
260
- ttype
261
- end
262
- when "~"
263
- case skip
264
- when EOL
265
- emit "~"
266
- when " "
267
- emit "~"
268
- when "["
269
- skip
270
- loop do
271
- if peek == "\\"
272
- skip
273
- @substr << grab
274
- next
275
- end
276
- break if ["]", EOL].include?(peek)
277
- @substr << grab
278
- end
279
- skip
280
- strike
281
- when "~" # doubled...
282
- skip
283
- loop { break if [".", ",", ")", EOL].include?(peek); @substr << grab } # ";" ?? FIXME
284
- strike
285
- when Other
286
- loop { @substr << grab; break if [" ", EOL].include?(peek) }
287
- strike
288
- end
289
- when Other
290
- keep
291
- end
292
- end
293
-
294
- @buffer
295
- end
296
- end
297
-
@@ -1,707 +0,0 @@
1
- class FormatLine
2
-
3
- SimpleFormats = {}
4
- SimpleFormats[:b] = %w[<b> </b>]
5
- SimpleFormats[:i] = %w[<i> </i>]
6
- SimpleFormats[:t] = ["<font size=+1><tt>", "</tt></font>"]
7
- SimpleFormats[:s] = %w[<strike> </strike>]
8
-
9
- Null = ""
10
- Space = " "
11
- Alpha = /[A-Za-z]/
12
- AlNum = /[A-Za-z0-9_]/
13
- LF = "\n"
14
- LBrack = "["
15
-
16
- Blank = [" ", nil, "\n"]
17
- Punc = [")", ",", ".", " ", "\n"]
18
- NoAlpha = /[^A-Za-z0-9_]/
19
- Param = ["]", "\n", nil]
20
- Escape = "\\" # not an ESC char
21
-
22
- def terminate?(terminators, ch)
23
- if terminators.is_a? Regexp
24
- terminators === ch
25
- else
26
- terminators.include?(ch)
27
- end
28
- end
29
-
30
- attr_reader :out
31
-
32
- def initialize(line, context)
33
- context ||= binding
34
- @context = context
35
- @line = line
36
- @i = -1
37
- @token = Null.dup
38
- @tokenlist = []
39
- end
40
-
41
- def old_initialize(line, context)
42
- context ||= binding
43
- @context = context
44
- @line = line
45
- chars = [nil] + line.scan(/./) + [nil] + [nil]
46
- @gen = chars.each_cons(3)
47
- @cc = 0 # char count
48
- go # @prev, @ch, @next = *@gen.next
49
- @out = ""
50
- loop do
51
- case @ch
52
- when "\\"
53
- go
54
- emit @ch
55
- next
56
- when "$"; dollar
57
- when "*"; asterisk
58
- when "_"; underscore
59
- when "`"; backtick
60
- when "~"; tilde; # showme("after tilde")
61
- when nil; break
62
- else
63
- emit @ch; # STDERR.puts "--- else - emitted #{@ch.inspect}"
64
- end
65
- go
66
- end
67
- end
68
-
69
- def self.parse(line, context = nil)
70
- x = self.new(line, context)
71
- x.out
72
- end
73
-
74
- def self.parse!(line, context = nil)
75
- x = self.new(line.chomp, context)
76
- x.tokenize(line)
77
- # x.evaluate # (context)
78
- # x.out
79
- x.evaluate
80
- end
81
-
82
- ############ new methods
83
-
84
- def tokenize(line)
85
- grab
86
- loop do
87
- # puts "*** char #{curr}"
88
- case curr
89
- when Escape; go; add curr; grab
90
- when "$"
91
- _dollar
92
- when "*", "_", "`", "~"
93
- marker curr
94
- add curr
95
- when LF, nil
96
- break
97
- else
98
- add curr
99
- end
100
- grab
101
- # add_token(:str)
102
- end
103
- add_token(:str)
104
- # p @tokenlist
105
- @tokenlist
106
- end
107
-
108
- def embed(sym, str)
109
- pre, post = SimpleFormats[sym]
110
- pre + str + post
111
- end
112
-
113
- def evaluate(tokens = @tokenlist)
114
- @out = ""
115
- return "" if tokens.empty?
116
- gen = tokens.each
117
- token = gen.next
118
- loop do
119
- break if token.nil?
120
- sym, val = *token
121
- case sym
122
- when :str
123
- @out << val unless val == "\n" # BUG
124
- when :var
125
- @out << varsub(val)
126
- when :func
127
- param = nil
128
- arg = gen.peek
129
- if [:colon, :brackets].include? arg[0]
130
- arg = gen.next # for real
131
- param = arg[1]
132
- end
133
- @out << funcall(val, param)
134
- when :b, :i, :t, :s
135
- @out << embed(sym, val)
136
- else
137
- add_token :str
138
- end
139
- token = gen.next
140
- end
141
- # p @out
142
- @out
143
- end
144
-
145
- def curr
146
- @line[@i]
147
- end
148
-
149
- def prev
150
- @line[@i-1]
151
- end
152
-
153
- def next!
154
- @line[@i+1]
155
- end
156
-
157
- def grab
158
- @line[@i+=1]
159
- end
160
-
161
- def grab_colon_param
162
- grab # grab :
163
- param = ""
164
- loop do
165
- case next!
166
- when Escape
167
- grab
168
- param << next!
169
- grab
170
- when Space, LF, nil; break
171
- else
172
- param << next!
173
- grab
174
- end
175
- end
176
-
177
- param = nil if param.empty?
178
- param
179
- end
180
-
181
- def grab_func_param
182
- grab # [
183
- param = ""
184
- loop do
185
- case next!
186
- when Escape
187
- grab
188
- param << next!
189
- grab
190
- when "]", LF, nil; break
191
- else
192
- param << next!
193
- grab
194
- end
195
- end
196
-
197
- add curr
198
- grab
199
- param = nil if param.empty?
200
- param
201
- end
202
-
203
- def add(str)
204
- @token << str unless str.nil?
205
- end
206
-
207
- Syms = { "*" => :b, "_" => :i, "`" => :t, "~" => :s }
208
-
209
- def self.format(line, context = nil)
210
- x = self.new(line, context)
211
- x.format
212
- end
213
-
214
- def format
215
- grab
216
- loop do
217
- case curr
218
- when Escape; go; add curr; grab
219
- when "$"
220
- _dollar
221
- when "*", "_", "`", "~"
222
- marker curr
223
- when LF, nil
224
- break
225
- else
226
- add curr
227
- end
228
- grab
229
- end
230
- add_token(:str)
231
- @tokenlist
232
- end
233
-
234
- def add_token(kind, token = @token)
235
- @tokenlist << [kind, token] unless token.empty?
236
- @token = Null.dup
237
- end
238
-
239
- def grab_alpha
240
- str = Null.dup
241
- grab
242
- loop do
243
- break if curr.nil?
244
- str << curr
245
- break if terminate?(NoAlpha, next!)
246
- grab
247
- end
248
- str
249
- end
250
-
251
- def _dollar
252
- grab
253
- case curr
254
- when LF; add "$"; add_token :str
255
- when " "; add "$ "; add_token :str
256
- when nil; add "$"; add_token :str
257
- when "$"; _double_dollar
258
- when "."; _dollar_dot
259
- when /[A-Za-z]/
260
- add_token :str
261
- var = curr + grab_alpha
262
- add_token(:var, var)
263
- else
264
- add "$" + curr
265
- add_token(:string)
266
- end
267
- end
268
-
269
- def handle_function_call
270
- end
271
-
272
- def _double_dollar
273
- case next!
274
- when Space; add_token :string, "$$ "; grab; return
275
- when LF, nil; add "$$"; add_token :str
276
- when Alpha
277
- add_token(:str, @token)
278
- func = grab_alpha
279
- add_token(:func, func)
280
- case next!
281
- when ":"; param = grab_colon_param; add_token(:colon, param)
282
- when "["; param = grab_func_param; add_token(:brackets, param)
283
- else # do nothing
284
- end
285
- else
286
- grab; add_token :str, "$$" + curr; return
287
- end
288
- end
289
-
290
- def dollar_dot
291
- add_token :ddot, @line[@i..-1]
292
- end
293
-
294
- def marker(char)
295
- add_token :str
296
- sym = Syms[char]
297
- if embedded?
298
- add char # ??? add_token "*", :string
299
- return
300
- end
301
- grab
302
- case curr
303
- when Space
304
- add char + " "
305
- add_token :str
306
- grab
307
- when LF, nil
308
- add char
309
- add_token :str
310
- when char; double_marker(char)
311
- when LBrack; long_marker(char)
312
- else
313
- add curr
314
- str = collect!(sym, Blank)
315
- add_token sym, str
316
- add curr # next char onto next token...
317
- end
318
- end
319
-
320
- def double_marker(char)
321
- sym = Syms[char]
322
- grab
323
- kind = sym # "string_#{char}".to_sym
324
- case next! # first char after **
325
- when Space, LF, nil
326
- pre, post = SimpleFormats[sym]
327
- add_token kind
328
- else
329
- str = collect!(sym, Punc)
330
- grab unless next!.nil?
331
- add_token kind, str
332
- end
333
- end
334
-
335
- def long_marker(char)
336
- sym = Syms[char]
337
- # grab # skip left bracket
338
- kind = sym # "param_#{sym}".to_sym
339
- arg = collect!(sym, Param, true)
340
- add_token kind, arg
341
- # add curr
342
- end
343
-
344
- def collect!(sym, terminators, param=false)
345
- str = Null.dup # next is not " ","*","["
346
- grab
347
- loop do
348
- if curr == Escape
349
- str << grab # ch = escaped char
350
- grab
351
- next
352
- end
353
- break if terminate?(terminators, curr)
354
- str << curr # not a terminator
355
- grab
356
- end
357
- grab if param && curr == "]" # skip right bracket
358
- # str << curr # if @ch
359
- # add curr # next char onto next token...
360
- add str
361
- end
362
-
363
- ############
364
-
365
- ### From FormatLine:
366
-
367
- def funcall(name, param)
368
- result =
369
- if self.respond_to?("func_" + name.to_s)
370
- self.send("func_" + name.to_s, param)
371
- else
372
- fobj = ::Livetext::Functions.new
373
- ::Livetext::Functions.param = param # is this
374
- ::Livetext::Functions.context = @context # screwed up???
375
- fobj.send(name)
376
- end
377
- result
378
- end
379
-
380
- def varsub(name)
381
- result = Livetext::Vars[name]
382
- result
383
- end
384
-
385
- #####
386
-
387
- def showme(tag)
388
- char = @line[@cc]
389
- puts "--- #{tag}: ch=#{@ch.inspect} next=#{@next.inspect} (cc=#@cc:#{char.inspect}) out=#{@out.inspect}"
390
- end
391
-
392
- def accumulate!(sym, terminators, param=false)
393
- # already ate *[ - ch=[
394
- str = "" # next is not " ","*","["
395
- go
396
- loop do
397
- if @ch == "\\"
398
- go # ch = escaped char
399
- str << @ch
400
- go
401
- next
402
- end
403
- break if terminate?(terminators, @ch)
404
- str << @ch # not a terminator
405
- go
406
- end
407
- pre, post = SimpleFormats[sym]
408
- str = (pre + str + post)
409
- go if param && @ch == "]" # skip right bracket
410
- str << @ch if @ch
411
- emit str
412
- end
413
-
414
- def go
415
- @cc += 1 # char count
416
- @prev, @ch, @next = *@gen.next
417
- end
418
-
419
- def blank?(ch)
420
- [" ", nil, "\n"].include? ch
421
- end
422
-
423
- def term_punc?(ch)
424
- [")", ",", ".", " ", "\n"].include? ch
425
- end
426
-
427
- def not_alphanum?(ch)
428
- ch !~ /[A-Za-z0-9_]/
429
- end
430
-
431
- def term_param?(ch)
432
- ["]", "\n", nil].include? ch
433
- end
434
-
435
- def embedded?
436
- ! (['"', "'", " ", nil].include? @prev)
437
- end
438
-
439
- def _embedded?
440
- ! (['"', "'", " ", nil].include? prev)
441
- end
442
-
443
- def emit(str)
444
- return if str.nil? || str.empty?
445
- str ||= ""
446
- @out << str
447
- end
448
-
449
- ### dollar...
450
-
451
- def dollar
452
- go
453
- case @ch
454
- when " "; emit "$ "
455
- when nil; emit "$"
456
- when "$"; double_dollar
457
- when "."; dollar_dot
458
- when /[A-Za-z]/
459
- var = @ch + get_alpha
460
- str = varsub(var)
461
- emit str
462
- else
463
- emit "$" + @ch
464
- end
465
- end
466
-
467
- def get_alpha
468
- str = ""
469
- grab
470
- loop do
471
- str << @ch
472
- break if terminate?(NoAlpha, @next)
473
- grab
474
- end
475
- str
476
- end
477
-
478
- def collect(terminators = NoAlpha)
479
- str = ""
480
- go
481
- loop do
482
- if @ch == "\\"
483
- go # ch = escaped char
484
- str << @ch
485
- go
486
- next
487
- else
488
- str << @ch
489
- end
490
- break if terminate?(terminators, @ch)
491
- go
492
- end
493
- str
494
- end
495
-
496
- def get_colon_param
497
- go # grab :
498
- param = ""
499
- loop do
500
- case @next
501
- when "\\"
502
- go
503
- param << @next
504
- go
505
- when " ", "\n", nil; break
506
- else
507
- param << @next
508
- go
509
- end
510
- end
511
-
512
- param = nil if param.empty?
513
- param
514
- end
515
-
516
- def get_func_param
517
- go # grab [
518
- param = ""
519
- loop do
520
- case @next
521
- when "\\"
522
- go
523
- param << @next
524
- go
525
- when "]", "\n", nil; break
526
- else
527
- param << @next
528
- go
529
- end
530
- end
531
-
532
- go
533
- param = nil if param.empty?
534
- param
535
- end
536
-
537
- def get_func_call
538
- func = get_alpha
539
- param = nil
540
- case @next
541
- when "["
542
- param = get_func_param
543
- when ":"
544
- param = get_colon_param
545
- end
546
- [func, param]
547
- end
548
-
549
- def double_dollar
550
- case @next
551
- when " "
552
- emit "$$ "
553
- go
554
- return
555
- when /[A-Za-z]/
556
- func, param = get_func_call
557
- else
558
- go
559
- emit "$$" + (@ch || "")
560
- return
561
- end
562
-
563
- str = funcall(func, param)
564
- save = @ch.dup # save last char
565
- emit str # if str && ! @ch.nil?
566
- # emit save if @next.nil? ### HERE
567
- end
568
-
569
- def dollar_dot
570
- go
571
- dot = collect { not_alphanum?(@ch) }
572
- emit "DOT(#{dot})" # not implemented yet
573
- end
574
-
575
- ### asterisk...
576
-
577
- def asterisk
578
- return emit("*") if embedded?
579
- case @next
580
- when " ", nil; emit "*"
581
- when "*"; double_asterisk
582
- when "["; long_asterisk
583
- else
584
- accumulate!(:b, Blank)
585
- end
586
- end
587
-
588
- def double_asterisk
589
- go
590
- case @next # first char after **
591
- when " ", nil; emit "<b>*</b>"
592
- else
593
- accumulate!(:b, Punc)
594
- go unless @next.nil?
595
- emit @ch
596
- end
597
- end
598
-
599
- def long_asterisk
600
- go # skip left bracket
601
- accumulate!(:b, Param, true)
602
- end
603
-
604
- ### underscore...
605
-
606
- def underscore
607
- return emit("_") if embedded?
608
- case @next
609
- when " ", nil; emit "_"
610
- when "_"; double_underscore
611
- when "["; long_underscore
612
- else
613
- accumulate!(:i, Blank)
614
- # emit @ch unless @ch.nil?
615
- end
616
- end
617
-
618
- def double_underscore
619
- go
620
- case @next # first char after __
621
- when " ", nil; emit "<i>_</i>"
622
- else
623
- accumulate!(:i, Punc)
624
- go unless @next.nil?
625
- emit @ch
626
- end
627
- end
628
-
629
- def long_underscore
630
- go # skip left bracket
631
- accumulate!(:i, Param, true)
632
- end
633
-
634
- ### backtick...
635
-
636
- def backtick
637
- return emit("`") if embedded?
638
- case @next
639
- when " ", nil; emit "`"
640
- when "`"; double_backtick
641
- when "["; long_backtick
642
- else
643
- accumulate!(:t, Blank)
644
- end
645
- end
646
-
647
- def double_backtick
648
- go
649
- case @next # first char after ``
650
- when " ", nil; emit "<tt>*</tt>"
651
- else
652
- accumulate!(:t, Punc)
653
- go unless @next.nil?
654
- emit @ch
655
- end
656
- end
657
-
658
- def long_backtick
659
- go # skip left bracket
660
- accumulate!(:t, Param, true)
661
- end
662
-
663
- ### tilde...
664
-
665
- def tilde
666
- return emit("~") if embedded?
667
- case @next
668
- when " ", nil; emit "~"
669
- when "~"; double_tilde
670
- when "["; long_tilde
671
- else
672
- accumulate!(:s, Blank)
673
- end
674
- end
675
-
676
- def double_tilde
677
- go
678
- case @next # first char after ~~
679
- when " ", nil; emit "<strike>~</strike>"
680
- else
681
- accumulate!(:s, Punc)
682
- go unless @next.nil?
683
- emit @ch
684
- end
685
- end
686
-
687
- def long_tilde
688
- go # skip left bracket
689
- accumulate!(:s, Param, true)
690
- end
691
-
692
- end
693
-
694
-
695
- # LineParser.new("Here's a $ dollar sign, a $$function, a $variable, and a $.dot_command.")
696
- # LineParser.new("This is *bold and _italics and `code and ~strike")
697
- # LineParser.new("This is **bold, but with two asterisks.")
698
- # LineParser.new("Bold asterisk ** here.")
699
- # LineParser.new("What about an embedded asterisk like X*Y situation?")
700
- # LineParser.new("What about multiple_embedded_underscores and such?")
701
- # LineParser.new("Try a bolded *string_with_underscores")
702
- # LineParser.new("Bolded *[arbitrary parameter with stuff: * _ ` ~ ]...")
703
- # LineParser.new("Bold *[until end of line")
704
- # LineParser.new("This is **bold, __italics, ``code, and ~~strike.")
705
- # LineParser.new("This is *[bold stuff], _[italics stuff], `[code stuff], and ~[strike stuff].")
706
-
707
-