runeblog 0.2.42 → 0.2.47

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/bin/blog +4 -7
  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 +11 -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/post/generate.lt3 +5 -4
  10. data/empty_view/themes/standard/widgets/ad/ad.lt3 +8 -1
  11. data/empty_view/themes/standard/widgets/ad/ad1.png +0 -0
  12. data/empty_view/themes/standard/widgets/ad/ad2.png +0 -0
  13. data/empty_view/themes/standard/widgets/ad/ad3.png +0 -0
  14. data/empty_view/themes/standard/widgets/ad/ad4.png +0 -0
  15. data/empty_view/themes/standard/widgets/bydates/bydates.rb +7 -3
  16. data/empty_view/themes/standard/widgets/links/links.rb +28 -3
  17. data/empty_view/themes/standard/widgets/news/news.rb +7 -3
  18. data/empty_view/themes/standard/widgets/pages/pages.rb +10 -3
  19. data/empty_view/themes/standard/widgets/pinned/pinned.rb +7 -3
  20. data/empty_view/themes/standard/widgets/search/search.rb +7 -3
  21. data/empty_view/themes/standard/widgets/sitemap/sitemap.rb +7 -3
  22. data/empty_view/themes/standard/widgets/tag-cloud/tag-cloud.rb +7 -3
  23. data/lib/default.rb +1 -1
  24. data/lib/global.rb +15 -40
  25. data/lib/helpers-blog.rb +15 -44
  26. data/lib/liveblog.rb +92 -56
  27. data/lib/logging.rb +17 -8
  28. data/lib/post.rb +7 -10
  29. data/lib/publish.rb +4 -5
  30. data/lib/repl.rb +2 -6
  31. data/lib/runeblog.rb +58 -71
  32. data/lib/runeblog_version.rb +1 -1
  33. data/lib/view.rb +2 -9
  34. data/lib/xlate.rb +35 -35
  35. data/test/austin.rb +29 -20
  36. metadata +8 -5
  37. data/empty_view/remote/widgets/links/list.data +0 -3
  38. data/empty_view/remote/widgets/news/list.data +0 -4
  39. 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,7 +7,6 @@ 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
@@ -144,6 +143,7 @@ module RuneBlog::REPL
144
143
  check_empty(arg)
145
144
  puts unless testing
146
145
  @blog.generate_view(@blog.view)
146
+ @blog.generate_index(@blog.view)
147
147
  @out
148
148
  end
149
149
 
@@ -199,7 +199,6 @@ module RuneBlog::REPL
199
199
  end
200
200
 
201
201
  def cmd_remove_post(arg, testing = false)
202
- puts "arg = #{arg.inspect} is a #{arg.class}"
203
202
  reset_output
204
203
  args = arg.split
205
204
  args.each do |x|
@@ -211,14 +210,12 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
211
210
  @out
212
211
  end
213
212
 
214
- #-- FIXME affects linking, building, publishing...
215
-
216
213
  def cmd_edit_post(arg, testing = false)
217
214
  reset_output
218
215
  id = get_integer(arg)
219
216
  # Simplify this
220
217
  tag = "#{'%04d' % id}"
