runeblog 0.2.43 → 0.2.48

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/bin/blog +8 -10
  3. data/empty_view/assets/austin-pano.jpg +0 -0
  4. data/empty_view/themes/standard/blog/generate.lt3 +5 -3
  5. data/empty_view/themes/standard/blog/post_entry.lt3 +14 -10
  6. data/empty_view/themes/standard/etc/blog.css.lt3 +18 -0
  7. data/empty_view/themes/standard/navbar/faq.lt3 +1 -0
  8. data/empty_view/themes/standard/navbar/navbar.lt3 +1 -0
  9. data/empty_view/themes/standard/widgets/ad/ad.lt3 +8 -1
  10. data/empty_view/themes/standard/widgets/ad/ad1.png +0 -0
  11. data/empty_view/themes/standard/widgets/ad/ad2.png +0 -0
  12. data/empty_view/themes/standard/widgets/ad/ad3.png +0 -0
  13. data/empty_view/themes/standard/widgets/ad/ad4.png +0 -0
  14. data/empty_view/themes/standard/widgets/bydates/bydates.rb +7 -3
  15. data/empty_view/themes/standard/widgets/links/links.rb +28 -3
  16. data/empty_view/themes/standard/widgets/news/news.rb +7 -3
  17. data/empty_view/themes/standard/widgets/pages/pages.rb +10 -3
  18. data/empty_view/themes/standard/widgets/pinned/pinned.rb +7 -3
  19. data/empty_view/themes/standard/widgets/search/search.rb +7 -3
  20. data/empty_view/themes/standard/widgets/sitemap/sitemap.rb +7 -3
  21. data/empty_view/themes/standard/widgets/tag-cloud/tag-cloud.rb +7 -3
  22. data/lib/default.rb +1 -1
  23. data/lib/global.rb +15 -40
  24. data/lib/helpers-blog.rb +15 -44
  25. data/lib/liveblog.rb +86 -62
  26. data/lib/logging.rb +17 -8
  27. data/lib/post.rb +24 -20
  28. data/lib/publish.rb +4 -5
  29. data/lib/repl.rb +52 -11
  30. data/lib/runeblog.rb +115 -93
  31. data/lib/runeblog_version.rb +1 -1
  32. data/lib/view.rb +2 -9
  33. data/lib/xlate.rb +34 -33
  34. data/test/austin.rb +31 -20
  35. metadata +8 -5
  36. data/empty_view/remote/widgets/links/list.data +0 -3
  37. data/empty_view/remote/widgets/news/list.data +0 -4
  38. data/empty_view/remote/widgets/pages/list.data +0 -4
@@ -21,29 +21,28 @@ class RuneBlog::Publishing
21
21
  end
22
22
 
23
23
  def to_h
24
- log!(enter: __method__)
24
+ log!(enter: __method__, level: 3)
25
25
  {user: @user, server: @server, docroot: @docroot,
26
26
  path: @path, proto: @proto}
27
27
  end
28
28
 
29
29
  def url
30
- log!(enter: __method__)
30
+ log!(enter: __method__, level: 3)
31
31
  vname = @blog.view.name # .gsub(/_/, "\\_")
32
32
  url = "#@proto://#@server/#@path" # /#{vname}"
33
33
  end
34
34
 
35
35
  def system!(str)
36
- log!(enter: __method__, args: [str])
36
+ log!(enter: __method__, args: [str], level: 1)
37
37
  rc = system(str)
38
38
  rc
39
39
  end
40
40
 
41
41
  def publish(files, assets=[])
42
- log!(enter: __method__, args: [files, assets])
42
+ log!(enter: __method__, args: [files, assets], level: 1)
43
43
  dir = @docroot/@path
44
44
  view_name = @blog.view.name
45
45
  viewpath = dir # /view_name
46
- # result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}")
47
46
  result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}/assets")
48
47
  files.each do |file|
49
48
  dest = "#@user@#@server:" + dir # /view_name
@@ -7,18 +7,19 @@ make_exception(:PublishError, "Error during publishing")
7
7
  make_exception(:EditorProblem, "Could not edit $1")
8
8
 
9
9
  module RuneBlog::REPL
10
-
11
10
  def edit_file(file)
12
11
  result = system!("#{@blog.editor} #{file}")
13
12
  raise EditorProblem(file) unless result
14
13
  sleep 0.1
