runeblog 0.3.18 → 0.3.23

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.
@@ -8,12 +8,14 @@
8
8
  <html>
9
9
  <!-- Generated from $File on $$date; editing not recommended. -->
10
10
 
11
- .seek global.lt3
11
+ .include $ViewDir/data/global.lt3
12
+
13
+ .variables! post metadata.txt
12
14
 
13
15
  . FIXME
14
16
  .head
15
- og:title $title
16
- description $teaser
17
+ og:title $post.title
18
+ description $post.teaser
17
19
  style blog.css
18
20
  .end
19
21
 
@@ -23,7 +25,8 @@ style blog.css
23
25
  <div class="recent-content">
24
26
  $.post_toolbar
25
27
  <table border=0 width=100%><tr>
26
- <td align=left valign=bottom><h2 class="recent-title">$title</h2></td>
28
+ <td align=left valign=bottom><h2 class="recent-title">$post.title</h2></td>
29
+ . FIXME - longdate is passed in from outside
27
30
  <td align=right valign=top><font size=-5><br></font>$longdate</td>
28
31
  </tr></table><hr>
29
32
  $.copy guts.html
@@ -31,6 +34,6 @@ style blog.css
31
34
  </section>
32
35
 
33
36
  <br>
34
- .post_trailer
37
+ .post_trailer $post.num
35
38
  </body>
36
39
  </html>
@@ -12,7 +12,7 @@
12
12
  <!-- Editing this file is not recommended. -->
13
13
  <!-- It was generated from $File on $$date. -->
14
14
 
15
- .seek global.lt3
15
+ .include $ViewDir/data/global.lt3
16
16
 
17
17
  .head
18
18
  og:title $title
@@ -0,0 +1,37 @@
1
+
2
+ def make_exception(sym, str, target_class = Object)
3
+ return if target_class.constants.include?(sym)
4
+
5
+ target_class.const_set(sym, StandardError.dup)
6
+ define_method(sym) do |*args|
7
+ msg = str.dup
8
+ args.each.with_index {|arg, i| msg.sub!("%#{i+1}", arg) }
9
+ target_class.class_eval(sym.to_s).new(msg)
10
+ end
11
+ end
12
+
13
+ make_exception(:NotImplemented, "Feature not yet implemented")
14
+ make_exception(:CantOpen, "Can't open '%1'")
15
+ make_exception(:CantDelete, "Can't delete '%1'")
16
+ make_exception(:InternalError, "Glitch: %1 got arg '%2'")
17
+ make_exception(:CantCopy, "Can't copy %1 to %2")
18
+
19
+ make_exception(:FileNotFound, "File %1 was not found")
20
+ make_exception(:FoundNeither, "Found neither %1 nor %2")
21
+ make_exception(:BlogRepoAlreadyExists, "Blog repo %1 already exists")
22
+ make_exception(:CantAssignView, "%1 is not a view")
23
+ make_exception(:ViewAlreadyExists, "View %1 already exists")
24
+ make_exception(:DirAlreadyExists, "Directory %1 already exists")
25
+ make_exception(:CantCreateDir, "Can't create directory %1")
26
+ make_exception(:EditorProblem, "Could not edit %1")
27
+ make_exception(:NoSuchView, "No such view: %1")
28
+ make_exception(:NoBlogAccessor, "Runeblog.blog is not set")
29
+ make_exception(:ExpectedString, "Expected nonempty string but got %1 (%2)")
30
+ make_exception(:ExpectedView, "Expected string or View object but got %1 (%2)")
31
+ make_exception(:ExpectedInteger, "Expected integer but got %1 (%2)")
32
+ make_exception(:NoPostCall, "Method #post not called (no metadata)")
33
+ make_exception(:CantFindWidgetDir, "Can't find widget dir '%1'")
34
+ make_exception(:PublishError, "Error during publishing")
35
+ make_exception(:NoNumericPrefix, "No numeric prefix on slug '%1'")
36
+ make_exception(:NoExtensionExpected, "No file extension expected on '%1'")
37
+
@@ -24,6 +24,7 @@ module RuneBlog::Helpers
24
24
  dir = root/:views/view/:settings
