livetext 0.9.25 → 0.9.26

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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/imports/bookish.rb +1 -2
  3. data/lib/livetext/errors.rb +3 -0
  4. data/lib/livetext/formatline.rb +102 -15
  5. data/lib/livetext/funcall.rb +86 -2
  6. data/lib/livetext/global_helpers.rb +5 -0
  7. data/lib/livetext/handler/import.rb +2 -6
  8. data/lib/livetext/handler/mixin.rb +2 -6
  9. data/lib/livetext/helpers.rb +9 -11
  10. data/lib/livetext/lineparser.rb +441 -0
  11. data/lib/livetext/more.rb +158 -0
  12. data/lib/livetext/processor.rb +3 -1
  13. data/lib/livetext/skeleton.rb +5 -0
  14. data/lib/livetext/standard.rb +12 -8
  15. data/lib/livetext/userapi.rb +27 -10
  16. data/lib/livetext/version.rb +1 -1
  17. data/lib/livetext.rb +3 -152
  18. data/test/snapshots/basic_formatting/actual-error.txt +0 -0
  19. data/test/snapshots/basic_formatting/actual-output.txt +13 -0
  20. data/test/snapshots/basic_formatting/err-sdiff.txt +1 -0
  21. data/test/snapshots/basic_formatting/out-sdiff.txt +14 -0
  22. data/test/snapshots/error_invalid_name/foo +5 -0
  23. data/test/snapshots/import_bookish/expected-output.txt +4 -4
  24. data/test/snapshots/more_functions/actual-error.txt +0 -0
  25. data/test/snapshots/more_functions/actual-output.txt +37 -0
  26. data/test/snapshots/more_functions/err-sdiff.txt +1 -0
  27. data/test/snapshots/more_functions/expected-output.txt +1 -1
  28. data/test/snapshots/more_functions/out-sdiff.txt +38 -0
  29. data/test/snapshots/more_functions/source.lt3 +1 -1
  30. data/test/snapshots/simple_vars/actual-error.txt +0 -0
  31. data/test/snapshots/simple_vars/actual-output.txt +6 -0
  32. data/test/snapshots/simple_vars/err-sdiff.txt +1 -0
  33. data/test/snapshots/simple_vars/out-sdiff.txt +7 -0
  34. data/test/snapshots/subset.txt +2 -0
  35. data/test/snapshots/var_into_func/actual-error.txt +0 -0
  36. data/test/snapshots/var_into_func/actual-output.txt +16 -0
  37. data/test/snapshots/var_into_func/err-sdiff.txt +1 -0
  38. data/test/snapshots/var_into_func/expected-error.txt +0 -0
  39. data/test/snapshots/var_into_func/expected-output.txt +16 -0
  40. data/test/snapshots/var_into_func/out-sdiff.txt +17 -0
  41. data/test/snapshots/var_into_func/source.lt3 +16 -0
  42. data/test/unit/all.rb +3 -1
  43. data/test/unit/formatline.rb +143 -274
  44. data/test/unit/lineparser.rb +650 -0
  45. data/test/unit/parser/set.rb +13 -12
  46. data/test/unit/tokenizer.rb +534 -0
  47. metadata +26 -5
  48. data/test/snapshots/error_inc_line_num/OUT +0 -17
  49. data/test/snapshots/error_no_such_copy/duh +0 -26
  50. data/test/snapshots/error_no_such_copy/mystery.txt +0 -36
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f447e149e6724975184b8db2c51ff59c58752c3cb5b4037bb86fb1f355015a6
4
- data.tar.gz: 9740fc3b2bb98e92c91c523656f270a66132d882fbcaa9b1a803294d1e10a65a
3
+ metadata.gz: 1744d4ccec6a1c997c1f37660276d9bbd13bc458b612e00ff90de5f0eab93261
4
+ data.tar.gz: 0ce2af2ed7e189f8128a94c93468f9044fdef6a044c4e551655ece97b6eaa3da
5
5
  SHA512:
6
- metadata.gz: 1ee34071fde07e45b13d8f13aa9889d2b060651901acd8e3876071121ea5222c8bc4b83162c30f772c53fe92e07ea7bada3f28be0c75994f1ad21bcdacbb2905
7
- data.tar.gz: ce9ed1ac2cd624818b775d19681a406f0a4c43c2a0b9a7f6f8c1f8fb9834b91301a2b65c10d1faa0c4b664a1abcb741c570d1745d996537f4d438e97b65e3f56
6
+ metadata.gz: 497f2e381f4ee255dc2b336fb6f287e136858e4d8daf96e6f652c321013d68e13139f41507e532bb1a57dd85b41afd6e8b5b6a35ce8f9cbb2b5b38eb7ccbde51
7
+ data.tar.gz: c5fcb435da4ee42395872a91f27ed5f2a1f67273f70b7e7bfdafe781b90a3170203bae9536ffd9dfb0e9af14e3cd0fde7a543c17e9aecdea1983fb4be8d74fd9
data/imports/bookish.rb CHANGED
@@ -187,8 +187,7 @@ module Bookish
187
187
  cells = line.split(delim)
188
188
  api.out "<tr>"
189
189
  cells.each.with_index do |cell, i|
190
- api.out " <td width=#{maxw}% valign=top>" +
191
- "#{cell}</td>"
190
+ api.out " <td width=#{maxw[i]}% valign=top>#{cell}</td>"
192
191
  end
193
192
  api.out "</tr>"
194
193
  end
@@ -13,3 +13,6 @@ def make_exception(sym, str, target_class = Object)
13
13
  end
14
14
  end
15
15
 
16
+ make_exception(:EndWithoutOpening, "Error: found .end with no opening command")
17
+ make_exception(:UnknownMethod, "Error: name '%1' is unknown")
18
+
@@ -20,14 +20,21 @@ class Livetext::FormatLine < StringParser
20
20
 
21
21
  def self.parse!(line)
22
22
  return nil if line.nil?
23
- x = self.new(line.chomp)
23
+ line.chomp!
24
+ x = self.new(line)
25
+ ::Livetext::TTY.puts "\n-- string: #{line.inspect}" if $testme
24
26
  t = x.tokenize
25
- x.evaluate
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
26
31
  end
27
32
 
28
33
  def tokenize
29
34
  loop do
30
- case peek
35
+ ch = peek
36
+ ::Livetext::TTY.puts "\n-- #{__method__}: ch1 = #{ch.inspect}\n " if $testme
37
+ case ch
31
38
  when Escape; grab; add peek; grab
32
39
  when "$"
33
40
  dollar
@@ -41,6 +48,64 @@ class Livetext::FormatLine < StringParser
41
48
  else
42
49
  add peek
43
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
44
109
  grab
45
110
  end
46
111
  add_token(:str)
@@ -60,7 +125,7 @@ class Livetext::FormatLine < StringParser
60
125
  loop do
61
126
  char = self.grab
62
127
  break if char == LF || char == nil
63
- self.handle_escaping if char == Escape
128
+ self.escaped if char == Escape
64
129
  self.dollar if char == "$" # Could be $$
65
130
  self.add char
66
131
  end
@@ -76,7 +141,7 @@ class Livetext::FormatLine < StringParser
76
141
  loop do
77
142
  char = x.grab
78
143
  break if char == LF || char == nil
79
- x.handle_escaping if char == Escape
144
+ x.escaped if char == Escape
80
145
  x.dollar if char == "$" # Could be $$
81
146
  x.add char
82
147
  end
@@ -85,9 +150,20 @@ class Livetext::FormatLine < StringParser
85
150
  result
86
151
  end
87
152
 
88
- def handle_escaping
89
- grab
90
- add grab
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
91
167
  end
92
168
 
93
169
  def embed(sym, str)
@@ -151,20 +227,31 @@ class Livetext::FormatLine < StringParser
151
227
  end
152
228
 
153
229
  def dollar
154
- grab
155
- case peek
156
- when LF; add "$"; add_token :str
157
- when " "; add "$ "; add_token :str
158
- when nil; add "$"; add_token :str
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
159
243
  when "$"; double_dollar
160
244
  # when "."; dollar_dot
161
245
  when /[A-Za-z]/
246
+ ::Livetext::TTY.puts "\n-- #{__method__}: (Alpha)" if $testme
162
247
  add_token :str
163
248
  var = peek + grab_alpha_dot
164
249
  add_token(:var, var)
165
250
  else
166
- add "$" + peek
167
- add_token(:string)
251
+ ch = grab # "$"
252
+ ::Livetext::TTY.puts "\n-- ch3 = #{ch.inspect}\n self = #{self.inspect}" if $testme
253
+ add "$" + ch
254
+ add_token(:str)
168
255
  end
169
256
  end
170
257
 
@@ -3,6 +3,90 @@ require_relative '../livetext'
3
3
 
