runeblog 0.2.16 → 0.2.17

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da4cf909e23c3d38745684efef6be5f7b048d5487edc5192fa2041db387f8e6e
4
- data.tar.gz: 5aef89b7cff7aab75cb093800ceaaf97f90d669c0a3901829e72fcdc4d1bcb44
3
+ metadata.gz: bf71088966e7393574d792a3508bb35f8a581e774a250dbe88b61fee08cd7588
4
+ data.tar.gz: 991d387f3649a4defbdee3500d2a275ab2b5b6b2956ad46188c50a8c3c393513
5
5
  SHA512:
6
- metadata.gz: d9d6b591026909681b34e1ab24fe61ba274a176c0d22bb335be1c2a07475f1f3b9444fb0c3e419b906853bc1b98f12650393f3a4d409bc83b9b37ee04269e7ce
7
- data.tar.gz: 2f22425943ba72ad5587895d4895662fc70e18dd0ae644f1b0f7f6283eb5dc8a188b0e08fa0a08178a9948f9c7b1671c1e98dc6ff704764d289faba2af4d0d17
6
+ metadata.gz: 57eaf8b41cb76dd92e2a4f5ba45c3461248761e433e2f1fefc4ab6373ac414fcfbe2c4c04016465438b7a68b3ef7d666ad848634afa37f1cbac36c01e7be5385
7
+ data.tar.gz: 3bd8ed4c9776f71b2787cdb484c981b314b53993b3d31bb125176e576d91f752830813eba24f1cacf84b1cf455a7f4743fc0bc866009217c3afe09a44b67d8c2
Binary file
@@ -2,7 +2,6 @@ class RuneBlog::Default
2
2
 
3
3
  # This will all become much more generic later.
4
4
 
5
-
6
5
  def RuneBlog.post_template(num: 0, title: "No title", date: nil, view: "test_view",
7
6
  teaser: "No teaser", body: "No body", tags: ["untagged"],
8
7
  views: [], back: "javascript:history.go(-1)", home: "no url")
@@ -1,89 +1,22 @@
1
1
  require 'runeblog_version'
2
2
  require 'fileutils'
3
3
 
4
- # Home = Dir.pwd # unless Home
5
-
6
- LEXT = ".lt3"
4
+ require 'xlate'
7
5
 
8
6
  module RuneBlog::Helpers
9
7
 
10
8
  def copy(src, dst)
11
9
  log!(enter: __method__, args: [src, dst])
12
- cmd = "cp #{src} #{dst} 2>/dev/null"
13
- # puts "\n--- pwd = #{Dir.pwd} \n Trying: #{cmd}"
14
- # if src =~ /\*/
15
- rc = system(cmd)
16
- puts " FROM #{caller[0]}" unless rc
17
- exit unless rc
18
- # else
19
- # FileUtils.cp(src, dst)
20
- # end
10
+ cmd = "cp #{src} #{dst} 2>/dev/null"
11
+ rc = system(cmd)
12
+ puts " Failed: #{cmd} - from #{caller[0]}" unless rc
21
13
  end
22
14
 
23
15
  def copy!(src, dst)
24
16
  log!(enter: __method__, args: [src, dst])
25
- cmd = "cp -r #{src} #{dst} 2>/dev/null"
26
- # puts "\n--- pwd = #{Dir.pwd} \n Trying: #{cmd}"
27
- # if src =~ /\*/
28
- rc = system(cmd)
29
- puts " FROM #{caller[0]}" unless rc
30
- exit unless rc
31
- # else
32
- # FileUtils.cp_r(src, dst)
33
- # end
34
- end
35
-
36
- def stale?(src, dst, force = false)
37
- log!(enter: __method__, args: [src, dst])
38
- raise "Source #{src} not found in #{Dir.pwd}" unless File.exist?(src)
39
- return true if force
40
- return true unless File.exist?(dst)
41
- return true if File.mtime(src) > File.mtime(dst)
42
- return false
43
- end
44
-
45
- # def livetext(src, dst=nil, dir=".")
46
- # log!(enter: __method__, args: [src, dst])
47
- # src << ".lt3" unless src.end_with?(".lt3")
48
- # if dst
49
- # dst << ".html" unless dst.end_with?(".html")
50
- # else
51
- # dst = src.sub(/.lt3$/, "")
52
- # end
53
- ## return unless stale?(src, dst)
54
- # Dir.chdir(dir) { system("livetext #{src} >#{dst}") }
55
- # end
56
- #
57
- # def livetext!(src, dst=nil, dir=".")
58
- # log!(enter: __method__, args: [src, dst])
59
- # src << ".lt3" unless src.end_with?(".lt3")
60
- # if dst
61
- # dst << ".html" unless dst.end_with?(".html")
62
- # else
63
- # dst = src.sub(/.lt3$/, "")
64
- # end
65
- ## return unless stale?(src, dst)
66
- #STDERR.puts "-- livetext #{src} >#{dst} \n in: #{Dir.pwd}\n from: #{caller[0]}"
67
- # Dir.chdir(dir) { system("livetext #{src} >#{dst}") }
68
- #STDERR.puts "... completed"
69
- # end
70
-
71
- def xlate(cwd: Dir.pwd, src:,
72
- dst: (strip = true; src.sub(/.lt3$/,"")),
73
- copy: nil, debug: false, force: false)
74
- src += LEXT unless src.end_with?(LEXT)
75
- dst += ".html" unless dst.end_with?(".html") || strip
76
- Dir.chdir(cwd) do
77
- return unless stale?(src, dst, force)
78
- if debug
79
- STDERR.puts "-- xlate #{src} >#{dst}"
80
- STDERR.puts " in: #{Dir.pwd}"
81
- STDERR.puts " from: #{caller[0]}"
82
- STDERR.puts " copy: #{copy}" if copy
83
- end
84
- rc = system("livetext #{src} >#{dst}")
85
- end
86
- STDERR.puts "...completed (shell returned #{rc})" if debug
17
+ cmd = "cp -r #{src} #{dst} 2>/dev/null"
18
+ rc = system(cmd)
19
+ puts " Failed: #{cmd} - from #{caller[0]}" unless rc
87
20
  end
