runeblog 0.3.19 → 0.3.24

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.
@@ -1,11 +1,18 @@
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
+ log!(str: err.backtrace.join("\n")) if err.respond_to?(:backtrace)
7
+ return
8
+
3
9
  out = "/tmp/blog#{rand(100)}.txt"
4
10
  File.open(out, "w") do |f|
5
11
  f.puts err.to_s + "\n--------"
6
12
  f.puts err.backtrace.join("\n")
7
13
  end
8
14
  puts "Error: See #{out}"
15
+ # sleep 3
9
16
  end
10
17
 
11
18
  def dump(obj, name)
@@ -20,6 +27,7 @@
20
27
  log!(enter: __method__, args: [str], level: 2)
21
28
  STDERR.puts str if show
22
29
  rc = system(str)
30
+ STDERR.puts " rc = #{rc.inspect}" if show
23
31
  return rc if rc
24
32
  STDERR.puts "FAILED: #{str.inspect}"
25
33
  STDERR.puts "\ncaller = \n#{caller.join("\n ")}\n"
@@ -32,10 +40,12 @@
32
40
  end
33
41
 
34
42
  def _get_data?(file) # File need not exist
43
+ log!(enter: __method__, args: [file], level: 2)
35
44
  File.exist?(file) ? _get_data(file) : []
36
45
  end
37
46
 
38
47
  def _get_data(file)
48
+ log!(enter: __method__, args: [file], level: 2)
39
49
  lines = File.readlines(file)
40
50
  lines = lines.map do |line|
41
51
  line = line.chomp.strip
@@ -46,6 +56,7 @@
46
56
  end
47
57
 
48
58
  def read_pairs(file) # returns a hash
59
+ log!(enter: __method__, args: [file], level: 2)
49
60
  lines = _get_data(file)
50
61
  hash = {}
51
62
  lines.each do |line|
@@ -57,6 +68,7 @@
57
68
  end
58
69
 
59
70
  def read_pairs!(file) # returns an openstruct
71
+ log!(enter: __method__, args: [file], level: 2)
60
72
  lines = _get_data(file)
61
73
  obj = OpenStruct.new
62
74
  lines.each do |line|
@@ -97,27 +109,32 @@
97
109
  end
98
110
 
99
111
  def error(err)
100
- # log!(str: err, enter: __method__, args: [err], level: 2)
101
- str = "\n Error: #{err}"
112
+ log!(str: err, enter: __method__, args: [err], level: 2)
113
+ str = "\n Error... #{err}"
102
114
  puts str
103
115
  puts err.backtrace.join("\n")
104
116
  end
105
117
 
106
- def find_item(list)
118
+ def find_item(list, &block)
119
+ log!(enter: __method__, args: [list], level: 2)
107
120
  list2 = list.select(&block)
108
- exactly_one(list2)
121
+ exactly_one(list2, list.join("/"))
109
122
  end
110
123
 
111
124
  def find_item!(list, &block)
125
+ log!(enter: __method__, args: [list], level: 2)
126
+ list2 = list.select(&block)
112
127
  list2 = list.select(&block)
113
- item = exactly_one(list2)
128
+ item = exactly_one(list2, list.join("/"))
114
129
  n = list.index(&block)
115
130
  [n, item]
116
131
  end
117
132
 
118
- def exactly_one(list)
119
- raise "List: Zero instances" if list.empty?
120
- raise "List: More than one instance" if list.size > 1
133
+ def exactly_one(list, tag = nil, &block)
134
+ log!(enter: __method__, args: [list], level: 2)
135
+ list2 = list.select(&block)
136
+ raise "List: Zero instances #{"- #{tag}" if tag}" if list.empty?
137
+ raise "List: More than one instance #{"- #{tag}" if tag}" if list.size > 1
121
138
  list.first
122
139
  end
123
140
 
