runeblog 0.2.16 → 0.2.17

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