runeblog 0.3.02 → 0.3.07

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.
@@ -8,74 +8,57 @@ make_exception(:EditorProblem, "Could not edit $1")
8
8
 
9
9
  module RuneBlog::REPL
10
10
  def edit_file(file, vim: "")
11
- STDSCR.saveback
11
+ # STDSCR.saveback
12
12
  ed = @blog.editor
13
13
  params = vim if ed =~ /vim$/
14
14
  result = system!("#{@blog.editor} #{file} #{params}")
15
15
  raise EditorProblem(file) unless result
16
- STDSCR.restback
17
- # cmd_clear(nil)
16
+ # STDSCR.restback
17
+ cmd_clear
18
18
  end
19
19
 
20
- def cmd_quit(arg, testing = false)
21
- cmd_clear(nil)
22
- RubyText.stop
20
+ def cmd_quit
21
+ STDSCR.rows.times { puts " "*(STDSCR.cols-1) }
22
+ # FIXME please?
23
+ # sleep 0.1
24
+ STDSCR.clear
23
25
  sleep 0.1
24
-
26
+ RubyText.stop
25
27
  sleep 0.1
28
+ system("clear")
29
+ # sleep 0.1
26
30
  exit
27
31
  end
28
32
 
29
- def cmd_clear(arg, testing = false)
30
- # STDSCR.rows.times { puts " "*(STDSCR.cols-1) }
33
+ def cmd_clear
34
+ STDSCR.rows.times { puts " "*(STDSCR.cols-1) }
35
+ # sleep 0.1
31
36
  STDSCR.clear
32
37
  end
33
38
 
