Module: Livetext::Standard

Includes:
Helpers
Included in:
UserAPI, Processor
Defined in:
lib/livetext/standard.rb

Overview

Module Standard comprises most of the standard or “common” methods.

Constant Summary collapse

TTY =
::File.open("/dev/tty", "w")
SimpleFormats =

Move this?

{ b: %w[<b> </b>],
i: %w[<i> </i>],
t: ["<font size=+1><tt>", "</tt></font>"],
s: %w[<strike> </strike>] }

Constants included from Helpers

Helpers::Comment, Helpers::DollarDot, Helpers::DotCmd, Helpers::ESCAPING, Helpers::Sigil, Helpers::Space

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Helpers

#check_disallowed, #check_file_exists, #escape_html, #find_file, #friendly_error, #get_name_data, #grab_file, #handle_dollar_dot, #handle_dotcmd, #handle_scomment, #include_file, #invoke_dotcmd, #onoff, #process_file, #process_line, #read_variables, rx, #search_upward, #set_variables, #setfile, #setfile!, #setvar, #showme

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



28
29
30
# File 'lib/livetext/standard.rb', line 28

def data
  @data
end

Instance Method Details

#backtrace(args = nil, body = nil) ⇒ Object

def setvars(pairs)

  pairs.each do |var, value|
    api.setvar(var, value)
  end
end


47
48
49
50
# File 'lib/livetext/standard.rb', line 47

def backtrace(args = nil, body = nil)
  @backtrace = onoff(api.args.first)
  api.optional_blank_line
end


127
128
129
130
131
132
133
# File 'lib/livetext/standard.rb', line 127

def banner(args = nil, body = nil)
  str = api.format(api.data)
  num = str.length
  decor = "-"*num + "\n"
  api.tty decor + str + "\n" + decor
  api.optional_blank_line
end

#bitsObject

dumb name - bold, italic, teletype, striketrough



32
33
34
35
36
37
38
39
# File 'lib/livetext/standard.rb', line 32

def bits   # FIXME umm what is this?
  b0, b1, i0, i1, t0, t1, s0, s1 = *api.args
  SimpleFormats[:b] = [b0, b1]
  SimpleFormats[:i] = [i0, i1]
  SimpleFormats[:t] = [t0, t1]
  SimpleFormats[:s] = [s0, s1]
  api.optional_blank_line
end

#br(args = nil, body = nil) ⇒ Object



427
428
429
430
431
432
433
# File 'lib/livetext/standard.rb', line 427

def br(args = nil, body = nil)
  num = api.args.first || "1"
  str = ""
  num.to_i.times { str << "<br>" }
  api.out str
  api.optional_blank_line
end

#cinclude(args = nil, body = nil) ⇒ Object

dot command



241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/livetext/standard.rb', line 241

def cinclude(args = nil, body = nil)   # dot command
  file = api.expand_variables(api.args.first)    # allows for variables
  if api.args.size > 1  # there is an HTML file
    processed = api.expand_variables(api.args[1]) 
    if File.exist?(processed) && File.mtime(processed) > File.mtime(file)
      api.args = [processed]
      copy
    end
  end
  check_file_exists(file)
  @parent.process_file(file)
  api.optional_blank_line
end

#cleanup(args = nil, body = nil) ⇒ Object



139
140
141
142
143
144
145
# File 'lib/livetext/standard.rb', line 139

def cleanup(args = nil, body = nil)
  api.args.each do |item|
    cmd = ::File.directory?(item) ? "rm -f #{item}/*" : "rm #{item}"
    system(cmd)
  end
  api.optional_blank_line
end

#comment(args = nil, body = nil) ⇒ Object



52
53
54
55
# File 'lib/livetext/standard.rb', line 52

def comment(args = nil, body = nil)
  api.body
  api.optional_blank_line
end

#copy(args = nil, body = nil) ⇒ Object



298
299
300
301
302
303
304
305
306
# File 'lib/livetext/standard.rb', line 298

def copy(args = nil, body = nil)
  file = api.args.first
  ok = check_file_exists(file)

  self.parent.graceful_error FileNotFound(file) unless ok   # FIXME seems weird?
    api.out grab_file(file)
  api.optional_blank_line
  [ok, file]
end

#debug(args = nil, body = nil) ⇒ Object



321
322
323
324
# File 'lib/livetext/standard.rb', line 321

def debug(args = nil, body = nil)
  @debug = onoff(api.args.first)
  api.optional_blank_line
end

#dlist(args = nil, body = nil) ⇒ Object



368
369
370
371
372
373
374
375
376
377
378
379
380
# File 'lib/livetext/standard.rb', line 368

def dlist(args = nil, body = nil)
  delim = api.args.first
  html.wrap(:dl) do
    api.body do |line|
      line = api.format(line)
      term, defn = line.split(delim)
      api.out html.tag(:dt, cdata: term)
      api.out "  " + html.tag(:dd, cdata: defn)
    end
  end
  api.out ""
  api.optional_blank_line