4
4
  # Parse function calls
5
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
+
6
90
  module Livetext::FormatLine::FunCall
7
91
 
8
92
  include Livetext::ParsingConstants
@@ -10,13 +94,13 @@ module Livetext::FormatLine::FunCall
10
94
  def param_loop(char)
11
95
  param = ""
12
96
  loop do
13
- case lookahead
97
+ case peek
14
98
  when Escape
15
99
  param << escaped
16
100
  when char, LF, nil
17
101
  break
18
102
  else
19
- param << lookahead
103
+ param << peek
20
104
  grab
21
105
  end
22
106
  end
@@ -2,6 +2,7 @@
2
2
  module GlobalHelpers
3
3
 
4
4
  def check_disallowed(name)
5
+ api.tty "GLOBAL cdis"
5
6
  raise DisallowedName(name) if disallowed?(name)
6
7
  end
7
8
 
@@ -34,4 +35,8 @@ module GlobalHelpers
34
35
  return nil
35
36
  end
36
37
 
38
+ def cwd_root?
39
+ File.dirname(File.expand_path(".")) == "/"
40
+ end
41
+
37
42
  end
@@ -1,6 +1,8 @@
1
1
 
2
2
  require_relative '../helpers'
3
3
 
4
+ # Handle a .import
5
+
4
6
  class Livetext::Handler::Import
5
7
  include Livetext::Helpers
6
8
  include GlobalHelpers
@@ -34,11 +36,5 @@ class Livetext::Handler::Import
34
36
  newmod # return actual module
35
37
  end
36
38
 
37
- private
38
-
39
- def cwd_root?
40
- File.dirname(File.expand_path(".")) == "/"
41
- end
42
-
43
39
  end
44
40
 
@@ -1,6 +1,8 @@
1
1
 
2
2
  require_relative '../helpers'
3
3
 
4
+ # Handle a .mixin
5
+
4
6
  class Livetext::Handler::Mixin
5
7
  include Livetext::Helpers
6
8
  include GlobalHelpers
@@ -27,11 +29,5 @@ class Livetext::Handler::Mixin
27
29
  [modname, "module ::#{modname}; #{meths}\nend"]
28
30
  end
29
31
 
30
- private
31
-
32
- def cwd_root?
33
- File.dirname(File.expand_path(".")) == "/"
34
- end
35
-
36
32
  end
37
33
 
@@ -55,8 +55,10 @@ module Livetext::Helpers
55
55
  base = "#{name}#{ext}"
56
56
  paths.each do |path|
57
57
  file = path + base
58
+ ::Livetext::TTY.puts " Checking: #{file}"
58
59
  return file if File.exist?(file)
59
60
  end
61
+ ::Livetext::TTY.puts " ...oops"
60
62
  return nil
61
63
  end
62
64
 
@@ -92,12 +94,12 @@ module Livetext::Helpers
92
94
  def process_line(line)
93
95
  success = true
94
96
  case line # must apply these in order
95
- when Comment
96
- success = handle_scomment(line)
97
- when DotCmd
98
- success = handle_dotcmd(line)
99
- when DollarDot
100
- success = handle_dollar_dot
97
+ when Comment
98
+ success = handle_scomment(line)
99
+ when DotCmd
100
+ success = handle_dotcmd(line)
101
+ when DollarDot
102
+ success = handle_dollar_dot
101
103
  else
102
104
  api.passthru(line) # must succeed?
103
105
  end
@@ -117,14 +119,11 @@ module Livetext::Helpers
117
119
  # FIXME Add cmdargs stuff... depends on name, etc.
118
120
  retval = @main.send(name)
119
121
  retval
120
- # rescue NoMethodError => err
121
- # graceful_error(err)
122
122
  rescue => err
123
123
  graceful_error(err)
124
124
  end
125
125
 
126
126
  def handle_dotcmd(line, indent = 0)
127
- # TTY.puts ">>> #{__method__} in #{__FILE__}" # if ENV['debug']
128
127
  indent = @indentation.last # top of stack
129
128
  line = line.sub(/# .*$/, "") # FIXME Could be problematic?
130
129
  name = get_name(line)
@@ -159,8 +158,7 @@ module Livetext::Helpers
159
158
  end
160
159
 
161
160
  def check_file_exists(file)
162
- # raise FileNotFound(file) unless File.exist?(file)
163
- return File.exist?(file)
161
+ return File.exist?(file)
164
162
  end
165
163
 
166
164
  def set_variables(pairs)