runeblog 0.3.19 → 0.3.24

Sign up to get free protection for your applications and to get access to all the features.
@@ -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