livetext 0.6.8 → 0.6.9
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/bin/livetext +2 -1
- data/dsl/bookish.rb +21 -0
- data/dsl/pyggish.rb +1 -1
- data/lib/livetext.rb +69 -81
- data/test/test.rb +4 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e46bad5eb2f6ef4b055c2f2a0b5b86582cc54f6
|
4
|
+
data.tar.gz: 150f82d63567a4199e8cdba23c57bc14c589486e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 495ff531811abbdae1c034f49584a7074505f644edeb18d12d1c33cf3c1d05ff9b47bd0e3f3f38cb569c66a41803a192fc646420c922e41ebc3a879d36a30027
|
7
|
+
data.tar.gz: 88d0f3742a2585ad1eb291cdb64491262ffdd943fb8068361236f97db3b63df87f8375b1dbabc6fcb900ea13928313d62b7b27c90fd066a7aaf7e89eacc69b4d
|
data/bin/livetext
CHANGED
data/dsl/bookish.rb
CHANGED
@@ -128,6 +128,27 @@ def subsec
|
|
128
128
|
_puts "<h3>#@subsec #{@_data}</h3>\n"
|
129
129
|
end
|
130
130
|
|
131
|
+
def table2
|
132
|
+
title = _data
|
133
|
+
wide = "90"
|
134
|
+
extra = _args[2]
|
135
|
+
delim = " :: "
|
136
|
+
_puts "<br><center><table border=1 width=#{wide}% cellpadding=5>"
|
137
|
+
lines = _body
|
138
|
+
lines.map! {|line| _formatting(line) }
|
139
|
+
|
140
|
+
lines.each do |line|
|
141
|
+
cells = line.split(delim)
|
142
|
+
percent = (100/cells.size.to_f).round
|
143
|
+
_puts "<tr>"
|
144
|
+
cells.each {|cell| _puts " <td width=#{percent}% #{extra}>#{cell}</td>" }
|
145
|
+
_puts "</tr>"
|
146
|
+
end
|
147
|
+
_puts "</table></center><br><br>"
|
148
|
+
|
149
|
+
_optional_blank_line
|
150
|
+
end
|
151
|
+
|
131
152
|
def table
|
132
153
|
@table_num ||= 0
|
133
154
|
@table_num += 1
|
data/dsl/pyggish.rb
CHANGED
data/lib/livetext.rb
CHANGED
@@ -8,7 +8,7 @@ require_relative "#{Plugins}/pyggish"
|
|
8
8
|
|
9
9
|
|
10
10
|
class Livetext
|
11
|
-
VERSION = "0.6.
|
11
|
+
VERSION = "0.6.9"
|
12
12
|
|
13
13
|
Space = " "
|
14
14
|
|
@@ -25,11 +25,17 @@ class Livetext
|
|
25
25
|
:enum_for, :pretty_inspect, :==, :equal?, :!, :!=, :instance_eval,
|
26
26
|
:instance_exec, :__send__, :__id__, :__binding__]
|
27
27
|
|
28
|
-
class
|
29
|
-
|
28
|
+
class Functions # Functions will go here... user-def AND pre-def??
|
29
|
+
def date
|
30
|
+
Time.now.strftime("%F")
|
31
|
+
end
|
32
|
+
|
33
|
+
def time
|
34
|
+
Time.now.strftime("%F")
|
35
|
+
end
|
30
36
|
end
|
31
37
|
|
32
|
-
def
|
38
|
+
def handle_line(line, sigil=".")
|
33
39
|
nomarkup = true
|
34
40
|
# FIXME inefficient
|
35
41
|
scomment = rx(sigil, Livetext::Space) # apply these in order
|
@@ -39,18 +45,18 @@ class Livetext
|
|
39
45
|
elsif line =~ sname
|
40
46
|
handle_sname(line)
|
41
47
|
else
|
42
|
-
|
48
|
+
_passthru(line)
|
43
49
|
end
|
44
50
|
end
|
45
51
|
|
46
|
-
def
|
52
|
+
def peek_nextline
|
47
53
|
@sources.last[0].peek
|
48
54
|
rescue StopIteration
|
49
55
|
@sources.pop
|
50
56
|
nil
|
51
57
|
end
|
52
58
|
|
53
|
-
def
|
59
|
+
def nextline
|
54
60
|
return nil if @sources.empty?
|
55
61
|
line = @sources.last[0].next
|
56
62
|
@sources.last[2] += 1
|
@@ -60,10 +66,9 @@ class Livetext
|
|
60
66
|
nil
|
61
67
|
end
|
62
68
|
|
63
|
-
def
|
64
|
-
@sources ||= []
|
69
|
+
def process_file(fname)
|
65
70
|
enum = File.readlines(fname).each
|
66
|
-
|
71
|
+
_check_existence(fname, "No such file '#{fname}' to process")
|
67
72
|
@sources.push [enum, fname, 0]
|
68
73
|
loop do
|
69
74
|
line = nextline
|
@@ -72,78 +77,58 @@ class Livetext
|
|
72
77
|
end
|
73
78
|
end
|
74
79
|
|
75
|
-
def
|
80
|
+
def grab_file(fname)
|
76
81
|
File.read(fname)
|
77
82
|
end
|
78
83
|
|
79
|
-
def
|
84
|
+
def rx(str, space=nil)
|
80
85
|
Regexp.compile("^" + Regexp.escape(str) + "#{space}")
|
81
86
|
end
|
82
87
|
|
83
|
-
def
|
88
|
+
def handle_scomment(line, sigil=".")
|
84
89
|
end
|
85
90
|
|
86
|
-
def
|
91
|
+
def _disallowed?(name)
|
87
92
|
Livetext::Disallowed.include?(name.to_sym)
|
88
93
|
end
|
89
94
|
|
90
|
-
def
|
91
|
-
|
92
|
-
name =
|
93
|
-
|
94
|
-
|
95
|
+
def _get_name(line, sigil=".")
|
96
|
+
name, @_data = line.split(" ", 2)
|
97
|
+
name = name[1..-1] # chop off sigil
|
98
|
+
@_args = @_data.split
|
99
|
+
_error! "Name '#{name}' is not permitted" if _disallowed?(name)
|
95
100
|
name = "_def" if name == "def"
|
96
101
|
name = "_include" if name == "include"
|
97
|
-
|
102
|
+
_error! "Mismatched 'end'" if name == "end"
|
98
103
|
name
|
99
104
|
end
|
100
105
|
|
101
|
-
def
|
106
|
+
def handle_sname(line, sigil=".")
|
102
107
|
name = _get_name(line, sigil=".")
|
103
|
-
unless
|
104
|
-
|
108
|
+
unless self.respond_to?(name)
|
109
|
+
_error! "Name '#{name}' is unknown"
|
105
110
|
return
|
106
111
|
end
|
107
|
-
|
112
|
+
self.send(name)
|
108
113
|
rescue => err
|
109
|
-
|
110
|
-
exit
|
114
|
+
_error!(err)
|
111
115
|
end
|
112
116
|
|
113
|
-
|
114
|
-
def
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
def time
|
119
|
-
Time.now.strftime("%F")
|
120
|
-
end
|
121
|
-
|
122
|
-
def basename
|
123
|
-
file = ::Livetext.main.file
|
124
|
-
::File.basename(file, ".*")
|
117
|
+
# include ::Livetext::Helpers
|
118
|
+
def _error!(err, abort=true, trace=false)
|
119
|
+
STDERR.puts "Error: #{err} (at #{@sources.last[1]} line #{@sources.last[2]})"
|
120
|
+
STDERR.puts err.backtrace if trace
|
121
|
+
exit if abort
|
125
122
|
end
|
126
|
-
end
|
127
123
|
|
128
|
-
|
129
|
-
|
130
|
-
raise "No such file found" unless File.exist?(file)
|
124
|
+
def _check_existence(file, msg)
|
125
|
+
_error! msg unless File.exist?(file)
|
131
126
|
end
|
132
127
|
|
133
128
|
def _source
|
134
129
|
@input
|
135
130
|
end
|
136
131
|
|
137
|
-
def _data=(str)
|
138
|
-
str ||= ""
|
139
|
-
@_data = str
|
140
|
-
@_args = str.split
|
141
|
-
end
|
142
|
-
|
143
|
-
def _data
|
144
|
-
@_data
|
145
|
-
end
|
146
|
-
|
147
132
|
def _args
|
148
133
|
if block_given?
|
149
134
|
@_args.each {|arg| yield arg }
|
@@ -153,7 +138,7 @@ end
|
|
153
138
|
end
|
154
139
|
|
155
140
|
def _optional_blank_line
|
156
|
-
@line =
|
141
|
+
@line = nextline if peek_nextline =~ /^ *$/
|
157
142
|
end
|
158
143
|
|
159
144
|
def _comment?(str, sigil=".")
|
@@ -177,7 +162,7 @@ end
|
|
177
162
|
def _raw_body(tag = "__EOF__", sigil = ".")
|
178
163
|
lines = []
|
179
164
|
loop do
|
180
|
-
@line =
|
165
|
+
@line = nextline
|
181
166
|
break if @line.chomp.strip == tag
|
182
167
|
lines << @line
|
183
168
|
end
|
@@ -192,7 +177,7 @@ end
|
|
192
177
|
def _body(sigil=".")
|
193
178
|
lines = []
|
194
179
|
loop do
|
195
|
-
@line =
|
180
|
+
@line = nextline
|
196
181
|
break if _end?(@line, sigil)
|
197
182
|
next if _comment?(@line, sigil)
|
198
183
|
lines << @line
|
@@ -303,33 +288,35 @@ end
|
|
303
288
|
end
|
304
289
|
|
305
290
|
# include ::Livetext::Standard
|
291
|
+
|
306
292
|
def comment
|
307
293
|
junk = _body # do nothing with contents
|
308
294
|
end
|
309
295
|
|
310
296
|
def shell
|
311
|
-
cmd = _data
|
297
|
+
cmd = @_data
|
312
298
|
_errout("Running: #{cmd}")
|
313
299
|
system(cmd)
|
314
300
|
end
|
315
301
|
|
316
302
|
def func
|
317
|
-
|
303
|
+
funcname = @_args[0]
|
304
|
+
_error! "Illegal name '#{funcname}'" if _disallowed?(funcname)
|
318
305
|
func_def = <<-EOS
|
319
|
-
def #{
|
306
|
+
def #{funcname}
|
320
307
|
#{_body!}
|
321
308
|
end
|
322
309
|
EOS
|
323
|
-
|
310
|
+
Livetext::Functions.class_eval func_def
|
324
311
|
end
|
325
312
|
|
326
313
|
def shell!
|
327
|
-
cmd = _data
|
314
|
+
cmd = @_data
|
328
315
|
system(cmd)
|
329
316
|
end
|
330
317
|
|
331
318
|
def errout
|
332
|
-
TTY.puts _data
|
319
|
+
TTY.puts @_data
|
333
320
|
end
|
334
321
|
|
335
322
|
def say
|
@@ -410,13 +397,14 @@ end
|
|
410
397
|
end
|
411
398
|
|
412
399
|
def _def
|
413
|
-
name = _args[0]
|
400
|
+
name = @_args[0]
|
414
401
|
str = "def #{name}\n"
|
402
|
+
raise "Illegal name '#{name}'" if _disallowed?(name)
|
415
403
|
str += _body!
|
416
404
|
str += "end\n"
|
417
405
|
eval str
|
418
406
|
rescue => err
|
419
|
-
|
407
|
+
_error!(err)
|
420
408
|
end
|
421
409
|
|
422
410
|
def nopass
|
@@ -424,7 +412,7 @@ end
|
|
424
412
|
end
|
425
413
|
|
426
414
|
def set
|
427
|
-
assigns = _data.chomp.split(/, */)
|
415
|
+
assigns = @_data.chomp.split(/, */)
|
428
416
|
assigns.each do |a|
|
429
417
|
var, val = a.split("=")
|
430
418
|
val = val[1..-2] if val[0] == ?" and val[-1] == ?"
|
@@ -435,13 +423,14 @@ end
|
|
435
423
|
end
|
436
424
|
|
437
425
|
def _include
|
438
|
-
file = _args.first
|
439
|
-
|
426
|
+
file = @_args.first
|
427
|
+
_check_existence(file, "No such include file '#{file}'")
|
428
|
+
process_file(file)
|
440
429
|
_optional_blank_line
|
441
430
|
end
|
442
431
|
|
443
432
|
def include! # FIXME huh?
|
444
|
-
file = _args.first
|
433
|
+
file = @_args.first
|
445
434
|
return unless File.exist?(file)
|
446
435
|
|
447
436
|
lines = process_file(file)
|
@@ -450,32 +439,33 @@ end
|
|
450
439
|
end
|
451
440
|
|
452
441
|
def mixin
|
453
|
-
name = _args.first # Expect a module name
|
442
|
+
name = @_args.first # Expect a module name
|
454
443
|
file = "#{Plugins}/" + name.downcase + ".rb"
|
455
444
|
return if @_mixins.include?(name)
|
456
445
|
file = "./#{name}.rb" unless File.exist?(file)
|
457
|
-
_check_existence(file)
|
446
|
+
_check_existence(file, "No such mixin '#{name}'")
|
458
447
|
|
459
448
|
@_mixins << name
|
460
|
-
meths =
|
449
|
+
meths = grab_file(file)
|
461
450
|
modname = name.gsub("/","_").capitalize
|
462
451
|
string = "module ::#{modname}\n#{meths}\nend"
|
463
452
|
eval(string)
|
464
453
|
newmod = Object.const_get("::" + modname)
|
465
|
-
|
454
|
+
self.extend(newmod)
|
466
455
|
init = "init_#{name}"
|
467
456
|
self.send(init) if self.respond_to? init
|
468
457
|
_optional_blank_line
|
469
458
|
end
|
470
459
|
|
471
460
|
def copy
|
472
|
-
file = _args.first
|
473
|
-
|
461
|
+
file = @_args.first
|
462
|
+
_check_existence(file, "No such file '#{file}' to copy")
|
463
|
+
@output.puts grab_file(file)
|
474
464
|
_optional_blank_line
|
475
465
|
end
|
476
466
|
|
477
467
|
def r
|
478
|
-
_puts _data # No processing at all
|
468
|
+
_puts @_data # No processing at all
|
479
469
|
end
|
480
470
|
|
481
471
|
def raw
|
@@ -484,7 +474,7 @@ end
|
|
484
474
|
end
|
485
475
|
|
486
476
|
def debug
|
487
|
-
arg = _args.first
|
477
|
+
arg = @_args.first
|
488
478
|
self._debug = true
|
489
479
|
self._debug = false if arg == "off"
|
490
480
|
end
|
@@ -495,7 +485,7 @@ end
|
|
495
485
|
|
496
486
|
def heading
|
497
487
|
_print "<center><font size=+1><b>"
|
498
|
-
_print _data
|
488
|
+
_print @_data
|
499
489
|
_print "</b></font></center>"
|
500
490
|
end
|
501
491
|
|
@@ -530,6 +520,7 @@ end
|
|
530
520
|
@vars = {}
|
531
521
|
@_mixins = []
|
532
522
|
@source_files = []
|
523
|
+
@sources = []
|
533
524
|
@_outdir = "."
|
534
525
|
@_file_num = 0
|
535
526
|
@_nopass = false
|
@@ -538,10 +529,6 @@ end
|
|
538
529
|
@lnum = 0
|
539
530
|
end
|
540
531
|
|
541
|
-
def where
|
542
|
-
"Line #@lnum of #@file"
|
543
|
-
end
|
544
|
-
|
545
532
|
# def method_missing(name, *args)
|
546
533
|
# ::TTY.puts "MM: #{name}"
|
547
534
|
# name = "_def" if name.to_s == "def"
|
@@ -561,6 +548,7 @@ end
|
|
561
548
|
end
|
562
549
|
|
563
550
|
if $0 == __FILE__
|
564
|
-
Livetext.
|
551
|
+
x = Livetext.new
|
552
|
+
x.process_file(ARGV[0] || STDIN)
|
565
553
|
end
|
566
554
|
|
data/test/test.rb
CHANGED
@@ -40,6 +40,10 @@ class TestingLiveText < MiniTest::Test
|
|
40
40
|
|
41
41
|
def test_error_line_num; external_files end
|
42
42
|
def test_error_inc_line_num; external_files end
|
43
|
+
def test_error_invalid_name; external_files end
|
44
|
+
def test_error_no_such_mixin; external_files end
|
45
|
+
def test_error_no_such_inc; external_files end
|
46
|
+
def test_error_no_such_copy; external_files end
|
43
47
|
|
44
48
|
def test_simple_vars; external_files end
|
45
49
|
def test_more_complex_vars; external_files end
|
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.6.
|
4
|
+
version: 0.6.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A smart text processor extensible in Ruby
|
14
14
|
email: rubyhacker@gmail.com
|
@@ -102,8 +102,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
104
|
rubyforge_project:
|
105
|
-
rubygems_version: 2.
|
105
|
+
rubygems_version: 2.4.2
|
106
106
|
signing_key:
|
107
107
|
specification_version: 4
|
108
108
|
summary: A smart processor for text
|
109
109
|
test_files: []
|
110
|
+
has_rdoc:
|