15
- STDSCR.clear
14
+ cmd_clear(nil)
16
15
  end
17
16
 
18
17
  def cmd_quit(arg, testing = false)
19
18
  check_empty(arg)
20
19
  RubyText.stop
21
- system!("tput clear")
20
+ sleep 0.1
21
+ cmd_clear(nil)
22
+ sleep 0.1
22
23
  exit
23
24
  end
24
25
 
@@ -99,6 +100,13 @@ module RuneBlog::REPL
99
100
  result = system!("open #{local}")
100
101
  raise CantOpen(local) unless result
101
102
  @out
103
+ rescue => err
104
+ out = "/tmp/blog#{rand(100)}.txt"
105
+ File.open(out, "w") do |f|
106
+ f.puts err
107
+ f.puts err.backtrace.join("\n")
108
+ end
109
+ puts "Error: See #{out}"
102
110
  end
103
111
 
104
112
  def cmd_publish(arg, testing = false)
@@ -136,6 +144,13 @@ module RuneBlog::REPL
136
144
  output! "...finished.\n"
137
145
  end
138
146
  return @out
147
+ rescue => err
148
+ out = "/tmp/blog#{rand(100)}.txt"
149
+ File.open(out, "w") do |f|
150
+ f.puts err
151
+ f.puts err.backtrace.join("\n")
152
+ end
153
+ puts "Error: See #{out}"
139
154
  end
140
155
 
141
156
  def cmd_rebuild(arg, testing = false)
@@ -144,7 +159,15 @@ module RuneBlog::REPL
144
159
  check_empty(arg)
145
160
  puts unless testing
146
161
  @blog.generate_view(@blog.view)
162
+ @blog.generate_index(@blog.view)
147
163
  @out
164
+ rescue => err
165
+ out = "/tmp/blog#{rand(100)}.txt"
166
+ File.open(out, "w") do |f|
167
+ f.puts err
168
+ f.puts err.backtrace.join("\n")
169
+ end
170
+ puts "Error: See #{out}"
148
171
  end
149
172
 
150
173
  def cmd_change_view(arg, testing = false)
@@ -178,18 +201,30 @@ module RuneBlog::REPL
178
201
  @out
179
202
  rescue ViewAlreadyExists
180
203
  puts 'Blog already exists'
204
+ rescue => err
205
+ out = "/tmp/blog#{rand(100)}.txt"
206
+ File.open(out, "w") do |f|
207
+ f.puts err
208
+ f.puts err.backtrace.join("\n")
209
+ end
210
+ puts "Error: See #{out}"
181
211
  end
182
212
 
183
213
  def cmd_new_post(arg, testing = false)
184
214
  reset_output
185
215
  check_empty(arg)
186
216
  title = ask("\nTitle: ")
217
+ puts
187
218
  @blog.create_new_post(title)
188
219
  # STDSCR.clear
189
220
  @out
190
221
  rescue => err
191
- puts err
192
- puts err.backtrace.join("\n")
222
+ out = "/tmp/blog#{rand(100)}.txt"
223
+ File.open(out, "w") do |f|
224
+ f.puts err
225
+ f.puts err.backtrace.join("\n")
226
+ end
227
+ puts "Error: See #{out}"
193
228
  end
194
229
 
195
230
  def _remove_post(arg, testing=false)
@@ -199,7 +234,6 @@ module RuneBlog::REPL
199
234
  end
200
235
 
201
236
  def cmd_remove_post(arg, testing = false)
202
- puts "arg = #{arg.inspect} is a #{arg.class}"
203
237
  reset_output
204
238
  args = arg.split
205
239
  args.each do |x|
@@ -211,14 +245,12 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
211
245
  @out
212
246
  end
213
247
 
214
- #-- FIXME affects linking, building, publishing...
215
-
216
248
  def cmd_edit_post(arg, testing = false)
217
249
  reset_output
218
250
  id = get_integer(arg)
219
251
  # Simplify this
220
252
  tag = "#{'%04d' % id}"