@@ -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
@@ -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
@@ -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
@@ -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,9 @@ def preprocess(cwd: Dir.pwd, src:,
31
32
  dst += ".html" unless dst.end_with?(".html")
32
33
  end
33
34
  sp = " "*12
35
+
36
+
37
+
34
38
  Dir.chdir(cwd) do
35
39
  if debug
36
40
  STDERR.puts "#{sp} -- preprocess "
@@ -40,20 +44,44 @@ def preprocess(cwd: Dir.pwd, src:,
40
44
  STDERR.puts "#{sp} from: #{caller[0]}"
41
45
  STDERR.puts "#{sp} copy: #{copy}" if copy
42
46
  STDERR.puts "#{sp} vars: #{vars.inspect}" unless vars == {}
47
+ STDERR.flush
43
48
  end
44
49
  stale = stale?(src, dst, deps, force)
50
+ STDERR.puts <<~EOF if debug
51
+ STALE = #{stale}
52
+ cwd = #{cwd.inspect}
53
+ src = #{src.inspect}
54
+ dst = #{dst.inspect}
55
+ strip = #{strip.inspect}
56
+ deps = #{deps.inspect}
57
+ copy = #{copy.inspect}
58
+ debug = #{debug.inspect}
59
+ force = #{force.inspect}
60
+ mix = #{mix.inspect}
61
+ call = #{call.inspect}
62
+ vars = #{vars.inspect}
63
+ EOF
45
64
  if stale
46
65
  live = Livetext.customize(mix: "liveblog", call: call, vars: vars)
66
+ log!(str: "Calling xform_file... src = #{src} pwd = #{Dir.pwd}")
47
67
  out = live.xform_file(src)
48
68
  File.write(dst, out)
49
69
  system!("cp #{dst} #{copy}") if copy
50
70
  end
51
71
  puts "#{sp} -- ^ Already up to date!" if debug && ! stale
52
72
  end
73
+ rescue => err
74
+ msg = err.to_s
75
+ msg << err.backtrace.join("\n") if err.respond_to?(:backtrace)
76
+ STDERR.puts msg
77
+ STDERR.flush
78
+ log!(str: msg)
53
79
  end
54
80
 
55
81
  def get_live_vars(src)
56
82
  live = Livetext.customize(call: [".nopara"])
83
+ # puts "glv: src = #{src.inspect}"
84
+ # STDERR.puts "glv: src = #{src.inspect}"
57
85
  live.xform_file(src)
58
86
  live
59
87
  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
 
@@ -176,7 +176,10 @@ module RuneBlog::REPL
176
176
  result = system!("open #{local}")
177
177
  raise CantOpen(local) unless result
178
178
  rescue => err
179
- _tmp_error(err)
179
+ msg = err.to_s
180
+ msg << "\n" << err.backtrace.join("\n") if err.respond_to?(:backtrace)
181
+ puts msg
182
+ log!(str: msg)
180
183
  end
181
184
 
182
185
  def cmd_publish
@@ -206,13 +209,14 @@ module RuneBlog::REPL
206
209
 
207
210
  def regen_posts
208
211
  drafts = @blog.drafts # current view
209
- puts " Regenerating posts..." unless drafts.empty?
212
+ log! str: "=== Regenerating posts..." unless drafts.empty?
210
213
  drafts.each do |draft|
211
214
  orig = @blog.root/:drafts/draft
212
215
  postdir = @blog.root/:posts/draft.sub(/.lt3$/, "")
213
216
  content = postdir/"/guts.html"
214
217
  next if fresh?(orig, content)
215
218
 
219
+ log! str: "=== Calling generate_post(#{orig})"
216
220
  @blog.generate_post(orig) # rebuild post
217
221
  Dir.chdir(postdir) do
218
222
  meta = @blog.read_metadata
@@ -224,28 +228,34 @@ module RuneBlog::REPL
224
228
  end
225
229
 
226
230
  def cmd_rebuild
227
- debug "Starting cmd_rebuild..."
231
+ log! str: "=== Starting cmd_rebuild..."
228
232
  puts
229
233
  regen_posts
230
- puts " Generating view"
234
+ log! str: "=== Generating view..."
231
235
  @blog.generate_view(@blog.view)
232
- puts " Generating index"
236
+ log! str: "=== Generating index..."
233
237
  @blog.generate_index(@blog.view)
234
- puts " ...finished!"
238
+ log! str: "=== ...finished!"
235
239
  rescue => err
236
240
  _tmp_error(err)
237
241
  end
238
242
 
239
243
  def cmd_change_view(arg = nil)
240
244
  if arg.nil?
241
- viewnames = @blog.views.map {|x| x.name }
242
- n = viewnames.find_index(@blog.view.name)
245
+ viewnames = {}
246
+ @blog.views.each do |v|
247
+ name = v.to_s
248
+ title = view2title(name)
249
+ string = "#{'%-25s' % title} #{name}"
250
+ viewnames[string] = name
251
+ end
252
+ n = viewnames.values.find_index(@blog.view.name)
243
253
  name = @blog.view.name
244
- # TODO: Add view description
245
254
  k, name = STDSCR.menu(title: "Views", items: viewnames, curr: n)
246
255
  return if name.nil?
256
+ log! str: "cv Setting to #{name.inspect}"
247
257
  @blog.view = name
248
- puts "\n ", fx(name, :bold), "\n"
258
+ # puts "\n ", fx(name, :bold), "\n"
249
259
  return
250
260
  else
251
261
  if @blog.view?(arg)
@@ -255,17 +265,56 @@ module RuneBlog::REPL
255
265
  end
256
266
  end
257
267
 
268
+ # move to helpers
269
+ def modify_view_global(view_name)
270
+ gfile = "#{@blog.root}/views/#{view_name}/data/global.lt3"
271
+ lines = File.readlines(gfile).map(&:chomp)
272
+ vars = <<~EOF
273
+ .variables
274
+ View #{view_name}
275
+ ViewDir #{@blog.root}/views/#{view_name}
276
+ .end
277
+
278
+ EOF
279
+ # lines.insert(5, vars)
280
+ text = lines.join("\n")
281
+ File.write(gfile, text)
282
+ end
283
+
284
+ def modify_view_settings(name:, title:, subtitle:, domain:)
285
+ vfile = "#{@blog.root}/views/#{name}/settings/view.txt"
286
+ hash = {/VIEW_NAME/ => name,
287
+ /VIEW_TITLE/ => title,
288
+ /VIEW_SUBTITLE/ => subtitle,
289
+ /VIEW_DOMAIN/ => domain}
290
+ @blog.complete_file(vfile, nil, hash)
291
+ end
292
+
258
293
  def cmd_new_view(arg)
294
+ view_name = ask!(" Filename: ")
295
+ @blog.create_view(view_name) # call change_view??
296
+ title = ask!(" View title: ")
297
+ subtitle = ask!(" Subtitle : ")
298
+ domain = ask!(" Domain : ")
299
+ modify_view_global(view_name)
300
+ modify_view_settings(name: view_name, title: title, subtitle: subtitle,
301
+ domain: domain)
302
+ @blog.change_view(view_name)
303
+ end
304
+
305
+ def cmd_new_view_ORIG(arg)
259
306
  if arg.nil?
260
307
  arg = ask(fx("\nFilename: ", :bold))
261
308
  puts
262
309
  end
263
310
  @blog.create_view(arg)
264
- text = File.read("#{@blog.root}/data/global.lt3")
265
- File.write("#{@blog.root}/views/#{@blog.view}/themes/standard/global.lt3",
311
+ lines = File.read("#{@blog.root}/data/global.lt3")
312
+ # File.write("#{@blog.root}/views/#{@blog.view}/themes/standard/global.lt3",
313
+ File.write("#{@blog.root}/views/#{@blog.view}/data/global.lt3",
266
314
  text.gsub(/VIEW_NAME/, @blog.view.to_s))
267
315
  vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(VIEW_.*\|SITE.*\)"'
268
- edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
316
+ # edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
317
+ edit_file(@blog.view.dir/"data/global.lt3", vim: vim_params)
269
318
  @blog.change_view(arg)
270
319
  rescue ViewAlreadyExists
271
320
  puts 'Blog already exists'
@@ -306,22 +355,26 @@ module RuneBlog::REPL
306
355
  tag = "#{'%04d' % id}"
307
356
  files = ::Find.find(@blog.root/:drafts).to_a
308
357
  files = files.grep(/#{tag}-.*lt3/)
309
- draft = exactly_one(files)
358
+ draft = exactly_one(files, files.join("/"))
310
359
  result = edit_file(draft, vim: '-c$')
311
360
  @blog.generate_post(draft)
312
361
  rescue => err
313
362
  _tmp_error(err)
314
363
  end
315
364
 
365
+ def view2title(name) # FIXME: crufty as hell
366
+ lines = File.readlines(@blog.root/"views/#{name}/settings/view.txt")
367
+ lines.map!(&:chomp)
368
+ lines = lines.select {|x| x =~ /^title / && x !~ /VIEW_/ }
369
+ title = lines.first.split(" ", 2)[1]
370
+ end
371
+
316
372
  def cmd_list_views
317
373
  puts
318
374
  @blog.views.each do |v|
319
375
  v = v.to_s
376
+ title = view2title(v)
320
377
  v = fx(v, :bold) if v == @blog.view.name
321
- # FIXME: next 3 lines are crufty as hell
322
- lines = File.readlines(@blog.root/"views/#{v}/settings/view.txt")
323
- lines = lines.select {|x| x =~ /^title / && x !~ /VIEW_/ }
324
- title = lines.first.split(" ", 2)[1]
325
378
  print " ", ('%15s' % v)
326
379
  puts " ", fx(title, Black)
327
380
  end
@@ -365,6 +418,7 @@ module RuneBlog::REPL
365
418
  base = draft.sub(/.lt3$/, "")
366
419
  dir = @blog.root/:posts/base
367
420
  meta = nil
421
+ puts "Trying chdir into #{dir}..."
368
422
  Dir.chdir(dir) { meta = @blog.read_metadata }
369
423
  num, title = meta.num, meta.title
370
424
  num = '%4d' % num.to_s