221
- files = Find.find(@blog.root+"/drafts").to_a
218
+ files = ::Find.find(@blog.root+"/drafts").to_a
222
219
  files = files.grep(/#{tag}-.*lt3/)
223
220
  files = files.map {|f| File.basename(f) }
224
221
  if files.size > 1
@@ -384,6 +381,5 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
384
381
  puts unless testing
385
382
  @out
386
383
  end
387
-
388
384
  end
389
385
 
@@ -1,4 +1,5 @@
1
1
  require 'date'
2
+ require 'find'
2
3
 
3
4
  require 'logging'
4
5
 
@@ -53,7 +54,7 @@ class RuneBlog
53
54
  end
54
55
 
55
56
  def self.create(root = ".blogs")
56
- log!(enter: __method__, args: [root])
57
+ log!(enter: __method__, args: [root], level: 1)
57
58
  # Crude - FIXME later - # What views are there? Publishing, etc.
58
59
  self.blog = self # Weird. Like a singleton - dumbass circular dependency?
59
60
  root = Dir.pwd/root
@@ -63,7 +64,6 @@ class RuneBlog
63
64
  create_dirs(:drafts, :views, :posts)
64
65
  new_sequence
65
66
  end
66
- # put_config(root: root)
67
67
  x = OpenStruct.new
68
68
  x.root, x.current_view, x.editor = root, "test_view", "/usr/bin/vim " # dumb - FIXME later
69
69
  write_config(x, root/ConfigFile)
@@ -101,7 +101,7 @@ class RuneBlog
101
101
  end
102
102
 
103
103
  def _deploy_local(dir)
104
- log!(enter: __method__, args: [dir])
104
+ log!(enter: __method__, args: [dir], level: 1)
105
105
  Dir.chdir(dir) do
106
106
  views = _retrieve_metadata(:views)
107
107
  views.each {|v| system!("cp *html #@root/views/#{v}/remote") }
@@ -132,7 +132,7 @@ class RuneBlog
132
132
  end
133
133
 
134
134
  def process_post(sourcefile)
135
- log!(enter: __method__, args: [dir])
135
+ log!(enter: __method__, args: [dir], level: 2)
136
136
  nslug = sourcefile.sub(/.lt3/, "")
137
137
  dir = @root/:posts/nslug
138
138
  create_dir(dir)
@@ -141,7 +141,7 @@ class RuneBlog
141
141
  end
142
142
 
143
143
  def inspect
144
- log!(enter: __method__)
144
+ log!(enter: __method__, level: 3)
145
145
  str = "blog: "
146
146
  ivars = ["@root", "@sequence"] # self.instance_variables
147
147
  ivars.each do |iv|
@@ -152,30 +152,30 @@ class RuneBlog
152
152
  end
153
153
 
154
154
  def view?(name)
155
- log!(enter: __method__, args: [name])
155
+ log!(enter: __method__, args: [name], level: 3)
156
156
  raise ArgumentError unless name.is_a?(String) && ! name.empty?
157
157
  views.any? {|x| x.name == name }
158
158
  end
159
159
 
160
160
  def view(name = nil)
161
- log!(enter: __method__, args: [name])
161
+ log!(enter: __method__, args: [name], level: 3)
162
162
  raise ArgumentError unless name.nil? || (name.is_a?(String) && ! name.empty?)
163
163
  name.nil? ? @view : str2view(name)
164
164
  end
165
165
 
166
166
  def str2view(str)
167
- log!(enter: __method__, args: [str])
167
+ log!(enter: __method__, args: [str], level: 3)
168
168
  raise ArgumentError unless str.is_a?(String) && ! str.empty?
169
169
  @views.find {|x| x.name == str }
170
170
  end
171
171
 
172
172
  def _set_publisher
173
- log!(enter: __method__)
173
+ log!(enter: __method__, level: 3)
174
174
  @view.publisher = RuneBlog::Publishing.new(@view.to_s) # FIXME refactor
175
175
  end
176
176
 
177
177
  def view=(arg)
178
- log!(enter: __method__, args: [arg])
178
+ log!(enter: __method__, args: [arg], level: 2)
179
179
  case arg
180
180
  when RuneBlog::View
181
181
  @view = arg
@@ -191,19 +191,19 @@ class RuneBlog
191
191
  end
192
192
 
193
193
  def get_sequence
194
- log!(enter: __method__)
194
+ log!(enter: __method__, level: 3)
195
195
  File.read(@root/:sequence).to_i
196
196
  end
197
197
 
198
198
  def next_sequence
199
- log!(enter: __method__)
199
+ log!(enter: __method__, level: 3)
200
200
  @sequence += 1
201
201
  dump(@sequence, @root/:sequence)
202
202
  @sequence
203
203
  end
204
204
 
205
205
  def viewdir(v = nil) # delete?
206
- log!(enter: __method__, args: [v])
206
+ log!(enter: __method__, args: [v], level: 3)
207
207
  v = str2view(v) if v.is_a?(String)
208
208
  raise ArgumentError unless v.nil? || v.is_a?(RuneBlog::View)
209
209
  v ||= @view
@@ -211,17 +211,17 @@ class RuneBlog
211
211
  end
212
212
 
213
213
  def self.exist?
214
- log!(enter: __method__)
214
+ log!(enter: __method__, level: 3)
215
215
  Dir.exist?(DotDir) && File.exist?(DotDir/ConfigFile)
216
216
  end
217
217
 
218
218
  def mark_last_published(str)
219
- log!(enter: __method__, args: [str])
219
+ log!(enter: __method__, args: [str], level: 2)
220
220
  dump(str, "#{self.view.dir}/last_published")
221
221
  end
222
222
 
223
223
  def add_view(view_name)
224
- log!(enter: __method__, args: [view_name])
224
+ log!(enter: __method__, args: [view_name], level: 2)
225
225
  view = RuneBlog::View.new(view_name)
226
226
  @view = view # current view
227
227
  @views << view # all views
@@ -229,7 +229,7 @@ class RuneBlog
229
229
  end
230
230
 
231
231
  def make_empty_view_tree(view_name)
232
- log!(enter: __method__, args: [view_name])
232
+ log!(enter: __method__, args: [view_name], level: 2)
233
233
  Dir.chdir(@root) do
234
234
  cmd = "cp -r #{RuneBlog::Path}/../empty_view views/#{view_name}"
235
235
  system!(cmd)
@@ -237,7 +237,7 @@ class RuneBlog
237
237
  end
238
238
 
239
239
  def check_valid_new_view(view_name)
240
- log!(enter: __method__, args: [view_name])
240
+ log!(enter: __method__, args: [view_name], level: 3)
241
241
  raise ArgumentError unless view_name.is_a?(String)
242
242
  raise ArgumentError if view_name.empty?
243
243
  names = self.views.map(&:to_s)
@@ -249,7 +249,7 @@ class RuneBlog
249
249
  end
250
250
 
251
251
  def create_view(view_name)
252
- log!(enter: __method__, args: [view_name])
252
+ log!(enter: __method__, args: [view_name], level: 2)
253
253
  check_valid_new_view(view_name)
254
254
  make_empty_view_tree(view_name)
255
255
  add_view(view_name)
@@ -267,7 +267,7 @@ class RuneBlog
267
267
  end
268
268
 
269
269
  def view_files
270
- log!(enter: __method__)
270
+ log!(enter: __method__, level: 2)
271
271
  vdir = self.view.dir
272
272
  files = [vdir/"index.html"]
273
273
  files += posts.map {|x| vdir/x }
@@ -275,7 +275,7 @@ class RuneBlog
275
275
  end
276
276
 
277
277
  def post_lookup(postid) # side-effect?
278
- log!(enter: __method__, args: [postid])
278
+ log!(enter: __method__, args: [postid], level: 2)
279
279
  slug = title = date = teaser_text = nil
280
280
 
281
281
  dir_posts = @vdir/:posts
@@ -290,7 +290,7 @@ class RuneBlog
290
290
  end
291
291
 
292
292
  def index_entry(slug)
293
- log!(enter: __method__, args: [slug])
293
+ log!(enter: __method__, args: [slug], level: 2)
294
294
  id = slug.to_i
295
295
  text = nil
296
296
  @theme = @view.dir/"themes/standard"
@@ -309,7 +309,7 @@ class RuneBlog
309
309
  end
310
310
 
311
311
  def collect_recent_posts(file)
312
- log!(enter: __method__, args: [file])
312
+ log!(enter: __method__, args: [file], level: 3)
313
313
  posts = nil
314
314
  dir_posts = @vdir/:posts
315
315
  entries = Dir.entries(dir_posts)
@@ -334,12 +334,13 @@ class RuneBlog
334
334
  File.write(@vdir/:remote/file, text)
335
335
  end
336
336
 
337
- def create_new_post(title, testing = false, teaser: nil, body: nil, views: [])
338
- log!(enter: __method__, args: [title, testing, teaser, body, views])
337
+ def create_new_post(title, testing = false, teaser: nil, body: nil,
338
+ pubdate: Time.now.strftime("%Y-%m-%d"), views: [])
339
+ log!(enter: __method__, args: [title, testing, teaser, body, views], level: 1)
339
340
  meta = nil
340
341
  views = views + [self.view.to_s]
341
342
  Dir.chdir(@root/:posts) do
342
- post = Post.create(title: title, teaser: teaser, body: body, views: views)
343
+ post = Post.create(title: title, teaser: teaser, body: body, pubdate: pubdate, views: views)
343
344
  post.edit unless testing
344
345
  post.build
345
346
  meta = post.meta
@@ -351,7 +352,7 @@ class RuneBlog
351
352
  end
352
353
 
353
354
  def edit_initial_post(file, testing = false)
354
- log!(enter: __method__, args: [file, testing])
355
+ log!(enter: __method__, args: [file, testing], level: 3)
355
356
  debug "=== edit_initial_post #{file.inspect} => #{sourcefile}"
356
357
  sourcefile = @root/:drafts/file
357
358
  result = system!("#@editor #{sourcefile} +8") unless testing
@@ -363,20 +364,20 @@ class RuneBlog
363
364
  end
364
365
 
365
366
  def posts
366
- log!(enter: __method__)
367
+ log!(enter: __method__, level: 3)
367
368
  dir = self.view.dir/:posts
368
369
  posts = Dir.entries(dir).grep(/^\d{4}/)
369
370
  posts
370
371
  end
371
372
 
372
373
  def drafts
373
- log!(enter: __method__)
374
+ log!(enter: __method__, level: 3)
374
375
  dir = @root/:drafts
375
376
  drafts = Dir.entries(dir).grep(/^\d{4}.*/)
376
377
  end
377
378
 
378
379
  def change_view(view)
379
- log!(enter: __method__, args: [view])
380
+ log!(enter: __method__, args: [view], level: 3)
380
381
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
381
382
  x = OpenStruct.new
382
383
  x.root, x.current_view, x.editor = @root, view.to_s, @editor # dumb - FIXME later
@@ -393,15 +394,12 @@ class RuneBlog
393
394
 
394
395
  def generate_view(view) # huh?
395
396
  log!(enter: __method__, args: [view])
396
- # generate_index(view) # recent posts (recent.html)
397
397
  vdir = @root/:views/view
398
398
  @theme = @root/:views/view/:themes/:standard
399
399
  xlate cwd: vdir/"themes/standard/etc",
400
400
  src: "blog.css.lt3", copy: vdir/"remote/etc/blog.css" # , debug: true
401
401
  xlate cwd: vdir/"themes/standard",
402
402
  src: "blog/generate.lt3", dst: vdir/:remote/"index.html"
403
- generate_index(view) # recent posts (recent.html)
404
- # ^ HERE
405
403
  copy("#{vdir}/assets/*", "#{vdir}/remote/assets/")
406
404
  rescue => err
407
405
  puts err
@@ -411,7 +409,7 @@ class RuneBlog
411
409
  end
412
410
 
413
411
  def _get_views(draft)
414
- log!(enter: __method__, args: [draft])
412
+ log!(enter: __method__, args: [draft], level: 2)
415
413
  # FIXME dumb code
416
414
  view_line = File.readlines(draft).grep(/^.views /)
417
415
  raise "More than one .views call!" if view_line.size > 1
@@ -422,7 +420,7 @@ class RuneBlog
422
420
  end
423
421
 
424
422
  def _copy_get_dirs(draft, view)
425
- log!(enter: __method__, args: [draft, view])
423
+ log!(enter: __method__, args: [draft, view], level: 2)
426
424
  fname = File.basename(draft)
427
425
  noext = fname.sub(/.lt3$/, "")
428
426
  vdir = @root/:views/view
@@ -435,16 +433,30 @@ class RuneBlog
435
433
  end
436
434
 
437
435
  def _post_metadata(draft, pdraft)
438
- log!(enter: __method__, args: [draft, pdraft])
436
+ log!(enter: __method__, args: [draft, pdraft], level: 2)
437
+ # FIXME store this somewhere
438
+ fname = File.basename(draft) # 0001-this-is-a-post.lt3
439
+ nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
440
+ aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
441
+ pnum = nslug[0..3] # 0001
439
442
  Dir.chdir(pdraft) do
440
443
  excerpt = File.read("teaser.txt")
441
444
  date = _retrieve_metadata(:date)
442
445
  longdate = ::Date.parse(date).strftime("%B %e, %Y")
443
446
  title = _retrieve_metadata(:title)
447
+ tags = _retrieve_metadata(:tags)
448
+ # FIXME simplify
444
449
  vars = <<~LIVE
450
+ .set post.num = #{pnum}
451
+ .heredoc post.aslug
452
+ #{aslug}
453
+ .end
445
454
  .heredoc title
446
455
  #{title.chomp}
447
456
  .end
457
+ .heredoc post.tags
458
+ #{tags.join(" ")}
459
+ .end
448
460
  .heredoc teaser
449
461
  #{excerpt.chomp}
450
462
  .end
@@ -457,7 +469,7 @@ class RuneBlog
457
469
  end
458
470
 
459
471
  def copy_widget_html(view)
460
- log!(enter: __method__)
472
+ log!(enter: __method__, level: 2)
461
473
  vdir = @root/:views/view
462
474
  remote = vdir/:remote
463
475
  wdir = vdir/:themes/:standard/:widgets
@@ -468,12 +480,13 @@ class RuneBlog
468
480
  create_dirs(rem)
469
481
  files = Dir[w/"*"]
470
482
  files = files.select {|x| x =~ /(html|css)$/ }
471
- files.each {|file| system!("cp #{file} #{rem}") }
483
+ tag = File.basename(w)
484
+ files.each {|file| system!("cp #{file} #{rem}", show: (tag == "zzz")) }
472
485
  end
473
486
  end
474
487
 
475
488
  def _handle_post(draft, view)
476
- log!(enter: __method__, args: [draft, view])
489
+ log!(enter: __method__, args: [draft, view], level: 2)
477
490
  # break into separate methods?
478
491
 
479
492
  fname = File.basename(draft) # 0001-this-is-a-post.lt3
@@ -502,34 +515,9 @@ class RuneBlog
502
515
  end
503
516
 
504
517
  def generate_post(draft)
505
- log!(enter: __method__, args: [draft])
518
+ log!(enter: __method__, args: [draft], level: 1)
506
519
  views = _get_views(draft)
507
- views.each do |view|
508
- _handle_post(draft, view)
509
- # generate_view(view) # FIXME leads to inefficiency?
510
- # ^ HERE
511
- end
512
- end
513
-
514
- def OLD_index_entry(view, meta)
515
- log!(enter: __method__, args: [view, meta])
516
- debug "=== index_entry #{view.to_s.inspect} #{meta.num} #{meta.title.inspect}"
517
- check_meta(meta, "index_entry1")
518
- raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
519
- check_meta(meta, "index_entry2")
520
- self.make_slug(meta)
521
- check_meta(meta, "index_entry3")
522
- # FIXME clean up and generalize
523
- ref = view/meta.slug/"index.html"
524
- <<-HTML
525
- <font size=-1>#{meta.date}&nbsp;&nbsp;</font> <br>
526
- <font size=+2 color=blue><a href=../#{ref} style="text-decoration: none">#{meta.title}</font></a>
527
- <br>
528
- <font size=+1>#{meta.teaser}&nbsp;&nbsp;</font>
529
- <a href=../#{ref} style="text-decoration: none">Read more...</a>
530
- <br>
531
- <hr>
532
- HTML
520
+ views.each {|view| _handle_post(draft, view) }
533
521
  end
534
522
 
535
523
  def rebuild_post(file)
@@ -548,7 +536,7 @@ class RuneBlog
548
536
  end
549
537
 
550
538
  def remove_post(num)
551
- log!(enter: __method__, args: [num])
539
+ log!(enter: __method__, args: [num], level: 1)
552
540
  raise ArgumentError unless num.is_a?(Integer)
553
541
  # FIXME update original draft .views
554
542
  tag = prefix(num)
@@ -565,7 +553,7 @@ class RuneBlog
565
553
  end
566
554
 
567
555
  def undelete_post(num)
568
- log!(enter: __method__, args: [num])
556
+ log!(enter: __method__, args: [num], level: 1)
569
557
  raise ArgumentError unless num.is_a?(Integer)
570
558
  files = Find.find(@root/:views).to_a
571
559
  tag = prefix(num)
@@ -581,14 +569,14 @@ class RuneBlog
581
569
  end
582
570
 
583
571
  def delete_draft(num)
584
- log!(enter: __method__, args: [num])
572
+ log!(enter: __method__, args: [num], level: 1)
585
573
  raise ArgumentError unless num.is_a?(Integer)
586
574
  tag = prefix(num)
587
575
  system!("rm -rf #@root/drafts/#{tag}-*")
588
576
  end
589
577
 
590
578
  def make_slug(meta)
591
- log!(enter: __method__, args: [meta])
579
+ log!(enter: __method__, args: [meta], level: 3)
592
580
  raise ArgumentError unless meta.title.is_a?(String)
593
581
  label = '%04d' % meta.num # FIXME can do better
594
582
  slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
@@ -596,6 +584,5 @@ class RuneBlog
596
584
  meta.slug = str
597
585
  str
598
586
  end
599
-
600
587
  end
601
588