livetext 0.9.01 → 0.9.06
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.
- checksums.yaml +4 -4
- data/lib/formatline.rb +3 -0
- data/lib/livetext.rb +31 -80
- data/lib/processor.rb +1 -1
- data/lib/standard.rb +26 -13
- data/lib/userapi.rb +13 -10
- data/plugin/bookish.rb +45 -18
- data/plugin/calibre.rb +4 -2
- data/test/data/basic_formatting/expected-output.txt +1 -1
- data/test/data/error_invalid_name/expected-err-line1match.txt +1 -0
- data/test/data/error_line_num/expected-err-line1match.txt +1 -0
- data/test/data/example_alpha2/source.lt3 +1 -1
- data/test/data/lines.txt +2 -2
- data/test/test.rb +35 -3
- metadata +8 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4070b2fad292adbaaf7e01d3436d352e91c4af4d51a9cdf4217af97ab9650d2f
|
|
4
|
+
data.tar.gz: 483229184f006895624ab5bb9abecf3c64e131d813ad7ec5f7dca761d148890b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8fa6323f64814746b0181b7440b3f85638c1a42275816aa541d41dccbfccf20d2730f6a4d151981a7232f7c89fb3f165d6f35ec1d2df1b8bfcf81b9ccaeec854
|
|
7
|
+
data.tar.gz: 89f65b89dd48f01ea6afa008fbd5db90ff68349cdc5fc2a45e7653830d631d230962b0c04b5a0b3406ad3fccd95b8c0eff21afdf84016a3186721257cc081dc6
|
data/lib/formatline.rb
CHANGED
|
@@ -195,6 +195,7 @@ class FormatLine
|
|
|
195
195
|
end
|
|
196
196
|
|
|
197
197
|
def add_token(kind, token = @token)
|
|
198
|
+
return if token.nil?
|
|
198
199
|
@tokenlist << [kind, token] unless token.empty?
|
|
199
200
|
@token = Null.dup
|
|
200
201
|
end
|
|
@@ -352,6 +353,8 @@ class FormatLine
|
|
|
352
353
|
grab # ZZZ
|
|
353
354
|
loop do
|
|
354
355
|
case
|
|
356
|
+
when curr.nil?
|
|
357
|
+
return str
|
|
355
358
|
when curr == Escape
|
|
356
359
|
str << escaped
|
|
357
360
|
next
|
data/lib/livetext.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
class Livetext
|
|
2
|
-
VERSION = "0.9.
|
|
2
|
+
VERSION = "0.9.06"
|
|
3
3
|
Path = File.expand_path(File.join(File.dirname(__FILE__)))
|
|
4
4
|
end
|
|
5
5
|
|
|
@@ -31,6 +31,10 @@ class Livetext
|
|
|
31
31
|
attr_accessor :output # both bad solutions?
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
+
def vars
|
|
35
|
+
Livetext::Vars.dup
|
|
36
|
+
end
|
|
37
|
+
|
|
34
38
|
def self.customize(mix: [], call: [], vars: {})
|
|
35
39
|
obj = self.new
|
|
36
40
|
mix = Array(mix)
|
|
@@ -50,10 +54,6 @@ class Livetext
|
|
|
50
54
|
self
|
|
51
55
|
end
|
|
52
56
|
|
|
53
|
-
def vars
|
|
54
|
-
Livetext::Vars.dup
|
|
55
|
-
end
|
|
56
|
-
|
|
57
57
|
Space = " "
|
|
58
58
|
Sigil = "." # Can't change yet
|
|
59
59
|
|
|
@@ -73,29 +73,30 @@ class Livetext
|
|
|
73
73
|
@body = ""
|
|
74
74
|
@main = Processor.new(self, output)
|
|
75
75
|
@indentation = [0]
|
|
76
|
+
@_vars = Livetext::Vars
|
|
76
77
|
end
|
|
77
78
|
|
|
78
|
-
def _parse_colon_args(args, hash) # really belongs in livetext
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
79
|
+
def _parse_colon_args(args, hash) # really belongs in livetext
|
|
80
|
+
h2 = hash.dup
|
|
81
|
+
e = args.each
|
|
82
|
+
loop do
|
|
83
|
+
arg = e.next.chop.to_sym
|
|
84
|
+
raise "_parse_args: #{arg} is unknown" unless hash.keys.include?(arg)
|
|
85
|
+
h2[arg] = e.next
|
|
86
|
+
end
|
|
87
|
+
h2 = h2.reject {|k,v| v.nil? }
|
|
88
|
+
h2.each_pair {|k, v| raise "#{k} has no value" if v.empty? }
|
|
89
|
+
h2
|
|
85
90
|
end
|
|
86
|
-
h2 = h2.reject {|k,v| v.nil? }
|
|
87
|
-
h2.each_pair {|k, v| raise "#{k} has no value" if v.empty? }
|
|
88
|
-
h2
|
|
89
|
-
end
|
|
90
91
|
|
|
91
|
-
def _get_arg(name, args) # really belongs in livetext
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
end
|
|
92
|
+
def _get_arg(name, args) # really belongs in livetext
|
|
93
|
+
raise "(#{name}) Expected an array" unless args.is_a? Array
|
|
94
|
+
raise "(#{name}) Expected an arg" if args.empty?
|
|
95
|
+
raise "(#{name}) Too many args: #{args.inspect}" if args.size > 1
|
|
96
|
+
val = args[0]
|
|
97
|
+
raise "Expected an argument '#{name}'" if val.nil?
|
|
98
|
+
val
|
|
99
|
+
end
|
|
99
100
|
|
|
100
101
|
def mixin(mod)
|
|
101
102
|
@main._mixin(mod)
|
|
@@ -105,6 +106,8 @@ end
|
|
|
105
106
|
str, sym = var.to_s, var.to_sym
|
|
106
107
|
Livetext::Vars[str] = val
|
|
107
108
|
Livetext::Vars[sym] = val
|
|
109
|
+
@_vars[str] = val
|
|
110
|
+
@_vars[sym] = val
|
|
108
111
|
end
|
|
109
112
|
|
|
110
113
|
def _setfile(file)
|
|
@@ -166,50 +169,13 @@ end
|
|
|
166
169
|
self.body
|
|
167
170
|
end
|
|
168
171
|
|
|
169
|
-
def xform_file(file, vars: {})
|
|
172
|
+
def xform_file(file) # , vars: {})
|
|
170
173
|
Livetext::Vars.replace(vars) unless vars.nil?
|
|
174
|
+
@_vars.replace(vars) unless vars.nil?
|
|
171
175
|
self.process_file(file)
|
|
172
176
|
self.body
|
|
173
177
|
end
|
|
174
178
|
|
|
175
|
-
# def transform(text)
|
|
176
|
-
# _setfile!("(string)")
|
|
177
|
-
# @output = ::Livetext.output
|
|
178
|
-
# enum = text.each_line
|
|
179
|
-
# front = text.match(/.*?\n/).to_a.first.chomp rescue "..."
|
|
180
|
-
# @main.source(enum, "STDIN: '#{front}...'", 0)
|
|
181
|
-
# loop do
|
|
182
|
-
# line = @main.nextline
|
|
183
|
-
# break if line.nil?
|
|
184
|
-
# process_line(line) # transform_line ???
|
|
185
|
-
# end
|
|
186
|
-
# @body
|
|
187
|
-
# end
|
|
188
|
-
|
|
189
|
-
## FIXME don't need process *and* process_text
|
|
190
|
-
|
|
191
|
-
# def process_text(text)
|
|
192
|
-
# _setfile!("(string)")
|
|
193
|
-
# text = text.split("\n") if text.is_a? String
|
|
194
|
-
# enum = text.each
|
|
195
|
-
# @backtrace = false
|
|
196
|
-
# front = text[0].chomp
|
|
197
|
-
# @main.source(enum, "(text): '#{front}...'", 0)
|
|
198
|
-
# loop do
|
|
199
|
-
# line = @main.nextline
|
|
200
|
-
# break if line.nil?
|
|
201
|
-
# process_line(line)
|
|
202
|
-
# end
|
|
203
|
-
# val = @main.finalize if @main.respond_to? :finalize
|
|
204
|
-
# val
|
|
205
|
-
# rescue => err
|
|
206
|
-
# puts "process_text: err = #{err}"
|
|
207
|
-
## puts err.backtrace.join("\n")
|
|
208
|
-
# puts @body
|
|
209
|
-
# @body = ""
|
|
210
|
-
# return @body
|
|
211
|
-
# end
|
|
212
|
-
|
|
213
179
|
## FIXME process_file[!] should call process[_text]
|
|
214
180
|
|
|
215
181
|
def process_file(fname, btrace=false)
|
|
@@ -231,21 +197,6 @@ end
|
|
|
231
197
|
@body = ""
|
|
232
198
|
end
|
|
233
199
|
|
|
234
|
-
# def process_file!(fname, backtrace=false)
|
|
235
|
-
# _setfile(fname)
|
|
236
|
-
# raise "No such file '#{fname}' to process" unless File.exist?(fname)
|
|
237
|
-
# @main.output = StringIO.new
|
|
238
|
-
# enum = File.readlines(fname).each
|
|
239
|
-
# @backtrace = backtrace
|
|
240
|
-
# @main.source(enum, fname, 0)
|
|
241
|
-
# loop do
|
|
242
|
-
# line = @main.nextline
|
|
243
|
-
# break if line.nil?
|
|
244
|
-
# process_line(line)
|
|
245
|
-
# end
|
|
246
|
-
# @main.finalize if @main.respond_to? :finalize
|
|
247
|
-
# end
|
|
248
|
-
|
|
249
200
|
def handle_scomment(line)
|
|
250
201
|
end
|
|
251
202
|
|
|
@@ -265,13 +216,13 @@ end
|
|
|
265
216
|
|
|
266
217
|
def handle_dotcmd(line, indent = 0)
|
|
267
218
|
indent = @indentation.last # top of stack
|
|
268
|
-
line = line.sub(/# .*$/, "")
|
|
219
|
+
line = line.sub(/# .*$/, "")
|
|
269
220
|
name = _get_name(line).to_sym
|
|
270
221
|
result = nil
|
|
271
222
|
if @main.respond_to?(name)
|
|
272
223
|
result = @main.send(name)
|
|
273
224
|
else
|
|
274
|
-
@main._error! "Name '#{name}' is unknown
|
|
225
|
+
@main._error! "Name '#{name}' is unknown"
|
|
275
226
|
return
|
|
276
227
|
end
|
|
277
228
|
result
|
data/lib/processor.rb
CHANGED
|
@@ -35,7 +35,7 @@ class Livetext
|
|
|
35
35
|
def _error!(err, abort=true, trace=false)
|
|
36
36
|
where = @sources.last || @save_location
|
|
37
37
|
puts @parent.body
|
|
38
|
-
STDERR.puts "Error: #{err} (at #{where[1]} line #{where[2]})"
|
|
38
|
+
STDERR.puts "Error: #{err} " # (at #{where[1]} line #{where[2]})"
|
|
39
39
|
STDERR.puts err.backtrace if err.respond_to?(:backtrace) # && trace
|
|
40
40
|
exit if abort
|
|
41
41
|
end
|
data/lib/standard.rb
CHANGED
|
@@ -9,7 +9,7 @@ module Livetext::Standard
|
|
|
9
9
|
attr_reader :_data
|
|
10
10
|
|
|
11
11
|
def data=(val)
|
|
12
|
-
@_data = val
|
|
12
|
+
@_data = val.chomp
|
|
13
13
|
@_args = val.split rescue []
|
|
14
14
|
@_mixins = []
|
|
15
15
|
end
|
|
@@ -33,7 +33,7 @@ module Livetext::Standard
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def shell
|
|
36
|
-
cmd = @_data
|
|
36
|
+
cmd = @_data.chomp
|
|
37
37
|
# _errout("Running: #{cmd}")
|
|
38
38
|
system(cmd)
|
|
39
39
|
end
|
|
@@ -49,23 +49,30 @@ EOS
|
|
|
49
49
|
Livetext::Functions.class_eval func_def
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
+
def h1; _out "<h1>#{@_data}</h1>"; end
|
|
53
|
+
def h2; _out "<h2>#{@_data}</h2>"; end
|
|
54
|
+
def h3; _out "<h3>#{@_data}</h3>"; end
|
|
55
|
+
def h4; _out "<h4>#{@_data}</h4>"; end
|
|
56
|
+
def h5; _out "<h5>#{@_data}</h5>"; end
|
|
57
|
+
def h6; _out "<h6>#{@_data}</h6>"; end
|
|
58
|
+
|
|
52
59
|
def shell!
|
|
53
|
-
cmd = @_data
|
|
60
|
+
cmd = @_data.chomp
|
|
54
61
|
system(cmd)
|
|
55
62
|
end
|
|
56
63
|
|
|
57
64
|
def errout
|
|
58
|
-
TTY.puts @_data
|
|
65
|
+
TTY.puts @_data.chomp
|
|
59
66
|
end
|
|
60
67
|
|
|
61
68
|
def say
|
|
62
|
-
str = _format(@_data)
|
|
69
|
+
str = _format(@_data.chomp)
|
|
63
70
|
TTY.puts str
|
|
64
71
|
_optional_blank_line
|
|
65
72
|
end
|
|
66
73
|
|
|
67
74
|
def banner
|
|
68
|
-
str = _format(@_data)
|
|
75
|
+
str = _format(@_data.chomp)
|
|
69
76
|
n = str.length - 1
|
|
70
77
|
puts "-"*n
|
|
71
78
|
puts str
|
|
@@ -94,7 +101,7 @@ EOS
|
|
|
94
101
|
name = @_args[0]
|
|
95
102
|
str = "def #{name}\n"
|
|
96
103
|
raise "Illegal name '#{name}'" if _disallowed?(name)
|
|
97
|
-
str +=
|
|
104
|
+
str += _body(true).join("\n")
|
|
98
105
|
str += "\nend\n"
|
|
99
106
|
eval str
|
|
100
107
|
rescue => err
|
|
@@ -179,7 +186,7 @@ EOS
|
|
|
179
186
|
end
|
|
180
187
|
|
|
181
188
|
def set_NEW
|
|
182
|
-
line = _data.
|
|
189
|
+
line = _data.chomp
|
|
183
190
|
e = line.each_char # enum
|
|
184
191
|
loop do
|
|
185
192
|
c = e.next
|
|
@@ -205,6 +212,7 @@ EOS
|
|
|
205
212
|
else
|
|
206
213
|
lines = _body
|
|
207
214
|
end
|
|
215
|
+
lines.map! {|x| x.sub(/# .*/, "").strip } # strip comments
|
|
208
216
|
lines.each do |line|
|
|
209
217
|
next if line.strip.empty?
|
|
210
218
|
var, val = line.split(" ", 2)
|
|
@@ -215,12 +223,12 @@ EOS
|
|
|
215
223
|
end
|
|
216
224
|
|
|
217
225
|
def reval
|
|
218
|
-
eval _data
|
|
226
|
+
eval _data.chomp
|
|
219
227
|
end
|
|
220
228
|
|
|
221
229
|
def heredoc
|
|
222
230
|
var = @_args[0]
|
|
223
|
-
str =
|
|
231
|
+
str = _body.join("\n")
|
|
224
232
|
s2 = ""
|
|
225
233
|
str.each_line do |s|
|
|
226
234
|
str = FormatLine.var_func_parse(s.chomp)
|
|
@@ -346,7 +354,7 @@ EOS
|
|
|
346
354
|
end
|
|
347
355
|
|
|
348
356
|
def r
|
|
349
|
-
_out @_data # No processing at all
|
|
357
|
+
_out @_data.chomp # No processing at all
|
|
350
358
|
end
|
|
351
359
|
|
|
352
360
|
def raw
|
|
@@ -392,7 +400,7 @@ EOS
|
|
|
392
400
|
|
|
393
401
|
def heading
|
|
394
402
|
_print "<center><font size=+1><b>"
|
|
395
|
-
_print @_data
|
|
403
|
+
_print @_data.chomp
|
|
396
404
|
_print "</b></font></center>"
|
|
397
405
|
end
|
|
398
406
|
|
|
@@ -443,7 +451,7 @@ EOS
|
|
|
443
451
|
end
|
|
444
452
|
|
|
445
453
|
def xtable # Borrowed from bookish - FIXME
|
|
446
|
-
title = @_data
|
|
454
|
+
title = @_data.chomp
|
|
447
455
|
delim = " :: "
|
|
448
456
|
_out "<br><center><table width=90% cellpadding=5>"
|
|
449
457
|
lines = _body(true)
|
|
@@ -471,6 +479,11 @@ EOS
|
|
|
471
479
|
_out "</table></center>"
|
|
472
480
|
end
|
|
473
481
|
|
|
482
|
+
def image
|
|
483
|
+
name = @_args[0]
|
|
484
|
+
_out "<img src='#{name}'></img>"
|
|
485
|
+
end
|
|
486
|
+
|
|
474
487
|
def br
|
|
475
488
|
n = _args.first || "1"
|
|
476
489
|
out = ""
|
data/lib/userapi.rb
CHANGED
|
@@ -19,6 +19,7 @@ module Livetext::UserAPI
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def _args
|
|
22
|
+
@_args = _format(@_data).chomp.split
|
|
22
23
|
if block_given?
|
|
23
24
|
@_args.each {|arg| yield arg }
|
|
24
25
|
else
|
|
@@ -26,6 +27,10 @@ module Livetext::UserAPI
|
|
|
26
27
|
end
|
|
27
28
|
end
|
|
28
29
|
|
|
30
|
+
def _vars
|
|
31
|
+
@_vars.dup
|
|
32
|
+
end
|
|
33
|
+
|
|
29
34
|
def _optional_blank_line
|
|
30
35
|
peek = peek_nextline
|
|
31
36
|
return if peek.nil?
|
|
@@ -68,19 +73,20 @@ module Livetext::UserAPI
|
|
|
68
73
|
end
|
|
69
74
|
|
|
70
75
|
def _body(raw=false)
|
|
71
|
-
lines = []
|
|
76
|
+
lines = []
|
|
72
77
|
end_found = false
|
|
73
78
|
loop do
|
|
74
79
|
@line = nextline
|
|
75
80
|
break if @line.nil?
|
|
76
81
|
@line.chomp!
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
next if _comment?(@line) # FIXME Will cause problem with $. ?
|
|
82
|
+
break if _end?(@line)
|
|
83
|
+
next if _comment?(@line)
|
|
80
84
|
@line = _format(@line) unless raw
|
|
81
85
|
lines << @line
|
|
82
86
|
end
|
|
83
87
|
|
|
88
|
+
raise "Expected .end, found end of file" unless _end?(@line)
|
|
89
|
+
|
|
84
90
|
_optional_blank_line
|
|
85
91
|
if block_given?
|
|
86
92
|
lines.each {|line| yield line } # FIXME what about $. ?
|
|
@@ -88,16 +94,13 @@ module Livetext::UserAPI
|
|
|
88
94
|
lines
|
|
89
95
|
end
|
|
90
96
|
rescue => err
|
|
91
|
-
str =
|
|
92
|
-
str << err.inspect + "\n"
|
|
97
|
+
str = err.inspect + "\n"
|
|
93
98
|
str << err.backtrace.map {|x| " " + x }.join("\n")
|
|
94
|
-
|
|
95
|
-
exit
|
|
96
|
-
# _error!(str)
|
|
99
|
+
_error!(str)
|
|
97
100
|
end
|
|
98
101
|
|
|
99
102
|
def _body_text(raw=false)
|
|
100
|
-
|
|
103
|
+
_raw_body.join("\n")
|
|
101
104
|
end
|
|
102
105
|
|
|
103
106
|
def _raw_body!
|
data/plugin/bookish.rb
CHANGED
|
@@ -12,6 +12,7 @@ def credit
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def h1; _out "<h1>#{@_data}</h1>"; end
|
|
15
|
+
def h2; _out "<h2>#{@_data}</h2>"; end
|
|
15
16
|
def h3; _out "<h3>#{@_data}</h3>"; end
|
|
16
17
|
|
|
17
18
|
def list
|
|
@@ -42,7 +43,7 @@ def alpha_columns
|
|
|
42
43
|
words << line.chomp
|
|
43
44
|
end
|
|
44
45
|
words.sort!
|
|
45
|
-
_out "<table cellpadding=
|
|
46
|
+
_out "<table cellpadding=2>"
|
|
46
47
|
words.each_slice(n) do |w|
|
|
47
48
|
items = w.map {|x| "<tt>#{x}</tt>" }
|
|
48
49
|
_out "<tr><td width=5% valign=top></td><td>" + items.join("</td><td>") + "</td></tr>"
|
|
@@ -88,10 +89,11 @@ def chapter
|
|
|
88
89
|
@sec = @sec2 = 0
|
|
89
90
|
title = @_data.split(" ",2)[1]
|
|
90
91
|
@toc << "<br><b>#@chapter</b> #{title}<br>"
|
|
91
|
-
|
|
92
|
+
@_data = _slug(title)
|
|
93
|
+
next_output
|
|
92
94
|
_out "<title>#{@chapter}. #{title}</title>"
|
|
93
95
|
_out <<-HTML
|
|
94
|
-
<h2>Chapter #{@chapter}</
|
|
96
|
+
<h2>Chapter #{@chapter}</h2>
|
|
95
97
|
<h1>#{title}</h1>
|
|
96
98
|
|
|
97
99
|
HTML
|
|
@@ -103,10 +105,11 @@ def chapterN
|
|
|
103
105
|
title = @_data # .split(" ",2)[1]
|
|
104
106
|
_errout("Chapter #@chapter: #{title}")
|
|
105
107
|
@toc << "<br><b>#@chapter</b> #{title}<br>"
|
|
106
|
-
|
|
108
|
+
@_data = _slug(title)
|
|
109
|
+
next_output
|
|
107
110
|
_out "<title>#{@chapter}. #{title}</title>"
|
|
108
111
|
_out <<-HTML
|
|
109
|
-
<h2>Chapter #{@chapter}</
|
|
112
|
+
<h2>Chapter #{@chapter}</h2>
|
|
110
113
|
<h1>#{title}</h1>
|
|
111
114
|
|
|
112
115
|
HTML
|
|
@@ -116,10 +119,11 @@ def sec
|
|
|
116
119
|
@sec += 1
|
|
117
120
|
@sec2 = 0
|
|
118
121
|
@section = "#@chapter.#@sec"
|
|
119
|
-
|
|
120
|
-
@toc << "#{_nbsp(3)}<b>#@section</b>
|
|
121
|
-
|
|
122
|
-
|
|
122
|
+
title = @_data.dup
|
|
123
|
+
@toc << "#{_nbsp(3)}<b>#@section</b> #{title}<br>"
|
|
124
|
+
@_data = _slug(@_data)
|
|
125
|
+
next_output
|
|
126
|
+
_out "<h3>#@section #{title}</h3>\n"
|
|
123
127
|
rescue => err
|
|
124
128
|
STDERR.puts "#{err}\n#{err.backtrace}"
|
|
125
129
|
exit
|
|
@@ -128,10 +132,33 @@ end
|
|
|
128
132
|
def subsec
|
|
129
133
|
@sec2 += 1
|
|
130
134
|
@subsec = "#@chapter.#@sec.#@sec2"
|
|
131
|
-
|
|
132
|
-
#
|
|
133
|
-
|
|
134
|
-
|
|
135
|
+
title = @_data.dup
|
|
136
|
+
@toc << "#{_nbsp(6)}<b>#@subsec</b> #{title}<br>"
|
|
137
|
+
@_data = _slug(@_data)
|
|
138
|
+
next_output
|
|
139
|
+
_out "<h3>#@subsec #{title}</h3>\n"
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def definition_table
|
|
143
|
+
title = @_data
|
|
144
|
+
wide = "95"
|
|
145
|
+
delim = " :: "
|
|
146
|
+
_out "<br><center><table width=#{wide}% cellpadding=5>"
|
|
147
|
+
lines = _body(true)
|
|
148
|
+
lines.map! {|line| _format(line) }
|
|
149
|
+
|
|
150
|
+
lines.each do |line|
|
|
151
|
+
cells = line.split(delim)
|
|
152
|
+
_out "<tr>"
|
|
153
|
+
cells.each.with_index do |cell, i|
|
|
154
|
+
width = (i == 0) ? "width=15%" : ""
|
|
155
|
+
_out " <td #{width} valign=top>#{cell}</td>"
|
|
156
|
+
end
|
|
157
|
+
_out "</tr>"
|
|
158
|
+
end
|
|
159
|
+
_out "</table></center><br><br>"
|
|
160
|
+
|
|
161
|
+
_optional_blank_line
|
|
135
162
|
end
|
|
136
163
|
|
|
137
164
|
def table2
|
|
@@ -139,7 +166,7 @@ def table2
|
|
|
139
166
|
wide = "90"
|
|
140
167
|
extra = _args[2]
|
|
141
168
|
delim = " :: "
|
|
142
|
-
_out "<br><center><table
|
|
169
|
+
_out "<br><center><table width=#{wide}% cellpadding=5>"
|
|
143
170
|
lines = _body(true)
|
|
144
171
|
lines.map! {|line| _format(line) }
|
|
145
172
|
|
|
@@ -192,7 +219,7 @@ def table
|
|
|
192
219
|
@table_num += 1
|
|
193
220
|
title = @_data
|
|
194
221
|
delim = " :: "
|
|
195
|
-
_out "<br><center><table
|
|
222
|
+
_out "<br><center><table width=90% cellpadding=5>"
|
|
196
223
|
lines = _body(true)
|
|
197
224
|
maxw = nil
|
|
198
225
|
lines.each do |line|
|
|
@@ -200,7 +227,7 @@ def table
|
|
|
200
227
|
cells = line.split(delim)
|
|
201
228
|
wide = cells.map {|x| x.length }
|
|
202
229
|
maxw = [0] * cells.size
|
|
203
|
-
maxw = maxw.map.with_index {|x, i| [x, wide[i]].max }
|
|
230
|
+
maxw = maxw.map.with_index {|x, i| [x, wide[i]+2].max }
|
|
204
231
|
end
|
|
205
232
|
|
|
206
233
|
sum = maxw.inject(0, :+)
|
|
@@ -246,12 +273,12 @@ end
|
|
|
246
273
|
def missing
|
|
247
274
|
@toc << "#{_nbsp(8)}<font color=red>TBD: #@_data</font><br>"
|
|
248
275
|
stuff = @_data.empty? ? "" : ": #@_data"
|
|
249
|
-
|
|
276
|
+
_out "<br><font color=red><i>[Material missing#{stuff}]</i></font><br>\n "
|
|
250
277
|
end
|
|
251
278
|
|
|
252
279
|
def TBC
|
|
253
280
|
@toc << "#{_nbsp(8)}<font color=red>To be continued...</font><br>"
|
|
254
|
-
|
|
281
|
+
_out "<br><font color=red><i>To be continued...</i></font><br>"
|
|
255
282
|
end
|
|
256
283
|
|
|
257
284
|
def note
|
data/plugin/calibre.rb
CHANGED
|
@@ -6,6 +6,7 @@ def epub!
|
|
|
6
6
|
@cover = @_args[2]
|
|
7
7
|
if ::File.directory?(src)
|
|
8
8
|
files = ::Dir["#{src}/*"].grep /\.html$/
|
|
9
|
+
files = files.sort # why is this necessary now?
|
|
9
10
|
cmd = "cat #{files.join(' ')} >TEMP.html"
|
|
10
11
|
system(cmd)
|
|
11
12
|
else
|
|
@@ -17,8 +18,9 @@ def epub!
|
|
|
17
18
|
cmd << "--cover #@cover " if @cover
|
|
18
19
|
system(cmd)
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
system("links -dump TEMP.html >/tmp/links.out")
|
|
22
|
+
str = `wc -w /tmp/links.out`
|
|
21
23
|
nw = str.split[0]
|
|
22
24
|
puts "Approx words: #{nw}"
|
|
23
|
-
::FileUtils.rm("TEMP.html")
|
|
25
|
+
# ::FileUtils.rm("TEMP.html")
|
|
24
26
|
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Error: Illegal name 'to_s' (at source.lt3 line 5)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Error: Name 'foobar' is unknown
|
data/test/data/lines.txt
CHANGED
|
@@ -104,7 +104,7 @@ _This for example
|
|
|
104
104
|
|
|
105
105
|
Line starts with double underscore
|
|
106
106
|
__This, for example
|
|
107
|
-
<i>This
|
|
107
|
+
<i>This</i>, for example
|
|
108
108
|
|
|
109
109
|
Line has embedded underscores
|
|
110
110
|
This has some_embedded_underscores
|
|
@@ -116,5 +116,5 @@ This has some_escaped_underscores
|
|
|
116
116
|
|
|
117
117
|
Doubled underscore, midline
|
|
118
118
|
This is __doubled, it seems
|
|
119
|
-
This is <i>doubled
|
|
119
|
+
This is <i>doubled</i>, it seems
|
|
120
120
|
|
data/test/test.rb
CHANGED
|
@@ -71,12 +71,44 @@ class TestingLivetext < MiniTest::Test
|
|
|
71
71
|
Dir.chdir(base) do
|
|
72
72
|
src, out, exp = "source.lt3", "/tmp/#{base}--actual-output.txt", "expected-output.txt"
|
|
73
73
|
err, erx = "/tmp/#{base}--actual-error.txt", "expected-error.txt"
|
|
74
|
+
|
|
75
|
+
# New features - match out/err by regex
|
|
76
|
+
expout_regex = "expected-out-line1match.txt"
|
|
77
|
+
experr_regex = "expected-err-line1match.txt"
|
|
78
|
+
|
|
74
79
|
cmd = "livetext #{src} >#{out} 2>#{err}"
|
|
75
80
|
system(cmd)
|
|
76
|
-
output, expected, errors, errexp = File.read(out), File.read(exp), File.read(err), File.read(erx)
|
|
77
81
|
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
output = File.read(out)
|
|
83
|
+
errors = File.read(err)
|
|
84
|
+
rx_out = rx_err = nil
|
|
85
|
+
|
|
86
|
+
if File.exist?(expout_regex)
|
|
87
|
+
rx_out = /#{Regexp.escape(File.read(expout_regex).chomp)}/
|
|
88
|
+
expected = "(match test)"
|
|
89
|
+
else
|
|
90
|
+
expected = File.read(exp)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if File.exist?(experr_regex)
|
|
94
|
+
rx_err = /#{Regexp.escape(File.read(experr_regex).chomp)}/
|
|
95
|
+
errexp = "(match test)"
|
|
96
|
+
else
|
|
97
|
+
errexp = File.read(erx)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
if rx_out
|
|
101
|
+
out_ok = output =~ rx_out
|
|
102
|
+
else
|
|
103
|
+
out_ok = output == expected
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
if rx_err
|
|
107
|
+
err_ok = errors =~ rx_err
|
|
108
|
+
else
|
|
109
|
+
err_ok = errors == errexp
|
|
110
|
+
end
|
|
111
|
+
|
|
80
112
|
nout = output.split("\n").size
|
|
81
113
|
nexp = expected.split("\n").size
|
|
82
114
|
bad_out = "--- Expected (#{nexp} lines): \n#{green(expected)}\n--- Output (#{nout} lines): \n#{red(output)}\n"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: livetext
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.06
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Hal Fulton
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-07-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: A smart text processor extensible in Ruby
|
|
14
14
|
email: rubyhacker@gmail.com
|
|
@@ -57,9 +57,11 @@ files:
|
|
|
57
57
|
- test/data/error_inc_line_num/expected-output.txt
|
|
58
58
|
- test/data/error_inc_line_num/file2.lt3
|
|
59
59
|
- test/data/error_inc_line_num/source.lt3
|
|
60
|
+
- test/data/error_invalid_name/expected-err-line1match.txt
|
|
60
61
|
- test/data/error_invalid_name/expected-error.txt
|
|
61
62
|
- test/data/error_invalid_name/expected-output.txt
|
|
62
63
|
- test/data/error_invalid_name/source.lt3
|
|
64
|
+
- test/data/error_line_num/expected-err-line1match.txt
|
|
63
65
|
- test/data/error_line_num/expected-error.txt
|
|
64
66
|
- test/data/error_line_num/expected-output.txt
|
|
65
67
|
- test/data/error_line_num/source.lt3
|
|
@@ -137,7 +139,7 @@ homepage: https://github.com/Hal9000/livetext
|
|
|
137
139
|
licenses:
|
|
138
140
|
- Ruby
|
|
139
141
|
metadata: {}
|
|
140
|
-
post_install_message:
|
|
142
|
+
post_install_message:
|
|
141
143
|
rdoc_options: []
|
|
142
144
|
require_paths:
|
|
143
145
|
- lib
|
|
@@ -152,8 +154,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
152
154
|
- !ruby/object:Gem::Version
|
|
153
155
|
version: '0'
|
|
154
156
|
requirements: []
|
|
155
|
-
rubygems_version: 3.
|
|
156
|
-
signing_key:
|
|
157
|
+
rubygems_version: 3.1.2
|
|
158
|
+
signing_key:
|
|
157
159
|
specification_version: 4
|
|
158
160
|
summary: A smart processor for text
|
|
159
161
|
test_files: []
|