88
21
 
89
22
  def get_root
@@ -131,7 +64,6 @@ exit unless rc
131
64
  log!(enter: __method__, args: [file, hash])
132
65
  return hash.values unless File.exist?(file)
133
66
  vals = read_config(file, *hash.keys)
134
- # STDERR.puts vals.inspect
135
67
  vals
136
68
  end
137
69
 
@@ -150,30 +82,19 @@ end
150
82
  def write_config(obj, file)
151
83
  log!(enter: __method__, args: [obj, file])
152
84
  hash = obj.to_h
153
- # Dir.chdir(::Home)
154
- # puts "--- wc: pwd = #{Dir.pwd}"
155
- File.open(file, "w") do |f|
156
- hash.each_pair do |key, val|
157
- f.puts "#{key}: #{val}"
158
- end
85
+ File.open(file, "w") do |out|
86
+ hash.each_pair {|key, val| out.puts "#{key}: #{val}" }
159
87
  end
160
88
  end
161
89
 
162
90
  def get_views # read from filesystem
163
91
  log!(enter: __method__)
164
- # Dir.chdir(::Home) do
165
- verify(@root => "#@root is nil",
166
- Dir.exist?(@root) => "#@root doesn't exist",
167
- Dir.exist?("#@root/views") => "#@root/views doesn't exist")
168
- dirs = subdirs("#@root/views/").sort
169
- dirs.map {|name| RuneBlog::View.new(name) }
170
- # end
92
+ dirs = subdirs("#@root/views/").sort
93
+ dirs.map {|name| RuneBlog::View.new(name) }
171
94
  end
172
95
 
173
96
  def new_dotfile(root: ".blogs", current_view: "test_view", editor: "vi")
174
97
  log!(enter: __method__, args: [root, current_view, editor])
175
- # raise BlogAlreadyExists if Dir.exist?(".blogs")
176
- # Dir.mkdir(".blogs")
177
98
  root = Dir.pwd + "/" + root
178
99
  x = OpenStruct.new
179
100
  x.root, x.current_view, x.editor = root, current_view, editor
@@ -189,7 +110,6 @@ end
189
110
 
190
111
  def subdirs(dir)
191
112
  log!(enter: __method__, args: [dir])
192
- verify(Dir.exist?(dir) => "Directory #{dir} not found")
193
113
  dirs = Dir.entries(dir) - %w[. ..]
194
114
  dirs.reject! {|x| ! File.directory?("#@root/views/#{x}") }
195
115
  dirs
@@ -197,9 +117,6 @@ end
197
117
 
198
118
  def find_draft_slugs
199
119
  log!(enter: __method__)
200
- verify(@root => "#@root is nil",
201
- Dir.exist?(@root) => "#@root doesn't exist",
202
- Dir.exist?("#@root/drafts") => "#@root/drafts doesn't exist")
203
120
  files = Dir["#@root/drafts/**"].grep /\d{4}.*.lt3$/
204
121
  flagfile = "#@root/drafts/last_rebuild"
205
122
  last = File.exist?(flagfile) ? File.mtime(flagfile) : (Time.now - 86_400)
@@ -161,7 +161,6 @@ module RuneBlog::REPL
161
161
  n.times { @out << "\n" }
162
162
  end
163
163
 
164
-
165
164
  def check_empty(arg)
166
165
  raise InternalError(caller[0], arg.inspect) unless arg.nil?