221
- files = Find.find(@blog.root+"/drafts").to_a
253
+ files = ::Find.find(@blog.root+"/drafts").to_a
222
254
  files = files.grep(/#{tag}-.*lt3/)
223
255
  files = files.map {|f| File.basename(f) }
224
256
  if files.size > 1
@@ -238,6 +270,13 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
238
270
  draft = "#{@blog.root}/drafts/#{file}"
239
271
  result = edit_file(draft)
240
272
  @blog.generate_post(draft)
273
+ rescue => err
274
+ out = "/tmp/blog#{rand(100)}.txt"
275
+ File.open(out, "w") do |f|
276
+ f.puts err
277
+ f.puts err.backtrace.join("\n")
278
+ end
279
+ puts "Error: See #{out}"
241
280
  end
242
281
 
243
282
  def cmd_list_views(arg, testing = false)
@@ -321,7 +360,10 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
321
360
 
322
361
  def cmd_ssh(arg, testing = false)
323
362
  pub = @blog.view.publisher
324
- system!("ssh #{pub.user}@#{pub.server}")
363
+ puts
364
+ system!("tputs clear; ssh #{pub.user}@#{pub.server}")
365
+ sleep 0.1
366
+ cmd_clear(nil)
325
367
  end
326
368
 
327
369
  def cmd_INVALID(arg, testing = false)
@@ -384,6 +426,5 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
384
426
  puts unless testing
385
427
  @out
386
428
  end
387
-
388
429
  end
389
430
 
@@ -1,4 +1,5 @@
1
1
  require 'date'
2
+ require 'find'
2
3
 
3
4
  require 'logging'
4
5
 
@@ -42,6 +43,15 @@ class RuneBlog
42
43
 
43
44
  include Helpers
44
45
 
46
+ def _tmp_error(err) # FIXME move to helpers
47
+ out = "/tmp/blog#{rand(100)}.txt"
48
+ File.open(out, "w") do |f|
49
+ f.puts err
50
+ f.puts err.backtrace.join("\n")
51
+ end
52
+ puts "Error: See #{out}"
53
+ end
54
+
45
55
  def self.create_new_blog_repo(dir = ".blogs")
46
56
  log!(enter: __method__, args: [dir])
47
57
  raise ArgumentError unless dir.is_a?(String) && ! dir.empty?
@@ -53,7 +63,7 @@ class RuneBlog
53
63
  end
54
64
 
55
65
  def self.create(root = ".blogs")
56
- log!(enter: __method__, args: [root])
66
+ log!(enter: __method__, args: [root], level: 1)
57
67
  # Crude - FIXME later - # What views are there? Publishing, etc.
58
68
  self.blog = self # Weird. Like a singleton - dumbass circular dependency?
59
69
  root = Dir.pwd/root
@@ -63,13 +73,13 @@ class RuneBlog
63
73
  create_dirs(:drafts, :views, :posts)
64
74
  new_sequence
65
75
  end
66
- # put_config(root: root)
67
76
  x = OpenStruct.new
68
77
  x.root, x.current_view, x.editor = root, "test_view", "/usr/bin/vim " # dumb - FIXME later
69
78
  write_config(x, root/ConfigFile)
70
79
  @blog = self.new(root)
71
- @blog.create_view("test_view")
72
80
  @blog
81
+ rescue => err
82
+ _tmp_error(err)
73
83
  end
74
84
 
75
85
  def self.open(root = ".blogs")
@@ -78,6 +88,8 @@ class RuneBlog
78
88
  self.blog = self # Weird. Like a singleton - dumbass circular dependency?
79
89
  root = Dir.pwd/root
80
90
  blog = self.new(root)
91
+ rescue => err
92
+ _tmp_error(err)
81
93
  end
82
94
 
83
95
  def initialize(root_dir = ".blogs") # always assumes existing blog
@@ -101,11 +113,13 @@ class RuneBlog
101
113
  end
102
114
 
103
115
  def _deploy_local(dir)
104
- log!(enter: __method__, args: [dir])
116
+ log!(enter: __method__, args: [dir], level: 1)
105
117
  Dir.chdir(dir) do
106
118
  views = _retrieve_metadata(:views)
107
119
  views.each {|v| system!("cp *html #@root/views/#{v}/remote") }
108
120
  end
121
+ rescue => err
122
+ _tmp_error(err)
109
123
  end
110
124
 
111
125
  def _retrieve_metadata(key)
@@ -129,19 +143,23 @@ class RuneBlog
129
143
  raise "Too many #{key} instances in metadata.txt!"
130
144
  end
131
145
  return result
146
+ rescue => err
147
+ _tmp_error(err)
132
148
  end
133
149
 
134
150
  def process_post(sourcefile)
135
- log!(enter: __method__, args: [dir])
151
+ log!(enter: __method__, args: [dir], level: 2)
136
152
  nslug = sourcefile.sub(/.lt3/, "")
137
153
  dir = @root/:posts/nslug
138
154
  create_dir(dir)
139
155
  xlate cwd: dir, src: sourcefile # , debug: true
140
156
  _deploy_local(dir)
157
+ rescue => err
158
+ _tmp_error(err)
141
159
  end
142
160
 
143
161
  def inspect
144
- log!(enter: __method__)
162
+ log!(enter: __method__, level: 3)
145
163
  str = "blog: "
146
164
  ivars = ["@root", "@sequence"] # self.instance_variables
147
165
  ivars.each do |iv|
@@ -152,30 +170,32 @@ class RuneBlog
152
170
  end
153
171
 
154
172
  def view?(name)
155
- log!(enter: __method__, args: [name])
173
+ log!(enter: __method__, args: [name], level: 3)
156
174
  raise ArgumentError unless name.is_a?(String) && ! name.empty?
157
175
  views.any? {|x| x.name == name }
158
176
  end
159
177
 
160
178
  def view(name = nil)
161
- log!(enter: __method__, args: [name])
179
+ log!(enter: __method__, args: [name], level: 3)
162
180
  raise ArgumentError unless name.nil? || (name.is_a?(String) && ! name.empty?)
163
181
  name.nil? ? @view : str2view(name)
164
182
  end
165
183
 
166
184
  def str2view(str)
167
- log!(enter: __method__, args: [str])
185
+ log!(enter: __method__, args: [str], level: 3)
168
186
  raise ArgumentError unless str.is_a?(String) && ! str.empty?
169
187
  @views.find {|x| x.name == str }
170
188
  end
171
189
 
172
190
  def _set_publisher
173
- log!(enter: __method__)
191
+ log!(enter: __method__, level: 3)
174
192
  @view.publisher = RuneBlog::Publishing.new(@view.to_s) # FIXME refactor
193
+ rescue => err
194
+ _tmp_error(err)
175
195
  end
176
196
 
177
197
  def view=(arg)
178
- log!(enter: __method__, args: [arg])
198
+ log!(enter: __method__, args: [arg], level: 2)
179
199
  case arg
180
200
  when RuneBlog::View
181
201
  @view = arg
@@ -188,22 +208,24 @@ class RuneBlog
188
208
  else
189
209
  raise CantAssignView(arg.class.to_s)
190
210
  end
211
+ rescue => err
212
+ _tmp_error(err)
191
213
  end
192
214
 
193
215
  def get_sequence
194
- log!(enter: __method__)
216
+ log!(enter: __method__, level: 3)
195
217
  File.read(@root/:sequence).to_i
196
218
  end
197
219
 
198
220
  def next_sequence
199
- log!(enter: __method__)
221
+ log!(enter: __method__, level: 3)
200
222
  @sequence += 1
201
223
  dump(@sequence, @root/:sequence)
202
224
  @sequence
203
225
  end
204
226
 
205
227
  def viewdir(v = nil) # delete?
206
- log!(enter: __method__, args: [v])
228
+ log!(enter: __method__, args: [v], level: 3)
207
229
  v = str2view(v) if v.is_a?(String)
208
230
  raise ArgumentError unless v.nil? || v.is_a?(RuneBlog::View)
209
231
  v ||= @view
@@ -211,17 +233,17 @@ class RuneBlog
211
233
  end
212
234
 
213
235
  def self.exist?
214
- log!(enter: __method__)
236
+ log!(enter: __method__, level: 3)
215
237
  Dir.exist?(DotDir) && File.exist?(DotDir/ConfigFile)
216
238
  end
217
239
 
218
240
  def mark_last_published(str)
219
- log!(enter: __method__, args: [str])
241
+ log!(enter: __method__, args: [str], level: 2)
220
242
  dump(str, "#{self.view.dir}/last_published")
221
243
  end
222
244
 
223
245
  def add_view(view_name)
224
- log!(enter: __method__, args: [view_name])
246
+ log!(enter: __method__, args: [view_name], level: 2)
225
247
  view = RuneBlog::View.new(view_name)
226
248
  @view = view # current view
227
249
  @views << view # all views
@@ -229,15 +251,17 @@ class RuneBlog
229
251
  end
230
252
 
231
253
  def make_empty_view_tree(view_name)
232
- log!(enter: __method__, args: [view_name])
254
+ log!(enter: __method__, args: [view_name], level: 2)
233
255
  Dir.chdir(@root) do
234
256
  cmd = "cp -r #{RuneBlog::Path}/../empty_view views/#{view_name}"
235
257
  system!(cmd)
236
258
  end
259
+ rescue => err
260
+ _tmp_error(err)
237
261
  end
238
262
 
239
263
  def check_valid_new_view(view_name)
240
- log!(enter: __method__, args: [view_name])
264
+ log!(enter: __method__, args: [view_name], level: 3)
241
265
  raise ArgumentError unless view_name.is_a?(String)
242
266
  raise ArgumentError if view_name.empty?
243
267
  names = self.views.map(&:to_s)
@@ -249,11 +273,13 @@ class RuneBlog
249
273
  end
250
274
 
251
275
  def create_view(view_name)
252
- log!(enter: __method__, args: [view_name])
276
+ log!(enter: __method__, args: [view_name], level: 2)
253
277
  check_valid_new_view(view_name)
254
278
  make_empty_view_tree(view_name)
255
279
  add_view(view_name)
256
280
  mark_last_published("Initial creation")
281
+ rescue => err
282
+ _tmp_error(err)
257
283
  end
258
284
 
259
285
  def delete_view(name, force = false)
@@ -267,7 +293,7 @@ class RuneBlog
267
293
  end
268
294
 
269
295
  def view_files
270
- log!(enter: __method__)
296
+ log!(enter: __method__, level: 2)
271
297
  vdir = self.view.dir
272
298
  files = [vdir/"index.html"]
273
299
  files += posts.map {|x| vdir/x }
@@ -275,7 +301,7 @@ class RuneBlog
275
301
  end
276
302
 
277
303
  def post_lookup(postid) # side-effect?
278
- log!(enter: __method__, args: [postid])
304
+ log!(enter: __method__, args: [postid], level: 2)
279
305
  slug = title = date = teaser_text = nil
280
306
 
281
307
  dir_posts = @vdir/:posts
@@ -287,10 +313,12 @@ class RuneBlog
287
313
  postdir = post.first
288
314
  vp = RuneBlog::ViewPost.new(self.view, postdir)
289
315
  vp
316
+ rescue => err
317
+ _tmp_error(err)
290
318
  end
291
319
 
292
320
  def index_entry(slug)
293
- log!(enter: __method__, args: [slug])
321
+ log!(enter: __method__, args: [slug], level: 2)
294
322
  id = slug.to_i
295
323
  text = nil
296
324
  @theme = @view.dir/"themes/standard"
@@ -302,28 +330,37 @@ class RuneBlog
302
330
  vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
303
331
  path = vp.path
304
332
  url = aslug + ".html"
333
+ # puts "--- vp = #{[vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text].inspect}"; gets
305
334
  date = ::Date.parse(date)
306
335
  date = date.strftime("%B %e<br><div style='float: right'>%Y</div>")
307
336
  text = interpolate(@_post_entry, binding)
308
337
  text
338
+ rescue => err
339
+ _tmp_error(err)
309
340
  end
310
341
 
311
342
  def collect_recent_posts(file)
312
- log!(enter: __method__, args: [file])
343
+ log!(enter: __method__, args: [file], level: 3)
313
344
  posts = nil
314
345
  dir_posts = @vdir/:posts
315
346
  entries = Dir.entries(dir_posts)
316
347
  posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts/x }
