runeblog 0.3.18 → 0.3.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,17 @@
1
1
 
2
2
  def _tmp_error(err)
3
+ STDERR.puts err
4
+ STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
5
+ log!(str: "#{err} - see also stderr.out")
6
+ return
7
+
3
8
  out = "/tmp/blog#{rand(100)}.txt"
4
9
  File.open(out, "w") do |f|
5
10
  f.puts err.to_s + "\n--------"
6
11
  f.puts err.backtrace.join("\n")
7
12
  end
8
13
  puts "Error: See #{out}"
14
+ # sleep 3
9
15
  end
10
16
 
11
17
  def dump(obj, name)
@@ -20,6 +26,7 @@
20
26
  log!(enter: __method__, args: [str], level: 2)
21
27
  STDERR.puts str if show
22
28
  rc = system(str)
29
+ STDERR.puts " rc = #{rc.inspect}" if show
23
30
  return rc if rc
24
31
  STDERR.puts "FAILED: #{str.inspect}"
25
32
  STDERR.puts "\ncaller = \n#{caller.join("\n ")}\n"
@@ -32,10 +39,12 @@
32
39
  end
33
40
 
34
41
  def _get_data?(file) # File need not exist
42
+ log!(enter: __method__, args: [file], level: 2)
35
43
  File.exist?(file) ? _get_data(file) : []
36
44
  end
37
45
 
38
46
  def _get_data(file)
47
+ log!(enter: __method__, args: [file], level: 2)
39
48
  lines = File.readlines(file)
40
49
  lines = lines.map do |line|
41
50
  line = line.chomp.strip
@@ -46,6 +55,7 @@
46
55
  end
47
56
 
48
57
  def read_pairs(file) # returns a hash
58
+ log!(enter: __method__, args: [file], level: 2)
49
59
  lines = _get_data(file)
50
60
  hash = {}
51
61
  lines.each do |line|
@@ -57,6 +67,7 @@
57
67
  end
58
68
 
59
69
  def read_pairs!(file) # returns an openstruct
70
+ log!(enter: __method__, args: [file], level: 2)
60
71
  lines = _get_data(file)
61
72
  obj = OpenStruct.new
62
73
  lines.each do |line|
@@ -97,27 +108,32 @@
97
108
  end
98
109
 
99
110
  def error(err)
100
- # log!(str: err, enter: __method__, args: [err], level: 2)
101
- str = "\n Error: #{err}"
111
+ log!(str: err, enter: __method__, args: [err], level: 2)
112
+ str = "\n Error... #{err}"
102
113
  puts str
103
114
  puts err.backtrace.join("\n")
104
115
  end
105
116
 
106
117
  def find_item(list)
118
+ log!(enter: __method__, args: [list], level: 2)
107
119
  list2 = list.select(&block)
108
- exactly_one(list2)
120
+ exactly_one(list2, list.join("/"))
109
121
  end
110
122
 
111
123
  def find_item!(list, &block)
124
+ log!(enter: __method__, args: [list], level: 2)
125
+ list2 = list.select(&block)
112
126
  list2 = list.select(&block)
113
- item = exactly_one(list2)
127
+ item = exactly_one(list2, list.join("/"))
114
128
  n = list.index(&block)
115
129
  [n, item]
116
130
  end
117
131
 
118
- def exactly_one(list)
119
- raise "List: Zero instances" if list.empty?
120
- raise "List: More than one instance" if list.size > 1
132
+ def exactly_one(list, tag = nil)
133
+ log!(enter: __method__, args: [list], level: 2)
134
+ list2 = list.select(&block)
135
+ raise "List: Zero instances #{"- #{tag}" if tag}" if list.empty?
136
+ raise "List: More than one instance #{"- #{tag}" if tag}" if list.size > 1
121
137
  list.first
122
138
  end
123
139
 
@@ -18,9 +18,10 @@ top_help = proc { RubyText.splash(RuneBlog::REPL::Help.gsub(/[{}]/, " ")) }
18
18
  # dir = @blog.view.dir/"themes/standard/"
19
19
 
20
20
  std = "themes/standard"
21
+ data = "." # CHANGED
21
22
 
