runeblog 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a037d087baf23e47f7b3c254dac3348048cc9c498ad439a5f235149b9bbf96cb
4
- data.tar.gz: f82a11b32ee3eb3738abdc1a60f3fc1606efb5252a29f5902d53591117199c6c
3
+ metadata.gz: bbd97f1cfd9631550e0ef799e14f8c5dfd621d29c4231dfb9f5bbc0f065b436e
4
+ data.tar.gz: 449f13d68fc2a247e9e307083c7b0f4c9034bc4e85d307d7775d8a7a881284a7
5
5
  SHA512:
6
- metadata.gz: 9fa1d23bd68596356383676b5d4c5c9fba04afaba2d98ccf8bb1d27fb4b68aba8b9a1078aaebcc7a61cefb8d8bb5102e51d09ecd68e82ce436afaa734c028862
7
- data.tar.gz: aae6ba4be7009d1cfcc7461f6dfb5f4459d880b796a7842e67050863e6f48d9ede6923a8995c4945a0923153b7f97c051f18691f8e0d343ed450dcba586c88e0
6
+ metadata.gz: 476e0804dd0085123c19019548bd7803ccfeff526d27e70b5bab1dcf3904fe8ec414b69a9562b34a9fd2e0574843cdbe66cdf9ed226b94d0d2aca92aebb1a7b5
7
+ data.tar.gz: 598f65529e5a1d52558142a3ad5230fa53bab77f12325efedc9a6c9f688a737633b4937088bf234e5e5b2fbee8bb17fc0778968e7547797ded0d116dbe024abc
Binary file
@@ -3,6 +3,8 @@ require 'fileutils'
3
3
 
4
4
  # Home = Dir.pwd # unless Home
5
5
 
6
+ LEXT = ".lt3"
7
+
6
8
  module RuneBlog::Helpers
7
9
 
8
10
  def copy(src, dst)
@@ -31,37 +33,57 @@ exit unless rc
31
33
  # end
32
34
  end
33
35
 
34
- def stale?(src, dst)
36
+ def stale?(src, dst, force = false)
35
37
  log!(enter: __method__, args: [src, dst])
38
+ raise "Source #{src} not found in #{Dir.pwd}" unless File.exist?(src)
39
+ return true if force
36
40
  return true unless File.exist?(dst)
37
41
  return true if File.mtime(src) > File.mtime(dst)
38
42
  return false
39
43
  end
40
44
 
41
- def livetext(src, dst=nil, dir=".")
42
- log!(enter: __method__, args: [src, dst])
43
- src << ".lt3" unless src.end_with?(".lt3")
44
- if dst
45
- dst << ".html" unless dst.end_with?(".html")
46
- else
47
- dst = src.sub(/.lt3$/, "")
48
- end
49
- # return unless stale?(src, dst)
50
- Dir.chdir(dir) { system("livetext #{src} >#{dst}") }
51
- end
52
-
53
- def livetext!(src, dst=nil, dir=".")
54
- log!(enter: __method__, args: [src, dst])
55
- src << ".lt3" unless src.end_with?(".lt3")
56
- if dst
57
- dst << ".html" unless dst.end_with?(".html")
58
- else
59
- dst = src.sub(/.lt3$/, "")
45
+ # def livetext(src, dst=nil, dir=".")
46
+ # log!(enter: __method__, args: [src, dst])
47
+ # src << ".lt3" unless src.end_with?(".lt3")
48
+ # if dst
49
+ # dst << ".html" unless dst.end_with?(".html")
50
+ # else
51
+ # dst = src.sub(/.lt3$/, "")
52
+ # end
53
+ ## return unless stale?(src, dst)
54
+ # Dir.chdir(dir) { system("livetext #{src} >#{dst}") }
55
+ # end
56
+ #
57
+ # def livetext!(src, dst=nil, dir=".")
58
+ # log!(enter: __method__, args: [src, dst])
59
+ # src << ".lt3" unless src.end_with?(".lt3")
60
+ # if dst
61
+ # dst << ".html" unless dst.end_with?(".html")
62
+ # else
63
+ # dst = src.sub(/.lt3$/, "")
64
+ # end
65
+ ## return unless stale?(src, dst)
66
+ #STDERR.puts "-- livetext #{src} >#{dst} \n in: #{Dir.pwd}\n from: #{caller[0]}"
67
+ # Dir.chdir(dir) { system("livetext #{src} >#{dst}") }
68
+ #STDERR.puts "... completed"
69
+ # end
70
+
71
+ def xlate(cwd: Dir.pwd, src:,
72
+ dst: (strip = true; src.sub(/.lt3$/,"")),
73
+ copy: nil, debug: false, force: false)
74
+ src += LEXT unless src.end_with?(LEXT)
75
+ dst += ".html" unless dst.end_with?(".html") || strip
76
+ Dir.chdir(cwd) do
77
+ return unless stale?(src, dst, force)
78
+ if debug
79
+ STDERR.puts "-- xlate #{src} >#{dst}"
80
+ STDERR.puts " in: #{Dir.pwd}"
81
+ STDERR.puts " from: #{caller[0]}"
82
+ STDERR.puts " copy: #{copy}" if copy
83
+ end
84
+ rc = system("livetext #{src} >#{dst}")
60
85
  end