317
348
  posts.select! {|x| File.directory?(x) }
318
349
  # directories that start with four digits
319
- posts = posts.sort {|a, b| b.to_i <=> a.to_i } # sort descending
350
+ posts = posts.sort do |a, b|
351
+ ai = a.index(/\d\d\d\d-/)
352
+ bi = b.index(/\d\d\d\d-/)
353
+ na = a[ai..(ai+3)].to_i
354
+ nb = b[bi..(bi+3)].to_i
355
+ nb <=> na
356
+ end # sort descending
320
357
  posts = posts[0..19] # return 20 at most
321
358
  text = <<-HTML
322
359
  <html>
323
360
  <head><link rel="stylesheet" href="etc/blog.css"></head>
324
361
  <body>
325
362
  HTML
326
- wanted = [5, posts.size].min # estimate how many we want?
363
+ wanted = [8, posts.size].min # estimate how many we want?
327
364
  enum = posts.each
328
365
  wanted.times do
329
366
  postid = File.basename(enum.next)
@@ -332,28 +369,30 @@ class RuneBlog
332
369
  end
333
370
  text << "</body></html>"
334
371
  File.write(@vdir/:remote/file, text)
372
+ rescue => err
373
+ _tmp_error(err)
335
374
  end
336
375
 
337
- def create_new_post(title, testing = false, teaser: nil, body: nil, views: [])
338
- log!(enter: __method__, args: [title, testing, teaser, body, views])
376
+ def create_new_post(title, testing = false, teaser: nil, body: nil,
377
+ pubdate: Time.now.strftime("%Y-%m-%d"), views: [])
378
+ log!(enter: __method__, args: [title, testing, teaser, body, views], level: 1, stderr: true)
339
379
  meta = nil