25
25
  end
26
26
  file = dir/"features.txt"
27
+ # puts "-- in #{Dir.pwd} trying to read #{file}"
27
28
  pairs = read_pairs(file)
28
29
  enabled = {}
29
30
  pairs.each {|k,v| enabled[k] = (v == "1") }
@@ -54,11 +55,12 @@ module RuneBlog::Helpers
54
55
  puts
55
56
  end
56
57
 
57
- def get_repo_config
58
+ def get_repo_config(root = ".blogs")
58
59
  log!(enter: __method__, level: 3)
59
- @editor = File.read(".blogs/data/EDITOR").chomp
60
- @current_view = File.read(".blogs/data/VIEW").chomp
61
- @root = File.read(".blogs/data/ROOT").chomp
60
+ @editor = File.read("#{root}/data/EDITOR").chomp
61
+ @current_view = File.read("#{root}/data/VIEW").chomp
62
+ @root = File.read("#{root}/data/ROOT").chomp
63
+ # Huh? Why not just @root = root? Hal.wtf?
62
64
  rescue => err
63
65
  puts "Can't read config: #{err}"
64
66
  puts err.backtrace.join("\n")
@@ -1,11 +1,7 @@
1
1
 
2
- # Reopening...
3
-
4
- make_exception(:CantOpen, "Can't open '$1'")
5
- make_exception(:CantDelete, "Can't open '$1'")
6
- make_exception(:InternalError, "Glitch: $1 got arg '$2'")
7
- make_exception(:CantCopy, "Can't copy $1 to $2")
2
+ require 'exceptions'
8
3
 
4
+ # Reopening...
9
5
 
10
6
  module RuneBlog::REPL
11
7
  Patterns =
@@ -12,6 +12,7 @@ require 'processing'
12
12
 
13
13
 
14
14
  def init_liveblog # FIXME - a lot of this logic sucks
15
+ log!(enter: __method__)
15
16
  dir = Dir.pwd.sub(/\.blogs.*/, "")
16
17
  @blog = nil
17
18
  Dir.chdir(dir) { @blog = RuneBlog.new }
@@ -19,6 +20,8 @@ def init_liveblog # FIXME - a lot of this logic sucks
19
20
  @view = @blog.view
20
21
  @view_name = @blog.view.name unless @view.nil?
21
22
  @vdir = @blog.view.dir rescue "NONAME"
23
+ setvar("View", @view_name)
24
+ setvar("ViewDir", @blog.root/:views/@view_name)
22
25
  @version = RuneBlog::VERSION
23
26
  @theme = @vdir/:themes/:standard
24
27
 
@@ -33,10 +36,10 @@ def init_liveblog # FIXME - a lot of this logic sucks
33
36
  </a>
34
37
  HTML
35
38
  end
39
+ log!(str: "End of init_liveblog")
36
40
  rescue => err
37
41
  STDERR.puts "err = #{err}"
38
- STDERR.puts err.backtrace.join("\n")
39
- # raise "Only works inside a blog repo"
42
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
40
43
  end
41
44
 
42
45
  ##################
@@ -44,6 +47,7 @@ end
44
47
  ##################
45
48
 
46
49
  def dropcap
50
+ log!(enter: __method__)
47
51
  # Bad form: adds another HEAD
48
52
  text = _data
49
53
  _out " "
@@ -54,12 +58,15 @@ def dropcap
54
58
  end
55
59
 
56
60
  def post
61
+ log!(enter: __method__)
57
62
  @meta = OpenStruct.new
58
63
  @meta.num = _args[0]
64
+ setvar("post.num", @meta.num.to_i)
59
65
  _out " <!-- Post number #{@meta.num} -->\n "
60
66
  end
61
67
 
62
68
  def _got_python?