22
23
  Menu.top_config = {
23
- "Variables (general)" => edit("#{std}/global.lt3"),
24
+ "Variables (general)" => edit("#{data}/global.lt3"),
24
25
  " View-specific" => edit("settings/view.txt"),
25
26
  " Recent posts" => edit("settings/recent.txt"),
26
27
  " Publishing" => edit("settings/publish.txt"),
@@ -32,8 +33,9 @@ Menu.top_config = {
32
33
  " HEAD info" => edit("#{std}/blog/head.lt3"),
33
34
  " Layout " => edit("#{std}/blog/index.lt3"),
34
35
  " Recent-posts entry" => edit("#{std}/blog/post_entry.lt3"),
35
- " Banner: Description" => edit("#{std}/blog/banner.lt3"),
36
- " Text portion" => edit("#{std}/banner/top.lt3"),
36
+ " Banner: Description" => edit("#{std}/banner/banner.lt3"),
37
+ " Navbar" => edit("#{std}/navbar/navbar.lt3"),
38
+ # " Text portion" => edit("#{std}/banner/top.lt3"),
37
39
  "Generator for a post" => edit("#{std}/post/generate.lt3"),
38
40
  " HEAD info for post" => edit("#{std}/post/head.lt3"),
39
41
  " Content for post" => edit("#{std}/post/index.lt3"),
@@ -0,0 +1,82 @@
1
+ require 'rubytext'
2
+
3
+ RubyText.start
4
+
5
+ # Idea: A special sub-environment for creating a post
6
+ #
7
+ # 1. Display: view, post number, date
8
+ # 2. Menu?
9
+ # 3. - Edit/enter title
10
+ # 4. - Edit teaser
11
+ # 5. - Add views
12
+ # 6. - Add tags
13
+ # 7. - Import assets
14
+ # 8. - Save
15
+ # 9. - Quit
16
+ # Edit body after save/quit
17
+
18
+ def ask(prompt) # elsewhere?
19
+ print prompt
20
+ str = gets
21
+ str.chomp! if str
22
+ str
23
+ end
24
+
25
+ def enter_title
26
+ puts __method__
27
+ str = ask("Title: ")
28
+ puts str.inspect
29
+ end
30
+
31
+ def edit_teaser
32
+ puts __method__
33
+ str = ask("Teaser: ")
34
+ puts str.inspect
35
+ end
36
+
37
+ def add_views
38
+ puts __method__
39
+ end
40
+
41
+ def add_tags
42
+ puts __method__
43
+ end
44
+
45
+ def import_assets
46
+ puts __method__
47
+ end
48
+
49
+ def save_post
50
+ puts __method__
51
+ end
52
+
53
+ def quit_post
54
+ puts __method__
55
+ end
56
+
57
+ items = {
58
+ "Enter title" => proc { enter_title },
59
+ "Edit teaser" => proc { edit_teaser },
60
+ "Add views" => proc { add_views },
61
+ "Add tags" => proc { add_tags },
62
+ "Import assets" => proc { import_assets },
63
+ "Save" => proc { save_post },
64
+ "Quit" => proc { quit_post }
65
+ }
66
+
67
+ enter_title
68
+ edit_teaser
69
+ add_views
70
+ add_tags
71
+ import_assets
72
+ save_post
73
+ quit_post
74
+
75
+ # getch
76
+
77
+ # curr = 0
78
+ # loop do
79
+ # str, curr = menu(c: 10, items: items, curr: curr, sticky: true)
80
+ # break if curr.nil?
81
+ # puts "str = #{str} curr = #{curr}"
82
+ # end
@@ -11,7 +11,7 @@ class RuneBlog::Post
11
11
 
12
12
  def self.load(post)
13
13
  log!(enter: __method__, args: [post], level: 3)
14
- raise "Doesn't work right now"
14
+ raise NotImplemented
15
15
  raise NoBlogAccessor if RuneBlog.blog.nil?
16
16
  # "post" is a slug?
17
17
  pdir = RuneBlog.blog.root/:drafts/post
@@ -66,7 +66,7 @@ class RuneBlog::Post
66
66
  end
67
67
 
68
68
  def edit
69
- # log!(enter: __method__)
69
+ log!(enter: __method__)
70
70
  edit_file(@draft, vim: "+8")
71
71
  build
72
72
  rescue => err
@@ -87,8 +87,8 @@ class RuneBlog::ViewPost
87
87
  attr_accessor :path, :title, :date, :teaser_text
88
88
 
89
89
  def self.make(blog:, view:, nslug:)
90
- raise "No numeric prefix on #{nslug}" unless nslug =~ /^\d{4}-/
91
- raise "Not expecting an extension" if nslug.end_with?(".lt3") || nslug.end_with?(".html")
90
+ raise NoNumericPrefix(nslug) unless nslug =~ /^\d{4}-/
91
+ raise NoExtensionExpected(nslug) if nslug.end_with?(".lt3") || nslug.end_with?(".html")
92
92
  view = view.to_s
93
93
  view.define_singleton_method :path do |subdir = ""|
94
94
  str = blog.root/:views/view
@@ -169,7 +169,8 @@ class RuneBlog::ViewPost
169
169
  @date = meta.pubdate
170
170
  end
171
171
  rescue => err
172
- STDERR.puts "--- #{err}\n #{err.backtrace.join("\n ")}"
172
+ STDERR.puts "--- #{err}"
173
+ STDERR.puts " #{err.backtrace.join("\n ")}" if err.respond_to?(:backtrace)
173
174
  end
174
175
 
175
176
  def get_dirs
@@ -12,7 +12,7 @@ end
12
12
  def stale?(src, dst, deps, force = false)
13
13
  meh = File.new("/tmp/dammit-#{src.gsub(/\//, "-")}", "w")
14
14
  log!(enter: __method__, args: [src, dst], level: 3)
15
- raise "Source #{src} not found in #{Dir.pwd}" unless File.exist?(src)
15
+ raise FileNotFound("#{Dir.pwd}/#{src}") unless File.exist?(src)
16
16
  return true if force
17
17
  return true unless File.exist?(dst)
18
18
  return true if newer?(src, dst)
@@ -23,7 +23,8 @@ end
23
23
  def preprocess(cwd: Dir.pwd, src:,
24
24
  dst: nil, strip: false,
25
25
  deps: [], copy: nil, debug: false, force: false,
26
- mix: [], call: [], vars: {})
26
+ mix: [], call: [],
27
+ vars: {})
27
28
  src += LEXT unless src.end_with?(LEXT)
28
29
  if strip
29
30
  dst = File.basename(src).sub(/.lt3$/,"")
@@ -31,6 +32,10 @@ def preprocess(cwd: Dir.pwd, src:,
31
32
  dst += ".html" unless dst.end_with?(".html")
32
33
  end
33
34
  sp = " "*12
35
+ # STDERR.puts "=== ls -l #{cwd} = "
36
+ # STDERR.puts `ls -l #{cwd}`
37
+ # STDERR.puts "=== going into #{cwd}"
38
+
34
39
  Dir.chdir(cwd) do
35
40
  if debug
36
41
  STDERR.puts "#{sp} -- preprocess "
@@ -44,6 +49,20 @@ def preprocess(cwd: Dir.pwd, src:,
44
49
  stale = stale?(src, dst, deps, force)
45
50
  if stale
46
51
  live = Livetext.customize(mix: "liveblog", call: call, vars: vars)
52
+ STDERR.puts <<~EOF
53
+ cwd = #{cwd.inspect}
54
+ src = #{src.inspect}
55
+ dst = #{dst.inspect}
56
+ strip = #{strip.inspect}
57
+ deps = #{deps.inspect}
58
+ copy = #{copy.inspect}
59
+ debug = #{debug.inspect}
60
+ force = #{force.inspect}
61
+ mix = #{mix.inspect}
62
+ call = #{call.inspect}
63
+ vars = #{vars.inspect}
64
+ EOF
65
+ log!(str: "Calling xform_file... src = #{src} pwd = #{Dir.pwd}")
47
66
  out = live.xform_file(src)
48
67
  File.write(dst, out)
49
68
  system!("cp #{dst} #{copy}") if copy
@@ -54,6 +73,8 @@ end
54
73
 
55
74
  def get_live_vars(src)
56
75
  live = Livetext.customize(call: [".nopara"])
76
+ # puts "glv: src = #{src.inspect}"
77
+ # STDERR.puts "glv: src = #{src.inspect}"
57
78
  live.xform_file(src)
58
79
  live
59
80
  end
@@ -14,7 +14,9 @@ class RuneBlog::Publishing
14
14
  def initialize(view)
15
15
  log!(enter: __method__, args: [view.to_s])
16
16
  @blog = RuneBlog.blog
17
- dir = @blog.root/:views/view/"themes/standard/"
17
+ dir0 = @blog.root/:views/view/"themes/standard/"
18
+ # CHANGED
19
+ dir = @blog.root/:views/view/:data
18
20
  gfile = dir/"global.lt3"
19
21
  return unless File.exist?(gfile) # FIXME Hackish as hell
20
22
 
@@ -2,35 +2,28 @@ require 'runeblog'
2
2
  require 'ostruct'
3
3
  require 'helpers-repl' # FIXME structure
4
4
  require 'pathmagic'
5
+ require 'exceptions'
5
6
 
6
7
  require 'menus'
7
8
 
8
- make_exception(:PublishError, "Error during publishing")
9
- make_exception(:EditorProblem, "Could not edit $1")
10
-
11
9
  Signal.trap("INT") { puts "Don't :)" }
12
10
 
13
11
  module RuneBlog::REPL
14
12
  def edit_file(file, vim: "")
15
- # STDSCR.saveback
16
13
  ed = @blog.editor
17
14
  params = vim if ed =~ /vim$/
18
15
  result = system!("#{@blog.editor} #{file} #{params}")
19
16
  raise EditorProblem(file) unless result
20
- # STDSCR.restback
21
17
  cmd_clear
22
18
  end
23
19
 
24
20
  def cmd_quit
25
21
  STDSCR.rows.times { puts " "*(STDSCR.cols-1) }
26
- # FIXME please?
27
- # sleep 0.1
28
22
  STDSCR.clear
29
23
  sleep 0.1
30
24
  RubyText.stop
31
25
  sleep 0.1
32
26
  system("clear")
33
- # sleep 0.1
34
27
  exit
35
28
  end
36
29
 
@@ -213,13 +206,14 @@ module RuneBlog::REPL
213
206
 
214
207
  def regen_posts
215
208
  drafts = @blog.drafts # current view
216
- puts " Regenerating posts..." unless drafts.empty?
209
+ log! str: "=== Regenerating posts..." unless drafts.empty?
217
210
  drafts.each do |draft|
218
211
  orig = @blog.root/:drafts/draft
219
212
  postdir = @blog.root/:posts/draft.sub(/.lt3$/, "")
220
213
  content = postdir/"/guts.html"
221
214
  next if fresh?(orig, content)
222
215
 
216
+ log! str: "=== Calling generate_post(#{orig})"
223
217
  @blog.generate_post(orig) # rebuild post
224
218
  Dir.chdir(postdir) do
225
219
  meta = @blog.read_metadata
@@ -231,28 +225,34 @@ module RuneBlog::REPL
231
225
  end
232
226
 
233
227
  def cmd_rebuild
234
- debug "Starting cmd_rebuild..."
228
+ log! str: "=== Starting cmd_rebuild..."
235
229
  puts
236
230
  regen_posts
237
- puts " Generating view"
231
+ log! str: "=== Generating view..."
238
232
  @blog.generate_view(@blog.view)
239
- puts " Generating index"
233
+ log! str: "=== Generating index..."
240
234
  @blog.generate_index(@blog.view)
241
- puts " ...finished!"
235
+ log! str: "=== ...finished!"
242
236
  rescue => err
243
237
  _tmp_error(err)
244
238
  end
245
239
 
246
240
  def cmd_change_view(arg = nil)
247
241
  if arg.nil?
248
- viewnames = @blog.views.map {|x| x.name }
249
- n = viewnames.find_index(@blog.view.name)
242
+ viewnames = {}
243
+ @blog.views.each do |v|
244
+ name = v.to_s
245
+ title = view2title(name)
246
+ string = "#{'%-25s' % title} #{name}"
247
+ viewnames[string] = name
248
+ end
249
+ n = viewnames.values.find_index(@blog.view.name)
250
250
  name = @blog.view.name
251
- # TODO: Add view description
252
251
  k, name = STDSCR.menu(title: "Views", items: viewnames, curr: n)
253
252
  return if name.nil?
253
+ log! str: "cv Setting to #{name.inspect}"
254
254
  @blog.view = name
255
- puts "\n ", fx(name, :bold), "\n"
255
+ # puts "\n ", fx(name, :bold), "\n"
256
256
  return
257
257
  else
258
258
  if @blog.view?(arg)
@@ -262,17 +262,56 @@ module RuneBlog::REPL
262
262
  end
263
263
  end
264
264
 
265
+ # move to helpers
266
+ def modify_view_global(view_name)
267
+ gfile = "#{@blog.root}/views/#{view_name}/data/global.lt3"
268
+ lines = File.readlines(gfile).map(&:chomp)
269
+ vars = <<~EOF
270
+ .variables
271
+ View #{view_name}
272
+ ViewDir #{@blog.root}/views/#{view_name}
273
+ .end
274
+
275
+ EOF
276
+ # lines.insert(5, vars)
277
+ text = lines.join("\n")
278
+ File.write(gfile, text)
279
+ end
280
+
281
+ def modify_view_settings(name:, title:, subtitle:, domain:)
282
+ vfile = "#{@blog.root}/views/#{name}/settings/view.txt"
283
+ hash = {/VIEW_NAME/ => name,
284
+ /VIEW_TITLE/ => title,
285
+ /VIEW_SUBTITLE/ => subtitle,
286
+ /VIEW_DOMAIN/ => domain}
287
+ @blog.complete_file(vfile, nil, hash)
288
+ end
289
+
265
290
  def cmd_new_view(arg)
291
+ view_name = ask!(" Filename: ")
292
+ @blog.create_view(view_name) # call change_view??
293
+ title = ask!(" View title: ")
294
+ subtitle = ask!(" Subtitle : ")
295
+ domain = ask!(" Domain : ")
296
+ modify_view_global(view_name)
297
+ modify_view_settings(name: view_name, title: title, subtitle: subtitle,
298
+ domain: domain)
299
+ @blog.change_view(view_name)
300
+ end
301
+
302
+ def cmd_new_view_ORIG(arg)
266
303
  if arg.nil?
267
304
  arg = ask(fx("\nFilename: ", :bold))
268
305
  puts
269
306
  end
270
307
  @blog.create_view(arg)
271
- text = File.read("#{@blog.root}/data/global.lt3")
272
- File.write("#{@blog.root}/views/#{@blog.view}/themes/standard/global.lt3",
308
+ lines = File.read("#{@blog.root}/data/global.lt3")
309
+ # File.write("#{@blog.root}/views/#{@blog.view}/themes/standard/global.lt3",
310
+ File.write("#{@blog.root}/views/#{@blog.view}/data/global.lt3",
273
311
  text.gsub(/VIEW_NAME/, @blog.view.to_s))
274
312
  vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(VIEW_.*\|SITE.*\)"'
275
- edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
313
+ # edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
314
+ edit_file(@blog.view.dir/"data/global.lt3", vim: vim_params)
276
315
  @blog.change_view(arg)
277
316
  rescue ViewAlreadyExists
278
317
  puts 'Blog already exists'
@@ -313,22 +352,26 @@ module RuneBlog::REPL
313
352
  tag = "#{'%04d' % id}"
314
353
  files = ::Find.find(@blog.root/:drafts).to_a
315
354
  files = files.grep(/#{tag}-.*lt3/)
316
- draft = exactly_one(files)
355
+ draft = exactly_one(files, files.join("/"))
317
356
  result = edit_file(draft, vim: '-c$')
318
357
  @blog.generate_post(draft)
319
358
  rescue => err
320
359
  _tmp_error(err)
321
360
  end
322
361
 
362
+ def view2title(name) # FIXME: crufty as hell
363
+ lines = File.readlines(@blog.root/"views/#{name}/settings/view.txt")
364
+ lines.map!(&:chomp)
365
+ lines = lines.select {|x| x =~ /^title / && x !~ /VIEW_/ }
366
+ title = lines.first.split(" ", 2)[1]
367
+ end
368
+
323
369
  def cmd_list_views
324
370
  puts
325
371
  @blog.views.each do |v|
326
372
  v = v.to_s
373
+ title = view2title(v)
327
374
  v = fx(v, :bold) if v == @blog.view.name
328
- # FIXME: next 3 lines are crufty as hell
329
- lines = File.readlines(@blog.root/"views/#{v}/settings/view.txt")
330
- lines = lines.select {|x| x =~ /^title / && x !~ /VIEW_/ }
331
- title = lines.first.split(" ", 2)[1]
332
375
  print " ", ('%15s' % v)
333
376
  puts " ", fx(title, Black)
334
377
  end
@@ -441,7 +484,6 @@ module RuneBlog::REPL
441
484
  cmd = "cp #{name} #{@blog.root}/drafts/#@fname"
442
485
  result = system!(cmd)
443
486
  raise CantCopy(name, "#{@blog.root}/drafts/#@fname") unless result
444
- # post = Post.load(@slug)
445
487
  draft = "#{@blog.root}/drafts/#@fname"
446
488
  @meta = @blog.generate_post(draft)
447
489
  puts