340
380
  views = views + [self.view.to_s]
381
+ views.uniq!
341
382
  Dir.chdir(@root/:posts) do
342
- post = Post.create(title: title, teaser: teaser, body: body, views: views)
383
+ post = Post.create(title: title, teaser: teaser, body: body, pubdate: pubdate, views: views)
343
384
  post.edit unless testing
344
385
  post.build
345
386
  meta = post.meta
346
387
  end
347
388
  return meta.num
348
389
  rescue => err
349
- puts err
350
- puts err.backtrace.join("\n")
390
+ _tmp_error(err)
351
391
  end
352
392
 
353
393
  def edit_initial_post(file, testing = false)
354
- log!(enter: __method__, args: [file, testing])
394
+ log!(enter: __method__, args: [file, testing], level: 3)
355
395
  debug "=== edit_initial_post #{file.inspect} => #{sourcefile}"
356
- sourcefile = @root/:drafts/file
357
396
  result = system!("#@editor #{sourcefile} +8") unless testing
358
397
  raise EditorProblem(sourcefile) unless result
359
398
  process_post(sourcefile)
@@ -363,20 +402,20 @@ class RuneBlog
363
402
  end
364
403
 
365
404
  def posts
366
- log!(enter: __method__)
405
+ log!(enter: __method__, level: 3)
367
406
  dir = self.view.dir/:posts