167
166
  end
@@ -209,8 +208,6 @@ module RuneBlog::REPL
209
208
  end
210
209
 
211
210
  def ask_publishing_info # returns Publishing object
212
- verify(@blog => "@blog is nil",
213
- @blog.view => "@blog.view is nil")
214
211
  # user, server, root, path, protocol = "http"
215
212
  puts "Please enter publishing data for view #{@blog.view}..."
216
213
  user = ask("User: ")
@@ -241,28 +238,4 @@ module RuneBlog::REPL
241
238
  all.sort + ["NEW TAG"]
242
239
  end
243
240
 
244
- ### find_asset
245
-
246
- # FIXME is this per-post?
247
-
248
- def find_asset(asset_name) # , views)
249
- search_path = proc do |path|
250
- full_path = path + asset_name
251
- return full_path if File.exist?(full_path)
252
- end
253
- check_meta(@meta, "find_asset")
254
- views = @meta.views
255
- views.each do |view| search_path.call("#{view.dir}/#{@meta.slug}/assets/") end
256
- views.each do |view| search_path.call(view.dir + "/assets/") end
257
- search_path.call(@root + "/assets/", asset_name)
258
- # If all fail... return nil
259
- return nil
260
- end
261
-
262
- ### find_all_assets
263
-
264
- def find_all_assets(list, views)
265
- list ||= []
266
- list.each {|asset| puts "#{asset} => #{find_asset(asset, views)}" }
267
- end
268
241
  end
@@ -2,11 +2,15 @@ require 'ostruct'
2
2
  require 'pp'
3
3
  require 'date'
4
4
 
5
- require 'livetext'
5
+ # require 'livetext'
6
6
  require 'runeblog'
7
7
 
8
- errfile = File.new("/tmp/liveblog.out", "w")
9
- STDERR.reopen(errfile)
8
+ require 'pathmagic'
9
+
10
+ require 'xlate'
11
+
12
+ # errfile = File.new("/tmp/liveblog.out", "w")
13
+ # STDERR.reopen(errfile)
10
14
 
11
15
  def init_liveblog # FIXME - a lot of this logic sucks
12
16
  here = Dir.pwd
@@ -24,21 +28,17 @@ end
24
28
 
25
29
  # FIXME - stale? and livetext are duplicated from helpers-blog
26
30
 
27
- def stale?(src, dst)
28
- return true unless File.exist?(dst)
29
- return true if File.mtime(src) > File.mtime(dst)
30
- return false
31
- end
32
-
33
- def livetext(src, dst=nil)
34
- src += ".lt3" unless src.end_with?(".lt3")
35
- if dst
36
- dst += ".html" unless dst.end_with?(".html")
37
- else
38
- dst = src.sub(/.lt3$/, "")
31
+ def livetext(src, dst=nil, cwd=Dir.pwd)
32
+ Dir.chdir(cwd) do
33
+ src += ".lt3" unless src.end_with?(".lt3")
34
+ if dst
35
+ dst += ".html" unless dst.end_with?(".html")
36
+ else
37
+ dst = src.sub(/.lt3$/, "")
38
+ end
39
+ return unless stale?(src, dst)
40
+ system("livetext #{src} >#{dst}")
39
41
  end
40
- return unless stale?(src, dst)
41
- system("livetext #{src} >#{dst}")
42
42
  end
43
43
 
44
44
  def post
@@ -103,7 +103,7 @@ def _html_body(file)
103
103
  end
104
104
 
105
105
  def _write_card(cardfile, mainfile, pairs, card_title, tag, relative: true)
106
- # HTML for sidebar card
106
+ # HTML for card
107
107
  log!(str: "Creating #{cardfile}.html", pwd: true)
108
108
  # TTY.puts "Creating #{cardfile}.html - pwd = #{Dir.pwd}"
109
109
  File.open("#{cardfile}.html", "w") do |f|
@@ -120,7 +120,6 @@ def _write_card(cardfile, mainfile, pairs, card_title, tag, relative: true)
120
120
  top = ""
121
121
  top = :widgets/tag + "/" unless tag == "news" # FIXME !!
122
122
  pairs.each do |file, title|
123
- # took out #{top}#{file}
124
123
  f.puts <<-EOS
125
124
  <li class="list-group-item"> <a href="javascript: void(0)"
126
125
  onclick="javascript:open_main('#{top}#{file}')">#{title}</a> </li>
@@ -134,7 +133,6 @@ def _write_card(cardfile, mainfile, pairs, card_title, tag, relative: true)
134
133
  end
135
134
 
136
135
  def _write_main(mainfile, pairs, card_title)
137
- # HTML for main area (iframe)
138
136
  log!(str: "Creating #{mainfile}.html", pwd: true)
139
137
  File.open("#{mainfile}.html", "w") do |f|