end

#dot_def(args = nil, body = nil) ⇒ Object



147
148
149
150
151
152
153
154
155
156
# File 'lib/livetext/standard.rb', line 147

def dot_def(args = nil, body = nil)
  name = api.args[0]
  check_disallowed(name)
  # Difficult to avoid eval here
  str = "def #{name}\n"
  str << api.body(true).join("\n")
  str << "\nend\n"
  eval str
  api.optional_blank_line
end

#dot_include(args = nil, body = nil) ⇒ Object

dot command



255
256
257
258
259
260
# File 'lib/livetext/standard.rb', line 255

def dot_include(args = nil, body = nil)   # dot command
  file = api.expand_variables(api.args.first)  # allows for variables
  check_file_exists(file)
  @parent.process_file(file)
  api.optional_blank_line
end

#errout(args = nil, body = nil) ⇒ Object



110
111
112
113
# File 'lib/livetext/standard.rb', line 110

def errout(args = nil, body = nil)
  ::STDERR.puts api.data
  api.optional_blank_line
end

#func(args = nil, body = nil) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/livetext/standard.rb', line 63

def func(args = nil, body = nil)
  funcname = api.args[0]
  # check_disallowed(funcname)  # should any be invalid?
  funcname = funcname.gsub(/\./, "__")
  func_def = <<~EOS
    def #{funcname}(param)
      #{api.body(true).to_a.join("\n")}
    end
  EOS
  api.optional_blank_line
  Livetext::Functions.class_eval func_def
  return true
end

#h1(args = nil, body = nil) ⇒ Object



77
# File 'lib/livetext/standard.rb', line 77

def h1(args = nil, body = nil); api.out html.tag(:h1, cdata: api.data); return true; end

#h2(args = nil, body = nil) ⇒ Object



78
# File 'lib/livetext/standard.rb', line 78

def h2(args = nil, body = nil); api.out html.tag(:h2, cdata: api.data); return true; end

#h3(args = nil, body = nil) ⇒ Object



79
# File 'lib/livetext/standard.rb', line 79

def h3(args = nil, body = nil); api.out html.tag(:h3, cdata: api.data); return true; end

#h4(args = nil, body = nil) ⇒ Object



80
# File 'lib/livetext/standard.rb', line 80

def h4(args = nil, body = nil); api.out html.tag(:h4, cdata: api.data); return true; end

#h5(args = nil, body = nil) ⇒ Object



81
# File 'lib/livetext/standard.rb', line 81

def h5(args = nil, body = nil); api.out html.tag(:h5, cdata: api.data); return true; end

#h6(args = nil, body = nil) ⇒ Object



82
# File 'lib/livetext/standard.rb', line 82

def h6(args = nil, body = nil); api.out html.tag(:h6, cdata: api.data); return true; end

#heading(args = nil, body = nil) ⇒ Object



348
349
350
351
352
353
# File 'lib/livetext/standard.rb', line 348

def heading(args = nil, body = nil)
  api.print "<center><font size=+1><b>"
  api.print api.data
  api.print "</b></font></center>"
  api.optional_blank_line
end

#heredoc(args = nil, body = nil) ⇒ Object



205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/livetext/standard.rb', line 205

def heredoc(args = nil, body = nil)
  var = api.args[0]
  text = api.body.join("\n")
  rhs = ""
  text.each_line do |line|
    str = api.format(line.chomp)
    rhs << str + "<br>\n"
  end
  indent = @parent.indentation.last
  indented = " " * indent
  api.setvar(var, rhs.chomp)
  api.optional_blank_line
end

#heredoc!(args = nil, body = nil) ⇒ Object

no



219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/livetext/standard.rb', line 219

def heredoc!(args = nil, body = nil)     # no <br>
  var = api.args[0]
  text = api.body.join("\n")
  rhs = ""
  text.each_line do |line|
    str = api.format(line.chomp)
    rhs << str + "\n"
  end
  indent = @parent.indentation.last
  indented = " " * indent
  api.setvar(var, rhs.chomp)
  api.optional_blank_line
end

#image(args = nil, body = nil) ⇒ Object



419
420
421
422
423
424
425
# File 'lib/livetext/standard.rb', line 419

def image(args = nil, body = nil)
  name, wide, high = api.args
  geom = ""
  geom = "width=#{wide} height=#{high}" if wide || high
  api.out "<img src='#{name} #{geom}'></img>"
  api.optional_blank_line
end

#import(args = nil, body = nil) ⇒ Object



286
287
288
289
290
291
292
293
294
295
296
# File 'lib/livetext/standard.rb', line 286