368
407
  posts = Dir.entries(dir).grep(/^\d{4}/)
369
408
  posts
370
409
  end
371
410
 
372
411
  def drafts
373
- log!(enter: __method__)
412
+ log!(enter: __method__, level: 3)
374
413
  dir = @root/:drafts
375
414
  drafts = Dir.entries(dir).grep(/^\d{4}.*/)
376
415
  end
377
416
 
378
417
  def change_view(view)
379
- log!(enter: __method__, args: [view])
418
+ log!(enter: __method__, args: [view], level: 3)
380
419
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
381
420
  x = OpenStruct.new
382
421
  x.root, x.current_view, x.editor = @root, view.to_s, @editor # dumb - FIXME later
@@ -389,40 +428,38 @@ class RuneBlog
389
428
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
390
429
  @vdir = @root/:views/view
391
430
  collect_recent_posts("recent.html")
431
+ rescue => err
432
+ _tmp_error(err)
392
433
  end
393
434
 
394
435
  def generate_view(view) # huh?
395
436
  log!(enter: __method__, args: [view])
396
- # generate_index(view) # recent posts (recent.html)
397
437
  vdir = @root/:views/view
398
438
  @theme = @root/:views/view/:themes/:standard
399
439
  xlate cwd: vdir/"themes/standard/etc",
400
440
  src: "blog.css.lt3", copy: vdir/"remote/etc/blog.css" # , debug: true
401
441
  xlate cwd: vdir/"themes/standard",
402
442
  src: "blog/generate.lt3", dst: vdir/:remote/"index.html"
403
- generate_index(view) # recent posts (recent.html)
404
- # ^ HERE
405
443
  copy("#{vdir}/assets/*", "#{vdir}/remote/assets/")
406
444
  rescue => err
407
- puts err
408
- puts err.backtrace.join("\n")
409
- print "Pause... "
410
- gets
445
+ _tmp_error(err)
411
446
  end
412
447
 
413
448
  def _get_views(draft)
414
- log!(enter: __method__, args: [draft])
449
+ log!(enter: __method__, args: [draft], level: 2)
415
450
  # FIXME dumb code
