livetext 0.6.8 → 0.6.9
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|