runeblog 0.3.19 → 0.3.24

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
@@ -12,7 +12,7 @@ end
12
12
 
13
13
  make_exception(:NotImplemented, "Feature not yet implemented")
14
14
  make_exception(:CantOpen, "Can't open '%1'")
15
- make_exception(:CantDelete, "Can't open '%1'")
15
+ make_exception(:CantDelete, "Can't delete '%1'")
16
16
  make_exception(:InternalError, "Glitch: %1 got arg '%2'")
17
17
  make_exception(:CantCopy, "Can't copy %1 to %2")
18
18
 
@@ -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")
@@ -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,9 +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")
42
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
39
43
  end
40
44
 
41
45
  ##################
@@ -43,6 +47,7 @@ end
43
47
  ##################
44
48
 
45
49
  def dropcap
50
+ log!(enter: __method__)
46
51
  # Bad form: adds another HEAD
47
52
  text = _data
48
53
  _out " "
@@ -53,12 +58,15 @@ def dropcap
53
58
  end
54
59
 
55
60
  def post
61
+ log!(enter: __method__)
56
62
  @meta = OpenStruct.new
57
63
  @meta.num = _args[0]
64
+ setvar("post.num", @meta.num.to_i)
58
65
  _out " <!-- Post number #{@meta.num} -->\n "
59
66
  end
60
67
 
61
68
  def _got_python?
69
+ log!(enter: __method__)
62
70
  # Dumb - fix later - check up front as needed
63
71
  # Should also check for praw lib
64
72
  str = `which python3`
@@ -66,6 +74,7 @@ end
66
74
  end
67
75
 
68
76
  def _reddit_post_url(vdir, date, title, url)
77
+ log!(enter: __method__)
69
78
  _got_python?
70
79
  tmpfile = "/tmp/reddit-post-url.txt"
71
80
  File.open(tmpfile, "w") do |tmp|
@@ -79,6 +88,7 @@ end
79
88
  end
80
89
 
81
90
  def post_toolbar
91
+ log!(enter: __method__)
82
92
  back_icon = %[<img src="assets/back-icon.png" width=24 height=24 alt="Go back"></img>]