416
451
  view_line = File.readlines(draft).grep(/^.views /)
417
452
  raise "More than one .views call!" if view_line.size > 1
418
453
  raise "No .views call!" if view_line.size < 1
419
454
  view_line = view_line.first
420
455
  views = view_line[7..-1].split
421
- views
456
+ views.uniq
457
+ rescue => err
458
+ _tmp_error(err)
422
459
  end
423
460
 
424
461
  def _copy_get_dirs(draft, view)
425
- log!(enter: __method__, args: [draft, view])
462
+ log!(enter: __method__, args: [draft, view], level: 2)
426
463
  fname = File.basename(draft)
427
464
  noext = fname.sub(/.lt3$/, "")
428
465
  vdir = @root/:views/view
@@ -432,21 +469,24 @@ class RuneBlog
432
469
  viewdir, slugdir, aslug = vdir, dir, noext[5..-1]
433
470
  theme = viewdir/:themes/:standard
434
471
  [noext, viewdir, slugdir, aslug, theme]
472
+ rescue => err
473
+ _tmp_error(err)
435
474
  end
436
475
 
437
476
  def _post_metadata(draft, pdraft)
438
- log!(enter: __method__, args: [draft, pdraft])
477
+ log!(enter: __method__, args: [draft, pdraft], level: 2)
439
478
  # FIXME store this somewhere
440
479
  fname = File.basename(draft) # 0001-this-is-a-post.lt3
441
480
  nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
442
481
  aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
443
- pnum = nslug[0..3] # 0001
482
+ pnum = nslug[0..3] # 0001
444
483
  Dir.chdir(pdraft) do
445
484
  excerpt = File.read("teaser.txt")
446
485
  date = _retrieve_metadata(:date)
447
486
  longdate = ::Date.parse(date).strftime("%B %e, %Y")
448
487
  title = _retrieve_metadata(:title)
449
488
  tags = _retrieve_metadata(:tags)
489
+ # FIXME simplify
450
490
  vars = <<~LIVE
451
491
  .set post.num = #{pnum}
452
492
  .heredoc post.aslug
@@ -467,10 +507,12 @@ class RuneBlog
467
507
  LIVE
468
508
  File.open(pdraft/"vars.lt3", "w") {|f| f.puts vars }
469
509
  end
510
+ rescue => err
511
+ _tmp_error(err)
470
512
  end
471
513
 
472
514
  def copy_widget_html(view)
473
- log!(enter: __method__)
515
+ log!(enter: __method__, level: 2)
474
516
  vdir = @root/:views/view
475
517
  remote = vdir/:remote
476
518
  wdir = vdir/:themes/:standard/:widgets
@@ -481,12 +523,15 @@ class RuneBlog
481
523
  create_dirs(rem)
482
524
  files = Dir[w/"*"]
483
525
  files = files.select {|x| x =~ /(html|css)$/ }
484
- files.each {|file| system!("cp #{file} #{rem}") }
526
+ tag = File.basename(w)
527
+ files.each {|file| system!("cp #{file} #{rem}", show: (tag == "zzz")) }
485
528
  end
529
+ rescue => err
530
+ _tmp_error(err)
486
531
  end
487
532
 
488
- def _handle_post(draft, view)
489
- log!(enter: __method__, args: [draft, view])
533
+ def _handle_post(draft, view_name = self.view.to_s)
534
+ log!(enter: __method__, args: [draft, view_name], level: 2)
490
535
  # break into separate methods?
491
536
 
492
537
  fname = File.basename(draft) # 0001-this-is-a-post.lt3
@@ -494,55 +539,34 @@ class RuneBlog
494
539
  aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
495
540
  ahtml = aslug + ".html" # this-is-a-post.html
496
541
  pdraft = @root/:posts/nslug
497
- remote = @root/:views/view/:remote
498
- @theme = @root/:views/view/:themes/:standard
542
+ remote = @root/:views/view_name/:remote
543
+ @theme = @root/:views/view_name/:themes/:standard
499
544
  # Step 1...
500
545
  create_dirs(pdraft)
501
- xlate cwd: pdraft, src: draft, dst: "guts.html"
546
+ xlate cwd: pdraft, src: draft, dst: "guts.html", debug: true
502
547
  _post_metadata(draft, pdraft)
503
548
  # Step 2...
504
- vposts = @root/:views/view/:posts
549
+ vposts = @root/:views/view_name/:posts
505
550
  copy!(pdraft, vposts) # ??
