livetext 0.9.11 → 0.9.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/lib/errors.rb +13 -0
  3. data/lib/formatline.rb +3 -5
  4. data/lib/functions.rb +6 -2
  5. data/lib/helpers.rb +21 -0
  6. data/lib/html.rb +32 -0
  7. data/lib/livetext/importable.rb +2 -0
  8. data/lib/livetext.rb +44 -42
  9. data/lib/parser/general.rb +38 -0
  10. data/lib/parser/import.rb +17 -0
  11. data/lib/parser/mixin.rb +46 -0
  12. data/lib/parser/set.rb +136 -0
  13. data/lib/parser/string.rb +55 -0
  14. data/lib/parser.rb +5 -0
  15. data/lib/processor.rb +22 -16
  16. data/lib/standard.rb +144 -292
  17. data/lib/userapi.rb +2 -1
  18. data/livetext.gemspec +1 -2
  19. data/test/all.rb +3 -0
  20. data/test/formatting.rb +2 -9
  21. data/test/{data → snapshots}/basic_formatting/expected-error.txt +0 -0
  22. data/test/{data → snapshots}/basic_formatting/expected-output.txt +0 -0
  23. data/test/{data → snapshots}/basic_formatting/source.lt3 +0 -0
  24. data/test/{data → snapshots}/block_comment/expected-error.txt +0 -0
  25. data/test/{data → snapshots}/block_comment/expected-output.txt +0 -0
  26. data/test/{data → snapshots}/block_comment/source.lt3 +0 -0
  27. data/test/{data → snapshots}/comments_ignored_1/expected-error.txt +0 -0
  28. data/test/{data → snapshots}/comments_ignored_1/expected-output.txt +0 -0
  29. data/test/{data → snapshots}/comments_ignored_1/source.lt3 +0 -0
  30. data/test/{data → snapshots}/copy_is_raw/expected-error.txt +0 -0
  31. data/test/{data → snapshots}/copy_is_raw/expected-output.txt +0 -0
  32. data/test/{data → snapshots}/copy_is_raw/rawtext.inc +0 -0
  33. data/test/{data → snapshots}/copy_is_raw/source.lt3 +0 -0
  34. data/test/{data → snapshots}/crap +0 -0
  35. data/test/{data → snapshots}/def_method/expected-error.txt +0 -0
  36. data/test/{data → snapshots}/def_method/expected-output.txt +0 -0
  37. data/test/{data → snapshots}/def_method/source.lt3 +0 -0
  38. data/test/{data/error_inc_line_num/expected-err-line1match.txt → snapshots/error_inc_line_num/actual-error.txt} +0 -0
  39. data/test/{data/error_inc_line_num/expected-output.txt → snapshots/error_inc_line_num/actual-output.txt} +0 -0
  40. data/test/{data/error_line_num → snapshots/error_inc_line_num}/expected-err-line1match.txt +0 -0
  41. data/test/snapshots/error_inc_line_num/expected-output.txt +13 -0
  42. data/test/{data → snapshots}/error_inc_line_num/file2.lt3 +0 -0
  43. data/test/snapshots/error_inc_line_num/out-sdiff.txt +14 -0
  44. data/test/{data → snapshots}/error_inc_line_num/source.lt3 +0 -0
  45. data/test/snapshots/error_invalid_name/actual-error.txt +10 -0
  46. data/test/{data/error_no_such_mixin/expected-output.txt → snapshots/error_invalid_name/actual-output.txt} +0 -0
  47. data/test/{data → snapshots}/error_invalid_name/expected-err-line1match.txt +0 -0
  48. data/test/{data → snapshots}/error_invalid_name/expected-output.txt +0 -0
  49. data/test/snapshots/error_invalid_name/out-sdiff.txt +6 -0
  50. data/test/{data → snapshots}/error_invalid_name/source.lt3 +0 -0
  51. data/test/snapshots/error_line_num/actual-error.txt +1 -0
  52. data/test/snapshots/error_line_num/actual-output.txt +5 -0
  53. data/test/snapshots/error_line_num/expected-err-line1match.txt +1 -0
  54. data/test/{data → snapshots}/error_line_num/expected-output.txt +0 -0
  55. data/test/snapshots/error_line_num/out-sdiff.txt +6 -0
  56. data/test/{data → snapshots}/error_line_num/source.lt3 +0 -0
  57. data/test/snapshots/error_mismatched_end/actual-error.txt +1 -0
  58. data/test/{data/error_mismatched_end/expected-output.txt → snapshots/error_mismatched_end/actual-output.txt} +0 -0
  59. data/test/{data → snapshots}/error_mismatched_end/expected-err-line1match.txt +0 -0
  60. data/test/snapshots/error_mismatched_end/expected-output.txt +8 -0
  61. data/test/snapshots/error_mismatched_end/out-sdiff.txt +9 -0
  62. data/test/{data → snapshots}/error_mismatched_end/source.lt3 +0 -0
  63. data/test/{data/error_missing_end/expected-err-line1match.txt → snapshots/error_missing_end/actual-error.txt} +0 -0
  64. data/test/{data/error_missing_end/expected-output.txt → snapshots/error_missing_end/actual-output.txt} +0 -0
  65. data/test/snapshots/error_missing_end/expected-err-line1match.txt +1 -0
  66. data/test/snapshots/error_missing_end/expected-output.txt +5 -0
  67. data/test/snapshots/error_missing_end/out-sdiff.txt +6 -0
  68. data/test/{data → snapshots}/error_missing_end/source.lt3 +0 -0
  69. data/test/{data/error_name_not_permitted/expected-output.txt → snapshots/error_name_not_permitted/OLD-exp-out} +0 -0
  70. data/test/{data/example_alpha/expected-error.txt → snapshots/error_name_not_permitted/expected-output.txt} +0 -0
  71. data/test/snapshots/error_name_not_permitted/match-error.txt +1 -0
  72. data/test/{data → snapshots}/error_name_not_permitted/source.lt3 +0 -0
  73. data/test/snapshots/error_no_such_copy/actual-error.txt +10 -0
  74. data/test/{data/example_alpha2/expected-error.txt → snapshots/error_no_such_copy/actual-output.txt} +0 -0
  75. data/test/snapshots/error_no_such_copy/expected-err-line1match.txt +1 -0
  76. data/test/{data → snapshots}/error_no_such_copy/expected-output.txt +0 -5
  77. data/test/snapshots/error_no_such_copy/out-sdiff.txt +5 -0
  78. data/test/{data → snapshots}/error_no_such_copy/source.lt3 +0 -0
  79. data/test/snapshots/error_no_such_inc/actual-error.txt +10 -0
  80. data/test/{data/functions/expected-error.txt → snapshots/error_no_such_inc/actual-output.txt} +0 -0
  81. data/test/snapshots/error_no_such_inc/expected-err-line1match.txt +1 -0
  82. data/test/{data → snapshots}/error_no_such_inc/expected-output.txt +0 -4
  83. data/test/snapshots/error_no_such_inc/out-sdiff.txt +6 -0
  84. data/test/{data → snapshots}/error_no_such_inc/source.lt3 +0 -0
  85. data/test/snapshots/error_no_such_mixin/actual-error.txt +1 -0
  86. data/test/snapshots/error_no_such_mixin/actual-output.txt +11 -0
  87. data/test/{data → snapshots}/error_no_such_mixin/expected-err-line1match.txt +0 -0
  88. data/test/snapshots/error_no_such_mixin/expected-output.txt +5 -0
  89. data/test/snapshots/error_no_such_mixin/out-sdiff.txt +12 -0
  90. data/test/{data → snapshots}/error_no_such_mixin/source.lt3 +0 -0
  91. data/test/{data/hello_world → snapshots/example_alpha}/expected-error.txt +0 -0
  92. data/test/{data → snapshots}/example_alpha/expected-output.txt +0 -0
  93. data/test/{data → snapshots}/example_alpha/source.lt3 +0 -0
  94. data/test/{data/more_complex_vars → snapshots/example_alpha2}/expected-error.txt +0 -0
  95. data/test/{data → snapshots}/example_alpha2/expected-output.txt +0 -0
  96. data/test/{data → snapshots}/example_alpha2/source.lt3 +0 -0
  97. data/test/{data → snapshots}/fixit +0 -0
  98. data/test/{data/predef_vars → snapshots/functions}/expected-error.txt +0 -0
  99. data/test/{data → snapshots}/functions/expected-output.txt +0 -0
  100. data/test/{data → snapshots}/functions/source.lt3 +0 -0
  101. data/test/{data/raw_lines → snapshots/hello_world}/expected-error.txt +0 -0
  102. data/test/{data → snapshots}/hello_world/expected-output.txt +0 -0
  103. data/test/{data → snapshots}/hello_world/source.lt3 +0 -0
  104. data/test/{data → snapshots}/lines.txt +0 -0
  105. data/test/{data/raw_text_block → snapshots/more_complex_vars}/expected-error.txt +0 -0
  106. data/test/{data → snapshots}/more_complex_vars/expected-output.txt +0 -0
  107. data/test/{data → snapshots}/more_complex_vars/source.lt3 +0 -0
  108. data/test/{data/simple_copy/expected-error.txt → snapshots/predef_vars/actual-error.txt} +0 -0
  109. data/test/snapshots/predef_vars/actual-output.txt +6 -0
  110. data/test/{data/simple_include → snapshots/predef_vars}/expected-error.txt +0 -0
  111. data/test/{data → snapshots}/predef_vars/expected-output.txt +1 -1
  112. data/test/snapshots/predef_vars/out-sdiff.txt +7 -0
  113. data/test/{data → snapshots}/predef_vars/source.lt3 +0 -0
  114. data/test/{data/simple_mixin → snapshots/raw_lines}/expected-error.txt +0 -0
  115. data/test/{data → snapshots}/raw_lines/expected-output.txt +0 -0
  116. data/test/{data → snapshots}/raw_lines/source.lt3 +0 -0
  117. data/test/{data/simple_vars → snapshots/raw_text_block}/expected-error.txt +0 -0
  118. data/test/{data → snapshots}/raw_text_block/expected-output.txt +0 -0
  119. data/test/{data → snapshots}/raw_text_block/rawtext.inc +0 -0
  120. data/test/{data → snapshots}/raw_text_block/source.lt3 +0 -0
  121. data/test/{data/single_raw_line → snapshots/simple_copy}/expected-error.txt +0 -0
  122. data/test/{data → snapshots}/simple_copy/expected-output.txt +0 -0
  123. data/test/{data → snapshots}/simple_copy/simplefile.inc +0 -0
  124. data/test/{data → snapshots}/simple_copy/source.lt3 +0 -0
  125. data/test/{data/table_with_heredocs → snapshots/simple_include}/expected-error.txt +0 -0
  126. data/test/{data → snapshots}/simple_include/expected-output.txt +0 -0
  127. data/test/{data → snapshots}/simple_include/simplefile.inc +0 -0
  128. data/test/{data → snapshots}/simple_include/source.lt3 +0 -0
  129. data/test/snapshots/simple_mixin/actual-error.txt +2 -0
  130. data/test/snapshots/simple_mixin/actual-output.txt +4 -0
  131. data/test/{data/subset.txt → snapshots/simple_mixin/expected-error.txt} +0 -0
  132. data/test/{data → snapshots}/simple_mixin/expected-output.txt +0 -0
  133. data/test/snapshots/simple_mixin/out-sdiff.txt +6 -0
  134. data/test/{data → snapshots}/simple_mixin/simple_mixin.rb +0 -0
  135. data/test/{data → snapshots}/simple_mixin/source.lt3 +0 -0
  136. data/test/snapshots/simple_vars/expected-error.txt +0 -0
  137. data/test/{data → snapshots}/simple_vars/expected-output.txt +0 -0
  138. data/test/{data → snapshots}/simple_vars/source.lt3 +0 -0
  139. data/test/snapshots/single_raw_line/expected-error.txt +0 -0
  140. data/test/{data → snapshots}/single_raw_line/expected-output.txt +0 -0
  141. data/test/{data → snapshots}/single_raw_line/source.lt3 +0 -0
  142. data/test/snapshots/subset.txt +0 -0
  143. data/test/snapshots/table_with_heredocs/expected-error.txt +0 -0
  144. data/test/{data → snapshots}/table_with_heredocs/expected-output.txt +0 -0
  145. data/test/{data → snapshots}/table_with_heredocs/source.lt3 +0 -0
  146. data/test/snapshots.rb +219 -0
  147. data/test/testlines.rb +2 -2
  148. data/test/unit/all.rb +3 -0
  149. data/test/unit/html.rb +38 -0
  150. data/test/unit/parse_misc.rb +60 -0
  151. data/test/unit/parse_set.rb +157 -0
  152. data/test/unit/parser/all.rb +3 -0
  153. data/test/unit/parser/general.rb +59 -0
  154. data/test/unit/parser/importable.rb +19 -0
  155. data/test/unit/parser/mixin.rb +19 -0
  156. data/test/unit/parser/set.rb +157 -0
  157. data/test/unit/parser/string.rb +130 -0
  158. data/test/unit/parser.rb +4 -0
  159. data/test/unit/standard.rb +23 -0
  160. data/test/unit/stringparser.rb +140 -0
  161. metadata +152 -99
  162. data/test/data/error_inc_line_num/FOO +0 -21
  163. data/test/data/error_missing_end/ERR +0 -32
  164. data/test/data/error_name_not_permitted/expected-error.txt +0 -1
  165. data/test/data/error_no_such_copy/expected-err-line1match.txt +0 -1
  166. data/test/data/error_no_such_inc/expected-err-line1match.txt +0 -1
  167. data/test/test.rb +0 -140