def import(args = nil, body = nil)
  name = api.args.first   # Expect a module name
  @imports ||= []
  return if @imports.include?(name)
  @imports << name
  mod = Livetext::Handler::Import.get_module(name, @parent)
  self.extend(mod)
  init = "init_#{name}"
  self.send(init) rescue nil  # if self.respond_to? init
  api.optional_blank_line
end

#inherit(args = nil, body = nil) ⇒ Object



262
263
264
265
266
267
268
269
270
271
272
# File 'lib/livetext/standard.rb', line 262

def inherit(args = nil, body = nil)
  file = api.args.first
  upper = "../#{file}"
  got_upper, got_file = File.exist?(upper), File.exist?(file)
  good = got_upper || got_file
  STDERR.puts "File #{file} not found (local or parent)" unless good

  @parent.process_file(upper) if got_upper
  @parent.process_file(file)  if got_file
  api.optional_blank_line
end


382
383
384
385
386
387
# File 'lib/livetext/standard.rb', line 382

def link(args = nil, body = nil)
  url = api.args.first
  text = api.args[2..-1].join(" ")
  api.out "<a style='text-decoration: none' href='#{url}'>#{text}</a>"
  api.optional_blank_line
end

#list(args = nil, body = nil) ⇒ Object



84
85
86
87
88
89
# File 'lib/livetext/standard.rb', line 84

def list(args = nil, body = nil)
  html.wrap :ul do
    api.body {|line| api.out html.tag(:li, cdata: line) }
  end
  api.optional_blank_line
end

#list!(args = nil, body = nil) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/livetext/standard.rb', line 91

def list!(args = nil, body = nil)
  html.wrap(:ul) do
    lines = api.body.each   # enumerator
    loop do
      line = lines.next
      line = api.format(line)
      str = line[0] == " " ? line : html.tag(:li, cdata: line)
      api.out str
    end
  end
  api.optional_blank_line
end

#mixin(args = nil, body = nil) ⇒ Object



274
275
276
277
278
279
280
281
282
283
284
# File 'lib/livetext/standard.rb', line 274

def mixin(args = nil, body = nil)
  name = api.args.first   # Expect a module name
  @mixins ||= []
  return if @mixins.include?(name)
  @mixins << name
  mod = Livetext::Handler::Mixin.get_module(name, @parent)
  self.extend(mod)
  init = "init_#{name}"
  self.send(init) rescue nil  # if self.respond_to? init
  api.optional_blank_line
end

#mono(args = nil, body = nil) ⇒ Object



361
362
363
364
365
366
# File 'lib/livetext/standard.rb', line 361

def mono(args = nil, body = nil)
  html.wrap ":pre" do
    api.body(true) {|line| api.out line }
  end
  api.optional_blank_line
end

#newpage(args = nil, body = nil) ⇒ Object



355
356
357
358
359
# File 'lib/livetext/standard.rb', line 355

def newpage(args = nil, body = nil)
  api.out '<p style="page-break-after:always;"></p>'
  api.out "<p/>"
  api.optional_blank_line
end

#nopara(args = nil, body = nil) ⇒ Object



343
344
345
346
# File 'lib/livetext/standard.rb', line 343

def nopara(args = nil, body = nil)
  @nopara = true
  api.optional_blank_line
end

#nopass(args = nil, body = nil) ⇒ Object



332
333
334
335
# File 'lib/livetext/standard.rb', line 332

def nopass(args = nil, body = nil)
  @nopass = true
  api.optional_blank_line
end

#para(args = nil, body = nil) ⇒ Object



337
338
339
340
341
# File 'lib/livetext/standard.rb', line 337

def para(args = nil, body = nil)
  # FIXME - add check for args size? (helpers)
  @nopara = ! onoff(api.args.first)
  api.optional_blank_line
end

#passthru(args = nil, body = nil) ⇒ Object



326
327
328
329
330
# File 'lib/livetext/standard.rb', line 326

def passthru(args = nil, body = nil)
  # FIXME - add check for args size? (helpers)
  @nopass = ! onoff(api.args.first)
  api.optional_blank_line
end

#quit(args = nil, body = nil) ⇒ Object



135
136
137
# File 'lib/livetext/standard.rb', line 135

def quit(args = nil, body = nil)
  @output.close
end

#r(args = nil, body = nil) ⇒ Object



308
309
310
311
312
313
# File 'lib/livetext/standard.rb', line 308

def r(args = nil, body = nil)
  # FIXME api.data is broken
  # api.out api.data  # No processing at all
  api.out api.args.join(" ")
  api.optional_blank_line
end

#raw(args = nil, body = nil) ⇒ Object



315
316
317
318
319
# File 'lib/livetext/standard.rb', line 315

def raw(args = nil, body = nil)
  # No processing at all (terminate with __EOF__)
  api.raw_body {|line| api.out line }  # no formatting
  api.optional_blank_line