506
551
  # Step 3..
507
552
  copy(pdraft/"guts.html", @theme/:post)
508
553
  copy(pdraft/"vars.lt3", @theme/:post)
509
554
  # Step 4...
510
- xlate cwd: @theme/:post, src: "generate.lt3",
511
- dst: remote/ahtml, copy: @theme/:post # , debug: true
555
+ xlate cwd: @theme/:post, src: "generate.lt3", force: true,
556
+ dst: remote/ahtml, copy: @theme/:post, debug: true
512
557
  xlate cwd: @theme/:post, src: "permalink.lt3",
513
558
  dst: remote/:permalink/ahtml # , debug: true
514
- copy_widget_html(view)
559
+ copy_widget_html(view_name)
560
+ rescue => err
561
+ _tmp_error(err)
515
562
  end
516
563
 
517
564
  def generate_post(draft)
518
- log!(enter: __method__, args: [draft])
565
+ log!(enter: __method__, args: [draft], level: 1)
519
566
  views = _get_views(draft)
520
- views.each do |view|
521
- _handle_post(draft, view)
522
- # generate_view(view) # FIXME leads to inefficiency?
523
- # ^ HERE
524
- end
525
- end
526
-
527
- def OLD_index_entry(view, meta)
528
- log!(enter: __method__, args: [view, meta])
529
- debug "=== index_entry #{view.to_s.inspect} #{meta.num} #{meta.title.inspect}"
530
- check_meta(meta, "index_entry1")
531
- raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
532
- check_meta(meta, "index_entry2")
533
- self.make_slug(meta)
534
- check_meta(meta, "index_entry3")
535
- # FIXME clean up and generalize
536
- ref = view/meta.slug/"index.html"
537
- <<-HTML
538
- <font size=-1>#{meta.date}&nbsp;&nbsp;</font> <br>
539
- <font size=+2 color=blue><a href=../#{ref} style="text-decoration: none">#{meta.title}</font></a>
540
- <br>
541
- <font size=+1>#{meta.teaser}&nbsp;&nbsp;</font>
542
- <a href=../#{ref} style="text-decoration: none">Read more...</a>
543
- <br>
544
- <hr>
545
- HTML
567
+ views.each {|view| _handle_post(draft, view) }
568
+ rescue => err
569
+ _tmp_error(err)
546
570
  end
547
571
 
548
572
  def rebuild_post(file)
@@ -556,12 +580,11 @@ class RuneBlog
556
580
  @views_dirty.flatten!
557
581
  @views_dirty.uniq!
558
582
  rescue => err
559
- error(err)
560
- getch
583
+ _tmp_error(err)
561
584
  end
562
585
 
563
586
  def remove_post(num)
564
- log!(enter: __method__, args: [num])
587
+ log!(enter: __method__, args: [num], level: 1)
565
588
  raise ArgumentError unless num.is_a?(Integer)
566
589
  # FIXME update original draft .views
567
590
  tag = prefix(num)
@@ -578,7 +601,7 @@ class RuneBlog
578
601
  end
579
602
 
580
603
  def undelete_post(num)
581
- log!(enter: __method__, args: [num])
604
+ log!(enter: __method__, args: [num], level: 1)
582
605
  raise ArgumentError unless num.is_a?(Integer)
583
606
  files = Find.find(@root/:views).to_a
584
607
  tag = prefix(num)
@@ -594,14 +617,14 @@ class RuneBlog
594
617
  end
595
618
 
596
619
  def delete_draft(num)
597
- log!(enter: __method__, args: [num])
620
+ log!(enter: __method__, args: [num], level: 1)
598
621
  raise ArgumentError unless num.is_a?(Integer)
599
622
  tag = prefix(num)
600
623
  system!("rm -rf #@root/drafts/#{tag}-*")
601
624
  end
602
625
 
603
626
  def make_slug(meta)
604
- log!(enter: __method__, args: [meta])
627
+ log!(enter: __method__, args: [meta], level: 3)
605
628
  raise ArgumentError unless meta.title.is_a?(String)
606
629
  label = '%04d' % meta.num # FIXME can do better
607
630
  slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
@@ -609,6 +632,5 @@ class RuneBlog
609
632
  meta.slug = str
610
633
  str
611
634
  end
612
-
613
635
  end
614
636