runeblog 0.2.10 → 0.2.11

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.
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