83
93
  back = %[<a style="text-decoration: none" href="javascript:history.go(-1)">#{back_icon}</a>]
84
94
  _out <<~HTML
@@ -87,21 +97,36 @@ def post_toolbar
87
97
  end
88
98
 
89
99
  def post_trailer
90
- perma = _var("publish.proto") + "://" + _var("publish.server") +
91
- "/" + _var("publish.path") + "/" + _var("post.aslug") +
92
- ".html"
93
- 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
94
117
  taglist = tags.empty? ? "" : "Tags: #{tags}"
95
118
 
96
119
  reddit_txt = ""
97
120
  if @reddit_enabled
98
121
  vdir = @blog.root/:views/@blog.view
99
- nslug = "#{_var("post.num")}-#{_var("post.aslug")}"
100
- date = _var("post.date")
122
+ date = meta.date
101
123
  rid_file = vdir/:posts/nslug/"reddit.id"
102
- rid = File.exist?(rid_file) ? File.read(rid_file).chomp : nil
103
- if rid.nil?
104
- 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
105
130
  rid = _reddit_post_url(vdir, date, title, perma)
106
131
  dump(rid, rid_file)
107
132
  end
@@ -112,6 +137,7 @@ def post_trailer
112
137
  HTML
113
138
  # damned syntax highlighting </>
114
139
  end
140
+ # STDERR.print "Pausing... "; getch
115
141
  _out <<~HTML
116
142
  #{reddit_txt}
117
143
  <hr>
@@ -123,6 +149,7 @@ def post_trailer
123
149
  end
124
150
 
125
151
  def faq
152
+ log!(enter: __method__)
126
153
  @faq_count ||= 0
127
154
  _out "<br>" if @faq_count == 0
128
155
  @faq_count += 1
@@ -137,15 +164,18 @@ def faq
137
164
  end
138
165
 
139
166
  def backlink
167
+ log!(enter: __method__)
140
168
  _out %[<br><a href="javascript:history.go(-1)">[Back]</a>]
141
169
  end
142
170
 
143
171
  def code
172
+ log!(enter: __method__)
144
173
  lines = _body # _text
145
174
  _out "<font size=+1><pre>\n#{lines}\n</pre></font>"
146
175
  end
147
176
 
148
177
  def _read_navbar_data
178
+ log!(enter: __method__)
149
179
  vdir = @blog.root/:views/@blog.view
150
180
  dir = vdir/"themes/standard/banner/navbar/"
151
181
  datafile = dir/"list.data"
@@ -153,6 +183,7 @@ def _read_navbar_data
153
183
  end
154
184
 
155
185
  def banner
186
+ log!(enter: __method__)
156
187
  count = 0
157
188
  bg = "white" # outside loop
158
189
  wide = nil
@@ -186,7 +217,7 @@ def banner
186
217
  if ! File.exist?(file)
187
218
  src = file.sub(/html$/, "lt3")
188
219
  if File.exist?(src)
189
- preprocess src: src, dst: file, call: ".nopara" # , vars: @blog.view.globals
220
+ preprocess src: src, dst: file, call: ".nopara", vars: @blog.view.globals
190
221
  else
191
222
  raise FoundNeither(file, src)
192
223
  end
@@ -212,11 +243,11 @@ def banner
212
243
  _out navbar if navbar
213
244
  rescue => err
214
245
  STDERR.puts "err = #{err}"
215
- STDERR.puts err.backtrace.join("\n")
216
- gets
246
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
217
247
  end
218
248
 
219
249
  def _svg_title(*args)
250
+ log!(enter: __method__)
220
251
  width = "95%"
221
252
  height = 90
222
253
  bgcolor = "black"
@@ -272,6 +303,7 @@ def _svg_title(*args)
272
303
  end
273
304
 
274
305
  def quote
306
+ log!(enter: __method__)
275
307
  _passthru "<blockquote>"
276
308
  _passthru _body.join(" ")
277
309
  _passthru "</blockquote>"
@@ -279,9 +311,11 @@ def quote
279
311
  end
280
312
 
281
313
  def categories # does nothing right now
314
+ log!(enter: __method__)
282
315
  end
283
316
 
284
317
  def style
318
+ log!(enter: __method__)
285
319
  fname = _args[0]
286
320
  _passthru %[<link rel="stylesheet" href="???/etc/#{fname}')">]
287
321
  end
@@ -298,6 +332,7 @@ def h6; _passthru "<h6>#{@_data}</h6>"; end
298
332
  def hr; _passthru "<hr>"; end
299
333
 
300
334
  def nlist
335
+ log!(enter: __method__)
301
336
  _out "<ol>"
302
337
  _body {|line| _out "<li>#{line}</li>" }
303
338
  _out "</ol>"
@@ -305,6 +340,7 @@ def nlist
305
340
  end
306
341
 
307
342
  def list
343
+ log!(enter: __method__)
308
344
  _out "<ul>"
309
345
  _body {|line| _out "<li>#{line}</li>" }
310
346
  _out "</ul>"
@@ -312,6 +348,7 @@ def list
312
348
  end
313
349
 
314
350
  def list!
351
+ log!(enter: __method__)
315
352
  _out "<ul>"
316
353
  lines = _body.each
317
354
  loop do
@@ -330,6 +367,7 @@ end
330
367
  ### inset
331
368
 
332
369
  def inset
370
+ log!(enter: __method__)
333
371
  lines = _body
334
372
  box = ""
335
373
  output = []
@@ -361,6 +399,7 @@ def inset
361
399
  end
362
400
 
363
401
  def title
402
+ log!(enter: __method__)
364
403
  raise NoPostCall unless @meta
365
404
  title = @_data.chomp
366
405
  @meta.title = title
@@ -370,6 +409,7 @@ def title
370
409
  end
371
410
 
372
411
  def pubdate
412
+ log!(enter: __method__)
373
413
  raise NoPostCall unless @meta
374
414
  _debug "data = #@_data"
375
415
  # Check for discrepancy?
@@ -382,6 +422,7 @@ def pubdate
382
422
  end
383
423
 
384
424
  def tags
425
+ log!(enter: __method__)
385
426
  raise NoPostCall unless @meta
386
427
  _debug "args = #{_args}"
387
428
  @meta.tags = _args.dup || []
@@ -389,6 +430,7 @@ def tags
389
430
  end
390
431
 
391
432
  def views
433
+ log!(enter: __method__)
392
434
  raise NoPostCall unless @meta
393
435
  _debug "data = #{_args}"
394
436
  @meta.views = _args.dup
@@ -396,6 +438,7 @@ def views
396
438
  end
397
439
 
398
440
  def pin
441
+ log!(enter: __method__)
399
442
  raise NoPostCall unless @meta
400
443
  _debug "data = #{_args}" # verify only valid views?
401
444
  pinned = @_args
@@ -411,21 +454,22 @@ def pin
411
454
  _optional_blank_line
412
455
  rescue => err
413
456
  STDERR.puts "err = #{err}"
414
- STDERR.puts err.backtrace.join("\n")
415
- gets
457
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
416
458
  end
417
459
 
418
460
  def write_post
461
+ log!(enter: __method__)
419
462
  raise NoPostCall unless @meta
420
463
  @meta.views = @meta.views.join(" ") if @meta.views.is_a? Array
421
464
  @meta.tags = @meta.tags.join(" ") if @meta.tags.is_a? Array
422
465
  _write_metadata
423
466
  rescue => err
424
467
  puts "err = #{err}"
425
- puts err.backtrace.join("\n")
468
+ puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
426
469
  end
427
470
 
428
471
  def teaser
472
+ log!(enter: __method__)
429
473
  raise NoPostCall unless @meta
430
474
  text = _body.join("\n")
431
475
  @meta.teaser = text
@@ -440,6 +484,7 @@ def teaser
440
484
  end
441
485
 
442
486
  def finalize
487
+ log!(str: "Now exiting livetext processing...")
443
488
  return unless @meta
444
489
  return @meta if @blog.nil?
445
490
 
@@ -451,6 +496,7 @@ def finalize
451
496
  end
452
497
 
453
498
  def head # Does NOT output <head> tags
499
+ log!(enter: __method__)
454
500
  args = _args
455
501
  args.each do |inc|
456
502
  self.data = inc
@@ -506,6 +552,7 @@ end
506
552
  ########## newer stuff...
507
553
 
508
554
  def meta
555
+ log!(enter: __method__)
509
556
  args = _args
510
557
  enum = args.each
511
558
  str = "<meta"
@@ -525,6 +572,7 @@ def meta
525
572
  end
526
573
 
527
574
  def recent_posts # side-effect
575
+ log!(enter: __method__)
528
576
  _out <<-HTML
529
577
  <div class="col-lg-9 col-md-9 col-sm-9 col-xs-12">
530
578
  <iframe id="main" style="width: 70vw; height: 100vh; position: relative;"
@@ -535,6 +583,7 @@ def recent_posts # side-effect
535
583
  end
536
584
 
537
585
  def _make_class_name(app)
586
+ log!(enter: __method__)
538
587
  if app =~ /[-_]/
539
588
  words = app.split(/[-_]/)
540
589
  name = words.map(&:capitalize).join
@@ -545,6 +594,7 @@ def _make_class_name(app)
545
594
  end
546
595
 
547
596
  def _load_local(widget)
597
+ log!(enter: __method__)
548
598
  Dir.chdir("../../widgets/#{widget}") do
549
599
  rclass = _make_class_name(widget)
550
600
  found = (require("./#{widget}") if File.exist?("#{widget}.rb"))
@@ -553,12 +603,13 @@ def _load_local(widget)
553
603
  end
554
604
  rescue => err
555
605
  STDERR.puts err.to_s
556
- STDERR.puts err.backtrace.join("\n")
606
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
557
607
  sleep 6; RubyText.stop
558
608
  exit
559
609
  end
560
610
 
561
611
  def _handle_standard_widget(tag)
612
+ log!(enter: __method__)
562
613
  wtag = "../../widgets"/tag
563
614
  code = _load_local(tag)
564
615
  if code
@@ -570,6 +621,7 @@ def _handle_standard_widget(tag)
570
621
  end
571
622
 
572
623
  def sidebar
624
+ log!(enter: __method__)
573
625
  _debug "--- handling sidebar\r"
574
626
  if _args.include? "off"
575
627
  _body { } # iterate, do nothing
@@ -597,12 +649,13 @@ def sidebar
597
649
  _out %[</div>]
598
650
  rescue => err
599
651
  puts "err = #{err}"
600
- puts err.backtrace.join("\n")
652
+ puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
601
653
  sleep 6; RubyText.stop
602
654
  exit
603
655
  end
604
656
 
605
657
  def stylesheet
658
+ log!(enter: __method__)
606
659
  lines = _body
607
660
  url = lines[0]
608
661
  integ = lines[1]
@@ -611,6 +664,7 @@ def stylesheet
611
664
  end
612
665
 
613
666
  def script
667
+ log!(enter: __method__)
614
668
  lines = _body
615
669
  url = lines[0]
616
670
  integ = lines[1]
@@ -660,6 +714,7 @@ end
660
714
 
661
715
 
662
716
  def tag_cloud
717
+ log!(enter: __method__)
663
718
  title = _data
664
719
  title = "Tag Cloud" if title.empty?
665
720
  open = <<-HTML
@@ -683,18 +738,22 @@ def tag_cloud
683
738
  end
684
739
 
685
740
  def vnavbar
741
+ log!(enter: __method__)
686
742
  str = _make_navbar(:vert)
687
743
  end
688
744
 
689
745
  def hnavbar
746
+ log!(enter: __method__)
690
747
  str = _make_navbar # horiz is default
691
748
  end
692
749
 
693
750
  def navbar
751
+ log!(enter: __method__)
694
752
  str = _make_navbar # horiz is default
695
753
  end
696
754
 
697
755
  def _make_navbar(orient = :horiz)
756
+ log!(enter: __method__)
698
757
  vdir = @root/:views/@blog.view
699
758
  title = _var("view.title")
700
759
 
@@ -735,7 +794,7 @@ def _make_navbar(orient = :horiz)
735
794
  else
736
795
  dir = @blog.root/:views/@blog.view/"themes/standard/banner/navbar"
737
796
  dest = vdir/"remote/banner/navbar"/basename+".html"
738
- 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
739
798
  output.puts %[#{li1} <a class="nav-link" #{href_main}>#{cdata}</a> #{li2}]
740
799
  end
741
800
  end
@@ -750,6 +809,7 @@ end
750
809
  ##################
751
810
 
752
811
  def _html_body(file, css = nil)
812
+ log!(enter: __method__)
753
813
  file.puts "<html>"
754
814
  if css
755
815
  file.puts " <head>"
@@ -762,10 +822,12 @@ def _html_body(file, css = nil)
762
822
  end
763
823
 
764
824
  def _errout(*args)
825
+ log!(enter: __method__)
765
826
  ::STDERR.puts *args
766
827
  end
767
828
 
768
829
  def _passthru(line)
830
+ log!(enter: __method__)
769
831
  return if line.nil?
770
832
  line = _format(line)
771
833
  _out line + "\n"
@@ -773,6 +835,7 @@ def _passthru(line)
773
835
  end
774
836
 
775
837
  def _passthru_noline(line)
838
+ log!(enter: __method__)
776
839
  return if line.nil?
777
840
  line = _format(line)
778
841
  _out line
@@ -780,6 +843,7 @@ def _passthru_noline(line)
780
843
  end
781
844
 
782
845
  def _write_metadata
846
+ log!(enter: __method__)
783
847
  File.write("teaser.txt", @meta.teaser)
784
848
  fields = [:num, :title, :date, :pubdate, :views, :tags, :pinned]
785
849
  fname = "metadata.txt"
@@ -789,20 +853,32 @@ def _write_metadata
789
853
  end
790
854
 
791
855
  def _post_lookup(postid) # side-effect
856
+ log!(enter: __method__)
792
857
  # .. = templates, ../.. = views/thisview
793
858
  slug = title = date = teaser_text = nil
794
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}"
795
867
  dir_posts = @vdir/:posts
796
868
  posts = Dir.entries(dir_posts).grep(/^\d\d\d\d/).map {|x| dir_posts/x }
797
869
  posts.select! {|x| File.directory?(x) }
798
870
 
871
+ tmp.puts "_post_lookup: postid = #{postid}"
872
+ tmp.puts "_post_lookup: posts = \n#{posts.inspect}"
873
+ tmp.close
799
874
  posts = posts.select {|x| File.basename(x).to_i == postid }
800
- postdir = exactly_one(posts)
875
+ postdir = exactly_one(posts, posts.inspect)
801
876
  vp = RuneBlog::ViewPost.new(@blog.view, postdir)
802
877
  vp
803
878
  end
804
879
 
805
880
  def _card_generic(card_title:, middle:, extra: "")
881
+ log!(enter: __method__)
806
882
  front = <<-HTML
807
883
  <div class="card #{extra} mb-3">
808
884
  <div class="card-body">
@@ -818,14 +894,17 @@ def _card_generic(card_title:, middle:, extra: "")
818
894
  end
819
895
 
820
896
  def _var(name) # FIXME scope issue!
897
+ log!(enter: __method__)
821
898
  ::Livetext::Vars[name] || "[:#{name} is undefined]"
822
899
  end
823
900
 
824
901
  def _main(url)
902
+ log!(enter: __method__)
825
903
  %[href="javascript: void(0)" onclick="javascript:open_main('#{url}')"]
826
904
  end
827
905
 
828
906
  def _blank(url)
907
+ log!(enter: __method__)
829
908
  %[href='#{url}' target='blank']
830
909
  end
831
910