140
138
  _html_body(f) do
@@ -286,25 +284,18 @@ def teaser
286
284
  end
287
285
 
288
286
  def finalize
289
- STDERR.puts :cp1
290
287
  unless @meta
291
288
  puts @live.body
292
289
  return
293
290
  end
294
- STDERR.puts :cp4
295
291
  if @blog.nil?
296
292
  return @meta
297
293
  end
298
294
 
299
- STDERR.puts :cp6
300
295
  @slug = @blog.make_slug(@meta)
301
- STDERR.puts :cp7
302
296
  slug_dir = @slug
303
297
  @postdir = @blog.view.dir/:posts/slug_dir
304
- STDERR.puts "--- finalize: pwd = #{Dir.pwd} postdir = #@postdir"
305
- STDERR.puts :cp8
306
298
  write_post
307
- STDERR.puts :cp9
308
299
  @meta
309
300
  end
310
301
 
@@ -397,10 +388,8 @@ def head # Does NOT output tags
397
388
  # Later: allow other overrides
398
389
  when ""; break
399
390
  else
400
- STDERR.puts "-- got '#{word}'; old value = #{result[word].inspect}"
401
391
  if defaults[word]
402
392
  result[word] = %[<meta property="#{word}" content="#{remain}">]
403
- STDERR.puts "-- new value = #{result[word].inspect}"
404
393
  else
405
394
  puts "Unknown tag '#{word}'"
406
395
  end
@@ -408,7 +397,6 @@ STDERR.puts "-- new value = #{result[word].inspect}"
408
397
  end
409
398
  hash = defaults.dup.update(result) # FIXME collisions?
410
399
 
411
- # _out "<!-- "; _out hash.inspect; _out "--> "
412
400
  hash.each_value {|x| _out " " + x }
413
401
  _out "<body>"
414
402
  end
@@ -445,16 +433,34 @@ def recent_posts # side-effect
445
433
  end
446
434
 
447
435
  def sidebar