61
- # return unless stale?(src, dst)
62
- STDERR.puts "-- livetext #{src} >#{dst} \n in: #{Dir.pwd}\n from: #{caller[0]}"
63
- Dir.chdir(dir) { system("livetext #{src} >#{dst}") }
64
- STDERR.puts "... completed"
86
+ STDERR.puts "...completed (shell returned #{rc})" if debug
65
87
  end
66
88
 
67
89
  def get_root
@@ -236,23 +236,20 @@ def pin
236
236
  _optional_blank_line
237
237
  end
238
238
 
239
- def write_post
240
- raise "'post' was not called" unless @meta
241
- save = Dir.pwd
242
- @postdir.gsub!(/\/\//, "/") # FIXME unneeded?
243
- Dir.mkdir(@postdir) unless Dir.exist?(@postdir) # FIXME remember assets!
244
- Dir.chdir(@postdir)
245
- @meta.views = @meta.views.join(" ") if @meta.views.is_a? Array
246
- @meta.tags = @meta.tags.join(" ") if @meta.tags.is_a? Array
239
+ def _write_metadata
247
240
  File.write("teaser.txt", @meta.teaser)
248
-
249
241
  fields = [:num, :title, :date, :pubdate, :views, :tags]
250
-
251
242
  fname2 = "metadata.txt"
252
243
  f2 = File.open(fname2, "w") do |f2|
253
244
  fields.each {|fld| f2.puts "#{fld}: #{@meta.send(fld)}" }
254
245
  end
255
- Dir.chdir(save)
246
+ end
247
+
248
+ def write_post
249
+ raise "'post' was not called" unless @meta
250
+ @meta.views = @meta.views.join(" ") if @meta.views.is_a? Array
251
+ @meta.tags = @meta.tags.join(" ") if @meta.tags.is_a? Array
252
+ _write_metadata
256
253
  rescue => err
257
254
  puts "err = #{err}"
258
255
  puts err.backtrace.join("\n")
@@ -267,19 +264,25 @@ def teaser
267
264
  end
268
265
 
269
266
  def finalize
267
+ STDERR.puts :cp1
270
268
  unless @meta
271
269
  puts @live.body
272
270
  return
273
271
  end
272
+ STDERR.puts :cp4
274
273
  if @blog.nil?
275
274
  return @meta
276
275
  end
277
276
 
277
+ STDERR.puts :cp6
278
278
  @slug = @blog.make_slug(@meta)
279
+ STDERR.puts :cp7
279
280
  slug_dir = @slug
280
281
  @postdir = @blog.view.dir + "/posts/#{slug_dir}"
281
282
  STDERR.puts "--- finalize: pwd = #{Dir.pwd} postdir = #@postdir"
283
+ STDERR.puts :cp8
282
284
  write_post
285
+ STDERR.puts :cp9
283
286
  @meta
284
287
  end
285
288
 
@@ -60,7 +60,7 @@ class RuneBlog
60
60
  create_dirs(root)
61
61
  Dir.chdir(root) do
62
62
  system("cp #{RuneBlog::Path}/../empty_view.tgz .")
63
- create_dirs(:drafts, :views)
63
+ create_dirs(:drafts, :views, :posts)
64
64
  new_sequence
65
65
  end
66
66
  put_config(root: root)
@@ -99,6 +99,23 @@ class RuneBlog
99
99
  @post_tags = []
100
100
  end
101
101
 
102
+ def _deploy_local(dir)
103
+ log!(enter: __method__, args: [dir])
104
+ Dir.chdir(dir) do
105
+ views = File.readlines("metadata.txt").grep(/^.views /).first[7..-1].split
106
+ views.each {|v| system("cp *html #@root/views/#{v}/remote") }
107
+ end
108
+ end
109
+
110
+ def process_post(sourcefile)
111
+ log!(enter: __method__, args: [dir])
112
+ nslug = sourcefile.sub(/.lt3/, "")
113
+ dir = @root + "/posts/#{nslug}"
114
+ create_dir(dir)
115
+ xlate cwd: dir, src: sourcefile, debug: true
116
+ _deploy_local(dir)
117
+ end
118
+
102
119
  def inspect
103
120
  log!(enter: __method__)
104
121
  str = "blog: "
@@ -177,45 +194,59 @@ class RuneBlog
177
194
  Dir.exist?(DotDir) && File.exist?(DotDir + "/" + ConfigFile)
178
195
  end
179
196
 
180
- def _copy_to_staging
181
- copy!("themes/standard/", "staging/")
182
- copy!("themes/standard/widgets/", "staging/")
197
+ def make_dummy_publish_file(view_name)
198
+ log!(enter: __method__, args: [view_name])
199
+ vdir = "#@root/views/#{view_name}"
200
+ pub = [:user, :server, :docroot, :path, :proto]
201
+ pub = pub.map {|x| x.to_s + ": undefined" }
202
+ pub = pub.join("\n") + "\n"
203
+ dump(pub, "#{vdir}/publish")
183
204
  end
184
205
 
185
- def _copy_to_remote
186
- copy!("themes/standard/etc", "remote/")
187
- copy!("themes/standard/assets", "remote/")
188
- copy!("themes/standard/widgets", "remote/")
206
+ def mark_last_published(str)
207
+ log!(enter: __method__, args: [str])
208
+ dump(str, "last_published")
189
209
  end
190
210
 
191
- def create_view(arg)
192
- log!(enter: __method__, args: [arg])
193
- raise ArgumentError unless arg.is_a?(String) && ! arg.empty?
194
-
195
- names = self.views.map(&:to_s)
196
- raise ViewAlreadyExists(arg) if names.include?(arg)
197
-
198
- vdir = arg.dup
199
- raise DirAlreadyExists(vdir) if Dir.exist?(vdir)
211
+ def add_view(view_name)
212
+ log!(enter: __method__, args: [view_name])
213
+ view = RuneBlog::View.new(view_name)
214
+ @view = view # current view
215
+ @views << view # all views
216
+ view
217
+ end
200
218
 
219
+ def make_empty_view_tree(view_name)
220
+ log!(enter: __method__, args: [view_name])
201
221
  Dir.chdir(@root) do
202
222
  cmd1 = "tar zxvf empty_view.tgz >/dev/null 2>&1"
203
- cmd2 = "cp -r empty_view views/#{arg}"
223
+ cmd2 = "cp -r empty_view views/#{view_name}"
204
224
  system(cmd1)
205
225
  system(cmd2)
206
226
  end
227
+ end
207
228
 
208
- Dir.chdir("#@root/views/#{vdir}") do
209
- livetext "generate", "../../../remote/index", "themes/standard/blog"
210
- pub = "user: xxx\nserver: xxx\ndocroot: xxx\npath: xxx\nproto: xxx\n"
211
- dump(pub, "publish")
229
+ def check_valid_new_view(view_name)
230
+ log!(enter: __method__, args: [view_name])
231
+ raise ArgumentError unless view_name.is_a?(String)
232
+ raise ArgumentError if view_name.empty?
233
+ names = self.views.map(&:to_s)
234
+ bad = names.include?(view_name)
235
+ raise ViewAlreadyExists(view_name) if bad
236
+ vdir = "@root/views/#{view_name}"
237
+ raise DirAlreadyExists(view_name) if Dir.exist?(vdir)
238
+ return true # hm?
239
+ end
212
240
 
213
- view = RuneBlog::View.new(arg)
214
- self.view = view
215
- dump("Initial creation", "last_published")
216
- end
217
- @views << view
218
- @views
241
+ def create_view(view_name)
242
+ log!(enter: __method__, args: [view_name])
243
+ check_valid_new_view(view_name)
244
+ make_empty_view_tree(view_name)
245
+ # xlate cwd: "#@root/views/#{view_name}/themes/standard/blog",
246
+ # src: "generate", dst: "../../../remote/index"
247
+ make_dummy_publish_file(view_name)
248
+ mark_last_published("Initial creation")
249
+ add_view(view_name)
219
250
  end
220
251
 
221
252
  def delete_view(name, force = false)
@@ -304,7 +335,7 @@ class RuneBlog
304
335
  def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
305
336
  log!(enter: __method__, args: [title, testing, teaser, body, other_views])
306
337
  meta = nil
307
- Dir.chdir(self.view.dir) do
338
+ Dir.chdir("#@root/posts/") do
308
339
  post = Post.create(title: title, teaser: teaser, body: body, other_views: other_views)
309
340
  post.edit unless testing
310
341
  post.build
@@ -322,6 +353,7 @@ class RuneBlog
322
353
  sourcefile = "#@root/drafts/#{file}"
323
354
  result = system("#@editor #{sourcefile} +8") unless testing
324
355
  raise EditorProblem(sourcefile) unless result
356
+ process_post(sourcefile)
325
357
  nil
326
358
  rescue => err
327
359
  error(err)
@@ -359,9 +391,9 @@ class RuneBlog
359
391
  def generate_view(view) # huh?
360
392
  log!(enter: __method__, args: [view])
361
393
  generate_index(view) # recent posts (recent.html)
362
- Dir.chdir(@root + "/views/#{view}/themes/standard") do
363
- livetext "blog/generate.lt3", "../../remote/index.html"
364
- end
394
+ vdir = "#@root/views/#{view}"
395
+ xlate cwd: "#{vdir}/themes/standard",
396
+ src: "blog/generate.lt3", dst: "#{vdir}/remote/index.html"
365
397
  end
366
398
 
367
399
  def _get_views(draft)
@@ -388,73 +420,66 @@ class RuneBlog
388
420
  [noext, viewdir, slugdir, aslug, theme]
389
421
  end
390
422
 
391
- def _handle_post(draft, view)
392
- noext, viewdir, slugdir, aslug, @theme = _copy_get_dirs(draft, view)
393
- html = noext[5..-1] # strip "nnnn-"
394
- remote = viewdir + "/remote"
395
- Dir.chdir(slugdir) do
396
- copy(draft, ".") # copy source into slugdir
397
- lt3 = draft.split("/")[-1] # Remember: Some posts may be in more than
398
- copy(lt3, remote) # one view -- careful with links back
399
- STDERR.puts "1 pwd = #{Dir.pwd}"
400
- livetext! draft, html
401
- STDERR.puts " copy #{html}, #{remote}/#{html}"
402
- copy(html, "#{remote}/#{html}")
403
-
404
- title_line = File.readlines(draft).grep(/^.title /).first
405
- title = title_line.split(" ", 2)[1]
423
+ def _post_metadata(draft, pdraft)
424
+ log!(enter: __method__, args: [draft, pdraft])
425
+ title_line = File.readlines(draft).grep(/^.title /).first
426
+ title = title_line.split(" ", 2)[1]
427
+ # pdir = "
428
+ Dir.chdir(pdraft) do
406
429
  excerpt = File.read("teaser.txt")
407
430
  vars = %[.set title="#{title.chomp}"\n] +
408
431
  %[.set teaser="#{excerpt.chomp}"]
409
- theme = "#{viewdir}/themes/standard"
410
- File.open("#{theme}/post/vars.lt3", "w") {|f| f.puts vars }
411
-
412
- livetext! "generate.lt3", "#{remote}/html", "#{theme}/post"
413
- copy("#{remote}/#{html}", "#{theme}/post")
414
-
415
- livetext! "permalink.lt3", "#{remote}/permalink/#{html}", "#{theme}/post"
416
- log!(str: "About to enter remote/", pwd: true, dir: true)
417
- Dir.chdir(remote) do
418
- log!(str: "Now in remote/", pwd: true, dir: true)
419
- system("cp -r ../themes/standard/widgets .")
420
- log!(str: "finished with remote/", pwd: true, dir: true)
421
- end
432
+ File.open("#{pdraft}/vars.lt3", "w") {|f| f.puts vars }
433
+ end
434
+ end
435
+
436
+ def copy_widget_html # FIXME make better?
437
+ log!(enter: __method__)
438
+ wdir = "../themes/standard/widgets"
439
+ widgets = Dir["#{wdir}/*"].select {|w| File.directory?(w) }
440
+ widgets.each do |w|
441
+ dir = File.basename(w)
442
+ rem = "#{remote}/#{w}"
443
+ create_dirs(rem)
444
+ system("cp #{w}/*html #{rem}")
422
445
  end
423
446
  end
424
447
 
448
+ def _handle_post(draft, view)
449
+ log!(enter: __method__, args: [draft, view])
450
+
451
+ fname = File.basename(draft) # 0001-this-is-a-post.lt3
452
+ nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
453
+ aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
454
+ ahtml = aslug + ".html" # this-is-a-post.html
455
+ pdraft = "#@root/posts/#{nslug}"
456
+ remote = "#@root/views/#{view}/remote"
457
+ @theme = "#@root/views/#{view}/themes/standard"
458
+ # Step 1...
459
+ create_dirs(pdraft)
460
+ xlate cwd: pdraft, src: draft, dst: "guts.html"
461
+ _post_metadata(draft, pdraft)
462
+ # Step 2...
463
+ vposts = "#@root/views/#{view}/posts/"
464
+ copy!(pdraft, vposts) # ??
465
+ # Step 3..
466
+ copy(pdraft + "/guts.html", "#@theme/post")
467
+ copy(pdraft + "/vars.lt3", "#@theme/post")
468
+ # Step 4...
469
+ xlate cwd: "#{@theme}/post", src: "generate.lt3",
470
+ dst: "#{remote}/#{ahtml}", copy: "#{@theme}/post"
471
+ xlate cwd: "#{@theme}/post", src: "permalink.lt3",
472
+ dst: "#{remote}/permalink/#{ahtml}"
473
+ copy_widget_html
474
+ end
475
+
425
476
  def generate_post(draft)
426
477
  log!(enter: __method__, args: [draft])
427
478
  views = _get_views(draft)
428
- views.each do |view|
479
+ views.each do |view|
429
480
  _handle_post(draft, view)
481
+ generate_view(view)
430
482
  end
431
- # noext, viewdir, slugdir, aslug, @theme = _copy_get_dirs(draft, view)
432
- # remote = viewdir + "/remote"
433
- # Dir.chdir(slugdir) do
434
- # copy(draft, ".")
435
- # lt3 = draft.split("/")[-1]
436
- # # Remember: Some posts may be in more than one view -- careful with links back
437
- # copy(lt3, remote)
438
- # html = noext[5..-1] # strip "nnnn-"
439
- # livetext! draft, html
440
- # copy(html, "#{remote}/#{html}")
441
- # title_line = File.readlines(draft).grep(/^.title /).first
442
- # title = title_line.split(" ", 2)[1]
443
- # excerpt = File.read("teaser.txt")
444
- # vars = %[.set title="#{title.chomp}"\n] +
445
- # %[.set teaser="#{excerpt.chomp}"]
446
- # theme = "#{viewdir}/themes/standard"
447
- # File.open("#{theme}/post/vars.lt3", "w") {|f| f.puts vars }
448
- # livetext! "generate.lt3", "#{remote}/html", "#{theme}/post"
449
- # copy("#{remote}/html", "#{theme}/post")
450
- # livetext! "permalink.lt3", "#{remote}/permalink/#{html}", "#{theme}/post"
451
- # log!(str: "About to enter remote/", pwd: true, dir: true)
452
- # Dir.chdir(remote) do
453
- # log!(str: "Now in remote/", pwd: true, dir: true)
454
- # system("cp -r ../themes/standard/widgets .")
455
- # log!(str: "finished with remote/", pwd: true, dir: true)
456
- # end
457
- # end
458
483
  end
459
484
 
460
485
  def relink
@@ -2,7 +2,7 @@
2
2
  if ! (Object.constants.include?(:RuneBlog) && RuneBlog.constants.include?(:Path))
3
3
 
4
4
  class RuneBlog
5
- VERSION = "0.2.10"
5
+ VERSION = "0.2.11"
6
6
 
7
7
  path = Gem.find_files("runeblog").grep(/runeblog-/).first
8
8
  Path = File.dirname(path)
@@ -20,7 +20,7 @@ spec = Gem::Specification.new do |s|
20
20
  s.authors = ["Hal Fulton"]
21
21
  s.email = 'rubyhacker@gmail.com'
22
22
  s.executables << "blog"
23
- s.add_runtime_dependency 'livetext', '~> 0.8', '>= 0.8.92'
23
+ s.add_runtime_dependency 'livetext', '~> 0.8', '>= 0.8.93'
24
24
  s.add_runtime_dependency 'rubytext', '~> 0.1', '>= 0.1.16'
25
25
 
26
26
  # Files...
@@ -42,10 +42,6 @@ x = RuneBlog.new(".blogs")
42
42
 
43
43
  x.create_view("around_austin") # FIXME remember view title!
44
44
 
45
- # puts "=== about to call: x.generate_view('around_austin')"
46
- x.generate_view("around_austin")
47
- # puts "=== ...returned"
48
-
49
45
  # Hack:
50
46
  if File.exist?("publish")
51
47
  system("cp publish .blogs/views/around_austin/publish")
@@ -130,6 +126,8 @@ But I first heard of them
130
126
  in 2005.
131
127
  BODY
132
128
 
129
+ x.generate_view("around_austin")
130
+
133
131
  x.change_view("around_austin")
134
132
 
135
133
  puts
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runeblog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.2.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hal Fulton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-28 00:00:00.000000000 Z
11
+ date: 2019-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: livetext
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '0.8'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.8.92
22
+ version: 0.8.93
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '0.8'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.8.92
32
+ version: 0.8.93
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rubytext
35
35
  requirement: !ruby/object:Gem::Requirement