end

#reflection(args = nil, body = nil) ⇒ Object

strictly experimental!



435
436
437
438
439
440
441
442
# File 'lib/livetext/standard.rb', line 435

def reflection(args = nil, body = nil)   # strictly experimental!
  list = self.methods
  obj  = Object.instance_methods
  diff = (list - obj).sort
  api.out "#{diff.size} methods:"
  api.out diff.inspect
  api.optional_blank_line
end

#say(args = nil, body = nil) ⇒ Object



120
121
122
123
124
125
# File 'lib/livetext/standard.rb', line 120

def say(args = nil, body = nil)
  data = args || api.args.join(" ")
  str = api.format(data)
  TTY.puts str
  api.optional_blank_line
end

#seek(args = nil, body = nil) ⇒ Object

like include, but search upward as needed



233
234
235
236
237
238
239
# File 'lib/livetext/standard.rb', line 233

def seek(args = nil, body = nil)    # like include, but search upward as needed
  file = api.args.first
file = search_upward(file)
  check_file_exists(file)
  @parent.process_file(file)
  api.optional_blank_line
end

#set(args = nil, body = nil) ⇒ Object



158
159
160
161
162
163
# File 'lib/livetext/standard.rb', line 158

def set(args = nil, body = nil)
  line = api.args.join(" ")  # data.chomp
  pairs = Livetext::ParseSet.new(line).parse
  api.setvars(pairs)
  api.optional_blank_line
end

#shell(args = nil, body = nil) ⇒ Object



57
58
59
60
61
# File 'lib/livetext/standard.rb', line 57

def shell(args = nil, body = nil)
  cmd = api.data
  system(cmd)
  api.optional_blank_line
end

#shell!(args = nil, body = nil) ⇒ Object



104
105
106
107
108
# File 'lib/livetext/standard.rb', line 104

def shell!(args = nil, body = nil)
  cmd = api.data
  system(cmd)
  api.optional_blank_line
end

#ttyout(args = nil, body = nil) ⇒ Object



115
116
117
118
# File 'lib/livetext/standard.rb', line 115

def ttyout(args = nil, body = nil)
  TTY.puts api.data
  api.optional_blank_line
end

#variables(args = nil, body = nil) ⇒ Object



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/livetext/standard.rb', line 182

def variables(args = nil, body = nil)
  prefix = api.args[0]
  file = api.args[1]
puts ">> variables: pre=#{prefix.inspect}  file=#{file.inspect} pwd=#{Dir.pwd}"
  prefix = nil if prefix == "-"  # FIXME dumb hack
  here = File.dirname(file)
  dok, fok = Dir.exist?(here), File.exist?(file)
  raise "No such dir #{here.inspect} (file #{file})" unless dok
  raise "No such file #{file.inspect} (file #{file})" unless fok
  if file
    here = ::Livetext::Vars[:FileDir] + "/"
    lines = File.readlines(here + file)
  else
    lines = api.body
  end
  pairs = Livetext::ParseGeneral.parse_vars(lines, prefix: nil)
  api.setvars(pairs)
  api.optional_blank_line
rescue => e
  puts e
  puts $!
end

#variables!(args = nil, body = nil) ⇒ Object

FIXME really these should be one method…



167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/livetext/standard.rb', line 167

def variables!(args = nil, body = nil)  # cwd, not FileDir - weird, fix later
  prefix = api.args[0]
  file = api.args[1]
  prefix = nil if prefix == "-"  # FIXME dumb hack
  if file
    here = ""  # different for ! version
    lines = File.readlines(here + file)
  else
    lines = api.body
  end
  pairs = Livetext::ParseGeneral.parse_vars(lines, prefix: nil)
  api.setvars(pairs)
  api.optional_blank_line
end

#xtable(args = nil, body = nil) ⇒ Object

Borrowed from bookish - FIXME



389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
# File 'lib/livetext/standard.rb', line 389

def xtable(args = nil, body = nil)   # Borrowed from bookish - FIXME
  title = api.data
  delim = " :: "
  api.out "<br>\n\n<center><table width=90% cellpadding=5>"
  lines = api.body(true)
  maxw = nil
  processed = []
  lines.each do |line|
    line = api.format(line)
    line.gsub!(/\n+/, "<br>\n")
    processed << line
    cells = line.split(delim)
    wide = cells.map {|cell| cell.length }
    maxw = [0] * cells.size
    maxw = maxw.map.with_index {|x, i| [x, wide[i]].max }
  end

  sum = maxw.inject(0, :+)
  maxw.map! {|x| (x/sum*100).floor }

  processed.each do |line|
    cells = line.split(delim)
    html.wrap :tr do
      cells.each {|cell| api.out "  <td valign=top>#{cell}</td>" }
    end
  end
  api.out "</table></center>"
  api.optional_blank_line
end