436
+ STDERR.puts "---- SIDEBAR pwd = #{Dir.pwd}"
437
+ _out %[<div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">]
438
+ _body do |token|
439
+ tag = token.chomp.strip.downcase
440
+ wtag = :widgets/tag
441
+ raise "Can't find #{wtag}" unless Dir.exist?(wtag)
442
+ tcard = "#{tag}-card.html"
443
+ # livetext tag, tcard, wtag
444
+ xlate cwd: wtag, src: tag, dst: tcard, debug: true
445
+ _include_file wtag/tcard
446
+ end
447
+ _out %[</div>]
448
+ end
449
+
450
+ def sidebar!
451
+ # if _args.include? "off"
452
+ # _body { } # iterate, do nothing
453
+ # return
454
+ # end
448
455
  _out %[<div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">]
449
456
  _args do |token|
450
457
  tag = token.chomp.strip.downcase
451
458
  wtag = :widgets/tag
452
459
  raise "Can't find #{wtag}" unless Dir.exist?(wtag)
453
- Dir.chdir(wtag) do
454
- tcard = "#{tag}-card.html"
455
- livetext tag, tcard
456
- _include_file tcard
457
- end
460
+ tcard = "#{tag}-card.html"
461
+ # livetext tag, tcard, wtag
462
+ xlate cwd: wtag, src: tag, dst: tcard, debug: true
463
+ _include_file wtag/tcard
458
464
  end
459
465
  _out %[</div>]
460
466
  end
@@ -475,44 +481,6 @@ def script
475
481
  _out %[<script src="#{url}" integrity="#{integ}" crossorigin="#{cross}"></script>]
476
482
  end
477
483
 
478
- # def _find_recent_posts
479
- # @vdir = _var(:FileDir).match(%r[(^.*/views/.*?)/])[1]
480
- # posts = nil
481
- # dir_posts = @vdir + "/posts"
482
- # entries = Dir.entries(dir_posts)
483
- # posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
484
- # posts.select! {|x| File.directory?(x) }
485
- # # directories that start with four digits
486
- # posts = posts.sort {|a, b| b.to_i <=> a.to_i } # sort descending
487
- # posts[0..19] # return 20 at most
488
- # end
489
- #
490
- # def all_teasers
491
- # open = <<-HTML
492
- # <section class="posts">
493
- # HTML
494
- # close = <<-HTML
495
- # </section>
496
- # HTML
497
- #
498
- # text = <<-HTML
499
- # <html>
500
- # <head><link rel="stylesheet" href="etc/blog.css"></head>
501
- # <body>
502
- # HTML
503
- # posts = _find_recent_posts
504
- # wanted = [5, posts.size].min # estimate how many we want?
505
- # enum = posts.each
506
- # wanted.times do
507
- # postid = File.basename(enum.next)
508
- # postid = postid.to_i
509
- # text << _teaser(postid) # side effect! calls _out
510
- # end
511
- # text << "</body></html>"
512
- # File.write("recent.html", text)
513
- # _out %[<iframe id="main" style="width: 100vw; height: 100vh; position: relative;" src='recent.html' width=100% frameborder="0" allowfullscreen></iframe>]
514
- # end
515
-
516
484
  def _post_lookup(postid) # side-effect
517
485
  # .. = templates, ../.. = views/thisview
518
486
  slug = title = date = teaser_text = nil
@@ -533,22 +501,6 @@ def _interpolate(str, context) # FIXME move this later
533
501
  eval(wrapped, context)
534
502
  end
535
503
 
536
- # def _teaser(slug)
537
- # id = slug.to_i
538
- # text = nil
539
- # post_entry_name = @theme + "blog/post_entry.lt3"
540
- # @_post_entry ||= File.read(post_entry_name)
541
- # vp = _post_lookup(id)
542
- # nslug, aslug, title, date, teaser_text =
543
- # vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
544
- # path = vp.path
545
- # url = "#{path}/#{aslug}.html" # Should be relative to .blogs!! FIXME
546
- # date = Date.parse(date)
547
- # date = date.strftime("%B %e<br>%Y")
548
- # text = _interpolate(@_post_entry, binding)
549
- # text
550
- # end
551
-
552
504
  def _card_generic(card_title:, middle:, extra: "")
553
505
  front = <<-HTML
554
506
  <div class="card #{extra} mb-3">
@@ -31,28 +31,5 @@ unless self.respond_to?("log!")
31
31
  $log = File.new("/tmp/runeblog.log","a")
32
32
  end
33
33
 
34
- # def log(str: "", enter: nil, args: [], pwd: false, dir: false)
35
- # return unless $logging
36
- # time = Time.now.strftime("%H:%M:%S")
37
- # meth = ""
38
- # meth = "#{enter}" if enter
39
- # para = " args: #{args.inspect[1..-2]}"
40
- # source = caller[0].sub(/.*\//, " in ").sub(/:/, " line ").sub(/:.*/, "")
41
- # source = " in #{source} (probably liveblog.rb)" if source.include? "(eval)"
42
- # str = " ... #{str}" unless str.empty?
43
- # indent = " "*12
44
- # STDERR.puts "#{time} #{str} #{meth}"
45
- # STDERR.puts "#{indent} #{source}"
46
- # STDERR.puts "#{indent} pwd = #{Dir.pwd} " if pwd
47
- # if dir
48
- # files = (Dir.entries('.') - %w[. ..]).join(" ")
49
- # STDERR.puts "#{indent} dir/* = #{files}"
50
- # end
51
- # STDERR.puts "#{indent} #{para} " unless args.empty?
52
- # # STDERR.puts "#{indent} livetext params = #{livedata.inpect} " unless livedata.nil?
53
- # STDERR.puts
54
- # # $log.close
55
- # # $log = File.new("/tmp/runeblog.log","a")
56
- # end
57
34
  end
58
35
 
@@ -1,11 +1,10 @@
1
- # require 'helpers-blog'
2
1
  require 'runeblog'
3
2
  require 'global'
3
+ require 'pathmagic'
4
4
 
5
5
  class RuneBlog::Post
6
6
 
7
7
  attr_reader :num, :title, :date, :views, :num, :slug
8
-
9
8
  attr_accessor :meta, :blog, :draft
10
9
 
11
10
  include RuneBlog::Helpers
@@ -22,17 +21,11 @@ class RuneBlog::Post
22
21
  raise "Doesn't work right now"
23
22
  raise NoBlogAccessor if RuneBlog.blog.nil?
24
23
  # "post" is a slug
25
- pdir = RuneBlog.blog.view.dir + "/" + post
24
+ pdir = RuneBlog.blog.view.dir/post
26
25
  verify(Dir.exist?(pdir) => "Directory #{pdir} not found")
27
26
  meta = nil
28
27
  Dir.chdir(pdir) do
29
- verify(File.exist?("metadata.txt") => "metadata.txt not found",
30
- File.exist?("teaser.txt") => "teaser.txt not found")
31
- # File.exist?("body.txt") => "body.txt not found")
32
28
  meta = read_config("metadata.txt")
33
- verify(meta.date => "meta.date is nil",
34
- meta.views => "meta.views is nil",
35
- meta.tags => "meta.tags is nil")
36
29
  meta.date = Date.parse(meta.date)
37
30
  meta.views = meta.views.split
38
31
  meta.tags = meta.tags.split
@@ -50,8 +43,6 @@ class RuneBlog::Post
50
43
  hash = meta.to_h
51
44
 
52
45
  File.write("teaser.txt", hash[:teaser])
53
- # STDERR.puts ">>>> #{__method__}: writing #{@live.body.size} bytes to #{Dir.pwd}/body.txt"
54
- # File.write("body.txt", hash[:body])
55
46
  hash.delete(:teaser)
56
47
  hash.delete(:body)
57
48
 
@@ -75,7 +66,7 @@ class RuneBlog::Post
75
66
  other_views:[])
76
67
  log!(enter: __method__, args: [title, teaser, body, pubdate, other_views])
77
68
  post = self.new
78
- # ONLY place next_sequence is called!
69
+ # NOTE: This is the ONLY place next_sequence is called!
79
70
  num = post.meta.num = post.blog.next_sequence
80
71
 
81
72
  # new_metadata
@@ -91,10 +82,8 @@ class RuneBlog::Post
91
82
  text = RuneBlog.post_template(num: meta.num, title: meta.title, date: meta.pubdate,
92
83
  view: meta.view, teaser: meta.teaser, body: meta.body,
93
84
  views: meta.views, tags: meta.tags, home: viewhome)
94
- srcdir = "#{post.blog.root}/drafts/"
95
- vpdir = "#{post.blog.root}/drafts/"
96
- verify(Dir.exist?(srcdir) => "#{srcdir} not found",
97
- meta.slug.is_a?(String) => "slug #{meta.slug.inspect} is invalid")
85
+ srcdir = post.blog.root/:drafts + "/"
86
+ vpdir = post.blog.root/:drafts + "/"
98
87
  fname = meta.slug + ".lt3"
99
88
  post.draft = srcdir + fname
100
89
  dump(text, post.draft)
@@ -134,7 +123,7 @@ class RuneBlog::ViewPost
134
123
  fname = "#{postdir}/teaser.txt"
135
124
  @teaser_text = File.read(fname).chomp
136
125
  # FIXME dumb hacks...
137
- mdfile = "#{postdir}/metadata.txt"
126
+ mdfile = postdir/"metadata.txt"
138
127
  lines = File.readlines(mdfile)
139
128
  @title = lines.grep(/title:/).first[7..-1].chomp
140
129
  @date = lines.grep(/pubdate:/).first[9..-1].chomp
@@ -144,12 +133,12 @@ class RuneBlog::ViewPost
144
133
  log!(enter: __method__, args: [view, postdir])
145
134
  fname = File.basename(draft)
146
135
  noext = fname.sub(/.lt3$/, "")
147
- vdir = "#@root/views/#{view}"
148
- dir = "#{vdir}/posts/#{noext}/"
136
+ vdir = @root/:views/view
137
+ dir = vdir/:posts/noext + "/"
149
138
  Dir.mkdir(dir) unless Dir.exist?(dir)
150
139
  system("cp #{draft} #{dir}")
151
140
  viewdir, slugdir, aslug = vdir, dir, noext[5..-1]
152
- theme = viewdir + "/themes/standard"
141
+ theme = viewdir/:themes/:standard
153
142
  [noext, viewdir, slugdir, aslug, theme]
154
143
  end
155
144
 
@@ -1,6 +1,5 @@
1
- # require 'helpers-blog'
2
- # require 'runeblog'
3
1
  require 'global'
2
+ require 'pathmagic'
4
3
 
5
4
  class RuneBlog::Publishing
6
5
  attr_reader :user, :server, :docroot, :path
@@ -42,15 +41,14 @@ class RuneBlog::Publishing
42
41
 
43
42
  def publish(files, assets=[])
44
43
  log!(enter: __method__, args: [files, assets])
45
- dir = "#@docroot/#@path"
44
+ dir = @docroot/@path
46
45
  view_name = @blog.view.name
47
- viewpath = "#{dir}/#{view_name}"
46
+ viewpath = dir/view_name
48
47
  result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}")
