runeblog 0.2.40 → 0.2.45

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/bin/blog +4 -7
  3. data/empty_view/themes/standard/blog/post_entry.lt3 +11 -10
  4. data/empty_view/themes/standard/etc/blog.css.lt3 +6 -1
  5. data/empty_view/themes/standard/navbar/faq.lt3 +1 -0
  6. data/empty_view/themes/standard/navbar/navbar.lt3 +1 -0
  7. data/empty_view/themes/standard/post/generate.lt3 +9 -4
  8. data/empty_view/themes/standard/widgets/ad/ad.lt3 +8 -1
  9. data/empty_view/themes/standard/widgets/ad/ad1.png +0 -0
  10. data/empty_view/themes/standard/widgets/ad/ad2.png +0 -0
  11. data/empty_view/themes/standard/widgets/ad/ad3.png +0 -0
  12. data/empty_view/themes/standard/widgets/ad/ad4.png +0 -0
  13. data/empty_view/themes/standard/widgets/bydates/bydates.rb +7 -3
  14. data/empty_view/themes/standard/widgets/links/links.rb +28 -3
  15. data/empty_view/themes/standard/widgets/news/news.rb +7 -3
  16. data/empty_view/themes/standard/widgets/pages/pages.rb +10 -3
  17. data/empty_view/themes/standard/widgets/pinned/pinned.rb +7 -3
  18. data/empty_view/themes/standard/widgets/search/search.rb +7 -3
  19. data/empty_view/themes/standard/widgets/sitemap/sitemap.rb +7 -3
  20. data/empty_view/themes/standard/widgets/tag-cloud/tag-cloud.rb +7 -3
  21. data/lib/default.rb +1 -4
  22. data/lib/global.rb +8 -7
  23. data/lib/helpers-blog.rb +15 -15
  24. data/lib/liveblog.rb +47 -18
  25. data/lib/logging.rb +17 -8
  26. data/lib/post.rb +6 -6
  27. data/lib/publish.rb +4 -4
  28. data/lib/repl.rb +1 -0
  29. data/lib/runeblog.rb +77 -47
  30. data/lib/runeblog_version.rb +1 -1
  31. data/lib/view.rb +2 -8
  32. data/lib/xlate.rb +2 -2
  33. data/test/austin.rb +157 -0
  34. metadata +8 -5
  35. data/empty_view/remote/widgets/links/list.data +0 -3
  36. data/empty_view/remote/widgets/news/list.data +0 -4
  37. data/empty_view/remote/widgets/pages/list.data +0 -4
@@ -33,6 +33,25 @@ def post
33
33
  _out " <!-- Post number #{@meta.num} -->\n "
34
34
  end
35
35
 
36
+ def post_trailer
37
+ perma = _var("publish.proto") + "://" + _var("publish.server") +
38
+ "/" + _var("publish.path") + "/permalink/" + _var("post.aslug") +
39
+ ".html"
40
+ tags = _var("post.tags")
41
+ if tags.empty?
42
+ taglist = ""
43
+ else
44
+ taglist = "Tags: #{tags}"
45
+ end
46
+ _out <<~HTML
47
+ <table width=100%><tr>
48
+ <td width=10%><a style="text-decoration: none" href="javascript:history.go(-1)">[Back]</a></td>
49
+ <td width=10%><a style="text-decoration: none" href="#{perma}"> [permalink] </a></td>
50
+ <td width=80% align=right><font size=-3>#{taglist}</font></td></tr></table>
51
+ HTML
52
+ # damned syntax highlighting
53
+ end
54
+
36
55
  def backlink
37
56
  _out %[<br><a href="javascript:history.go(-1)">[Back]</a>]
38
57
  end
@@ -109,17 +128,17 @@ end
109
128
 
110
129
 
111
130
  def make_main_links
112
- log!(enter: __method__)
131
+ log!(enter: __method__, level: 1)
113
132
  # FIXME remember strings may not be safe
114
133
  line = _data.chomp
115
134
  tag, card_title = *line.split(" ", 2)
116
135
  cardfile, mainfile = "#{tag}-card", "#{tag}-main"
117
136
  input = "list.data"