data/lib/standard.rb CHANGED
@@ -1,5 +1,21 @@
1
+ require 'pathname' # For _seek - remove later??
2
+
3
+ require_relative 'parser' # nested requires
4
+ require_relative 'html'
5
+ require_relative 'helpers'
6
+
7
+ make_exception(:ExpectedOnOff, "Error: expected 'on' or 'off'")
8
+ make_exception(:DisallowedName, "Error: name %1 is invalid")
9
+ make_exception(:FileNotFound, "Error: file %1 not found")
10
+
11
+
12
+ # Module Standard comprises most of the standard or "common" methods.
13
+
1
14
  module Livetext::Standard
2
15
 
16
+ include HTMLHelper
17
+ include Helpers
18
+
3
19
  SimpleFormats = # Move this?
4
20
  { b: %w[<b> </b>],
5
21
  i: %w[<i> </i>],
@@ -8,7 +24,7 @@ module Livetext::Standard
8
24
 
9
25
  attr_reader :_data
10
26
 
11
- def data=(val)
27
+ def data=(val) # FIXME this is weird, let's not do it
12
28
  @_data = val.chomp
13
29
  @_args = val.split rescue []
14
30
  @_mixins = []
@@ -23,69 +39,75 @@ module Livetext::Standard
23
39
  end
24
40
 
25
41
  def backtrace
26
- arg = @_args.first
27
- @backtrace = true
28
- @backtrace = false if arg == "off"
42
+ @backtrace = onoff(@_args.first)
43
+ _optional_blank_line
29
44
  end
30
45
 
31
46
  def comment
32
47
  _body
48
+ _optional_blank_line
33
49
  end
34
50
 
35
51
  def shell
36
52
  cmd = @_data.chomp
37
- # _errout("Running: #{cmd}")
38
53
  system(cmd)
54
+ _optional_blank_line
39
55
  end
40
56
 
41
57
  def func
42
58
  funcname = @_args[0]
43
- _error! "Illegal name '#{funcname}'" if _disallowed?(funcname)
44
- func_def = <<-EOS
59
+ check_disallowed(funcname)
60
+ func_def = <<~EOS
45
61
  def #{funcname}(param)
46
62
  #{_body.to_a.join("\n")}
47
63
  end
48
- EOS
64
+ EOS
49
65
  _optional_blank_line
50
-
66
+
51
67
  Livetext::Functions.class_eval func_def
52
68
  end
53
69
 
54
- def h1; _out "<h1>#{@_data}</h1>"; end
55
- def h2; _out "<h2>#{@_data}</h2>"; end
56
- def h3; _out "<h3>#{@_data}</h3>"; end
57
- def h4; _out "<h4>#{@_data}</h4>"; end
58
- def h5; _out "<h5>#{@_data}</h5>"; end
59
- def h6; _out "<h6>#{@_data}</h6>"; end
70
+ def h1; _out wrapped(@_data, :h1); end
71
+ def h2; _out wrapped(@_data, :h2); end
72
+ def h3; _out wrapped(@_data, :h3); end
73
+ def h4; _out wrapped(@_data, :h4); end
74
+ def h5; _out wrapped(@_data, :h5); end
75
+ def h6; _out wrapped(@_data, :h6); end
60
76
 
61
77
  def list
62
- _out "<ul>"
63
- _body {|line| _out "<li>#{line}</li>" }
64
- _out "</ul>"
78
+ wrap :ul do
79
+ _body {|line| _out wrapped(line, :li) }
80
+ end
81
+ _optional_blank_line
65
82
  end
66
83
 
67
84
  def list!
68
- _out "<ul>"
69
- lines = _body.each # {|line| _out "<li>#{line}</li>" }
70
- loop do
71
- line = lines.next
72
- line = _format(line)
73
- if line[0] == " "
74
- _out line
75
- else
76
- _out "<li>#{line}</li>"
85
+ wrap(:ul) do
86
+ lines = _body.each # enumerator
87
+ loop do
88
+ line = lines.next
89
+ line = _format(line)
90
+ str = line[0] == " " ? line : wrapped(line, :li)
91
+ _out str
77
92
  end
78
93
  end
79
- _out "</ul>"
94
+ _optional_blank_line
80
95
  end
81
96
 
82
97
  def shell!
83
98
  cmd = @_data.chomp
84
99
  system(cmd)
100
+ _optional_blank_line
85
101
  end
86
102
 
87
103
  def errout
104
+ STDERR.puts @_data.chomp
105
+ _optional_blank_line
106
+ end
107
+
108
+ def ttyout
88
109
  TTY.puts @_data.chomp
110
+ _optional_blank_line
89
111
  end
90
112
 
91
113
  def say
@@ -96,133 +118,40 @@ EOS
96
118
 
97
119
  def banner
98
120
  str = _format(@_data.chomp)
99
- n = str.length - 1
100
- puts "-"*n
101
- puts str
102
- puts "-"*n
121
+ num = str.length - 1
122
+ decor = "-"*num + "\n"
123
+ puts decor + str + "\n" + decor
103
124
  end
104
125
 
105
126
  def quit
106
127
  puts @body
107
128
  @body = ""
108
129
  @output.close
109
- # exit!
110
130
  end
111
131
 
112
-
113
132
  def cleanup
114
- @_args.each do |item|
115
- if ::File.directory?(item)
116
- system("rm -f #{item}/*")
117
- else
118
- ::FileUtils.rm(item)
119
- end
133
+ @_args.each do |item|
134
+ cmd = ::File.directory?(item) ? "rm -f #{item}/*" : "rm #{item}"
135
+ system(cmd)
120
136
  end
121
137
  end
122
138
 
123
139
  def _def
124
140
  name = @_args[0]
125
141
  str = "def #{name}\n"
126
- raise "Illegal name '#{name}'" if _disallowed?(name)
127
- str += _body(true).join("\n")
128
- str += "\nend\n"
142
+ check_disallowed(name)
143
+ # Difficult to avoid eval here
144
+ str << _body(true).join("\n")
145
+ str << "\nend\n"
129
146
  eval str
130
- rescue => err
131
- _error!(err)
147
+ # rescue => err
148
+ # _error!(err)
132
149
  end
133
150
 
134
151
  def set
135
- # FIXME bug -- .set var="RIP, Hope Gallery"
136
- assigns = @_data.chomp.split(/, */)
137
- # Do a better way?
138
- # FIXME *Must* allow for vars/functions
139
- assigns.each do |a|
140
- var, val = a.split("=")
141
- var.strip!
142
- val.strip!
143
- val = val[1..-2] if val[0] == ?" && val[-1] == ?"
144
- val = val[1..-2] if val[0] == ?' && val[-1] == ?'
145
- val = FormatLine.var_func_parse(val)
146
- @parent._setvar(var, val)
147
- end
148
- _optional_blank_line
149
- end
150
-
151
- def _assign_get_var(c, e)
152
- name = c
153
- loop do
154
- c = e.peek
155
- case c
156
- when /[a-zA-Z_\.0-9]/
157
- name << e.next
158
- next
159
- when / =/
160
- return name
161
- else
162
- raise "Error: did not expect #{c.inspect} in variable name"
163
- end
164
- end
165
- raise "Error: loop ended parsing variable name"
166
- end
167
-
168
- def _assign_skip_equal(e)
169
- loop { break if e.peek != " "; e.next }
170
- if e.peek == "="
171
- e.next # skip spaces too
172
- loop { break if e.peek != " "; e.next }
173
- else
174
- raise "Error: expect equal sign"
175
- end
176
- end
177
-
178
- def _quoted_value(quote, e)
179
- value = ""
180
- loop do
181
- c = e.next
182
- break if c == quote
183
- value << c
184
- end
185
- value
186
- end
187
-
188
- def _unquoted_value(e)
189
- value = ""
190
- loop do
191
- c = e.next
192
- break if c == " " || c == ","
193
- value << c
194
- end
195
- value
196
- end
197
-
198
- def _assign_get_value
199
- c = e.peek
200
- value = ""
201
- case c
202
- when ?", ?'
203
- value = _quoted_value(c, e)
204
- else
205
- value = _unquoted_value(e)
206
- end
207
- c = e.peek
208
- value
209
- end
210
-
211
- def set_NEW
212
152
  line = _data.chomp
213
- e = line.each_char # enum
214
- loop do
215
- c = e.next
216
- case c
217
- when /a-z/i
218
- _assign_get_var(c, e)
219
- _assign_skip_equal
220
- when " "
221
- next
222
- else
223
- raise "set: Huh? line = #{line}"
224
- end
225
- end
153
+ pairs = Livetext::ParseSet.new(line).parse
154
+ set_variables(pairs)
226
155
  end
227
156
 
228
157
  def variables! # cwd, not FileDir - weird, fix later
@@ -235,14 +164,8 @@ EOS
235
164
  else
236
165
  lines = _body
237
166
  end
238
- lines.map! {|x| x.sub(/# .*/, "").strip } # strip comments
239
- lines.each do |line|
240
- next if line.strip.empty?
241
- var, val = line.split(" ", 2)
242
- val = FormatLine.var_func_parse(val)
243
- var = prefix + "." + var if prefix
244
- @parent._setvar(var, val)
245
- end
167
+ pairs = Livetext::ParseMisc.parse_vars(prefix, lines)
168
+ set_variables(pairs)
246
169
  end
247
170
 
248
171
  def variables
@@ -255,89 +178,63 @@ EOS
255
178
  else
256
179
  lines = _body
257
180
  end
258
- lines.map! {|x| x.sub(/# .*/, "").strip } # strip comments
259
- lines.each do |line|
260
- next if line.strip.empty?
261
- var, val = line.split(" ", 2)
262
- val = FormatLine.var_func_parse(val)
263
- var = prefix + "." + var if prefix
264
- @parent._setvar(var, val)
265
- end
266
- end
267
-
268
- def reval
269
- eval _data.chomp
270
- end
271
-
272
- def heredoc! # adds <br>...
273
- _heredoc(true)
181
+ pairs = Livetext::ParseMisc.parse_vars(prefix, lines)
182
+ set_variables(pairs)
274
183
  end
275
184
 
276
185
  def heredoc
277
- _heredoc
278
- end
279
-
280
- def _heredoc(bang=false)
281
186
  var = @_args[0]
282
- str = _body.join("\n")
283
- s2 = ""
284
- str.each_line do |s|
285
- str = FormatLine.var_func_parse(s.chomp)
286
- s2 << str + "<br>"
187
+ text = _body.join("\n")
188
+ rhs = ""
189
+ text.each_line do |line|
190
+ str = FormatLine.var_func_parse(line.chomp)
191
+ rhs << str + "<br>"
287
192
  end
288
193
  indent = @parent.indentation.last
289
194
  indented = " " * indent
290
- @parent._setvar(var, s2.chomp)
195
+ @parent._setvar(var, rhs.chomp)
291
196
  _optional_blank_line
292
197
  end
293
198
 
294
199
  def _seek(file)
295
- require 'pathname' # ;)
296
200
  value = nil
297
- if File.exist?(file)
298
- return file
299
- else
300
- count = 1
301
- loop do
302
- front = "../" * count
303
- count += 1
304
- here = Pathname.new(front).expand_path.dirname.to_s
305
- break if here == "/"
306
- path = front + file
307
- value = path if File.exist?(path)
308
- break if value
309
- end
310
- end
201
+ return file if File.exist?(file)
202
+
203
+ count = 1
204
+ loop do
205
+ front = "../" * count
206
+ count += 1
207
+ here = Pathname.new(front).expand_path.dirname.to_s
208
+ break if here == "/"
209
+ path = front + file
210
+ value = path if File.exist?(path)
211
+ break if value
212
+ end
311
213
  STDERR.puts "Cannot find #{file.inspect} from #{Dir.pwd}" unless value
312
214
  return value
313
215
  rescue
314
216
  STDERR.puts "Can't find #{file.inspect} from #{Dir.pwd}"
315
217
  return nil
316
218
  end
317
-
318
- def seek
319
- # like include, but search upward as needed
219
+
220
+ def seek # like include, but search upward as needed
320
221
  file = @_args.first
321
222
  file = _seek(file)
322
- _error!("No such include file #{file.inspect}") unless file
223
+ check_file_exists(file)
323
224
  @parent.process_file(file)
324
225
  _optional_blank_line
325
- rescue => err
326
- STDERR.puts ".seek error - #{err}"
327
- STDERR.puts err.inspect
328
- return nil
329
226
  end
330
227
 
331
228
  def in_out # FIXME dumb name!
332
229
  file, dest = *@_args
333
- _check_existence(file, "No such include file #{file.inspect}")
230
+ check_file_exists(file)
334
231
  @parent.process_file(file, dest)
335
232
  _optional_blank_line
336
233
  end
337
234
 
338
- def _include
235
+ def _include # dot command
339
236
  file = _format(@_args.first) # allows for variables
340
- _check_existence(file, "No such include file #{file.inspect}")
237
+ check_file_exists(file)
341
238
  @parent.process_file(file)
342
239
  _optional_blank_line
343
240
  end
@@ -350,63 +247,37 @@ EOS
350
247
  def inherit
351
248
  file = @_args.first
352
249
  upper = "../#{file}"
353
- good = (File.exist?(upper) || File.exist?(file))
250
+ got_upper, got_file = File.exist?(upper), File.exist?(file)
251
+ good = got_upper || got_file
354
252
  _error!("File #{file} not found (local or parent)") unless good
355
253
 
356
- @parent.process_file(upper) if File.exist?(upper)
357
- @parent.process_file(file) if File.exist?(file)
254
+ @parent.process_file(upper) if got_upper
255
+ @parent.process_file(file) if got_file
358
256
  _optional_blank_line
359
257
  end
360
258
 
361
- # def include! # FIXME huh?
362
- # file = @_args.first
363
- # return unless File.exist?(file)
364
- #
365
- # lines = @parent.process_file(file)
366
- # #? File.delete(file)
367
- # _optional_blank_line
368
- # end
369
-
370
- def _mixin(name)
371
- @_args = [name]
372
- mixin
373
- end
374
-
375
259
  def mixin
376
260
  name = @_args.first # Expect a module name
377
- file = "#{Plugins}/" + name.downcase + ".rb"
378
261
  return if @_mixins.include?(name)
379
- file = "./#{name}.rb" unless File.exist?(file)
380
- if File.exist?(file)
381
- # Just keep going...
382
- else
383
- if File.dirname(File.expand_path(".")) != "/"
384
- Dir.chdir("..") { mixin }
385
- return
386
- else
387
- raise "No such mixin '#{name}'"
388
- # STDERR.puts "No such mixin '#{name}'"
389
- # puts @body
390
- # exit!
391
- end
392
- end
262
+ @_mixins << name
263
+ parse = Livetext::ParseMixin.new(name) # FIXME??
264
+ file = parse.find_mixin(name)
265
+ parse.use_mixin(name, file)
266
+ _optional_blank_line
267
+ end
393
268
 
269
+ def import
270
+ name = @_args.first # Expect a module name
271
+ return if @_mixins.include?(name)
394
272
  @_mixins << name
395
- meths = grab_file(file)
396
- modname = name.gsub("/","_").capitalize
397
- string = "module ::#{modname}; #{meths}\nend"
398
-
399
- eval(string)
400
- newmod = Object.const_get("::" + modname)
401
- self.extend(newmod)
402
- init = "init_#{name}"
403
- self.send(init) if self.respond_to? init
273
+ parse = Livetext::ParseImport.new(name)
274
+ parse.use_import(name)
404
275
  _optional_blank_line
405
276
  end
406
277
 
407
278
  def copy
408
279
  file = @_args.first
409
- _check_existence(file, "No such file '#{file}' to copy")
280
+ check_file_exists(file)
410
281
  _out grab_file(file)
411
282
  _optional_blank_line
412
283
  end
@@ -417,24 +288,16 @@ EOS
417
288
 
418
289
  def raw
419
290
  # No processing at all (terminate with __EOF__)
420
- _raw_body {|x| _out x } # no formatting
291
+ _raw_body {|line| _out line } # no formatting
421
292
  end
422
293
 
423
294
  def debug
424
- arg = @_args.first
425
- self._debug = true
426
- self._debug = false if arg == "off"
295
+ self._debug = onoff(@_args.first)
427
296
  end
428
297
 
429
298
  def passthru
430
- # FIXME - add check for args size (helpers); _onoff helper??
431
- onoff = _args.first
432
- case onoff
433
- when nil; @_nopass = false
434
- when "on"; @_nopass = false
435
- when "off"; @_nopass = true
436
- else _error!("Unknown arg '#{onoff}'")
437
- end
299
+ # FIXME - add check for args size? (helpers)
300
+ @_nopass = ! onoff(_args.first)
438
301
  end
439
302
 
440
303
  def nopass
@@ -442,13 +305,20 @@ EOS
442
305
  end
443
306
 
444
307
  def para
445
- # FIXME - add check for args size (helpers); _onoff helper??
446
- onoff = _args.first
447
- case onoff
448
- when nil; @_nopara = false
449
- when "on"; @_nopara = false
450
- when "off"; @_nopara = true
451
- else _error!("Unknown arg '#{onoff}'")
308
+ # FIXME - add check for args size? (helpers)
309
+ @_nopara = ! onoff(_args.first)
310
+ end
311
+
312
+ def onoff(arg) # helper
313
+ arg ||= "on"
314
+ raise ExpectedOnOff unless String === arg
315
+ case arg.downcase
316
+ when "on"
317
+ return true
318
+ when "off"
319
+ return false
320
+ else
321
+ raise ExpectedOnOff
452
322
  end
453
323
  end
454
324
 
@@ -467,39 +337,23 @@ EOS
467
337
  _out "<p/>"
468
338
  end
469
339
 
470
- def invoke(str)
471
- end
472
-
473
340
  def mono
474
- _out "<pre>"
475
- _body(true) {|line| _out line }
476
- _out "</pre>"
341
+ wrap ":pre" do
342
+ _body(true) {|line| _out line }
343
+ end
477
344
  _optional_blank_line
478
345
  end
479
346
 
480
347
  def dlist
481
348
  delim = _args.first
482
- _out "<dl>"
483
- _body do |line|
484
- line = _format(line)
485
- term, defn = line.split(delim)
486
- _out "<dt>#{term}</dt>"
487
- _out "<dd>#{defn}</dd>"
488
- end
489
- _out "</dl>"
490
- end
491
-
492
- def old_dlist
493
- delim = _args.first
494
- _out "<table>"
495
- _body do |line|
496
- line = _format(line)
497
- term, defn = line.split(delim)
498
- _out "<tr>"
499
- _out "<td width=3%><td width=10%>#{term}</td><td>#{defn}</td>"
500
- _out "</tr>"
349
+ wrap(:dl) do
350
+ _body do |line|
351
+ line = _format(line)
352
+ term, defn = line.split(delim)
353
+ _out wrapped(term, :dt)
354
+ _out wrapped(defn, :dd)
355
+ end
501
356
  end
502
- _out "</table>"
503
357
  end
504
358
 
505
359
  def link
@@ -518,21 +372,19 @@ EOS
518
372
  line = _format(line)
519
373
  line.gsub!(/\n+/, "<br>")
520
374
  cells = line.split(delim)
521
- wide = cells.map {|x| x.length }
375
+ wide = cells.map {|cell| cell.length }
522
376
  maxw = [0] * cells.size
523
377
  maxw = maxw.map.with_index {|x, i| [x, wide[i]].max }
524
378
  end
525
-
379
+
526
380
  sum = maxw.inject(0, :+)
527
381
  maxw.map! {|x| (x/sum*100).floor }
528
-
382
+
529
383
  lines.each do |line|
530
384
  cells = line.split(delim)
531
- _out "<tr>"
532
- cells.each.with_index do |cell, i|
533
- _out " <td valign=top>#{cell}</td>"
385
+ wrap :tr do
386
+ cells.each {|cell| _out " <td valign=top>#{cell}</td>" }
534
387
  end
535
- _out "</tr>"
536
388
  end
537
389
  _out "</table></center>"
538
390
  end
@@ -543,10 +395,10 @@ EOS
543
395
  end
544
396
 
545
397
  def br
546
- n = _args.first || "1"
398
+ num = _args.first || "1"
547
399
  out = ""
548
- n.to_i.times { out << "<br>" }
400
+ num.to_i.times { out << "<br>" }
549
401
  _out out
550
402
  end
551
403
 
552
- end
404
+ end
data/lib/userapi.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  # User API
2
2
 
3
- require 'formatline'
3
+ require_relative 'formatline'
4
4
 
5
+ # UserAPI deals mostly with user-level methods.
5
6
  module Livetext::UserAPI
6
7
 
7
8
  def setvar(var, val)
data/livetext.gemspec CHANGED
@@ -1,8 +1,7 @@
1
1
  require 'date'
2
2
  require 'find'
3
3
 
4
- $: << "."
5
- require "lib/livetext"
4
+ require_relative "lib/livetext"
6
5
 
7
6
  Gem::Specification.new do |s|
8
7
  system("rm -f *.gem")
data/test/all.rb ADDED
@@ -0,0 +1,3 @@
1
+
2
+ require_relative 'unit/all'
3
+ require_relative 'snapshots' # snapshots
data/test/formatting.rb CHANGED
@@ -1,13 +1,6 @@
1
- def minitest?
2
- require 'minitest/autorun'
3
- end
4
-
5
- abort "minitest gem is not installed" unless minitest?
6
-
7
-
8
- $LOAD_PATH << "./lib"
1
+ require 'minitest/autorun'
9
2
 
10
- require 'livetext'
3
+ require_relative '../lib/livetext'
11
4
 
12
5
  class TestingLivetext < MiniTest::Test
13
6
 
File without changes