49
48
  result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}/assets")
50
49
  files.each do |file|
51
- dest = "#@user@#@server:#{dir}/#{view_name}"
50
+ dest = "#@user@#@server:" + dir/view_name
52
51
  file.gsub!(/\/\//, "/") # weird... :-/
53
- dest.gsub!(/\/\//, "/") # weird... :-/
54
52
  cmd = "scp -r #{file} #{dest} >/dev/null 2>/tmp/wtf"
55
53
  debug "cmd = #{cmd.inspect} - see /tmp/wtf"
56
54
  result = system!(cmd) || puts("\n Could not copy #{file} to #{dest}")
@@ -74,8 +72,8 @@ class RuneBlog::Publishing
74
72
 
75
73
  def remote_permissions?
76
74
  log!(enter: __method__)
77
- dir = "#@docroot/#@path"
78
- temp = "#@path/__only_testing"
75
+ dir = @docroot/@path
76
+ temp = @path/"__only_testing"
79
77
  try1 = system("ssh -o BatchMode=yes -o ConnectTimeout=1 #@user@#@server -x mkdir -p #{temp} >/dev/null 2>&1")
80
78
  return nil unless try1
81
79
  try2 = system("ssh -o BatchMode=yes -o ConnectTimeout=1 #@user@#@server -x rmdir #{temp} >/dev/null 2>&1")
@@ -84,4 +82,3 @@ class RuneBlog::Publishing
84
82
  end
85
83
  end
86
84
 
87
-
@@ -10,7 +10,6 @@ module RuneBlog::REPL
10
10
 
11
11
  def edit_file(file)
12
12
  result = system("#{@blog.editor} #{file}")
13
- STDERR.puts "editor = #{@blog.editor} FILE = #{file}"
14
13
  raise EditorProblem(file) unless result
15
14
  sleep 0.1
16
15
  STDSCR.clear
@@ -222,7 +221,6 @@ STDERR.puts "editor = #{@blog.editor} FILE = #{file}"
222
221
  id = get_integer(arg)
223
222
  result = @blog.remove_post(id)
224
223
  output! "Post #{id} not found" if result.nil?
225
- # puts "Post #{id} not found" if result.nil?
226
224
  @out
227
225
  end
228
226
 
@@ -114,7 +114,7 @@ class RuneBlog
114
114
  nslug = sourcefile.sub(/.lt3/, "")
115
115
  dir = @root/:posts/nslug
116
116
  create_dir(dir)
117
- xlate cwd: dir, src: sourcefile, debug: true
117
+ xlate cwd: dir, src: sourcefile # , debug: true
118
118
  _deploy_local(dir)
119
119
  end
120
120
 
@@ -323,12 +323,6 @@ class RuneBlog
323
323
  end
324
324
  text << "</body></html>"
325
325
  File.write(@vdir/:remote/file, text)
326
- # iframe_text = <<-HTML
327
- # <iframe name="main" style="width: 100vw;height: 100vh;position: relative;"
328
- # src='recent.html' width=100% frameborder="0" allowfullscreen>
329
- # </iframe>
330
- # HTML
331
- # FIXME ^ serves no purpose??
332
326
  end
333
327
 
334
328
  def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
@@ -380,7 +374,7 @@ class RuneBlog
380
374
  self.view = view # error checking?
381
375
  end
382
376
 
383
- def generate_index(view) # FIXME delete?
377
+ def generate_index(view)
384
378
  log!(enter: __method__, args: [view], pwd: true, dir: true)
385
379
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
386
380
  @vdir = @root/:views/view
@@ -423,7 +417,6 @@ class RuneBlog
423
417
  log!(enter: __method__, args: [draft, pdraft])
424
418
  title_line = File.readlines(draft).grep(/^.title /).first
425
419
  title = title_line.split(" ", 2)[1]
426
- # pdir = "
427
420
  Dir.chdir(pdraft) do
428
421
  excerpt = File.read("teaser.txt")
429
422
  vars = %[.set title="#{title.chomp}"\n] +
@@ -442,13 +435,15 @@ class RuneBlog
442
435
  dir = File.basename(w)
443
436
  rem = w.sub(/themes.standard/, "remote")
444
437
  create_dirs(rem)
445
- next unless Dir[w/"*"].any? {|x| x =~ /html$/ }
438
+ files = Dir[w/"*"]
439
+ next unless files.any? {|x| x =~ /html$/ }
446
440
  system("cp #{w}/*html #{rem}")
447
441
  end
448
442
  end
449
443
 
450
444
  def _handle_post(draft, view)
451
445
  log!(enter: __method__, args: [draft, view])
446
+ # break into separate methods?
452
447
 
453
448
  fname = File.basename(draft) # 0001-this-is-a-post.lt3
454
449
  nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
@@ -469,9 +464,9 @@ class RuneBlog
469
464
  copy(pdraft/"vars.lt3", @theme/:post)
470
465
  # Step 4...
471
466
  xlate cwd: @theme/:post, src: "generate.lt3",
472
- dst: remote/ahtml, copy: @theme/:post
467
+ dst: remote/ahtml, copy: @theme/:post # , debug: true
473
468
  xlate cwd: @theme/:post, src: "permalink.lt3",
474
- dst: remote/:permalink/ahtml
469
+ dst: remote/:permalink/ahtml # , debug: true
475
470
  copy_widget_html(view)
476
471
  end
477
472
 
@@ -480,11 +475,11 @@ class RuneBlog
480
475
  views = _get_views(draft)
481
476
  views.each do |view|
482
477
  _handle_post(draft, view)
483
- generate_view(view)
478
+ generate_view(view) # FIXME leads to inefficiency?
484
479
  end
485
480
  end
486
481
 
487
- def relink
482
+ def relink # FIXME no longer used?
488
483
  log!(enter: __method__)
489
484
  self.views.each {|view| generate_index(view) }
490
485
  end
@@ -2,7 +2,7 @@
2
2
  if ! (Object.constants.include?(:RuneBlog) && RuneBlog.constants.include?(:Path))
3
3
 
4
4
  class RuneBlog
5
- VERSION = "0.2.16"
5
+ VERSION = "0.2.17"
6
6
 
7
7
  path = Gem.find_files("runeblog").grep(/runeblog-/).first
8
8
  Path = File.dirname(path)
@@ -1,6 +1,5 @@
1
- # require 'helpers-blog'
2
- # require 'runeblog'
3
1
  require 'global'
2
+ require 'logging'
4
3
 
5
4
  class RuneBlog::View
6
5
  attr_reader :name, :state
@@ -22,7 +21,7 @@ class RuneBlog::View
22
21
  end
23
22
 
24
23
  def dir
25
- # log!(enter: __method__)
24
+ log!(enter: __method__)
26
25
  @blog.root + "/views/#@name/"
27
26
  end
28
27
 
@@ -0,0 +1,31 @@
1
+
2
+ LEXT = ".lt3"
3
+
4
+ def stale?(src, dst, force = false)
5
+ log!(enter: __method__, args: [src, dst])
6
+ raise "Source #{src} not found in #{Dir.pwd}" unless File.exist?(src)
7
+ return true if force
8
+ return true unless File.exist?(dst)
9
+ return true if File.mtime(src) > File.mtime(dst)
10
+ return false
11
+ end
12
+
13
+ def xlate(cwd: Dir.pwd, src:,
14
+ dst: (strip = true; src.sub(/.lt3$/,"")),
15
+ copy: nil, debug: false, force: false)
16
+ src += LEXT unless src.end_with?(LEXT)
17
+ dst += ".html" unless dst.end_with?(".html") || strip
18
+ STDERR.puts "-- xlate: pwd = #{cwd}"
19
+ Dir.chdir(cwd) do
20
+ return unless stale?(src, dst, force)
21
+ if debug
22
+ STDERR.puts "-- xlate #{src} >#{dst}"
23
+ STDERR.puts " in: #{Dir.pwd}"
24
+ STDERR.puts " from: #{caller[0]}"
25
+ STDERR.puts " copy: #{copy}" if copy
26
+ end
27
+ rc = system("livetext #{src} >#{dst}")
28
+ STDERR.puts "...completed (shell returned #{rc})" if debug
29
+ end
30
+ end
31
+
@@ -15,14 +15,18 @@ def getch
15
15
  end
16
16
 
17
17
  def debug(str)
18
- # STDERR.puts str
18
+ STDERR.puts ">>> #{str} #{Time.now}"
19
19
  end
20
20
 
21
21
  def make_post(x, title, teaser, body, views=[])
22
- # STDERR.puts "\n========= make_post '#{title}'"
23
- print "."
22
+ debug " make_post '#{title}'"
23
+ # print "."
24
24
  x.create_new_post(title, true, teaser: teaser, body: body, other_views: views)
25
- views.each {|view| x.generate_index(view) } # recent.html
25
+ views.each do |view|
26
+ debug " generate_index #{view}"
27
+ x.generate_index(view)
28
+ end # recent.html
29
+ STDERR.puts
26
30
  end
27
31
 
28
32
  def show_lines(text)
@@ -40,6 +44,7 @@ system("rm -rf .blogs")
40
44
  RuneBlog.create_new_blog_repo(".blogs")
41
45
  x = RuneBlog.new(".blogs")
42
46
 
47
+ debug("create_view 'around_austin'")
43
48
  x.create_view("around_austin") # FIXME remember view title!
44
49
 
45
50
  # Hack:
@@ -47,8 +52,10 @@ if File.exist?("publish")
47
52
  system("cp publish .blogs/views/around_austin/publish")
48
53
  end
49
54
 
55
+ debug("create_view 'computing'")
50
56
  x.create_view("computing")
51
57
 
58
+ debug("create_view 'music'")
52
59
  x.create_view("music")
53
60
 
54
61
  x.change_view("around_austin") # 1 2 7 8 9
@@ -126,6 +133,7 @@ But I first heard of them
126
133
  in 2005.
127
134
  BODY
128
135
 
136
+ debug("GENERATE_view 'around_austin'")
129
137
  x.generate_view("around_austin")
130
138
 
131
139
  x.change_view("around_austin")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runeblog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.16
4
+ version: 0.2.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hal Fulton
@@ -76,6 +76,7 @@ files:
76
76
  - lib/runeblog.rb
77
77
  - lib/runeblog_version.rb
78
78
  - lib/view.rb
79
+ - lib/xlate.rb
79
80
  - test/config
80
81
  - test/fakeimage.jpg
81
82
  - test/general_test.rb