34
- def cmd_version(arg, testing = false)
35
- reset_output
36
- output RuneBlog::VERSION
37
- puts fx("\n RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red) unless testing
38
- @out
39
+ def cmd_version
40
+ puts fx("\n RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red)
39
41
  end
40
42
 
41
- def OLD_cmd_config(arg, testing = false)
42
- hash = {"global.lt3 Global configuration" => "global.lt3",
43
- "banner/top.lt3 Text portion of banner" => "banner/top.lt3",
44
- "blog/generate.lt3 Generator for view (usu not edited)" => "blog/generate.lt3",
45
- ".... head.lt3 HEAD info for view" => "blog/head.lt3",
46
- ".... banner.lt3 banner description" => "blog/banner.lt3",
47
- ".... index.lt3 User-edited detail for view" => "blog/index.lt3",
48
- ".... post_entry.lt3 Generator for post entry in recent-posts" => "blog/post_entry.lt3",
49
- "etc/blog.css.lt3 Global CSS" => "etc/blog.css.lt3",
50
- "... externals.lt3 External JS/CSS (Bootstrap, etc.)" => "/etc/externals.lt3",
51
- "post/generate.lt3 Generator for a post" => "post/generate.lt3",
52
- ".... head.lt3 HEAD info for post" => "post/head.lt3",
53
- ".... index.lt3 Content for post" => "post/index.lt3",
54
- ".... permalink.lt3 Generator for permalink" => "post/permalink.lt3",
55
- }
56
-
57
- dir = @blog.view.dir/"themes/standard/"
58
- num, target = STDSCR.menu(title: "Edit file:", items: hash)
59
- edit_file(dir/target)
60
- end
61
-
62
- def cmd_config(arg, testing = false)
43
+ def cmd_config
63
44
  hash = {"Global configuration" => "global.lt3",
64
45
  " View-specific variables" => "../../settings/view.txt",
65
46
  " Recent posts" => "../../settings/recent.txt",
66
47
  " Publishing vars" => "../../settings/publish.txt",
67
- "Banner description" => "blog/banner.lt3",
68
- " Text portion of banner" => "banner/top.lt3",
69
- "Generator for view (usu not edited)" => "blog/generate.lt3",
48
+ " Config for reddit" => "../../config/reddit/credentials.txt",
49
+ " Config for Facebook" => "../../config/facebook/credentials.txt",
50
+ " Config for Twitter" => "../../config/twitter/credentials.txt",
51
+ "View generator" => "blog/generate.lt3",
52
+ " Banner: Description" => "blog/banner.lt3",
53
+ " Banner: Text portion" => "banner/top.lt3",
70
54
  " HEAD info for view" => "blog/head.lt3",
71
55
  " User-edited detail for view" => "blog/index.lt3",
72
- "Generator for post entry in recent-posts" => "blog/post_entry.lt3",
73
- "Global CSS" => "etc/blog.css.lt3",
74
- "External JS/CSS (Bootstrap, etc.)" => "/etc/externals.lt3",
56
+ " Generator for recent-posts entry" => "blog/post_entry.lt3",
75
57
  "Generator for a post" => "post/generate.lt3",
76
58
  " HEAD info for post" => "post/head.lt3",
77
59
  " Content for post" => "post/index.lt3",
78
- "Generator for permalink" => "post/permalink.lt3",
60
+ "Global CSS" => "etc/blog.css.lt3",
61
+ "External JS/CSS (Bootstrap, etc.)" => "/etc/externals.lt3"
79
62
  }
80
63
 
81
64
  dir = @blog.view.dir/"themes/standard/"
@@ -83,26 +66,24 @@ module RuneBlog::REPL
83
66
  edit_file(dir/target)
84
67
  end
85
68
 
86
-
87
-
88
- def cmd_manage(arg, testing = false)
69
+ def cmd_manage(arg)
89
70
  case arg
90
- when "pages"; _manage_pages(nil, testing = false)
91
- when "links"; _manage_links(nil, testing = false)
92
- when "navbar"; _manage_navbar(nil, testing = false)
93
- # when "pinned"; _manage_pinned(nil, testing = false) # ditch this??
71
+ when "pages"; _manage_pages(nil)
72
+ when "links"; _manage_links(nil)
73
+ when "navbar"; _manage_navbar(nil)
74
+ # when "pinned"; _manage_pinned(nil) # ditch this??
94
75
  else
95
76
  puts "#{arg} is unknown"
96
77
  end
97
78
  end
98
79
 
99
- def _manage_pinned(arg, testing = false) # cloned from manage_links
80
+ def _manage_pinned # cloned from manage_links
100
81
  dir = @blog.view.dir/"themes/standard/widgets/pinned"
101
82
  data = dir/"list.data"
102
83
  edit_file(data)
103
84
  end
104
85
 
105
- def _manage_navbar(arg, testing = false) # cloned from manage_pages
86
+ def _manage_navbar # cloned from manage_pages
106
87
  dir = @blog.view.dir/"themes/standard/banner/navbar"
107
88
  files = Dir.entries(dir) - %w[. .. navbar.lt3]
108
89
  main_file = "[ navbar.lt3 ]"
@@ -131,13 +112,13 @@ module RuneBlog::REPL
131
112
  end
132
113
  end
133
114
 
134
- def _manage_links(arg, testing = false)
115
+ def _manage_links
135
116
  dir = @blog.view.dir/"themes/standard/widgets/links"
136
117
  data = dir/"list.data"
137
118
  edit_file(data)
138
119
  end
139
120
 
140
- def _manage_pages(arg, testing = false)
121
+ def _manage_pages(arg)
141
122
  dir = @blog.view.dir/"themes/standard/widgets/pages"
142
123
  # Assume child files already generated (and list.data??)
143
124
  data = dir/"list.data"
@@ -172,73 +153,53 @@ module RuneBlog::REPL
172
153
  end
173
154
  end
174
155
 
175
- def cmd_import(arg, testing = false)
156
+ def cmd_import
176
157
  files = ask("\n File(s) = ")
177
158
  system!("cp #{files} #{@blog.root}/views/#{@blog.view.name}/assets/")
178
159
  end
179
160
 
180
- def cmd_browse(arg, testing = false)
181
- reset_output
161
+ def cmd_browse
182
162
  url = @blog.view.publisher.url
183
163
  if url.nil?
184
- output! "Publish first."
185
164
  puts "\n Publish first."
186
- return @out
165
+ return
187
166
  end
188
167
  result = system!("open '#{url}'")
189
168
  raise CantOpen(url) unless result
190
- return @out
169
+ return
191
170
  end
192
171
 
193
- def cmd_preview(arg, testing = false)
194
- reset_output
172
+ def cmd_preview
195
173
  local = @blog.view.local_index
196
174
  unless File.exist?(local)
197
175
  puts "\n No index. Rebuilding..."
198
- cmd_rebuild(nil)
176
+ cmd_rebuild
199
177
  end
200
178
  result = system!("open #{local}")
201
179
  raise CantOpen(local) unless result
202
- @out
203
180
  rescue => err
204
- out = "/tmp/blog#{rand(100)}.txt"
205
- File.open(out, "w") do |f|
206
- f.puts err
207
- f.puts err.backtrace.join("\n")
208
- end
209
- puts "Error: See #{out}"
181
+ _tmp_error(err)
210
182
  end
211
183
 
212
- def cmd_publish(arg, testing = false)
184
+ def cmd_publish
213
185
  # Future Hal says please refactor this
214
- puts unless testing
215
- reset_output
186
+ puts
216
187
  unless @blog.view.can_publish?
217
188
  msg = "Can't publish... see global.lt3"
218
- puts msg unless testing
219
- output! msg
220
- return @out
189
+ puts msg
190
+ return
221
191
  end
222
192
 
223
193
  ret = RubyText.spinner(label: " Publishing... ") do
224
194
  @blog.view.publisher.publish
225
195
  end
226
- return @out unless ret
196
+ return unless ret
227
197
 
228
198
  vdir = @blog.view.dir
229
199
  dump("fix this later", "#{vdir}/last_published")
230
- if ! testing || ! ret
231
- puts " ...finished.\n "
232
- output! "...finished.\n"
233
- end
234
- return @out
200
+ puts " ...finished.\n " unless ret
235
201
  rescue => err
236
- out = "/tmp/blog#{rand(100)}.txt"
237
- File.open(out, "w") do |f|
238
- f.puts err
239
- f.puts err.backtrace.join("\n")
240
- end
241
- puts "Error: See #{out}"
202
+ _tmp_error(err)
242
203
  end
243
204
 
244
205
  def fresh?(src, dst)
@@ -259,49 +220,37 @@ module RuneBlog::REPL
259
220
  puts
260
221
  end
261
222
 
262
- def cmd_rebuild(arg, testing = false)
223
+ def cmd_rebuild
263
224
  debug "Starting cmd_rebuild..."
264
- reset_output
265
- puts unless testing
225
+ puts
226
+ regen_posts
266
227
  @blog.generate_view(@blog.view)
267
228
  @blog.generate_index(@blog.view)
268
- regen_posts
269
- @out
270
229
  rescue => err
271
- out = "/tmp/blog#{rand(100)}.txt"
272
- File.open(out, "w") do |f|
273
- f.puts err
274
- f.puts err.backtrace.join("\n")
275
- end
276
- puts "Error: See #{out}"
230
+ _tmp_error(err)
277
231
  end
278
232
 
279
- def cmd_change_view(arg, testing = false)
280
- reset_output
233
+ def cmd_change_view(arg)
281
234
  # Simplify this
282
235
  if arg.nil?
283
236
  viewnames = @blog.views.map {|x| x.name }
284
237
  n = viewnames.find_index(@blog.view.name)
285
238
  name = @blog.view.name
286
239
  # TODO: Add view description
287
- k, name = STDSCR.menu(title: "Views", items: viewnames, curr: n) unless testing
240
+ k, name = STDSCR.menu(title: "Views", items: viewnames, curr: n)
288
241
  return if name.nil?
289
242
  @blog.view = name
290
- output name + "\n"
291
- puts "\n ", fx(name, :bold), "\n" unless testing
292
- return @out
243
+ puts "\n ", fx(name, :bold), "\n"
244
+ return
293
245
  else
294
246
  if @blog.view?(arg)
295
247
  @blog.view = arg
296
- output "View: " + @blog.view.name.to_s
297
- puts "\n ", fx(arg, :bold), "\n" unless testing
248
+ puts "\n ", fx(arg, :bold), "\n"
298
249
  end
299
250
  end
300
- return @out
301
251
  end
302
252
 
303
- def cmd_new_view(arg, testing = false)
304
- reset_output
253
+ def cmd_new_view(arg)
305
254
  if arg.nil?
306
255
  arg = ask(fx("\nFilename: ", :bold))
307
256
  puts
@@ -313,20 +262,13 @@ module RuneBlog::REPL
313
262
  vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(VIEW_.*\|SITE.*\)"'
314
263
  edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
315
264
  @blog.change_view(arg)
316
- @out
317
265
  rescue ViewAlreadyExists
318
266
  puts 'Blog already exists'
319
267
  rescue => err
320
- out = "/tmp/blog#{rand(100)}.txt"
321
- File.open(out, "w") do |f|
322
- f.puts err
323
- f.puts err.backtrace.join("\n")
324
- end
325
- puts "Error: See #{out}"
268
+ _tmp_error(err)
326
269
  end
327
270
 
328
- def cmd_new_post(arg, testing = false)
329
- reset_output
271
+ def cmd_new_post
330
272
  if @blog.views.empty?
331
273
  puts "\n Create a view before creating the first post!\n "
332
274
  return
@@ -334,15 +276,8 @@ module RuneBlog::REPL
334
276
  title = ask("\nTitle: ")
335
277
  puts
336
278
  @blog.create_new_post(title)
337
- # STDSCR.clear
338
- @out
339
279
  rescue => err
340
- out = "/tmp/blog#{rand(100)}.txt"
341
- File.open(out, "w") do |f|
342
- f.puts err
343
- f.puts err.backtrace.join("\n")
344
- end
345
- puts "Error: See #{out}"
280
+ _tmp_error(err)
346
281
  end
347
282
 
348
283
  def _remove_post(arg, testing=false)
@@ -351,162 +286,125 @@ module RuneBlog::REPL
351
286
  puts "Post #{id} not found" if result.nil?
352
287
  end
353
288
 
354
- def cmd_remove_post(arg, testing = false)
355
- reset_output
289
+ def cmd_remove_post(arg)
356
290
  args = arg.split
357
291
  args.each do |x|
358
292
  # FIXME
359
293
  ret = _remove_post(x.to_i, false)
360
294
  puts ret
361
- output ret
362
295
  end
363
- @out
364
296
  end
365
297
 
366
- def cmd_edit_post(arg, testing = false)
367
- reset_output
298
+ def cmd_edit_post(arg)
368
299
  id = get_integer(arg)
369
300
  # Simplify this
370
301
  tag = "#{'%04d' % id}"
371
302
  files = ::Find.find(@blog.root/:drafts).to_a
372
303
  files = files.grep(/#{tag}-.*lt3/)
373
- files = files.map {|f| File.basename(f) }
374
- if files.size > 1
375
- msg = "Multiple files: #{files}"
376
- output msg
377
- puts msg unless testing
378
- return [false, msg]
379
- end
380
- if files.empty?
381
- msg = "\n Can't edit post #{id}"
382
- output msg
383
- puts msg unless testing
384
- return [false, msg]
385
- end
386
-
387
- file = files.first
388
- draft = @blog.root/:drafts/file
389
- vim_params = '-c G'
390
- result = edit_file(draft)
304
+ draft = exactly_one(files)
305
+ result = edit_file(draft, vim: '-c$')
391
306
  @blog.generate_post(draft)
392
307
  rescue => err
393
- out = "/tmp/blog#{rand(100)}.txt"
394
- File.open(out, "w") do |f|
395
- f.puts err
396
- f.puts err.backtrace.join("\n")
397
- end
398
- puts "Error: See #{out}"
308
+ _tmp_error(err)
399
309
  end
400
310
 
401
- def cmd_list_views(arg, testing = false)
402
- reset_output("\n")
403
- puts unless testing
311
+ def cmd_list_views
312
+ puts
404
313
  @blog.views.each do |v|
405
314
  v = v.to_s
406
315
  v = fx(v, :bold) if v == @blog.view.name
407
- output v + "\n"
408
316
  # FIXME: next 3 lines are crufty as hell
409
- lines = File.readlines(@blog.root/"views/#{v}/themes/standard/global.lt3")
410
- lines = lines.select {|x| x =~ /^blog / && x !~ /VIEW_/ }
317
+ lines = File.readlines(@blog.root/"views/#{v}/settings/view.txt")
318
+ lines = lines.select {|x| x =~ /^title / && x !~ /VIEW_/ }
411
319
  title = lines.first.split(" ", 2)[1]
412
- print " ", ('%15s' % v) unless testing
413
- puts " ", fx(title, :black) unless testing
320
+ print " ", ('%15s' % v)
321
+ puts " ", fx(title, :black)
414
322
  end
415
- puts unless testing
416
- # @out
323
+ puts
417
324
  end
418
325
 
419
- def cmd_list_posts(arg, testing = false)
420
- reset_output
326
+ def cmd_list_posts
421
327
  posts = @blog.posts # current view
422
328
  str = @blog.view.name + ":\n"
423
- output str
424
- puts unless testing
425
- puts " ", fx(str, :bold) unless testing
329
+ puts
426
330
  if posts.empty?
427
- output! "No posts"
428
- puts " No posts" unless testing
331
+ puts " No posts"
429
332
  else
430
333
  posts.each do |post|
431
- outstr " #{colored_slug(post)}\n"
432
334
  base = post.sub(/.lt3$/, "")
433
- num, rest = base[0..3], base[4..-1]
434
- puts " ", fx(num, Red), fx(rest, Blue) unless testing
335
+ dir = @blog.root/:posts/base
336
+ meta = nil
337
+ Dir.chdir(dir) { meta = @blog.read_metadata }
338
+ num, title = meta.num, meta.title
339
+ num = '%4d' % num.to_s
340
+ puts " ", fx(num, Red), " ", fx(title, Blue)
435
341
  draft = @blog.root/:drafts/post + ".lt3"
436
- other = @blog._get_views(draft) - [@blog.view.to_s]
342
+ other = meta.views - [@blog.view.to_s]
437
343
  unless other.empty?
438
- print fx(" "*7 + "also in: ", :bold)
344
+ print fx(" "*9 + "also in: ", :bold)
439
345
  puts other.join(", ")
440
346
  end
441
347
  end
442
348
  end
443
- puts unless testing
444
- @out
349
+ puts
445
350
  end
446
351
 
447
- def cmd_list_drafts(arg, testing = false)
448
- reset_output
352
+ def cmd_list_drafts
449
353
  drafts = @blog.drafts # current view
450
354
  if drafts.empty?
451
- output! "No drafts"
452
- puts "\n No drafts\n " unless testing
453
- return @out
355
+ puts "\n No drafts\n "
356
+ return
454
357
  else
455
- puts unless testing
358
+ puts
456
359
  drafts.each do |draft|
457
- outstr " #{colored_slug(draft.sub(/.lt3$/, ""))}\n"
458
360
  base = draft.sub(/.lt3$/, "")
459
- num, rest = base[0..3], base[4..-1]
460
- puts " ", fx(num, Red), fx(rest, Blue) unless testing
361
+ dir = @blog.root/:posts/base
362
+ meta = nil
363
+ Dir.chdir(dir) { meta = @blog.read_metadata }
364
+ num, title = meta.num, meta.title
365
+ num = '%4d' % num.to_s
366
+ puts " ", fx(num, Red), " ", fx(title, Blue)
461
367
  other = @blog._get_views(@blog.root/:drafts/draft) - [@blog.view.to_s]
462
368
  unless other.empty?
463
- print fx(" "*7 + "also in: ", :bold)
369
+ print fx(" "*9 + "also in: ", :bold)
464
370
  puts other.join(", ")
465
371
  end
466
372
  end
467
373
  end
468
- puts unless testing
469
- @out
374
+ puts
470
375
  end
471
376
 
472
- def cmd_list_assets(arg, testing = false)
473
- reset_output
377
+ def cmd_list_assets
474
378
  dir = @blog.view.dir + "/assets"
475
379
  assets = Dir[dir + "/*"]
476
380
  if assets.empty?
477
- output! "No assets"
478
- puts " No assets" unless testing
479
- return @out
381
+ puts " No assets"
382
+ return
480
383
  else
481
- puts unless testing
384
+ puts
482
385
  assets.each do |name|
483
386
  asset = File.basename(name)
484
- outstr asset
485
- puts " ", fx(asset, Blue) unless testing
387
+ puts " ", fx(asset, Blue)
486
388
  end
487
389
  end
488
- puts unless testing
489
- @out
390
+ puts
490
391
  end
491
392
 
492
- def cmd_ssh(arg, testing = false)
393
+ def cmd_ssh
493
394
  pub = @blog.view.publisher
494
395
  puts
495
396
  system!("tputs clear; ssh #{pub.user}@#{pub.server}")
496
397
  sleep 0.1
497
- cmd_clear(nil)
398
+ cmd_clear
498
399
  end
499
400
 
500
- def cmd_INVALID(arg, testing = false)
501
- reset_output "\n Command '#{arg}' was not understood."
401
+ def cmd_INVALID(arg)
502
402
  print fx("\n Command ", :bold)
503
403
  print fx(arg, Red, :bold)
504
404
  puts fx(" was not understood.\n ", :bold)
505
- @out
506
405
  end
507
406
 
508
- def cmd_legacy(arg = nil)
509
- # dir = ask("Dir = ")
407
+ def cmd_legacy
510
408
  dir = "sources/computing"
511
409
  puts "Importing from: #{dir}"
512
410
  files = Dir[dir/"**"]
@@ -555,7 +453,7 @@ module RuneBlog::REPL
555
453
  {Posts:} {Advanced:}
556
454
  ------------------------------------------- -------------------------------------------
557
455
  {p, post} Create a new post {config} Edit various system files
558
- {new post} Same as p, post {customize} (BUGGY) Change set of tags, extra views
456
+ {new post} Same as p, post
559
457
  {lsp, list posts} List posts in current view {preview} Look at current (local) view in browser
560
458
  {lsd, list drafts} List all drafts (all views) {browse} Look at current (published) view in browser
561
459
  {delete ID [ID...]} Remove multiple posts {rebuild} Regenerate all posts and relink
@@ -564,10 +462,8 @@ module RuneBlog::REPL
564
462
  {import ASSETS} Import assets (images, etc.) {manage WIDGET} Manage content/layout of a widget
565
463
  EOS
566
464
 
567
- def cmd_help(arg, testing = false)
568
- reset_output
465
+ def cmd_help
569
466
  msg = Help
570
- output msg
571
467
  msg.each_line do |line|
572
468
  e = line.each_char
573
469
  first = true
@@ -590,8 +486,6 @@ module RuneBlog::REPL
590
486
  print s1
591
487
  end
592
488
  end
593
- puts unless testing
594
- @out
489
+ puts
595
490
  end
596
491
  end
597
-