livetext 0.9.30 → 0.9.31

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.
@@ -17,6 +17,8 @@ module Livetext::Standard
17
17
  include HTMLHelper
18
18
  include Livetext::Helpers
19
19
 
20
+ TTY = ::File.open("/dev/tty", "w")
21
+
20
22
  SimpleFormats = # Move this?
21
23
  { b: %w[<b> </b>],
22
24
  i: %w[<i> </i>],
@@ -25,18 +27,19 @@ module Livetext::Standard
25
27
 
26
28
  attr_reader :data
27
29
 
28
- def data=(val) # FIXME this is weird, let's remove it soonish and why are there two???
29
- # api.tty ">>>> in #{__FILE__}: api id = #{api.object_id}"
30
- val = val.chomp
31
- api.data = val
32
- api.args = format(val).split rescue []
33
- @mixins = []
34
- @imports = []
35
- end
30
+ # def data=(val) # FIXME this is weird, let's remove it soonish and why are there two???
31
+ # # api.tty ">>>> in #{__FILE__}: api id = #{api.object_id}"
32
+ # val ||= ""
33
+ # val = val.chomp
34
+ # api.data = val
35
+ # api.args = format(val).split rescue []
36
+ # @mixins = []
37
+ # @imports = []
38
+ # end
36
39
 
37
40
  # dumb name - bold, italic, teletype, striketrough
38
41
 
39
- def bits(args = nil, body = nil) # FIXME umm what is this?
42
+ def bits # FIXME umm what is this?
40
43
  b0, b1, i0, i1, t0, t1, s0, s1 = *api.args
41
44
  SimpleFormats[:b] = [b0, b1]
42
45
  SimpleFormats[:i] = [i0, i1]
@@ -51,29 +54,29 @@ module Livetext::Standard
51
54
  # end
52
55
  # end
53
56
 
54
- def backtrace(args = nil, body = nil)
57
+ def backtrace
55
58
  @backtrace = onoff(api.args.first)
56
59
  api.optional_blank_line
57
60
  end
58
61
 
59
- def comment(args = nil, body = nil)
62
+ def comment
60
63
  api.body
61
64
  api.optional_blank_line
62
65
  end
63
66
 
64
- def shell(args = nil, body = nil)
67
+ def shell
65
68
  cmd = api.data
66
69
  system(cmd)
67
70
  api.optional_blank_line
68
71
  end
69
72
 
70
- def func(args = nil, body = nil)
73
+ def func
71
74
  funcname = api.args[0]
72
75
  # check_disallowed(funcname) # should any be invalid?
73
76
  funcname = funcname.gsub(/\./, "__")
74
77
  func_def = <<~EOS
75
78
  def #{funcname}(param)
76
- #{api.body.to_a.join("\n")}
79
+ #{api.body(true).to_a.join("\n")}
77
80
  end
78
81
  EOS
79
82
  api.optional_blank_line
@@ -81,21 +84,21 @@ module Livetext::Standard
81
84
  return true
82
85
  end
83
86
 
84
- def h1(args = nil, body = nil); api.out wrapped(api.data, :h1); return true; end
85
- def h2(args = nil, body = nil); api.out wrapped(api.data, :h2); return true; end
86
- def h3(args = nil, body = nil); api.out wrapped(api.data, :h3); return true; end
87
- def h4(args = nil, body = nil); api.out wrapped(api.data, :h4); return true; end
88
- def h5(args = nil, body = nil); api.out wrapped(api.data, :h5); return true; end
89
- def h6(args = nil, body = nil); api.out wrapped(api.data, :h6); return true; end
87
+ def h1; api.out wrapped(api.data, :h1); return true; end
88
+ def h2; api.out wrapped(api.data, :h2); return true; end
89
+ def h3; api.out wrapped(api.data, :h3); return true; end
90
+ def h4; api.out wrapped(api.data, :h4); return true; end
91
+ def h5; api.out wrapped(api.data, :h5); return true; end
92
+ def h6; api.out wrapped(api.data, :h6); return true; end
90
93
 
91
- def list(args = nil, body = nil)
94
+ def list
92
95
  wrap :ul do
93
96
  api.body {|line| api.out wrapped(line, :li) }
94
97
  end
95
98
  api.optional_blank_line
96
99
  end
97
100
 
98
- def list!(args = nil, body = nil)
101
+ def list!
99
102
  wrap(:ul) do
100
103
  lines = api.body.each # enumerator
101
104
  loop do
@@ -108,40 +111,40 @@ module Livetext::Standard
108
111
  api.optional_blank_line
109
112
  end
110
113
 
111
- def shell!(args = nil, body = nil)
114
+ def shell!
112
115
  cmd = api.data
113
116
  system(cmd)
114
117
  api.optional_blank_line
115
118
  end
116
119
 
117
- def errout(args = nil, body = nil)
120
+ def errout
118
121
  ::STDERR.puts api.data
119
122
  api.optional_blank_line
120
123
  end
121
124
 
122
- def ttyout(args = nil, body = nil)
125
+ def ttyout
123
126
  TTY.puts api.data
124
127
  api.optional_blank_line
125
128
  end
126
129
 
127
- def say(args = nil, body = nil)
130
+ def say
128
131
  str = api.format(api.data)
129
132
  TTY.puts str
130
133
  api.optional_blank_line
131
134
  end
132
135
 
133
- def banner(args = nil, body = nil)
136
+ def banner
134
137
  str = api.format(api.data)
135
138
  num = str.length
136
139
  decor = "-"*num + "\n"
137
140
  puts decor + str + "\n" + decor
138
141
  end
139
142
 
140
- def quit(args = nil, body = nil)
143
+ def quit
141
144
  @output.close
142
145
  end
143
146
 
144
- def cleanup(args = nil, body = nil)
147
+ def cleanup
145
148
  api.args.each do |item|
146
149
  cmd = ::File.directory?(item) ? "rm -f #{item}/*" : "rm #{item}"
147
150
  system(cmd)
@@ -149,7 +152,7 @@ module Livetext::Standard
149
152
  api.optional_blank_line
150
153
  end
151
154
 
152
- def dot_def(args = nil, body = nil)
155
+ def dot_def
153
156
  # api.tty "in #{__FILE__}: api id = #{api.inspect}"
154
157
  name = api.args[0]
155
158
  # api.tty :dd1
@@ -164,7 +167,7 @@ module Livetext::Standard
164
167
  api.optional_blank_line
165
168
  end
166
169
 
167
- def set(args = nil, body = nil)
170
+ def set
168
171
  line = api.args.join(" ") # data.chomp
169
172
  pairs = Livetext::ParseSet.new(line).parse
170
173
  api.setvars(pairs)
@@ -173,7 +176,7 @@ module Livetext::Standard
173
176
 
174
177
  # FIXME really these should be one method...
175
178
 
176
- def variables!(args = nil, body = nil) # cwd, not FileDir - weird, fix later
179
+ def variables! # cwd, not FileDir - weird, fix later
177
180
  prefix = api.args[0]
178
181
  file = api.args[1]
179
182
  prefix = nil if prefix == "-" # FIXME dumb hack
@@ -189,7 +192,7 @@ STDERR.puts "! pairs = #{pairs.inspect}"
189
192
  api.optional_blank_line
190
193
  end
191
194
 
192
- def variables(args = nil, body = nil)
195
+ def variables
193
196
  prefix = api.args[0]
194
197
  file = api.args[1]
195
198
  prefix = nil if prefix == "-" # FIXME dumb hack
@@ -205,7 +208,7 @@ STDERR.puts "pairs = #{pairs.inspect}"
205
208
  api.optional_blank_line
206
209
  end
207
210
 
208
- def heredoc(args = nil, body = nil)
211
+ def heredoc
209
212
  var = api.args[0]
210
213
  text = api.body.join("\n")
211
214
  rhs = ""
@@ -215,11 +218,11 @@ STDERR.puts "pairs = #{pairs.inspect}"
215
218
  end
216
219
  indent = @parent.indentation.last
217
220
  indented = " " * indent
218
- api.set(var, rhs.chomp)
221
+ api.setvar(var, rhs.chomp)
219
222
  api.optional_blank_line
220
223
  end
221
224
 
222
- def seek(args = nil, body = nil) # like include, but search upward as needed
225
+ def seek # like include, but search upward as needed
223
226
  file = api.args.first
224
227
  file = search_upward(file)
225
228
  check_file_exists(file)
@@ -227,14 +230,14 @@ STDERR.puts "pairs = #{pairs.inspect}"
227
230
  api.optional_blank_line
228
231
  end
229
232
 
230
- def dot_include(args = nil, body = nil) # dot command
231
- file = api.format(api.args.first) # allows for variables
233
+ def dot_include # dot command
234
+ file = api.args.first # api.format(api.args.first) # allows for variables
232
235
  check_file_exists(file)
233
236
  @parent.process_file(file)
234
237
  api.optional_blank_line
235
238
  end
236
239
 
237
- def inherit(args = nil, body = nil)
240
+ def inherit
238
241
  file = api.args.first
239
242
  upper = "../#{file}"
240
243
  got_upper, got_file = File.exist?(upper), File.exist?(file)
@@ -246,8 +249,9 @@ STDERR.puts "pairs = #{pairs.inspect}"
246
249
  api.optional_blank_line
247
250
  end
248
251
 
249
- def mixin(args = nil, body = nil)
252
+ def mixin
250
253
  name = api.args.first # Expect a module name
254
+ @mixins ||= []
251
255
  return if @mixins.include?(name)
252
256
  @mixins << name
253
257
  mod = Livetext::Handler::Mixin.get_module(name, @parent)
@@ -257,8 +261,9 @@ STDERR.puts "pairs = #{pairs.inspect}"
257
261
  api.optional_blank_line
258
262
  end
259
263
 
260
- def import(args = nil, body = nil)
264
+ def import
261
265
  name = api.args.first # Expect a module name
266
+ @imports ||= []
262
267
  return if @imports.include?(name)
263
268
  @imports << name
264
269
  mod = Livetext::Handler::Import.get_module(name, @parent)
@@ -268,7 +273,7 @@ STDERR.puts "pairs = #{pairs.inspect}"
268
273
  api.optional_blank_line
269
274
  end
270
275
 
271
- def copy(args = nil, body = nil)
276
+ def copy
272
277
  file = api.args.first
273
278
  ok = check_file_exists(file)
274
279
 
@@ -278,67 +283,67 @@ STDERR.puts "pairs = #{pairs.inspect}"
278
283
  [ok, file]
279
284
  end
280
285
 
281
- def r(args = nil, body = nil)
286
+ def r
282
287
  # FIXME api.data is broken
283
288
  # api.out api.data # No processing at all
284
289
  api.out api.args.join(" ")
285
290
  api.optional_blank_line
286
291
  end
287
292
 
288
- def raw(args = nil, body = nil)
293
+ def raw
289
294
  # No processing at all (terminate with __EOF__)
290
295
  api.raw_body {|line| api.out line } # no formatting
291
296
  api.optional_blank_line
292
297
  end
293
298
 
294
- def debug(args = nil, body = nil)
299
+ def debug
295
300
  self._debug = onoff(api.args.first)
296
301
  api.optional_blank_line
297
302
  end
298
303
 
299
- def passthru(args = nil, body = nil)
304
+ def passthru
300
305
  # FIXME - add check for args size? (helpers)
301
306
  @nopass = ! onoff(api.args.first)
302
307
  api.optional_blank_line
303
308
  end
304
309
 
305
- def nopass(args = nil, body = nil)
310
+ def nopass
306
311
  @nopass = true
307
312
  api.optional_blank_line
308
313
  end
309
314
 
310
- def para(args = nil, body = nil)
315
+ def para
311
316
  # FIXME - add check for args size? (helpers)
312
317
  @nopara = ! onoff(api.args.first)
313
318
  api.optional_blank_line
314
319
  end
315
320
 
316
- def nopara(args = nil, body = nil)
321
+ def nopara
317
322
  @nopara = true
318
323
  api.optional_blank_line
319
324
  end
320
325
 
321
- def heading(args = nil, body = nil)
326
+ def heading
322
327
  api.print "<center><font size=+1><b>"
323
328
  api.print api.data
324
329
  api.print "</b></font></center>"
325
330
  api.optional_blank_line
326
331
  end
327
332
 
328
- def newpage(args = nil, body = nil)
333
+ def newpage
329
334
  api.out '<p style="page-break-after:always;"></p>'
330
335
  api.out "<p/>"
331
336
  api.optional_blank_line
332
337
  end
333
338
 
334
- def mono(args = nil, body = nil)
339
+ def mono
335
340
  wrap ":pre" do
336
341
  api.body(true) {|line| api.out line }
337
342
  end
338
343
  api.optional_blank_line
339
344
  end
340
345
 
341
- def dlist(args = nil, body = nil)
346
+ def dlist
342
347
  delim = api.args.first
343
348
  wrap(:dl) do
344
349
  api.body do |line|
@@ -351,14 +356,14 @@ STDERR.puts "pairs = #{pairs.inspect}"
351
356
  api.optional_blank_line
352
357
  end
353
358
 
354
- def link(args = nil, body = nil)
359
+ def link
355
360
  url = api.args.first
356
361
  text = api.args[2..-1].join(" ")
357
362
  api.out "<a style='text-decoration: none' href='#{url}'>#{text}</a>"
358
363
  api.optional_blank_line
359
364
  end
360
365
 
361
- def xtable(args = nil, body = nil) # Borrowed from bookish - FIXME
366
+ def xtable # Borrowed from bookish - FIXME
362
367
  # TTY.puts "=== #{__method__} #{__FILE__} #{__LINE__}"
363
368
  title = api.data
364
369
  delim = " :: "
@@ -389,13 +394,13 @@ STDERR.puts "pairs = #{pairs.inspect}"
389
394
  api.optional_blank_line
390
395
  end
391
396
 
392
- def image(args = nil, body = nil)
397
+ def image
393
398
  name = api.args[0]
394
399
  api.out "<img src='#{name}'></img>"
395
400
  api.optional_blank_line
396
401
  end
397
402
 
398
- def br(args = nil, body = nil)
403
+ def br
399
404
  num = api.args.first || "1"
400
405
  str = ""
401
406
  num.to_i.times { str << "<br>" }
@@ -48,7 +48,7 @@ class Livetext::UserAPI
48
48
  end
49
49
 
50
50
  def data=(value)
51
- @data = value
51
+ @data = value.dup
52
52
  @args = format(@data).chomp.split
53
53
  end
54
54
 
@@ -104,17 +104,29 @@ class Livetext::UserAPI
104
104
  lines = []
105
105
  end_found = false
106
106
  loop do
107
+ # TTY.puts "BODY 0: @line = #{@line.inspect}"
107
108
  @line = @live.nextline
109
+ # TTY.puts "BODY 1: @line = #{@line.inspect}"
108
110
  break if @line.nil?
111
+ # TTY.puts "BODY 2: @line = #{@line.inspect}"
109
112
  @line.chomp!
113
+ # TTY.puts "BODY 3: @line = #{@line.inspect}"
110
114
  break if end?(@line)
115
+ # TTY.puts "BODY 4: @line = #{@line.inspect}"
111
116
  next if comment?(@line)
117
+ # TTY.puts "BODY 5: @line = #{@line.inspect}"
112
118
  @line = format(@line) unless raw
119
+ # TTY.puts "BODY 6: @line = #{@line.inspect}"
113
120
  lines << @line
121
+ # TTY.puts "BODY 7: @line = #{@line.inspect}"
114
122
  end
123
+ # TTY.puts "BODY 8: lines = #{lines.inspect}"
115
124
  raise "Expected .end, found end of file" unless end?(@line) # use custom exception
125
+ # TTY.puts "BODY 9: lines = #{lines.inspect}"
116
126
  optional_blank_line # FIXME Delete this??
127
+ # TTY.puts "BODY A: lines = #{lines.inspect}"
117
128
  return lines unless block_given?
129
+ # TTY.puts "BODY B: lines = #{lines.inspect}"
118
130
  lines.each {|line| yield line } # FIXME what about $. ?
119
131
  end
120
132
 
@@ -135,7 +147,6 @@ class Livetext::UserAPI
135
147
  end
136
148
 
137
149
  def format(line)
138
- return "" if line == "\n" || line.nil?
139
150
  line2 = @expander.format(line)
140
151
  line2
141
152
  end
@@ -2,5 +2,5 @@
2
2
  # Defining VERSION
3
3
 
4
4
  class Livetext
5
- VERSION = "0.9.30"
5
+ VERSION = "0.9.31"
6
6
  end
data/plugin/bookish.rb CHANGED
@@ -173,7 +173,7 @@ def simple_table(args = nil, body = nil)
173
173
  lines = api.body(true)
174
174
  maxw = nil
175
175
  lines.each do |line|
176
- api.format(line)
176
+ # api.format(line)
177
177
  cells = line.split(delim)
178
178
  wide = cells.map {|x| x.length }
179
179
  maxw = [0] * cells.size
@@ -0,0 +1,149 @@
1
+ The testgen.rb tool takes a .txt and generates a corresponding file
2
+ of MiniTest code.
3
+
4
+ $ ruby testgen.rb variables.txt # produces variables.rb
5
+
6
+ The tests here include:
7
+
8
+ variables.txt Variable expansion
9
+ functions.txt Function call evaluation
10
+ single.txt Single sigil (see Formatting below)
11
+ double.txt Double sigil (see Formatting below)
12
+ bracketed.txt Bracketed sigil (see Formatting below)
13
+
14
+
15
+ Variables:
16
+ ----------
17
+
18
+ 1. A variable begins with a $ and is followed by an alpha; periods may
19
+ be embedded, but each separate piece must "look like" an identifier
20
+
21
+ $x yes
22
+ $xyz yes
23
+ $xyz.abc yes
24
+ $x123 yes
25
+ $x.123 no
26
+ $345 no
27
+
28
+ 2. Rather than causing an error, invalid variables are rendered "as-is"
29
+ as soon as possible:
30
+ " $ " => " $ "
31
+ " $5 " => " $5 "
32
+ "...$" => "...$" (end of line)
33
+
34
+ 3. Actual variables may be user-defined or predefined. The latter usually
35
+ begin with a capital. This is only a convention so far, nothing that is
36
+ enforced.
37
+
38
+ 4. The $ may be escaped as needed. This is problematic.
39
+
40
+ 5. An unknown variable will not raise an error, but will be replaced with
41
+ a warning string.
42
+
43
+
44
+ Functions:
45
+ ----------
46
+
47
+ 1. A function looks like a variable name, but it has two $ in front.
48
+
49
+ 2. If followed by space, comma, end of line, or similar delimiter, it is
50
+ called with no parameter.
51
+
52
+ 3. Note that a function name may contain periods, but may not end with
53
+ one. "$$func." is parsed as a function call (with no parameter) plus a
54
+ period.
55
+
56
+ 4. Use a colon to pass a single parameter delimited by a space or end of line.
57
+ Colon at end of line is valid but probably pointless.
58
+
59
+ 5. Use brackets to pass a single parameter that contains spaces. The bracketed
60
+ parameter may be terminated by end of line instead of right bracket.
61
+
62
+ 6. Only one parameter (a string) may be passed, but the function may parse it
63
+ however it needs to.
64
+
65
+ 7. There is no enforcement of a parameter being "present or absent" except what
66
+ the function itself may enforce.
67
+
68
+ 8. An unknown function will not raise an error, but will be replaced with a warning
69
+ string.
70
+
71
+
72
+ Formatting:
73
+ -----------
74
+
75
+ 1. My formatting notation would be considered quirky by many people.
76
+ The sigils or markers are:
77
+ * bold
78
+ _ underscore
79
+ ` code/teletype
80
+ ~ strikethrough
81
+
82
+ 1. A single sigil is recognized basically at beginning of line or after a space.
83
+ my_func_name No italics here
84
+ M*A*S*H No boldface here
85
+
86
+ 2. A single sigil is terminated by a space or end of line.
87
+
88
+ 3. A single sigil "by itself" is rendered as-is (asterisk, underscore, whatever).
89
+
90
+ 4. An escaped single sigil is rendered as-is. (This is problematic.)
91
+
92
+ 5. A double sigil is recognized at start of line or after a space
93
+
94
+ 6. A double sigil is terminated by a space OR a comma OR a period. (The comma
95
+ and period cases seem very common to me; they are the whole justification
96
+ for the double sigil.) End of line also terminates it.
97
+
98
+ 7. A double sigil by itself is rendered as-is.
99
+
100
+ 8. A bracketed sigil is in general a sigil followed by: [ data ]
101
+
102
+ 9. An empty bracketed sigil simply "goes away"
103
+ " *[] " => " "
104
+
105
+ 10. End of line can terminate instead of right bracket -- but it may still be empty
106
+ and therefore go away.
107
+
108
+ 11. NOTE: These tests use only asterisks (bold), but the logic "should" be the same
109
+ for all sigils.
110
+
111
+
112
+
113
+ Order of evaluation, etc.:
114
+ --------------------------
115
+
116
+ 1. This logic is always a compromise between syntax and the code that parses it.
117
+ I prefer simplicity whenever possible, though it may introduce complexity in
118
+ other situations. I believe that the acceptable complexity of a workaround
119
+ depends on how commonplace the situation is and how onerous the workaround is.
120
+ These are both highly subjective.
121
+
122
+ 2. For example: Note that the simple formatting sigils may not be nested. However,
123
+ there are functions like $$bits provided (with the silly mnemonic "bold, italic,
124
+ teletype, strikthrough"). Every combination is provided (e.g., $$bi, $$bt).
125
+
126
+ 3. Note also: Formatting is only intra-line; it doesn't span lines. If you need to
127
+ work around this, use a heredoc or make your own .def for this.
128
+
129
+ 4. Finally: HTML or CSS may be inserted at will (possibly with some escaping). This
130
+ can be inline or "a file at a time" via such commands as .copy and .include
131
+
132
+ 5. For these reasons: Parsing is naive and simple. Variables are parsed first.
133
+
134
+ 6. Next, function calls are parsed. I said variables are parsed first; this implies
135
+ that a variable can be embedded in a function parameter. But be aware these are
136
+ "naive" substitutions (like C macros).
137
+ .set alpha = "some value"
138
+ Calling $$myfunc:$alpha (means: Calling $$myfunc:some value)
139
+ Better to say $$myfunc[$alpha] (means: Better to say $$myfunc[some value]
140
+
141
+ 7. Formatting is handled last. The four sigils (* _ ` ~) and their three modes
142
+ (single, double, bracketed) make 12 passes necessary for formatting. As this is
143
+ always single-line, it has not been observed to cause a delay so far.
144
+
145
+ 8. The call api.format(line) essentially expands variables, calls functions, and
146
+ finally does simple formatting. See classes Expansion and Formatter.
147
+
148
+ 9. User code (e.g. inside a .def) may also call expand_variables, expand_functions,
149
+ and Formatter.format separately.
@@ -0,0 +1,121 @@
1
+ require 'minitest/autorun'
2
+
3
+ require 'livetext'
4
+
5
+ # Just another testing class. Chill.
6
+
7
+ class TestingLivetextBracketed < MiniTest::Test
8
+
9
+ def setup
10
+ @live = Livetext.new
11
+ end
12
+
13
+ def check_match(exp, actual)
14
+ if exp.is_a? Regexp
15
+ assert_match(exp, actual, "actual does not match expected")
16
+ else
17
+ assert_equal(exp, actual, "actual != expected")
18
+ end
19
+ end
20
+
21
+ def test_bracketed_001_single_bracketed_item
22
+ # Single bracketed item
23
+ # No special initialization
24
+ src = "*[abc]"
25
+ exp = "<b>abc</b>"
26
+ actual = @live.api.format(src)
27
+ check_match(exp, actual)
28
+ end
29
+
30
+ def test_bracketed_002_end_of_line_can_replace_bracket
31
+ # End of line can replace bracket
32
+ # No special initialization
33
+ src = "*[abc"
34
+ exp = "<b>abc</b>"
35
+ actual = @live.api.format(src)
36
+ check_match(exp, actual)
37
+ end
38
+
39
+ def test_bracketed_003_end_of_line_can_replace_bracket_again
40
+ # End of line can replace bracket again
41
+ # No special initialization
42
+ src = "abc *[d"
43
+ exp = "abc <b>d</b>"
44
+ actual = @live.api.format(src)
45
+ check_match(exp, actual)
46
+ end
47
+
48
+ def test_bracketed_004_missing_right_bracket_ignored_at_eol_if_empty
49
+ # Missing right bracket ignored at eol if empty
50
+ # No special initialization
51
+ src = "abc*["
52
+ exp = "abc*["
53
+ actual = @live.api.format(src)
54
+ check_match(exp, actual)
55
+ end
56
+
57
+ def test_bracketed_005_two_simple_bracketed_items
58
+ # Two simple bracketed items
59
+ # No special initialization
60
+ src = "*[A], *[B], C"
61
+ exp = "<b>A</b>, <b>B</b>, C"
62
+ actual = @live.api.format(src)
63
+ check_match(exp, actual)
64
+ end
65
+
66
+ def test_bracketed_006_simple_bracketed_item
67
+ # Simple bracketed item
68
+ # No special initialization
69
+ src = "Just a *[test]..."
70
+ exp = "Just a <b>test</b>..."
71
+ actual = @live.api.format(src)
72
+ check_match(exp, actual)
73
+ end
74
+
75
+ def test_bracketed_007_bracketed_item_with_space
76
+ # Bracketed item with space
77
+ # No special initialization
78
+ src = "A *[simple test]"
79
+ exp = "A <b>simple test</b>"
80
+ actual = @live.api.format(src)
81
+ check_match(exp, actual)
82
+ end
83
+
84
+ def test_bracketed_008_empty_bracketed_item_results_in_null
85
+ # Empty bracketed item results in null
86
+ # No special initialization
87
+ src = " *[] "
88
+ exp = " "
89
+ actual = @live.api.format(src)
90
+ check_match(exp, actual)
91
+ end
92
+
93
+ def test_bracketed_009_bracketed_item_with_space_again
94
+ # Bracketed item with space again
95
+ # No special initialization
96
+ src = "*[ab c] d"
97
+ exp = "<b>ab c</b> d"
98
+ actual = @live.api.format(src)
99
+ check_match(exp, actual)
100
+ end
101
+
102
+ def test_bracketed_010_two_bracketed_items_with_spaces
103
+ # Two bracketed items with spaces
104
+ # No special initialization
105
+ src = "*[a b] *[c d]"
106
+ exp = "<b>a b</b> <b>c d</b>"
107
+ actual = @live.api.format(src)
108
+ check_match(exp, actual)
109
+ end
110
+
111
+ def test_bracketed_011_solitary_item_missing_right_bracket_ignored_at_eol_if_empty
112
+ # Solitary item, missing right bracket ignored at eol if empty
113
+ # No special initialization
114
+ src = "*["
115
+ exp = ""
116
+ actual = @live.api.format(src)
117
+ check_match(exp, actual)
118
+ end
119
+
120
+
121
+ end