118
- log!(str: "Reading #{input}", pwd: true)
137
+ log!(str: "Reading #{input}", pwd: true, level: 3)
119
138
  pairs = File.readlines(input).map {|line| line.chomp.split(/, */, 2) }
120
139
  _write_main(mainfile, pairs, card_title, tag)
121
140
  _write_card(cardfile, mainfile, pairs, card_title, tag)
122
- log!(str: "...returning from method", pwd: true)
141
+ log!(str: "...returning from method", pwd: true, level: 3)
123
142
  end
124
143
 
125
144
  ### inset
@@ -154,7 +173,8 @@ def title
154
173
  title = @_data.chomp
155
174
  @meta.title = title
156
175
  setvar :title, title
157
- _out %[<h1 class="post-title">#{title}</h1><br>]
176
+ # FIXME refactor -- just output variables for a template
177
+ # _out %[<h1 class="post-title">#{title}</h1><br>]
158
178
  _optional_blank_line
159
179
  end
160
180
 
@@ -285,7 +305,6 @@ def head # Does NOT output tags
285
305
  hash = defaults.dup.update(result) # FIXME collisions?
286
306
 
287
307
  hash.each_value {|x| _out " " + x }
288
- _out "<body>"
289
308
  end
290
309
 
291
310
  ########## newer stuff...
@@ -356,16 +375,26 @@ def sidebar
356
375
  tcard = "#{tag}-card.html"
357
376
 
358
377
  code = _load_local(tag)
359
- code && Dir.chdir(wtag) { code.build }
360
-
361
- # if File.exist?(wtag/"SUBFILES")
362
- # children = Dir[wtag/"*.lt3"] - [wtag/tag+".lt3"]
363
- # children.each do |child|
364
- # dest = child.sub(/.lt3$/, ".html")
365
- # xlate src: child, dst: dest # , debug: true
366
- # end
367
- # end
368
- xlate cwd: wtag, src: tag, dst: tcard # , debug: true
378
+ if code
379
+ if ["pages", "links"].include? tag
380
+ Dir.chdir(wtag) do
381
+ widget = code.new(@blog)
382
+ widget.build
383
+ end
384
+ end
385
+ end
386
+
387
+ if tag == "ad"
388
+ num = rand(1..4)
389
+ img = "widgets/ad/ad#{num}.png"
390
+ src, dst = img, @root/:views/@view_name/"remote/widgets/ad/"
391
+ system!("cp #{src} #{dst}") # , show: true)
392
+ File.open(wtag/"vars.lt3", "w") do |f|
393
+ f.puts ".set ad.image = #{img}"
394
+ end
395
+ end
396
+
397
+ xlate cwd: wtag, src: tag, dst: tcard # , debug: (tag == "ad")
369
398
  _include_file wtag/tcard
370
399
  end
371
400
  _out %[</div>]
@@ -574,7 +603,7 @@ def _html_body(file, css = nil)
574
603
  end
575
604
 
576
605
  def _write_card(cardfile, mainfile, pairs, card_title, tag)
577
- log!(str: "Creating #{cardfile}.html", pwd: true)
606
+ log!(str: "Creating #{cardfile}.html", pwd: true, level: 2)
578
607
  url = mainfile
579
608
  url = :widgets/tag/mainfile + ".html"
580
609
  File.open("#{cardfile}.html", "w") do |f|
@@ -589,7 +618,7 @@ def _write_card(cardfile, mainfile, pairs, card_title, tag)
589
618
  </h5>
590
619
  <div class="collapse" id="#{tag}">
591
620
  EOS
592
- log!(str: "Writing data pairs to #{cardfile}.html", pwd: true)
621
+ log!(str: "Writing data pairs to #{cardfile}.html", pwd: true, level: 2)
593
622
  local = _local_tag?(tag)
594
623
  pairs.each do |file, title|
595
624
  url = file
@@ -662,7 +691,7 @@ def _write_main_pages(mainfile, pairs, card_title, tag)
662
691
  end
663
692
 
664
693
  def _write_main(mainfile, pairs, card_title, tag)
665
- log!(str: "Creating #{mainfile}.html", pwd: true)
694
+ log!(str: "Creating #{mainfile}.html", pwd: true, level: 2)
666
695
 
667
696
  if tag == "pages" # temporary experiment
668
697
  _write_main_pages(mainfile, pairs, card_title, tag)
@@ -2,8 +2,17 @@ unless self.respond_to?("log!")
2
2
  $logging = true
3
3
  $log = File.new("/tmp/runeblog.log","w")
4
4
 
5
- def log!(str: "", enter: nil, args: [], pwd: false, dir: false)
5
+ def outlog(str = "", stderr: false)
6
+ $log.puts str
7
+ STDERR.puts str if stderr
8
+ end
9
+
10
+ def log!(str: "", enter: nil, args: [], pwd: false, dir: false, level: 0, stderr: false)
6
11
  return unless $logging
12
+ @err_level ||= ENV['RUNEBLOG_ERROR_LEVEL']
13
+ @err_level ||= 0
14
+ return if level < @err_level
15
+
7
16
  time = Time.now.strftime("%H:%M:%S")
8
17
 
9
18
  meth = ""
@@ -17,16 +26,16 @@ unless self.respond_to?("log!")
17
26
  str = " ... #{str}" unless str.empty?
18
27
  indent = " "*12
19
28
 
20
- $log.puts "#{time} #{meth}#{para}"
21
- $log.puts "#{indent} #{str} " unless str.empty?
22
- $log.puts "#{indent} #{source}"
23
- $log.puts "#{indent} pwd = #{Dir.pwd} " if pwd
29
+ outlog "#{time} #{meth}#{para}"
30
+ outlog "#{indent} #{str} " unless str.empty?
31
+ outlog "#{indent} #{source}"
32
+ outlog "#{indent} pwd = #{Dir.pwd} " if pwd
24
33
  if dir
25
34
  files = (Dir.entries('.') - %w[. ..]).join(" ")
26
- $log.puts "#{indent} dir/* = #{files}"
35
+ outlog "#{indent} dir/* = #{files}"
27
36
  end
28
- # $log.puts "#{indent} livetext params = #{livedata.inpect} " unless livedata.nil?
29
- $log.puts
37
+ # outlog "#{indent} livetext params = #{livedata.inpect} " unless livedata.nil?
38
+ outlog
30
39
  $log.close
31
40
  $log = File.new("/tmp/runeblog.log","a")
32
41
  end
@@ -10,14 +10,14 @@ class RuneBlog::Post
10
10
  include RuneBlog::Helpers
11
11
 
12
12
  def self.files(num, root)
13
- log!(enter: __method__, args: [num, root])
13
+ log!(enter: __method__, args: [num, root], level: 3)
14
14
  files = Find.find(root).to_a
15
15
  result = files.grep(/#{prefix(num)}-/)
16
16
  result
17
17
  end
18
18
 
19
19
  def self.load(post)
20
- log!(enter: __method__, args: [post])
20
+ log!(enter: __method__, args: [post], level: 3)
21
21
  raise "Doesn't work right now"
22
22
  raise NoBlogAccessor if RuneBlog.blog.nil?
23
23
  # "post" is a slug
@@ -36,7 +36,7 @@ class RuneBlog::Post
36
36
  end
37
37
 
38
38
  def write_metadata(meta) # FIXME ???
39
- log!(enter: __method__, args: [meta])
39
+ log!(enter: __method__, args: [meta], level: 3)
40
40
  debug "=== write_metadata:"
41
41
  debug "-----\n#{meta.inspect}\n-----"
42
42
  fname2 = "metadata.txt"
@@ -57,7 +57,7 @@ class RuneBlog::Post
57
57
  end
58
58
 
59
59
  def initialize
60
- log!(enter: __method__)
60
+ log!(enter: __method__, level: 3)
61
61
  @blog = RuneBlog.blog || raise(NoBlogAccessor)
62
62
  @meta = OpenStruct.new
63
63
  end
@@ -115,7 +115,7 @@ class RuneBlog::ViewPost
115
115
  :teaser_text
116
116
 
117
117
  def initialize(view, postdir)
118
- log!(enter: __method__, args: [view, postdir])
118
+ log!(enter: __method__, args: [view, postdir], level: 3)
119
119
  # Assumes already parsed/processed
120
120
  @blog = RuneBlog.blog || raise(NoBlogAccessor)
121
121
  @path = postdir.dup
@@ -131,7 +131,7 @@ class RuneBlog::ViewPost
131
131
  end
132
132
 
133
133
  def get_dirs
134
- log!(enter: __method__, args: [view, postdir])
134
+ log!(enter: __method__, args: [view, postdir], level: 3)
135
135
  fname = File.basename(draft)
136
136
  noext = fname.sub(/.lt3$/, "")
137
137
  vdir = @root/:views/view
@@ -21,25 +21,25 @@ 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
@@ -144,6 +144,7 @@ module RuneBlog::REPL
144
144
  check_empty(arg)
145
145
  puts unless testing
146
146
  @blog.generate_view(@blog.view)
147
+ @blog.generate_index(@blog.view)
147
148
  @out
148
149
  end
149
150
 
@@ -53,7 +53,7 @@ class RuneBlog
53
53
  end
54
54
 
55
55
  def self.create(root = ".blogs")
56
- log!(enter: __method__, args: [root])
56
+ log!(enter: __method__, args: [root], level: 1)
57
57
  # Crude - FIXME later - # What views are there? Publishing, etc.
58
58
  self.blog = self # Weird. Like a singleton - dumbass circular dependency?
59
59
  root = Dir.pwd/root
@@ -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,9 +249,11 @@ 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
+ # STDERR.puts "Made empty tree!"
256
+ # system("bash")
255
257
  add_view(view_name)
256
258
  mark_last_published("Initial creation")
257
259
  end
@@ -267,7 +269,7 @@ class RuneBlog
267
269
  end
268
270
 
269
271
  def view_files
270
- log!(enter: __method__)
272
+ log!(enter: __method__, level: 2)
271
273
  vdir = self.view.dir
272
274
  files = [vdir/"index.html"]
273
275
  files += posts.map {|x| vdir/x }
@@ -275,7 +277,7 @@ class RuneBlog
275
277
  end
276
278
 
277
279
  def post_lookup(postid) # side-effect?
278
- log!(enter: __method__, args: [postid])
280
+ log!(enter: __method__, args: [postid], level: 2)
279
281
  slug = title = date = teaser_text = nil
280
282
 
281
283
  dir_posts = @vdir/:posts
@@ -289,8 +291,8 @@ class RuneBlog
289
291
  vp
290
292
  end
291
293
 
292
- def teaser(slug)
293
- log!(enter: __method__, args: [slug])
294
+ def index_entry(slug)
295
+ log!(enter: __method__, args: [slug], level: 2)
294
296
  id = slug.to_i
295
297
  text = nil
296
298
  @theme = @view.dir/"themes/standard"
@@ -303,13 +305,13 @@ class RuneBlog
303
305
  path = vp.path
304
306
  url = aslug + ".html"
305
307
  date = ::Date.parse(date)
306
- date = date.strftime("%B %e<br>%Y")
308
+ date = date.strftime("%B %e<br><div style='float: right'>%Y</div>")
307
309
  text = interpolate(@_post_entry, binding)
308
310
  text
309
311
  end
310
312
 
311
313
  def collect_recent_posts(file)
312
- log!(enter: __method__, args: [file])
314
+ log!(enter: __method__, args: [file], level: 3)
313
315
  posts = nil
314
316
  dir_posts = @vdir/:posts
315
317
  entries = Dir.entries(dir_posts)
@@ -328,18 +330,19 @@ class RuneBlog
328
330
  wanted.times do
329
331
  postid = File.basename(enum.next)
330
332
  postid = postid.to_i
331
- text << teaser(postid) # side effect! calls _out
333
+ text << index_entry(postid) # side effect! calls _out
332
334
  end
333
335
  text << "</body></html>"
334
336
  File.write(@vdir/:remote/file, text)
335
337
  end
336
338
 
337
- def create_new_post(title, testing = false, teaser: nil, body: nil, views: [])
338
- log!(enter: __method__, args: [title, testing, teaser, body, views])
339
+ def create_new_post(title, testing = false, teaser: nil, body: nil,
340
+ pubdate: Time.now.strftime("%Y-%m-%d"), views: [])
341
+ log!(enter: __method__, args: [title, testing, teaser, body, views], level: 1)
339
342
  meta = nil
340
343
  views = views + [self.view.to_s]
341
344
  Dir.chdir(@root/:posts) do
342
- post = Post.create(title: title, teaser: teaser, body: body, views: views)
345
+ post = Post.create(title: title, teaser: teaser, body: body, pubdate: pubdate, views: views)
343
346
  post.edit unless testing
344
347
  post.build
345
348
  meta = post.meta
@@ -351,7 +354,7 @@ class RuneBlog
351
354
  end
352
355
 
353
356
  def edit_initial_post(file, testing = false)
354
- log!(enter: __method__, args: [file, testing])
357
+ log!(enter: __method__, args: [file, testing], level: 3)
355
358
  debug "=== edit_initial_post #{file.inspect} => #{sourcefile}"
356
359
  sourcefile = @root/:drafts/file
357
360
  result = system!("#@editor #{sourcefile} +8") unless testing
@@ -363,20 +366,20 @@ class RuneBlog
363
366
  end
364
367
 
365
368
  def posts
366
- log!(enter: __method__)
369
+ log!(enter: __method__, level: 3)
367
370
  dir = self.view.dir/:posts
368
371
  posts = Dir.entries(dir).grep(/^\d{4}/)
369
372
  posts
370
373
  end
371
374
 
372
375
  def drafts
373
- log!(enter: __method__)
376
+ log!(enter: __method__, level: 3)
374
377
  dir = @root/:drafts
375
378
  drafts = Dir.entries(dir).grep(/^\d{4}.*/)
376
379
  end
377
380
 
378
381
  def change_view(view)
379
- log!(enter: __method__, args: [view])
382
+ log!(enter: __method__, args: [view], level: 3)
380
383
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
381
384
  x = OpenStruct.new
382
385
  x.root, x.current_view, x.editor = @root, view.to_s, @editor # dumb - FIXME later
@@ -400,7 +403,7 @@ class RuneBlog
400
403
  src: "blog.css.lt3", copy: vdir/"remote/etc/blog.css" # , debug: true
401
404
  xlate cwd: vdir/"themes/standard",
402
405
  src: "blog/generate.lt3", dst: vdir/:remote/"index.html"
403
- generate_index(view) # recent posts (recent.html)
406
+ # generate_index(view) # recent posts (recent.html)
404
407
  # ^ HERE
405
408
  copy("#{vdir}/assets/*", "#{vdir}/remote/assets/")
406
409
  rescue => err
@@ -411,7 +414,7 @@ class RuneBlog
411
414
  end
412
415
 
413
416
  def _get_views(draft)
414
- log!(enter: __method__, args: [draft])
417
+ log!(enter: __method__, args: [draft], level: 2)
415
418
  # FIXME dumb code
416
419
  view_line = File.readlines(draft).grep(/^.views /)
417
420
  raise "More than one .views call!" if view_line.size > 1
@@ -422,7 +425,7 @@ class RuneBlog
422
425
  end
423
426
 
424
427
  def _copy_get_dirs(draft, view)
425
- log!(enter: __method__, args: [draft, view])
428
+ log!(enter: __method__, args: [draft, view], level: 2)
426
429
  fname = File.basename(draft)
427
430
  noext = fname.sub(/.lt3$/, "")
428
431
  vdir = @root/:views/view
@@ -435,18 +438,42 @@ class RuneBlog
435
438
  end
436
439
 
437
440
  def _post_metadata(draft, pdraft)
438
- log!(enter: __method__, args: [draft, pdraft])
441
+ log!(enter: __method__, args: [draft, pdraft], level: 2)
442
+ # FIXME store this somewhere
443
+ fname = File.basename(draft) # 0001-this-is-a-post.lt3
444
+ nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
445
+ aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
446
+ pnum = nslug[0..3] # 0001
439
447
  Dir.chdir(pdraft) do
440
448
  excerpt = File.read("teaser.txt")
449
+ date = _retrieve_metadata(:date)
450
+ longdate = ::Date.parse(date).strftime("%B %e, %Y")
441
451
  title = _retrieve_metadata(:title)
442
- vars = %[.heredoc title\n#{title.chomp}\n.end\n] +
443
- %[.heredoc teaser\n#{excerpt.chomp}\n.end\n]
452
+ tags = _retrieve_metadata(:tags)
453
+ vars = <<~LIVE
454
+ .set post.num = #{pnum}
455
+ .heredoc post.aslug
456
+ #{aslug}
457
+ .end
458
+ .heredoc title
459
+ #{title.chomp}
460
+ .end
461
+ .heredoc post.tags
462
+ #{tags.join(" ")}
463
+ .end
464
+ .heredoc teaser
465
+ #{excerpt.chomp}
466
+ .end
467
+ .heredoc longdate
468
+ #{longdate}
469
+ .end
470
+ LIVE
444
471
  File.open(pdraft/"vars.lt3", "w") {|f| f.puts vars }
445
472
  end
446
473
  end
447
474
 
448
475
  def copy_widget_html(view)
449
- log!(enter: __method__)
476
+ log!(enter: __method__, level: 2)
450
477
  vdir = @root/:views/view
451
478
  remote = vdir/:remote
452
479
  wdir = vdir/:themes/:standard/:widgets
@@ -457,12 +484,15 @@ class RuneBlog
457
484
  create_dirs(rem)
458
485
  files = Dir[w/"*"]
459
486
  files = files.select {|x| x =~ /(html|css)$/ }
460
- files.each {|file| system!("cp #{file} #{rem}") }
487
+ # files.each {|f| STDERR.puts " #{f.inspect}" }
488
+ tag = File.basename(w)
489
+ # STDERR.puts "--- tag: #{tag.inspect}"
490
+ files.each {|file| system!("cp #{file} #{rem}", show: (tag == "zzz")) }
461
491
  end
462
492
  end
463
493
 
464
494
  def _handle_post(draft, view)
465
- log!(enter: __method__, args: [draft, view])
495
+ log!(enter: __method__, args: [draft, view], level: 2)
466
496
  # break into separate methods?
467
497
 
468
498
  fname = File.basename(draft) # 0001-this-is-a-post.lt3
@@ -491,7 +521,7 @@ class RuneBlog
491
521
  end
492
522
 
493
523
  def generate_post(draft)
494
- log!(enter: __method__, args: [draft])
524
+ log!(enter: __method__, args: [draft], level: 1)
495
525
  views = _get_views(draft)
496
526
  views.each do |view|
497
527
  _handle_post(draft, view)
@@ -500,7 +530,7 @@ class RuneBlog
500
530
  end
501
531
  end
502
532
 
503
- def index_entry(view, meta)
533
+ def OLD_index_entry(view, meta)
504
534
  log!(enter: __method__, args: [view, meta])
505
535
  debug "=== index_entry #{view.to_s.inspect} #{meta.num} #{meta.title.inspect}"
506
536
  check_meta(meta, "index_entry1")
@@ -537,7 +567,7 @@ class RuneBlog
537
567
  end
538
568
 
539
569
  def remove_post(num)
540
- log!(enter: __method__, args: [num])
570
+ log!(enter: __method__, args: [num], level: 1)
541
571
  raise ArgumentError unless num.is_a?(Integer)
542
572
  # FIXME update original draft .views
543
573
  tag = prefix(num)
@@ -554,7 +584,7 @@ class RuneBlog
554
584
  end
555
585
 
556
586
  def undelete_post(num)
557
- log!(enter: __method__, args: [num])
587
+ log!(enter: __method__, args: [num], level: 1)
558
588
  raise ArgumentError unless num.is_a?(Integer)
559
589
  files = Find.find(@root/:views).to_a
560
590
  tag = prefix(num)
@@ -570,14 +600,14 @@ class RuneBlog
570
600
  end
571
601
 
572
602
  def delete_draft(num)
573
- log!(enter: __method__, args: [num])
603
+ log!(enter: __method__, args: [num], level: 1)
574
604
  raise ArgumentError unless num.is_a?(Integer)
575
605
  tag = prefix(num)
576
606
  system!("rm -rf #@root/drafts/#{tag}-*")
577
607
  end
578
608
 
579
609
  def make_slug(meta)
580
- log!(enter: __method__, args: [meta])
610
+ log!(enter: __method__, args: [meta], level: 3)
581
611
  raise ArgumentError unless meta.title.is_a?(String)
582
612
  label = '%04d' % meta.num # FIXME can do better
583
613
  slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')