69
+ log!(enter: __method__)
63
70
  # Dumb - fix later - check up front as needed
64
71
  # Should also check for praw lib
65
72
  str = `which python3`
@@ -67,6 +74,7 @@ end
67
74
  end
68
75
 
69
76
  def _reddit_post_url(vdir, date, title, url)
77
+ log!(enter: __method__)
70
78
  _got_python?
71
79
  tmpfile = "/tmp/reddit-post-url.txt"
72
80
  File.open(tmpfile, "w") do |tmp|
@@ -80,6 +88,7 @@ end
80
88
  end
81
89
 
82
90
  def post_toolbar
91
+ log!(enter: __method__)
83
92
  back_icon = %[<img src="assets/back-icon.png" width=24 height=24 alt="Go back"></img>]
84
93
  back = %[<a style="text-decoration: none" href="javascript:history.go(-1)">#{back_icon}</a>]
85
94
  _out <<~HTML
@@ -88,21 +97,36 @@ def post_toolbar
88
97
  end
89
98
 
90
99
  def post_trailer
91
- perma = _var("publish.proto") + "://" + _var("publish.server") +
92
- "/" + _var("publish.path") + "/" + _var("post.aslug") +
93
- ".html"
94
- tags = _var("post.tags")
100
+ log!(enter: __method__)
101
+ # Not called from *inside* a post, therefore no @meta --
102
+ # can/must call read_metadata
103
+ num = _var("post.num").to_i
104
+ log! str: "post_trailer: num = #{num}"
105
+ vp = _post_lookup(num)
106
+ log! str: "post_trailer: lookup = #{vp.num} #{vp.title}"
107
+ dir = @blog.root/:posts/vp.nslug
108
+ log! str: " -- dir = #{dir}"
109
+ meta = Dir.chdir(dir) { @blog.read_metadata }
110
+ nslug = @blog.make_slug(meta)
111
+ aslug = nslug[5..-1]
112
+ proto = _var("publish.proto")
113
+ server = _var("publish.server")
114
+ path = _var("publish.path")
115
+ perma = "#{proto}://#{server}/#{path}/#{aslug}.html"
116
+ tags = meta.tags
95
117
  taglist = tags.empty? ? "" : "Tags: #{tags}"
96
118
 
97
119
  reddit_txt = ""
98
120
  if @reddit_enabled
99
121
  vdir = @blog.root/:views/@blog.view
100
- nslug = "#{_var("post.num")}-#{_var("post.aslug")}"
101
- date = _var("post.date")
122
+ date = meta.date
102
123
  rid_file = vdir/:posts/nslug/"reddit.id"
103
- rid = File.exist?(rid_file) ? File.read(rid_file).chomp : nil
104
- if rid.nil?
105
- title = _var("title")
124
+ if File.exist?(rid_file)
125
+ STDERR.puts " reading #{rid_file}"
126
+ rid = File.read(rid_file).chomp
127
+ else
128
+ STDERR.puts " creating #{rid_file}"
129
+ title = meta.title
106
130
  rid = _reddit_post_url(vdir, date, title, perma)
107
131
  dump(rid, rid_file)
108
132
  end
@@ -113,6 +137,7 @@ def post_trailer
113
137
  HTML
114
138
  # damned syntax highlighting </>
115
139
  end
140
+ # STDERR.print "Pausing... "; getch
116
141
  _out <<~HTML
117
142
  #{reddit_txt}
118
143
  <hr>
@@ -124,6 +149,7 @@ def post_trailer
124
149
  end
125
150
 
126
151
  def faq
152
+ log!(enter: __method__)
127
153
  @faq_count ||= 0
128
154
  _out "<br>" if @faq_count == 0
129
155
  @faq_count += 1
@@ -138,15 +164,18 @@ def faq
138
164
  end
139
165
 
140
166
  def backlink
167
+ log!(enter: __method__)
141
168
  _out %[<br><a href="javascript:history.go(-1)">[Back]</a>]
142
169
  end
143
170
 
144
171
  def code
172
+ log!(enter: __method__)
145
173
  lines = _body # _text
146
174
  _out "<font size=+1><pre>\n#{lines}\n</pre></font>"
147
175
  end
148
176
 
149
177
  def _read_navbar_data
178
+ log!(enter: __method__)
150
179
  vdir = @blog.root/:views/@blog.view
151
180
  dir = vdir/"themes/standard/banner/navbar/"
152
181
  datafile = dir/"list.data"
@@ -154,6 +183,7 @@ def _read_navbar_data
154
183
  end
155
184
 
156
185
  def banner
186
+ log!(enter: __method__)
157
187
  count = 0
158
188
  bg = "white" # outside loop
159
189
  wide = nil
@@ -187,9 +217,9 @@ def banner
187
217
  if ! File.exist?(file)
188
218
  src = file.sub(/html$/, "lt3")
189
219
  if File.exist?(src)
190
- preprocess src: src, dst: file, call: ".nopara" # , vars: @blog.view.globals
220
+ preprocess src: src, dst: file, call: ".nopara", vars: @blog.view.globals
191
221
  else
192
- raise "Neither #{file} nor #{src} found"
222
+ raise FoundNeither(file, src)
193
223
  end
194
224
  end
195
225
  str2 << "<td>" + File.read(file) + "</td>" + "\n"
@@ -213,11 +243,11 @@ def banner
213
243
  _out navbar if navbar
214
244
  rescue => err
215
245
  STDERR.puts "err = #{err}"
216
- STDERR.puts err.backtrace.join("\n")
217
- gets
246
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
218
247
  end
219
248
 
220
249
  def _svg_title(*args)
250
+ log!(enter: __method__)
221
251
  width = "95%"
222
252
  height = 90
223
253
  bgcolor = "black"
@@ -273,6 +303,7 @@ def _svg_title(*args)
273
303
  end
274
304
 
275
305
  def quote
306
+ log!(enter: __method__)
276
307
  _passthru "<blockquote>"
277
308
  _passthru _body.join(" ")
278
309
  _passthru "</blockquote>"
@@ -280,9 +311,11 @@ def quote
280
311
  end
281
312
 
282
313
  def categories # does nothing right now
314
+ log!(enter: __method__)
283
315
  end
284
316
 
285
317
  def style
318
+ log!(enter: __method__)
286
319
  fname = _args[0]
287
320
  _passthru %[<link rel="stylesheet" href="???/etc/#{fname}')">]
288
321
  end
@@ -299,6 +332,7 @@ def h6; _passthru "<h6>#{@_data}</h6>"; end
299
332
  def hr; _passthru "<hr>"; end
300
333
 
301
334
  def nlist
335
+ log!(enter: __method__)
302
336
  _out "<ol>"
303
337
  _body {|line| _out "<li>#{line}</li>" }
304
338
  _out "</ol>"
@@ -306,6 +340,7 @@ def nlist
306
340
  end
307
341
 
308
342
  def list
343
+ log!(enter: __method__)
309
344
  _out "<ul>"
310
345
  _body {|line| _out "<li>#{line}</li>" }
311
346
  _out "</ul>"
@@ -313,6 +348,7 @@ def list
313
348
  end
314
349
 
315
350
  def list!
351
+ log!(enter: __method__)
316
352
  _out "<ul>"
317
353
  lines = _body.each
318
354
  loop do
@@ -331,6 +367,7 @@ end
331
367
  ### inset
332
368
 
333
369
  def inset
370
+ log!(enter: __method__)
334
371
  lines = _body
335
372
  box = ""
336
373
  output = []
@@ -362,7 +399,8 @@ def inset
362
399
  end
363
400
 
364
401
  def title
365
- raise "'post' was not called" unless @meta
402
+ log!(enter: __method__)
403
+ raise NoPostCall unless @meta
366
404
  title = @_data.chomp
367
405
  @meta.title = title
368
406
  setvar :title, title
@@ -371,7 +409,8 @@ def title
371
409
  end
372
410
 
373
411
  def pubdate
374
- raise "'post' was not called" unless @meta
412
+ log!(enter: __method__)
413
+ raise NoPostCall unless @meta
375
414
  _debug "data = #@_data"
376
415
  # Check for discrepancy?
377
416
  match = /(\d{4}).(\d{2}).(\d{2})/.match @_data
@@ -383,21 +422,24 @@ def pubdate
383
422
  end
384
423
 
385
424
  def tags
386
- raise "'post' was not called" unless @meta
425
+ log!(enter: __method__)
426
+ raise NoPostCall unless @meta
387
427
  _debug "args = #{_args}"
388
428
  @meta.tags = _args.dup || []
389
429
  _optional_blank_line
390
430
  end
391
431
 
392
432
  def views
393
- raise "'post' was not called" unless @meta
433
+ log!(enter: __method__)
434
+ raise NoPostCall unless @meta
394
435
  _debug "data = #{_args}"
395
436
  @meta.views = _args.dup
396
437
  _optional_blank_line
397
438
  end
398
439
 
399
440
  def pin
400
- raise "'post' was not called" unless @meta
441
+ log!(enter: __method__)
442
+ raise NoPostCall unless @meta
401
443
  _debug "data = #{_args}" # verify only valid views?
402
444
  pinned = @_args
403
445
  @meta.pinned = pinned
@@ -412,22 +454,23 @@ def pin
412
454
  _optional_blank_line
413
455
  rescue => err
414
456
  STDERR.puts "err = #{err}"
415
- STDERR.puts err.backtrace.join("\n")
416
- gets
457
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
417
458
  end
418
459
 
419
460
  def write_post
420
- raise "'post' was not called" unless @meta
461
+ log!(enter: __method__)
462
+ raise NoPostCall unless @meta
421
463
  @meta.views = @meta.views.join(" ") if @meta.views.is_a? Array
422
464
  @meta.tags = @meta.tags.join(" ") if @meta.tags.is_a? Array
423
465
  _write_metadata
424
466
  rescue => err
425
467
  puts "err = #{err}"
426
- puts err.backtrace.join("\n")
468
+ puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
427
469
  end
428
470
 
429
471
  def teaser
430
- raise "'post' was not called" unless @meta
472
+ log!(enter: __method__)
473
+ raise NoPostCall unless @meta
431
474
  text = _body.join("\n")
432
475
  @meta.teaser = text
433
476
  setvar :teaser, @meta.teaser
@@ -441,6 +484,7 @@ def teaser
441
484
  end
442
485
 
443
486
  def finalize
487
+ log!(str: "Now exiting livetext processing...")
444
488
  return unless @meta
445
489
  return @meta if @blog.nil?
446
490
 
@@ -452,6 +496,7 @@ def finalize
452
496
  end
453
497
 
454
498
  def head # Does NOT output <head> tags
499
+ log!(enter: __method__)
455
500
  args = _args
456
501
  args.each do |inc|
457
502
  self.data = inc
@@ -507,6 +552,7 @@ end
507
552
  ########## newer stuff...
508
553
 
509
554
  def meta
555
+ log!(enter: __method__)
510
556
  args = _args
511
557
  enum = args.each
512
558
  str = "<meta"
@@ -526,6 +572,7 @@ def meta
526
572
  end
527
573
 
528
574
  def recent_posts # side-effect
575
+ log!(enter: __method__)
529
576
  _out <<-HTML
530
577
  <div class="col-lg-9 col-md-9 col-sm-9 col-xs-12">
531
578
  <iframe id="main" style="width: 70vw; height: 100vh; position: relative;"
@@ -536,6 +583,7 @@ def recent_posts # side-effect
536
583
  end
537
584
 
538
585
  def _make_class_name(app)
586
+ log!(enter: __method__)
539
587
  if app =~ /[-_]/
540
588
  words = app.split(/[-_]/)
541
589
  name = words.map(&:capitalize).join
@@ -546,6 +594,7 @@ def _make_class_name(app)
546
594
  end
547
595
 
548
596
  def _load_local(widget)
597
+ log!(enter: __method__)
549
598
  Dir.chdir("../../widgets/#{widget}") do
550
599
  rclass = _make_class_name(widget)
551
600
  found = (require("./#{widget}") if File.exist?("#{widget}.rb"))
@@ -554,12 +603,13 @@ def _load_local(widget)
554
603
  end
555
604
  rescue => err
556
605
  STDERR.puts err.to_s
557
- STDERR.puts err.backtrace.join("\n")
606
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
558
607
  sleep 6; RubyText.stop
559
608
  exit
560
609
  end
561
610
 
562
611
  def _handle_standard_widget(tag)
612
+ log!(enter: __method__)
563
613
  wtag = "../../widgets"/tag
564
614
  code = _load_local(tag)
565
615
  if code
@@ -571,6 +621,7 @@ def _handle_standard_widget(tag)
571
621
  end
572
622
 
573
623
  def sidebar
624
+ log!(enter: __method__)
574
625
  _debug "--- handling sidebar\r"
575
626
  if _args.include? "off"
576
627
  _body { } # iterate, do nothing
@@ -584,9 +635,8 @@ def sidebar
584
635
  _body do |token|
585
636
  tag = token.chomp.strip.downcase
586
637
  wtag = "../../widgets"/tag
587
- raise "Can't find #{wtag}" unless Dir.exist?(wtag)
638
+ raise CantFindWidgetDir(wtag) unless Dir.exist?(wtag)
588
639
  tcard = "#{tag}-card.html"
589
-
590
640
  case
591
641
  when standard.include?(tag)
592
642
  _handle_standard_widget(tag)
@@ -599,12 +649,13 @@ def sidebar
599
649
  _out %[</div>]
600
650
  rescue => err
601
651
  puts "err = #{err}"
602
- puts err.backtrace.join("\n")
652
+ puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
603
653
  sleep 6; RubyText.stop
604
654
  exit
605
655
  end
606
656
 
607
657
  def stylesheet
658
+ log!(enter: __method__)
608
659
  lines = _body
609
660
  url = lines[0]
610
661
  integ = lines[1]
@@ -613,6 +664,7 @@ def stylesheet
613
664
  end
614
665
 
615
666
  def script
667
+ log!(enter: __method__)
616
668
  lines = _body
617
669
  url = lines[0]
618
670
  integ = lines[1]
@@ -662,6 +714,7 @@ end
662
714
 
663
715
 
664
716
  def tag_cloud
717
+ log!(enter: __method__)
665
718
  title = _data
666
719
  title = "Tag Cloud" if title.empty?
667
720
  open = <<-HTML
@@ -685,18 +738,22 @@ def tag_cloud
685
738
  end
686
739
 
687
740
  def vnavbar
741
+ log!(enter: __method__)
688
742
  str = _make_navbar(:vert)
689
743
  end
690
744
 
691
745
  def hnavbar
746
+ log!(enter: __method__)
692
747
  str = _make_navbar # horiz is default
693
748
  end
694
749
 
695
750
  def navbar
751
+ log!(enter: __method__)
696
752
  str = _make_navbar # horiz is default
697
753
  end
698
754
 
699
755
  def _make_navbar(orient = :horiz)
756
+ log!(enter: __method__)
700
757
  vdir = @root/:views/@blog.view
701
758
  title = _var("view.title")
702
759
 
@@ -737,7 +794,7 @@ def _make_navbar(orient = :horiz)
737
794
  else
738
795
  dir = @blog.root/:views/@blog.view/"themes/standard/banner/navbar"
739
796
  dest = vdir/"remote/banner/navbar"/basename+".html"
740
- preprocess cwd: dir, src: basename, dst: dest, call: ".nopara" # , debug: true
797
+ preprocess cwd: dir, src: basename, dst: dest, call: ".nopara", vars: @blog.view.globals # , debug: true
741
798
  output.puts %[#{li1} <a class="nav-link" #{href_main}>#{cdata}</a> #{li2}]
742
799
  end
743
800
  end
@@ -752,6 +809,7 @@ end
752
809
  ##################
753
810
 
754
811
  def _html_body(file, css = nil)
812
+ log!(enter: __method__)
755
813
  file.puts "<html>"
756
814
  if css
757
815
  file.puts " <head>"
@@ -764,10 +822,12 @@ def _html_body(file, css = nil)
764
822
  end
765
823
 
766
824
  def _errout(*args)
825
+ log!(enter: __method__)
767
826
  ::STDERR.puts *args
768
827
  end
769
828
 
770
829
  def _passthru(line)
830
+ log!(enter: __method__)
771
831
  return if line.nil?
772
832
  line = _format(line)
773
833
  _out line + "\n"
@@ -775,6 +835,7 @@ def _passthru(line)
775
835
  end
776
836
 
777
837
  def _passthru_noline(line)
838
+ log!(enter: __method__)
778
839
  return if line.nil?
779
840
  line = _format(line)
780
841
  _out line
@@ -782,6 +843,7 @@ def _passthru_noline(line)
782
843
  end
783
844
 
784
845
  def _write_metadata
846
+ log!(enter: __method__)
785
847
  File.write("teaser.txt", @meta.teaser)
786
848
  fields = [:num, :title, :date, :pubdate, :views, :tags, :pinned]
787
849
  fname = "metadata.txt"
@@ -791,20 +853,32 @@ def _write_metadata
791
853
  end
792
854
 
793
855
  def _post_lookup(postid) # side-effect
856
+ log!(enter: __method__)
794
857
  # .. = templates, ../.. = views/thisview
795
858
  slug = title = date = teaser_text = nil
796
859
 
860
+ view = @blog.view
861
+ vdir = view.dir rescue "NONAME"
862
+ setvar("View", view.name)
863
+ setvar("ViewDir", @blog.root/:views/view.name)
864
+ tmp = File.new("/tmp/PL-#{Time.now.to_i}.txt", "w")
865
+ tmp.puts "_post_lookup: blog.view = #{@blog.view.inspect}"
866
+ tmp.puts "_post_lookup: vdir = #{vdir}"
797
867
  dir_posts = @vdir/:posts
798
868
  posts = Dir.entries(dir_posts).grep(/^\d\d\d\d/).map {|x| dir_posts/x }
799
869
  posts.select! {|x| File.directory?(x) }
800
870
 
871
+ tmp.puts "_post_lookup: postid = #{postid}"
872
+ tmp.puts "_post_lookup: posts = \n#{posts.inspect}"
873
+ tmp.close
801
874
  posts = posts.select {|x| File.basename(x).to_i == postid }
802
- postdir = exactly_one(posts)
875
+ postdir = exactly_one(posts, posts.inspect)
803
876
  vp = RuneBlog::ViewPost.new(@blog.view, postdir)
804
877
  vp
805
878
  end
806
879
 
807
880
  def _card_generic(card_title:, middle:, extra: "")
881
+ log!(enter: __method__)
808
882
  front = <<-HTML
809
883
  <div class="card #{extra} mb-3">
810
884
  <div class="card-body">
@@ -820,14 +894,17 @@ def _card_generic(card_title:, middle:, extra: "")
820
894
  end
821
895
 
822
896
  def _var(name) # FIXME scope issue!
897
+ log!(enter: __method__)
823
898
  ::Livetext::Vars[name] || "[:#{name} is undefined]"
824
899
  end
825
900
 
826
901
  def _main(url)
902
+ log!(enter: __method__)
827
903
  %[href="javascript: void(0)" onclick="javascript:open_main('#{url}')"]
828
904
  end
829
905
 
830
906
  def _blank(url)
907
+ log!(enter: __method__)
831
908
  %[href='#{url}' target='blank']
832
909
  end
833
910