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,408 +0,0 @@
1
-
2
- require_relative 'parsing'
3
- require_relative 'funcall'
4
-
5
- # Class FormatLine handles the parsing of comments, dot commands, and
6
- # simple formatting characters.
7
-
8
- class Livetext::FormatLine < StringParser
9
- include Livetext::ParsingConstants
10
- include Livetext::FormatLine::FunCall
11
-
12
- attr_reader :out
13
- attr_reader :tokenlist
14
-
15
- def initialize(line)
16
- super
17
- @token = Null.dup
18
- @tokenlist = []
19
- end
20
-
21
- def self.parse!(line)
22
- return nil if line.nil?
23
- line.chomp!
24
- x = self.new(line)
25
- ::Livetext::TTY.puts "\n-- string: #{line.inspect}" if $testme
26
- t = x.tokenize
27
- ::Livetext::TTY.puts "\n-- Tokens: #{t.inspect}" if $testme
28
- result = x.evaluate
29
- ::Livetext::TTY.puts "\n-- result: #{result.inspect}\n " if $testme
30
- result
31
- end
32
-
33
- def tokenize
34
- loop do
35
- ch = peek
36
- ::Livetext::TTY.puts "\n-- #{__method__}: ch1 = #{ch.inspect}\n " if $testme
37
- case ch
38
- when Escape; grab; add peek; grab
39
- when "$"
40
- dollar
41
- when "*", "_", "`", "~"
42
- marker peek
43
- add peek
44
- when LF
45
- break if eos?
46
- when nil
47
- break
48
- else
49
- add peek
50
- end
51
- ch = grab
52
- # add ch
53
- ::Livetext::TTY.puts "\n-- #{__method__}: !!! ch2 = #{ch.inspect}\n " if $testme
54
- end
55
- add_token(:str)
56
- @tokenlist
57
- end
58
-
59
- def parse_formatting
60
- loop do
61
- case peek
62
- when Escape; grab; add peek; grab
63
- when "*", "_", "`", "~"
64
- marker peek
65
- add peek
66
- when LF
67
- break if eos?
68
- when nil
69
- break
70
- else
71
- add peek
72
- end
73
- grab
74
- end
75
- add_token(:str)
76
- @tokenlist
77
- end
78
-
79
- def self.get_vars
80
- grab
81
- case peek
82
- when LF, " ", nil
83
- add "$"
84
- add_token :str
85
- when "$"; double_dollar
86
- # when "."; dollar_dot
87
- when /[A-Za-z]/
88
- add_token :str
89
- var = peek + grab_alpha_dot
90
- add_token(:var, var)
91
- else
92
- add "$" + peek
93
- add_token(:str)
94
- end
95
- end
96
-
97
- def self.parse_var_func # FIXME Hmm...
98
- loop do
99
- case peek
100
- when "$"
101
- dollar
102
- when LF
103
- break if eos?
104
- when nil
105
- break
106
- else
107
- add peek
108
- end
109
- grab
110
- end
111
- add_token(:str)
112
- @tokenlist
113
- end
114
-
115
- def terminate?(terminators, ch)
116
- if terminators.is_a? Regexp
117
- terminators === ch
118
- else
119
- terminators.include?(ch)
120
- end
121
- end
122
-
123
- def var_func_parse
124
- char = self.peek
125
- loop do
126
- char = self.grab
127
- break if char == LF || char == nil
128
- self.escaped if char == Escape
129
- self.dollar if char == "$" # Could be $$
130
- self.add char
131
- end
132
- self.add_token(:str)
133
- result = self.evaluate
134
- result
135
- end
136
-
137
- def self.var_func_parse(str)
138
- return nil if str.nil?
139
- x = self.new(str.chomp)
140
- char = x.peek
141
- loop do
142
- char = x.grab
143
- break if char == LF || char == nil
144
- x.escaped if char == Escape
145
- x.dollar if char == "$" # Could be $$
146
- x.add char
147
- end
148
- x.add_token(:str)
149
- result = x.evaluate
150
- result
151
- end
152
-
153
- def self.parse_variables(str)
154
- return nil if str.nil?
155
- x = self.new(str.chomp)
156
- char = x.peek
157
- loop do
158
- char = x.grab
159
- break if char == LF || char == nil
160
- x.escaped if char == Escape
161
- x.dollar if char == "$" # Could be $$
162
- x.add char
163
- end
164
- x.add_token(:str)
165
- result = x.evaluate
166
- result
167
- end
168
-
169
- def embed(sym, str)
170
- pre, post = SimpleFormats[sym]
171
- pre + str + post
172
- end
173
-
174
- def evaluate(tokens = @tokenlist)
175
- @out = ""
176
- return "" if tokens.empty?
177
- gen = tokens.each
178
- token = gen.next
179
- loop do
180
- break if token.nil?
181
- sym, val = *token
182
- case sym
183
- when :str; eval_str(val)
184
- when :var; eval_var(val)
185
- when :func; eval_func(val, gen)
186
- when *BITS; eval_bits(sym, val)
187
- else
188
- add_token :str
189
- end
190
- token = gen.next
191
- end
192
- @out
193
- end
194
-
195
- def add(str)
196
- @token << str unless str.nil?
197
- end
198
-
199
- def add_token(kind, token = @token)
200
- return if token.nil?
201
- @tokenlist << [kind, token] unless token.empty?
202
- @token = Null.dup
203
- end
204
-
205
- def grab_alpha
206
- str = Null.dup
207
- grab
208
- loop do
209
- break if eos?
210
- str << peek
211
- break if terminate?(NoAlpha, lookahead)
212
- grab
213
- end
214
- str
215
- end
216
-
217
- def grab_alpha_dot
218
- str = Null.dup
219
- grab
220
- loop do
221
- break if peek.nil? # eos?
222
- str << peek
223
- break if terminate?(NoAlphaDot, lookahead)
224
- grab
225
- end
226
- str
227
- end
228
-
229
- def dollar
230
- ch = grab # "$"
231
- ::Livetext::TTY.puts "\n-- #{__method__}: ch1 = #{ch.inspect}\n self = #{self.inspect}" if $testme
232
- ch = peek
233
- ::Livetext::TTY.puts "\n-- #{__method__}: ch2 = #{ch.inspect}\n self = #{self.inspect}" if $testme
234
- case ch
235
- when " "
236
- ::Livetext::TTY.puts "\n-- #{__method__}: (space)" if $testme
237
- add "$ "
238
- add_token :str
239
- when LF, nil
240
- ::Livetext::TTY.puts "\n-- #{__method__}: (LF/nil)" if $testme
241
- add "$"
242
- add_token :str
243
- when "$"; double_dollar
244
- # when "."; dollar_dot
245
- when /[A-Za-z]/
246
- ::Livetext::TTY.puts "\n-- #{__method__}: (Alpha)" if $testme
247
- add_token :str
248
- var = peek + grab_alpha_dot
249
- add_token(:var, var)
250
- else
251
- ch = grab # "$"
252
- ::Livetext::TTY.puts "\n-- ch3 = #{ch.inspect}\n self = #{self.inspect}" if $testme
253
- add "$" + ch
254
- add_token(:str)
255
- end
256
- end
257
-
258
- # def dollar_dot
259
- # add_token :ddot, @line[@i..-1]
260
- # end
261
-
262
- def marker(char)
263
- add_token :str
264
- sym = Syms[char]
265
- if embedded?
266
- # add char # ??? add_token "*", :string
267
- return
268
- end
269
-
270
- grab
271
- case peek
272
- when Space
273
- add char + " "
274
- add_token :str
275
- grab
276
- when LF, nil
277
- add char
278
- add_token :str
279
- when char; double_marker(char)
280
- when LBrack; long_marker(char)
281
- else
282
- str = peek + collect!(sym, Blank)
283
- add str
284
- add_token sym, str
285
- grab
286
- end
287
- end
288
-
289
- def double_marker(char)
290
- sym = Syms[char]
291
- kind = sym
292
- case lookahead # first char after **
293
- when Space, LF, nil
294
- pre, post = SimpleFormats[sym]
295
- add_token kind
296
- else
297
- str = collect!(sym, Punc)
298
- add_token kind, str
299
- grab
300
- end
301
- end
302
-
303
- def long_marker(char)
304
- sym = Syms[char]
305
- # grab # skip left bracket
306
- kind = sym # "param_#{sym}".to_sym
307
- arg = collect!(sym, Param, true)
308
- add_token kind, arg
309
- end
310
-
311
- def collect_bracketed(sym, terminators)
312
- str = Null.dup # next is not " ","*","["
313
- grab # ZZZ
314
- loop do
315
- if peek == Escape
316
- grab
317
- str << grab
318
- next
319
- end
320
- if terminate?(terminators, peek)
321
- break
322
- end
323
- str << peek # not a terminator
324
- grab
325
- end
326
-
327
- if peek == "]" # skip right bracket
328
- grab
329
- end
330
- add str
331
- str
332
- rescue => err
333
- ::STDERR.puts "ERR = #{err}\n#{err.backtrace}"
334
- end
335
-
336
- def escaped
337
- grab # Eat the backslash
338
- ch = grab # Take next char
339
- ch
340
- end
341
-
342
- def collect!(sym, terminators, bracketed=nil)
343
- return collect_bracketed(sym, terminators) if bracketed
344
-
345
- str = Null.dup # next is not " ","*","["
346
- grab # ZZZ
347
- loop do
348
- case
349
- when peek.nil?
350
- return str
351
- when peek == Escape
352
- str << escaped
353
- next
354
- when terminate?(terminators, peek)
355
- break
356
- else
357
- str << peek # not a terminator
358
- end
359
- grab
360
- end
361
- ungrab
362
- add str
363
- str
364
- rescue => err
365
- ::STDERR.puts "ERR = #{err}\n#{err.backtrace}"
366
- end
367
-
368
- def varsub(name)
369
- live = Livetext.new
370
- value = live.vars[name]
371
- result = value || "[#{name} is undefined]"
372
- result
373
- end
374
-
375
- def embedded?
376
- ! (['"', "'", " ", nil].include? prev)
377
- end
378
-
379
- private
380
-
381
- def eval_bits(sym, val)
382
- val = Livetext.interpolate(val)
383
- @out << embed(sym, val)
384
- end
385
-
386
- def eval_func(val, gen)
387
- param = nil
388
- arg = gen.peek rescue :bogus
389
- unless arg == :bogus
390
- if [:colon, :brackets].include? arg[0]
391
- arg = gen.next # for real
392
- param = arg[1]
393
- # FIXME - unsure - interpolate again??
394
- # param = Livetext.interpolate(param)
395
- end
396
- end
397
- @out << funcall(val, param)
398
- end
399
-
400
- def eval_var(val)
401
- @out << varsub(val)
402
- end
403
-
404
- def eval_str(val)
405
- @out << val unless val == "\n" # BUG
406
- end
407
-
408
- end
@@ -1,168 +0,0 @@
1
-
2
- require_relative '../livetext'
3
-
4
- # Parse function calls
5
-
6
- module Livetext::LineParser::FunCall
7
-
8
- include Livetext::ParsingConstants
9
-
10
- def param_loop(char)
11
- param = ""
12
- loop do
13
- case peek
14
- when Escape
15
- param << escaped
16
- when char, LF, nil
17
- break
18
- else
19
- param << grab
20
- end
21
- end
22
- param = nil if param.empty?
23
- param
24
- end
25
-
26
- def grab_colon_param
27
- grab # grab :
28
- param = param_loop(Space)
29
- end
30
-
31
- def grab_bracket_param
32
- grab # [
33
- param = param_loop("]")
34
- grab # "]"
35
- param
36
- end
37
-
38
- def funcall(name, param)
39
- err = "[Error evaluating $$#{name}(#{param})]"
40
- result =
41
- if self.send?(name, param)
42
- # do nothing
43
- else
44
- fobj = ::Livetext::Functions.new
45
- fobj.send(name, param) rescue err
46
- end
47
- result.to_s
48
- end
49
-
50
- def grab_func_with_param
51
- add_token(:str, @token)
52
- func = grab_alpha
53
- add_token(:func, func)
54
- param = grab_func_param # may be null/missing
55
- param
56
- end
57
-
58
- def double_dollar
59
- case peek
60
- when Space; add_token :string, "$$ "; grab
61
- when LF, nil; add "$$ "; add_token :str
62
- when Alpha; param = grab_func_with_param
63
- else grab; add_token :str, "$$" + peek
64
- end
65
- end
66
-
67
- def grab_func_param
68
- case peek
69
- when "["
70
- param = grab_bracket_param
71
- add_token(:brackets, param)
72
- when ":"
73
- param = grab_colon_param
74
- add_token(:colon, param)
75
- else # do nothing
76
- end
77
- end
78
-
79
- def escaped
80
- grab # Eat the backslash
81
- ch = grab # Take next char
82
- ch
83
- end
84
-
85
- end
86
-
87
-
88
- # FIXME...
89
-
90
- module Livetext::FormatLine::FunCall
91
-
92
- include Livetext::ParsingConstants
93
-
94
- def param_loop(char)
95
- param = ""
96
- loop do
97
- case peek
98
- when Escape
99
- param << escaped
100
- when char, LF, nil
101
- break
102
- else
103
- param << peek
104
- grab
105
- end
106
- end
107
- param = nil if param.empty?
108
- param
109
- end
110
-
111
- def grab_colon_param
112
- grab # grab :
113
- param = param_loop(Space)
114
- end
115
-
116
- def grab_bracket_param
117
- grab # [
118
- param = param_loop("]")
119
- grab # "]"
120
- param
121
- end
122
-
123
- def funcall(name, param)
124
- err = "[Error evaluating $$#{name}(#{param})]"
125
- func_name = name # "func_" + name.to_s
126
- result =
127
- if self.send?(func_name, param) # self.respond_to?(func_name)
128
- # do nothing
129
- else
130
- fobj = ::Livetext::Functions.new
131
- fobj.send(name, param) rescue err
132
- end
133
- result.to_s
134
- end
135
-
136
- def double_dollar
137
- case lookahead
138
- when Space; add_token :string, "$$ "; grab; return
139
- when LF, nil; add "$$"; add_token :str
140
- when Alpha
141
- add_token(:str, @token)
142
- func = grab_alpha
143
- add_token(:func, func)
144
- param = grab_func_param # may be null/missing
145
- else
146
- grab; add_token :str, "$$" + peek; return
147
- end
148
- end
149
-
150
- def grab_func_param
151
- case lookahead
152
- when "["
153
- param = grab_bracket_param
154
- add_token(:brackets, param)
155
- when ":"
156
- param = grab_colon_param
157
- add_token(:colon, param)
158
- else # do nothing
159
- end
160
- end
161
-
162
- def escaped
163
- grab # Eat the backslash
164
- ch = grab # Take next char
165
- ch
166
- end
167
-
168
- end