livetext 0.9.33 → 0.9.36
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 -2
- data/imports/bookish.rb +5 -1
- data/lib/livetext/helpers.rb +13 -3
- data/lib/livetext/html.rb +37 -35
- data/lib/livetext/more.rb +4 -0
- data/lib/livetext/processor.rb +2 -0
- data/lib/livetext/standard.rb +15 -12
- data/lib/livetext/userapi.rb +4 -0
- data/lib/livetext/version.rb +1 -1
- data/plugin/bookish.rb +118 -3
- data/plugin/pyggish.rb +80 -6
- data/test/unit/html.rb +18 -20
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2dceb322a5f44e776bab9ed9113c7c7a4adf29eff271be81a613c72a081a2d51
|
|
4
|
+
data.tar.gz: 70576d3a39fccbe7f3285ddca930f79400b8d770ef600d043e2b3690f173ba23
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8d91e26a1721ce60ca41ff49a323df2e4ef0a365b0b4eec9b224cbef8381e48b6ab4f3c0bb63e74ada905efb101c69a33e021f521420abe56927b16a46e02091
|
|
7
|
+
data.tar.gz: fa718856dcbb75bb4f60f49f31638041158b815335ba9df3680c2ca0b117a2584d66921e06dae30b266f3104a465f826904a797e3e1a546960d75d6dc79d9d4b
|
data/bin/livetext
CHANGED
data/imports/bookish.rb
CHANGED
|
@@ -98,14 +98,18 @@ module Bookish
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
def sec(args = nil, body = nil)
|
|
101
|
+
api.tty "## sec: cp 1"
|
|
101
102
|
@sec += 1
|
|
102
103
|
@sec2 = 0
|
|
103
104
|
@section = "#@chapter.#@sec"
|
|
105
|
+
api.tty "## sec: cp 2"
|
|
104
106
|
title = api.data.dup
|
|
105
107
|
@toc << "#{_nbsp(3)}<b>#@section</b> #{title}<br>"
|
|
106
|
-
api.data = _slug(
|
|
108
|
+
api.data = _slug(title)
|
|
109
|
+
api.tty "## sec: cp 3"
|
|
107
110
|
next_output
|
|
108
111
|
api.out "<h3>#@section #{title}</h3>\n"
|
|
112
|
+
api.tty "## sec: cp 4"
|
|
109
113
|
rescue => err
|
|
110
114
|
::STDERR.puts "#{err}\n#{err.backtrace}"
|
|
111
115
|
exit
|
data/lib/livetext/helpers.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
require_relative 'global_helpers'
|
|
3
3
|
require_relative 'expansion'
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
module Livetext::Helpers
|
|
6
7
|
|
|
7
8
|
Space = " "
|
|
@@ -98,13 +99,16 @@ module Livetext::Helpers
|
|
|
98
99
|
when Comment
|
|
99
100
|
success = handle_scomment(line)
|
|
100
101
|
when DotCmd
|
|
101
|
-
success = handle_dotcmd(line)
|
|
102
|
+
success = handle_dotcmd(line) # was 102
|
|
102
103
|
when DollarDot
|
|
103
104
|
success = handle_dollar_dot(line)
|
|
104
105
|
else
|
|
105
106
|
api.passthru(line) # must succeed?
|
|
106
107
|
end
|
|
107
108
|
success
|
|
109
|
+
rescue => err
|
|
110
|
+
STDERR.puts "ERROR: #{err}\n#{err.backtrace.join("\n")}"
|
|
111
|
+
exit
|
|
108
112
|
end
|
|
109
113
|
|
|
110
114
|
def handle_dollar_dot(line)
|
|
@@ -120,7 +124,7 @@ module Livetext::Helpers
|
|
|
120
124
|
api.data = data0.dup # should permit _ in function names at least
|
|
121
125
|
args0 = data0.split
|
|
122
126
|
api.args = args0.dup
|
|
123
|
-
retval = @main.send(name) # , *args)
|
|
127
|
+
retval = @main.send(name) # , *args) # was 125
|
|
124
128
|
retval
|
|
125
129
|
rescue => err
|
|
126
130
|
graceful_error(err)
|
|
@@ -135,7 +139,7 @@ module Livetext::Helpers
|
|
|
135
139
|
when name == :end # special case
|
|
136
140
|
graceful_error EndWithoutOpening()
|
|
137
141
|
when @main.respond_to?(name)
|
|
138
|
-
success = invoke_dotcmd(name, data)
|
|
142
|
+
success = invoke_dotcmd(name, data) # was 141
|
|
139
143
|
else
|
|
140
144
|
graceful_error UnknownMethod(name)
|
|
141
145
|
end
|
|
@@ -250,3 +254,9 @@ module Livetext::Helpers
|
|
|
250
254
|
end
|
|
251
255
|
|
|
252
256
|
end
|
|
257
|
+
|
|
258
|
+
=begin
|
|
259
|
+
/Users/Hal/.rvm/gems/ruby-2.7.0/gems/livetext-0.9.35/lib/livetext/helpers.rb:125:in `invoke_dotcmd'
|
|
260
|
+
/Users/Hal/.rvm/gems/ruby-2.7.0/gems/livetext-0.9.35/lib/livetext/helpers.rb:141:in `handle_dotcmd'
|
|
261
|
+
/Users/Hal/.rvm/gems/ruby-2.7.0/gems/livetext-0.9.35/lib/livetext/helpers.rb:102:in `process_line'
|
|
262
|
+
=end
|
data/lib/livetext/html.rb
CHANGED
|
@@ -1,43 +1,48 @@
|
|
|
1
1
|
|
|
2
|
-
module HTMLHelper
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
end
|
|
2
|
+
# module HTMLHelper
|
|
3
|
+
#
|
|
4
|
+
# def wrapped(str, *tags) # helper
|
|
5
|
+
# open, close = open_close_tags(*tags)
|
|
6
|
+
# open + str + close
|
|
7
|
+
# end
|
|
8
|
+
#
|
|
9
|
+
# def wrapped!(str, tag, **extras) # helper
|
|
10
|
+
# open, close = open_close_tags(tag)
|
|
11
|
+
# extras.each_pair do |name, value|
|
|
12
|
+
# open.sub!(">", " #{name}='#{value}'>")
|
|
13
|
+
# end
|
|
14
|
+
# open + str + close
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# def wrap(*tags) # helper
|
|
18
|
+
# open, close = open_close_tags(*tags)
|
|
19
|
+
# api.out open
|
|
20
|
+
# yield
|
|
21
|
+
# api.out close
|
|
22
|
+
# end
|
|
23
|
+
#
|
|
24
|
+
# def open_close_tags(*tags)
|
|
25
|
+
# open, close = "", ""
|
|
26
|
+
# tags.each do |tag|
|
|
27
|
+
# open << "<#{tag}>"
|
|
28
|
+
# close.prepend("</#{tag}>")
|
|
29
|
+
# end
|
|
30
|
+
# [open, close]
|
|
31
|
+
# end
|
|
32
|
+
# end
|
|
33
33
|
|
|
34
34
|
class HTML
|
|
35
35
|
|
|
36
36
|
def initialize(api)
|
|
37
|
+
raise "API is nil!" unless api
|
|
37
38
|
@api = api
|
|
38
39
|
@indent = 0
|
|
39
40
|
end
|
|
40
41
|
|
|
42
|
+
def api
|
|
43
|
+
@api
|
|
44
|
+
end
|
|
45
|
+
|
|
41
46
|
def indented
|
|
42
47
|
" "*@indent
|
|
43
48
|
end
|
|
@@ -69,10 +74,6 @@ class HTML
|
|
|
69
74
|
wrap(:li, **details, &block)
|
|
70
75
|
end
|
|
71
76
|
|
|
72
|
-
def api
|
|
73
|
-
@api
|
|
74
|
-
end
|
|
75
|
-
|
|
76
77
|
def open_close_tags(*tags)
|
|
77
78
|
open, close = "", ""
|
|
78
79
|
tags.each do |tag|
|
|
@@ -87,6 +88,7 @@ class HTML
|
|
|
87
88
|
extras.each_pair do |name, value|
|
|
88
89
|
open.sub!(">", " #{name}='#{value}'>")
|
|
89
90
|
end
|
|
91
|
+
# STDERR.puts "#wrap - @api = #{@api.inspect}\n-----------"
|
|
90
92
|
api.out indented + open
|
|
91
93
|
indent(:in)
|
|
92
94
|
yield
|
data/lib/livetext/more.rb
CHANGED
data/lib/livetext/processor.rb
CHANGED
data/lib/livetext/standard.rb
CHANGED
|
@@ -14,7 +14,7 @@ make_exception(:FileNotFound, "Error: file '%1' not found")
|
|
|
14
14
|
|
|
15
15
|
module Livetext::Standard
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
# include HTMLHelper
|
|
18
18
|
include Livetext::Helpers
|
|
19
19
|
|
|
20
20
|
TTY = ::File.open("/dev/tty", "w")
|
|
@@ -82,14 +82,14 @@ module Livetext::Standard
|
|
|
82
82
|
def h6; api.out wrapped(api.data, :h6); return true; end
|
|
83
83
|
|
|
84
84
|
def list
|
|
85
|
-
wrap :ul do
|
|
85
|
+
html.wrap :ul do
|
|
86
86
|
api.body {|line| api.out wrapped(line, :li) }
|
|
87
87
|
end
|
|
88
88
|
api.optional_blank_line
|
|
89
89
|
end
|
|
90
90
|
|
|
91
91
|
def list!
|
|
92
|
-
wrap(:ul) do
|
|
92
|
+
html.wrap(:ul) do
|
|
93
93
|
lines = api.body.each # enumerator
|
|
94
94
|
loop do
|
|
95
95
|
line = lines.next
|
|
@@ -117,9 +117,10 @@ module Livetext::Standard
|
|
|
117
117
|
api.optional_blank_line
|
|
118
118
|
end
|
|
119
119
|
|
|
120
|
-
def say
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
def say(arg=nil)
|
|
121
|
+
data = arg || api.args.join(" ")
|
|
122
|
+
str = api.format(data)
|
|
123
|
+
TTY.puts "(say) #{str}"
|
|
123
124
|
api.optional_blank_line
|
|
124
125
|
end
|
|
125
126
|
|
|
@@ -281,7 +282,7 @@ module Livetext::Standard
|
|
|
281
282
|
end
|
|
282
283
|
|
|
283
284
|
def debug
|
|
284
|
-
|
|
285
|
+
@debug = onoff(api.args.first)
|
|
285
286
|
api.optional_blank_line
|
|
286
287
|
end
|
|
287
288
|
|
|
@@ -321,7 +322,7 @@ module Livetext::Standard
|
|
|
321
322
|
end
|
|
322
323
|
|
|
323
324
|
def mono
|
|
324
|
-
wrap ":pre" do
|
|
325
|
+
html.wrap ":pre" do
|
|
325
326
|
api.body(true) {|line| api.out line }
|
|
326
327
|
end
|
|
327
328
|
api.optional_blank_line
|
|
@@ -329,7 +330,7 @@ module Livetext::Standard
|
|
|
329
330
|
|
|
330
331
|
def dlist
|
|
331
332
|
delim = api.args.first
|
|
332
|
-
wrap(:dl) do
|
|
333
|
+
html.wrap(:dl) do
|
|
333
334
|
api.body do |line|
|
|
334
335
|
line = api.format(line)
|
|
335
336
|
term, defn = line.split(delim)
|
|
@@ -369,7 +370,7 @@ module Livetext::Standard
|
|
|
369
370
|
|
|
370
371
|
processed.each do |line|
|
|
371
372
|
cells = line.split(delim)
|
|
372
|
-
wrap :tr do
|
|
373
|
+
html.wrap :tr do
|
|
373
374
|
cells.each {|cell| api.out " <td valign=top>#{cell}</td>" }
|
|
374
375
|
end
|
|
375
376
|
end
|
|
@@ -378,8 +379,10 @@ module Livetext::Standard
|
|
|
378
379
|
end
|
|
379
380
|
|
|
380
381
|
def image
|
|
381
|
-
name = api.args
|
|
382
|
-
|
|
382
|
+
name, wide, high = api.args
|
|
383
|
+
geom = ""
|
|
384
|
+
geom = "width=#{wide} height=#{high}" if wide || high
|
|
385
|
+
api.out "<img src='#{name} #{geom}'></img>"
|
|
383
386
|
api.optional_blank_line
|
|
384
387
|
end
|
|
385
388
|
|
data/lib/livetext/userapi.rb
CHANGED
|
@@ -5,6 +5,8 @@ require_relative 'html'
|
|
|
5
5
|
|
|
6
6
|
class Livetext::UserAPI
|
|
7
7
|
|
|
8
|
+
include ::Livetext::Standard
|
|
9
|
+
|
|
8
10
|
KBD = File.new("/dev/tty", "r")
|
|
9
11
|
TTY = File.new("/dev/tty", "w")
|
|
10
12
|
|
|
@@ -33,6 +35,8 @@ class Livetext::UserAPI
|
|
|
33
35
|
|
|
34
36
|
def include_file(file)
|
|
35
37
|
api.data = file
|
|
38
|
+
api.args = [file]
|
|
39
|
+
STDERR.puts "incfile: #{api.methods.sort.inspect}\n "
|
|
36
40
|
api.dot_include
|
|
37
41
|
end
|
|
38
42
|
|
data/lib/livetext/version.rb
CHANGED
data/plugin/bookish.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
def hardbreaks(args = nil, body = nil)
|
|
2
2
|
@hard = false
|
|
3
3
|
@hard = true unless api.args.first == "off"
|
|
4
|
+
api.optional_blank_line
|
|
4
5
|
end
|
|
5
6
|
|
|
6
7
|
def hardbreaks?
|
|
@@ -9,13 +10,14 @@ end
|
|
|
9
10
|
|
|
10
11
|
def credit(args = nil, body = nil)
|
|
11
12
|
# really just a place marker in source
|
|
13
|
+
api.optional_blank_line
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
# These are duplicated. Remove safely
|
|
15
17
|
|
|
16
|
-
def h1; api.out "<h1>#{api.data}</h1>"; end
|
|
17
|
-
def h2; api.out "<h2>#{api.data}</h2>"; end
|
|
18
|
-
def h3; api.out "<h3>#{api.data}</h3>"; end
|
|
18
|
+
def h1; api.out "<h1>#{api.data}</h1>"; api.optional_blank_line; end
|
|
19
|
+
def h2; api.out "<h2>#{api.data}</h2>"; api.optional_blank_line; end
|
|
20
|
+
def h3; api.out "<h3>#{api.data}</h3>"; api.optional_blank_line; end
|
|
19
21
|
|
|
20
22
|
def alpha_columns(args = nil, body = nil)
|
|
21
23
|
n = api.args.first.to_i # FIXME: what if it's missing?
|
|
@@ -30,6 +32,7 @@ def alpha_columns(args = nil, body = nil)
|
|
|
30
32
|
api.out "<tr><td width=5% valign=top></td><td>" + items.join("</td><td>") + "</td></tr>"
|
|
31
33
|
end
|
|
32
34
|
api.out "</table>"
|
|
35
|
+
api.optional_blank_line
|
|
33
36
|
end
|
|
34
37
|
|
|
35
38
|
# def comment
|
|
@@ -55,6 +58,7 @@ end
|
|
|
55
58
|
def image(args = nil, body = nil)
|
|
56
59
|
name = api.args[0]
|
|
57
60
|
api.out "<img src='#{name}'></img>"
|
|
61
|
+
api.optional_blank_line
|
|
58
62
|
end
|
|
59
63
|
|
|
60
64
|
def figure(args = nil, body = nil)
|
|
@@ -64,6 +68,7 @@ def figure(args = nil, body = nil)
|
|
|
64
68
|
title = api.format(title)
|
|
65
69
|
api.out "<img src='#{name}'></img>"
|
|
66
70
|
api.out "<center><b>Figure #{num}</b> #{title}</center>"
|
|
71
|
+
api.optional_blank_line
|
|
67
72
|
end
|
|
68
73
|
|
|
69
74
|
def chapter(args = nil, body = nil)
|
|
@@ -79,6 +84,7 @@ def chapter(args = nil, body = nil)
|
|
|
79
84
|
<h1>#{title}</h1>
|
|
80
85
|
|
|
81
86
|
HTML
|
|
87
|
+
api.optional_blank_line
|
|
82
88
|
end
|
|
83
89
|
|
|
84
90
|
def chapterN(args = nil, body = nil)
|
|
@@ -95,6 +101,7 @@ def chapterN(args = nil, body = nil)
|
|
|
95
101
|
<h1>#{title}</h1>
|
|
96
102
|
|
|
97
103
|
HTML
|
|
104
|
+
api.optional_blank_line
|
|
98
105
|
end
|
|
99
106
|
|
|
100
107
|
def sec(args = nil, body = nil)
|
|
@@ -106,7 +113,9 @@ def sec(args = nil, body = nil)
|
|
|
106
113
|
api.data = _slug(api.data)
|
|
107
114
|
next_output
|
|
108
115
|
api.out "<h3>#@section #{title}</h3>\n"
|
|
116
|
+
api.optional_blank_line
|
|
109
117
|
rescue => err
|
|
118
|
+
api.tty "#{err}\n#{err.backtrace}"
|
|
110
119
|
::STDERR.puts "#{err}\n#{err.backtrace}"
|
|
111
120
|
exit
|
|
112
121
|
end
|
|
@@ -119,6 +128,7 @@ def subsec(args = nil, body = nil)
|
|
|
119
128
|
api.data = _slug(api.data)
|
|
120
129
|
next_output
|
|
121
130
|
api.out "<h3>#@subsec #{title}</h3>\n"
|
|
131
|
+
api.optional_blank_line
|
|
122
132
|
end
|
|
123
133
|
|
|
124
134
|
def definition_table(args = nil, body = nil)
|
|
@@ -234,6 +244,7 @@ end
|
|
|
234
244
|
def toc!(args = nil, body = nil)
|
|
235
245
|
_debug "Closing TOC"
|
|
236
246
|
@toc.close
|
|
247
|
+
api.optional_blank_line
|
|
237
248
|
rescue => err
|
|
238
249
|
puts @parent.body
|
|
239
250
|
@parent.body = ""
|
|
@@ -251,29 +262,34 @@ def toc2(args = nil, body = nil)
|
|
|
251
262
|
|
|
252
263
|
EOS
|
|
253
264
|
system("cat toc.tmp >>#{file}")
|
|
265
|
+
api.optional_blank_line
|
|
254
266
|
end
|
|
255
267
|
|
|
256
268
|
def missing(args = nil, body = nil)
|
|
257
269
|
@toc << "#{_nbsp(8)}<font color=red>TBD: #{api.data}</font><br>"
|
|
258
270
|
stuff = api.data.empty? ? "" : ": #{api.data}"
|
|
259
271
|
api.out "<br><font color=red><i>[Material missing#{stuff}]</i></font><br>\n "
|
|
272
|
+
api.optional_blank_line
|
|
260
273
|
end
|
|
261
274
|
|
|
262
275
|
def TBC(args = nil, body = nil)
|
|
263
276
|
@toc << "#{_nbsp(8)}<font color=red>To be continued...</font><br>"
|
|
264
277
|
api.out "<br><font color=red><i>To be continued...</i></font><br>"
|
|
278
|
+
api.optional_blank_line
|
|
265
279
|
end
|
|
266
280
|
|
|
267
281
|
def note(args = nil, body = nil)
|
|
268
282
|
api.out "<br><font color=red><i>Note: "
|
|
269
283
|
api.out api.data
|
|
270
284
|
api.out "</i></font><br>\n "
|
|
285
|
+
api.optional_blank_line
|
|
271
286
|
end
|
|
272
287
|
|
|
273
288
|
def quote(args = nil, body = nil)
|
|
274
289
|
api.out "<blockquote>"
|
|
275
290
|
api.body {|line| api.out line }
|
|
276
291
|
api.out "</blockquote>"
|
|
292
|
+
api.optional_blank_line
|
|
277
293
|
rescue => err
|
|
278
294
|
::STDERR.puts "#{err}\n#{err.backtrace}"
|
|
279
295
|
exit
|
|
@@ -285,3 +301,102 @@ def init_bookish
|
|
|
285
301
|
@chapter = -1
|
|
286
302
|
end
|
|
287
303
|
|
|
304
|
+
################### custom.rb
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def outdir
|
|
308
|
+
@_outdir = api.args.first
|
|
309
|
+
# @output = STDOUT
|
|
310
|
+
@output = nil
|
|
311
|
+
api.optional_blank_line
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
def outdir! # FIXME ?
|
|
315
|
+
@_outdir = api.args.first
|
|
316
|
+
raise "No output directory specified" if @_outdir.nil?
|
|
317
|
+
raise "No output directory specified" if @_outdir.empty?
|
|
318
|
+
system("rm -f #@_outdir/*.html")
|
|
319
|
+
api.optional_blank_line
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def _append(name)
|
|
323
|
+
@_outdir ||= "."
|
|
324
|
+
@output.close unless @output == STDOUT
|
|
325
|
+
@output = File.open(@_outdir + "/" + name, "a")
|
|
326
|
+
@output.puts "<meta charset='UTF-8'>\n\n"
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def append
|
|
331
|
+
file = api.args[0]
|
|
332
|
+
_append(file)
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def close_output
|
|
336
|
+
return if @output == STDOUT
|
|
337
|
+
@_outdir ||= "."
|
|
338
|
+
@output.puts "<meta charset='UTF-8'>\n\n"
|
|
339
|
+
@output.puts @parent.body
|
|
340
|
+
@output.close
|
|
341
|
+
@parent.body = "" # See bin/livetext
|
|
342
|
+
@output = STDOUT
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def _prep_next_output(args)
|
|
346
|
+
tag, num = args # _next_output(tag, num)
|
|
347
|
+
@_file_num = num ? num : @_file_num + 1
|
|
348
|
+
@_file_num = @_file_num.to_i
|
|
349
|
+
name = "#{'%03d' % @_file_num}-#{tag}.html"
|
|
350
|
+
api.tty "tag, num, name= #{[tag, num, name].inspect}"
|
|
351
|
+
name
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
def next_output
|
|
355
|
+
name = _prep_next_output(api.args)
|
|
356
|
+
@_outdir ||= "."
|
|
357
|
+
unless @output.nil?
|
|
358
|
+
@output.puts "<meta charset='UTF-8'>\n\n"
|
|
359
|
+
@output.puts @parent.body
|
|
360
|
+
@parent.body = ""
|
|
361
|
+
@output.close unless @output == STDOUT
|
|
362
|
+
end
|
|
363
|
+
fname = @_outdir + "/" + name
|
|
364
|
+
@output = File.open(fname, "w")
|
|
365
|
+
api.optional_blank_line
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def output
|
|
369
|
+
name = api.args.first
|
|
370
|
+
_debug "Redirecting output to: #{name}"
|
|
371
|
+
# _output(name)
|
|
372
|
+
@_outdir ||= "." # FIXME
|
|
373
|
+
@output.puts "<meta charset='UTF-8'>\n\n"
|
|
374
|
+
@output.puts @parent.body
|
|
375
|
+
@parent.body = ""
|
|
376
|
+
@output.close unless @output == STDOUT
|
|
377
|
+
fname = @_outdir + "/" + name #; STDERR.puts "--- _output: fname = #{fname.inspect}"
|
|
378
|
+
@output = File.open(fname, "w") #; STDERR.puts "---- @out = #{@output.inspect}"
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
def columns
|
|
382
|
+
api.out "<table border=1><tr><td valign=top><br>\n"
|
|
383
|
+
api.body.to_a.each do |line|
|
|
384
|
+
if line.start_with?("##col")
|
|
385
|
+
api.out "</td><td valign=top>"
|
|
386
|
+
elsif line.start_with?("##row")
|
|
387
|
+
api.out "</td></tr><tr><td valign=top>"
|
|
388
|
+
else
|
|
389
|
+
api.out line
|
|
390
|
+
end
|
|
391
|
+
end
|
|
392
|
+
api.out "<br>\n</td></tr></table>"
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
def quote
|
|
396
|
+
api.out "<blockquote>"
|
|
397
|
+
lines = api.body.to_a
|
|
398
|
+
# STDERR.puts "-----------------------------------------------------"
|
|
399
|
+
# STDERR.puts lines.inspect
|
|
400
|
+
lines.each {|line| api.out line }
|
|
401
|
+
api.out "</blockquote>"
|
|
402
|
+
end
|
data/plugin/pyggish.rb
CHANGED
|
@@ -82,14 +82,26 @@ def self.pyg_finalize(code, lexer=:elixir)
|
|
|
82
82
|
result
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
-
def fragment
|
|
85
|
+
def fragment(args = nil, body = nil)
|
|
86
86
|
lang = api.args.empty? ? :elixir : api.args.first.to_sym # ruby or elixir
|
|
87
87
|
api.args = []
|
|
88
|
-
#
|
|
89
|
-
send(lang)
|
|
88
|
+
lines = api.body(true) # .to_a # raw
|
|
89
|
+
result = send(lang, lines)
|
|
90
|
+
api.out result
|
|
90
91
|
api.out "\n"
|
|
92
|
+
api.optional_blank_line
|
|
93
|
+
rescue => err
|
|
94
|
+
STDERR.puts "fragment Error: #{__method__} err = #{err}\n#{err.backtrace.join("\n")}"
|
|
91
95
|
end
|
|
92
96
|
|
|
97
|
+
def dammit(args = nil, body = nil)
|
|
98
|
+
lines = api.body(true)
|
|
99
|
+
api.out "BODY:"
|
|
100
|
+
lines.each {|x| api.out x }
|
|
101
|
+
api.out "END BODY"
|
|
102
|
+
api.optional_blank_line
|
|
103
|
+
end
|
|
104
|
+
|
|
93
105
|
def code # FIXME ?
|
|
94
106
|
text = ""
|
|
95
107
|
api.body {|line| api.out " " + line }
|
|
@@ -145,8 +157,9 @@ def self.pyg_finalize(code, lexer=:elixir)
|
|
|
145
157
|
text
|
|
146
158
|
end
|
|
147
159
|
|
|
148
|
-
def
|
|
160
|
+
def xruby
|
|
149
161
|
file = api.args.first
|
|
162
|
+
code = nil
|
|
150
163
|
if file.nil?
|
|
151
164
|
code = " # Ruby code\n\n"
|
|
152
165
|
api.body {|line| code << " " + line + "\n" }
|
|
@@ -158,15 +171,76 @@ def self.pyg_finalize(code, lexer=:elixir)
|
|
|
158
171
|
api.out html
|
|
159
172
|
end
|
|
160
173
|
|
|
161
|
-
def
|
|
174
|
+
def xelixir
|
|
162
175
|
file = api.args.first
|
|
176
|
+
code = nil
|
|
163
177
|
if file.nil?
|
|
164
178
|
code = ""
|
|
165
179
|
api.body {|line| code << " " + line + "\n" }
|
|
166
180
|
else
|
|
167
181
|
code = ::File.read(file)
|
|
168
182
|
end
|
|
169
|
-
|
|
170
183
|
html = format_elixir(code)
|
|
171
184
|
api.out html
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def ruby(lines)
|
|
188
|
+
theme = :Github # default
|
|
189
|
+
source = lines.join("\n")
|
|
190
|
+
formatter = Rouge::Formatters::HTML.new
|
|
191
|
+
lexer = Rouge::Lexers::Ruby.new
|
|
192
|
+
body = formatter.format(lexer.lex(source))
|
|
193
|
+
|
|
194
|
+
# css = Rouge::Themes.const_get(theme.to_s).render(scope: '.highlight')
|
|
195
|
+
# added = ".highlight { font-family: courier; white-space: pre }"
|
|
196
|
+
|
|
197
|
+
result = <<~HTML
|
|
198
|
+
<div class="highlight">
|
|
199
|
+
#{body}
|
|
200
|
+
</div>
|
|
201
|
+
<br>
|
|
202
|
+
HTML
|
|
203
|
+
return result
|
|
204
|
+
|
|
205
|
+
iheight = lines.size * 25
|
|
206
|
+
api.out <<~HTML
|
|
207
|
+
<center>
|
|
208
|
+
<iframe width=90% height=#{iheight} src='#{File.basename(html_file)}'></iframe>
|
|
209
|
+
</center>
|
|
210
|
+
<br>
|
|
211
|
+
HTML
|
|
212
|
+
rescue => err
|
|
213
|
+
STDERR.puts "Error: #{__method__} err = #{err}\n#{err.backtrace.join("\n")}"
|
|
172
214
|
end
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def elixir(lines)
|
|
218
|
+
theme = :Github # default
|
|
219
|
+
source = lines.join("\n")
|
|
220
|
+
formatter = Rouge::Formatters::HTML.new
|
|
221
|
+
lexer = Rouge::Lexers::Elixir.new
|
|
222
|
+
body = formatter.format(lexer.lex(source))
|
|
223
|
+
|
|
224
|
+
# css = Rouge::Themes.const_get(theme.to_s).render(scope: '.highlight')
|
|
225
|
+
# added = ".highlight { font-family: courier; white-space: pre }"
|
|
226
|
+
|
|
227
|
+
result = <<~HTML
|
|
228
|
+
<div class="highlight">
|
|
229
|
+
#{body}
|
|
230
|
+
</div>
|
|
231
|
+
<br>
|
|
232
|
+
HTML
|
|
233
|
+
return result
|
|
234
|
+
|
|
235
|
+
iheight = lines.size * 25
|
|
236
|
+
api.out <<~HTML
|
|
237
|
+
<center>
|
|
238
|
+
<iframe width=90% height=#{iheight} src='#{File.basename(html_file)}'></iframe>
|
|
239
|
+
</center>
|
|
240
|
+
<br>
|
|
241
|
+
HTML
|
|
242
|
+
rescue => err
|
|
243
|
+
STDERR.puts "Error: #{__method__} err = #{err}\n#{err.backtrace}"
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
|
data/test/unit/html.rb
CHANGED
|
@@ -9,29 +9,27 @@ class TestingLivetext < MiniTest::Test
|
|
|
9
9
|
# Same is probably true of the methods that are testing them.
|
|
10
10
|
|
|
11
11
|
def test_wrapped
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
assert_equal
|
|
17
|
-
|
|
12
|
+
live = Livetext.new
|
|
13
|
+
html = HTML.new(live.api)
|
|
14
|
+
str = "nothing much"
|
|
15
|
+
assert_equal html.tag(:b, cdata: str), "<b>#{str}</b>"
|
|
16
|
+
assert_equal html.tag(:b, :i, cdata: str), "<b><i>#{str}</i></b>"
|
|
17
|
+
|
|
18
|
+
assert_equal html.tag(:table, :tr, :td, cdata: str),
|
|
19
|
+
"<table><tr><td>#{str}</td></tr></table>"
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
def
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
assert_equal
|
|
25
|
-
|
|
26
|
-
assert_equal
|
|
22
|
+
def test_wrapped_extra
|
|
23
|
+
live = Livetext.new
|
|
24
|
+
html = HTML.new(live.api)
|
|
25
|
+
str = "nothing much"
|
|
26
|
+
assert_equal html.tag(:td, cdata: str, valign: :top),
|
|
27
|
+
"<td valign='top'>#{str}</td>"
|
|
28
|
+
assert_equal html.tag(:img, cdata: str, src: "foo.jpg"),
|
|
29
|
+
"<img src='foo.jpg'>#{str}</img>"
|
|
30
|
+
assert_equal html.tag(:a, cdata: str, style: 'text-decoration: none',
|
|
27
31
|
href: 'foo.com'),
|
|
28
|
-
"<a style='text-decoration: none' href='foo.com'>#{
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def xtest_wrap
|
|
32
|
-
# bogus!
|
|
33
|
-
wrap(:ul) { 2.times {|i| _out i } }
|
|
34
|
-
dump # puts @body
|
|
32
|
+
"<a style='text-decoration: none' href='foo.com'>#{str}</a>"
|
|
35
33
|
end
|
|
36
34
|
|
|
37
35
|
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.9.
|
|
4
|
+
version: 0.9.36
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Hal Fulton
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-03-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: A smart text processor extensible in Ruby
|
|
14
14
|
email: rubyhacker@gmail.com
|