runeblog 0.2.16 → 0.2.17
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 +4 -4
- data/empty_view.tgz +0 -0
- data/lib/default.rb +0 -1
- data/lib/helpers-blog.rb +11 -94
- data/lib/helpers-repl.rb +0 -27
- data/lib/liveblog.rb +41 -89
- data/lib/logging.rb +0 -23
- data/lib/post.rb +9 -20
- data/lib/publish.rb +6 -9
- data/lib/repl.rb +0 -2
- data/lib/runeblog.rb +9 -14
- data/lib/runeblog_version.rb +1 -1
- data/lib/view.rb +2 -3
- data/lib/xlate.rb +31 -0
- data/test/make_blog.rb +12 -4
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf71088966e7393574d792a3508bb35f8a581e774a250dbe88b61fee08cd7588
|
4
|
+
data.tar.gz: 991d387f3649a4defbdee3500d2a275ab2b5b6b2956ad46188c50a8c3c393513
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57eaf8b41cb76dd92e2a4f5ba45c3461248761e433e2f1fefc4ab6373ac414fcfbe2c4c04016465438b7a68b3ef7d666ad848634afa37f1cbac36c01e7be5385
|
7
|
+
data.tar.gz: 3bd8ed4c9776f71b2787cdb484c981b314b53993b3d31bb125176e576d91f752830813eba24f1cacf84b1cf455a7f4743fc0bc866009217c3afe09a44b67d8c2
|
data/empty_view.tgz
CHANGED
Binary file
|
data/lib/default.rb
CHANGED
@@ -2,7 +2,6 @@ class RuneBlog::Default
|
|
2
2
|
|
3
3
|
# This will all become much more generic later.
|
4
4
|
|
5
|
-
|
6
5
|
def RuneBlog.post_template(num: 0, title: "No title", date: nil, view: "test_view",
|
7
6
|
teaser: "No teaser", body: "No body", tags: ["untagged"],
|
8
7
|
views: [], back: "javascript:history.go(-1)", home: "no url")
|
data/lib/helpers-blog.rb
CHANGED
@@ -1,89 +1,22 @@
|
|
1
1
|
require 'runeblog_version'
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
LEXT = ".lt3"
|
4
|
+
require 'xlate'
|
7
5
|
|
8
6
|
module RuneBlog::Helpers
|
9
7
|
|
10
8
|
def copy(src, dst)
|
11
9
|
log!(enter: __method__, args: [src, dst])
|
12
|
-
cmd = "cp #{src}
|
13
|
-
|
14
|
-
#
|
15
|
-
rc = system(cmd)
|
16
|
-
puts " FROM #{caller[0]}" unless rc
|
17
|
-
exit unless rc
|
18
|
-
# else
|
19
|
-
# FileUtils.cp(src, dst)
|
20
|
-
# end
|
10
|
+
cmd = "cp #{src} #{dst} 2>/dev/null"
|
11
|
+
rc = system(cmd)
|
12
|
+
puts " Failed: #{cmd} - from #{caller[0]}" unless rc
|
21
13
|
end
|
22
14
|
|
23
15
|
def copy!(src, dst)
|
24
16
|
log!(enter: __method__, args: [src, dst])
|
25
|
-
cmd = "cp -r #{src}
|
26
|
-
|
27
|
-
#
|
28
|
-
rc = system(cmd)
|
29
|
-
puts " FROM #{caller[0]}" unless rc
|
30
|
-
exit unless rc
|
31
|
-
# else
|
32
|
-
# FileUtils.cp_r(src, dst)
|
33
|
-
# end
|
34
|
-
end
|
35
|
-
|
36
|
-
def stale?(src, dst, force = false)
|
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
|
40
|
-
return true unless File.exist?(dst)
|
41
|
-
return true if File.mtime(src) > File.mtime(dst)
|
42
|
-
return false
|
43
|
-
end
|
44
|
-
|
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}")
|
85
|
-
end
|
86
|
-
STDERR.puts "...completed (shell returned #{rc})" if debug
|
17
|
+
cmd = "cp -r #{src} #{dst} 2>/dev/null"
|
18
|
+
rc = system(cmd)
|
19
|
+
puts " Failed: #{cmd} - from #{caller[0]}" unless rc
|
87
20
|
end
|
88
21
|
|
89
22
|
def get_root
|
@@ -131,7 +64,6 @@ exit unless rc
|
|
131
64
|
log!(enter: __method__, args: [file, hash])
|
132
65
|
return hash.values unless File.exist?(file)
|
133
66
|
vals = read_config(file, *hash.keys)
|
134
|
-
# STDERR.puts vals.inspect
|
135
67
|
vals
|
136
68
|
end
|
137
69
|
|
@@ -150,30 +82,19 @@ end
|
|
150
82
|
def write_config(obj, file)
|
151
83
|
log!(enter: __method__, args: [obj, file])
|
152
84
|
hash = obj.to_h
|
153
|
-
|
154
|
-
|
155
|
-
File.open(file, "w") do |f|
|
156
|
-
hash.each_pair do |key, val|
|
157
|
-
f.puts "#{key}: #{val}"
|
158
|
-
end
|
85
|
+
File.open(file, "w") do |out|
|
86
|
+
hash.each_pair {|key, val| out.puts "#{key}: #{val}" }
|
159
87
|
end
|
160
88
|
end
|
161
89
|
|
162
90
|
def get_views # read from filesystem
|
163
91
|
log!(enter: __method__)
|
164
|
-
|
165
|
-
|
166
|
-
Dir.exist?(@root) => "#@root doesn't exist",
|
167
|
-
Dir.exist?("#@root/views") => "#@root/views doesn't exist")
|
168
|
-
dirs = subdirs("#@root/views/").sort
|
169
|
-
dirs.map {|name| RuneBlog::View.new(name) }
|
170
|
-
# end
|
92
|
+
dirs = subdirs("#@root/views/").sort
|
93
|
+
dirs.map {|name| RuneBlog::View.new(name) }
|
171
94
|
end
|
172
95
|
|
173
96
|
def new_dotfile(root: ".blogs", current_view: "test_view", editor: "vi")
|
174
97
|
log!(enter: __method__, args: [root, current_view, editor])
|
175
|
-
# raise BlogAlreadyExists if Dir.exist?(".blogs")
|
176
|
-
# Dir.mkdir(".blogs")
|
177
98
|
root = Dir.pwd + "/" + root
|
178
99
|
x = OpenStruct.new
|
179
100
|
x.root, x.current_view, x.editor = root, current_view, editor
|
@@ -189,7 +110,6 @@ end
|
|
189
110
|
|
190
111
|
def subdirs(dir)
|
191
112
|
log!(enter: __method__, args: [dir])
|
192
|
-
verify(Dir.exist?(dir) => "Directory #{dir} not found")
|
193
113
|
dirs = Dir.entries(dir) - %w[. ..]
|
194
114
|
dirs.reject! {|x| ! File.directory?("#@root/views/#{x}") }
|
195
115
|
dirs
|
@@ -197,9 +117,6 @@ end
|
|
197
117
|
|
198
118
|
def find_draft_slugs
|
199
119
|
log!(enter: __method__)
|
200
|
-
verify(@root => "#@root is nil",
|
201
|
-
Dir.exist?(@root) => "#@root doesn't exist",
|
202
|
-
Dir.exist?("#@root/drafts") => "#@root/drafts doesn't exist")
|
203
120
|
files = Dir["#@root/drafts/**"].grep /\d{4}.*.lt3$/
|
204
121
|
flagfile = "#@root/drafts/last_rebuild"
|
205
122
|
last = File.exist?(flagfile) ? File.mtime(flagfile) : (Time.now - 86_400)
|
data/lib/helpers-repl.rb
CHANGED
@@ -161,7 +161,6 @@ module RuneBlog::REPL
|
|
161
161
|
n.times { @out << "\n" }
|
162
162
|
end
|
163
163
|
|
164
|
-
|
165
164
|
def check_empty(arg)
|
166
165
|
raise InternalError(caller[0], arg.inspect) unless arg.nil?
|
167
166
|
end
|
@@ -209,8 +208,6 @@ module RuneBlog::REPL
|
|
209
208
|
end
|
210
209
|
|
211
210
|
def ask_publishing_info # returns Publishing object
|
212
|
-
verify(@blog => "@blog is nil",
|
213
|
-
@blog.view => "@blog.view is nil")
|
214
211
|
# user, server, root, path, protocol = "http"
|
215
212
|
puts "Please enter publishing data for view #{@blog.view}..."
|
216
213
|
user = ask("User: ")
|
@@ -241,28 +238,4 @@ module RuneBlog::REPL
|
|
241
238
|
all.sort + ["NEW TAG"]
|
242
239
|
end
|
243
240
|
|
244
|
-
### find_asset
|
245
|
-
|
246
|
-
# FIXME is this per-post?
|
247
|
-
|
248
|
-
def find_asset(asset_name) # , views)
|
249
|
-
search_path = proc do |path|
|
250
|
-
full_path = path + asset_name
|
251
|
-
return full_path if File.exist?(full_path)
|
252
|
-
end
|
253
|
-
check_meta(@meta, "find_asset")
|
254
|
-
views = @meta.views
|
255
|
-
views.each do |view| search_path.call("#{view.dir}/#{@meta.slug}/assets/") end
|
256
|
-
views.each do |view| search_path.call(view.dir + "/assets/") end
|
257
|
-
search_path.call(@root + "/assets/", asset_name)
|
258
|
-
# If all fail... return nil
|
259
|
-
return nil
|
260
|
-
end
|
261
|
-
|
262
|
-
### find_all_assets
|
263
|
-
|
264
|
-
def find_all_assets(list, views)
|
265
|
-
list ||= []
|
266
|
-
list.each {|asset| puts "#{asset} => #{find_asset(asset, views)}" }
|
267
|
-
end
|
268
241
|
end
|
data/lib/liveblog.rb
CHANGED
@@ -2,11 +2,15 @@ require 'ostruct'
|
|
2
2
|
require 'pp'
|
3
3
|
require 'date'
|
4
4
|
|
5
|
-
require 'livetext'
|
5
|
+
# require 'livetext'
|
6
6
|
require 'runeblog'
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
require 'pathmagic'
|
9
|
+
|
10
|
+
require 'xlate'
|
11
|
+
|
12
|
+
# errfile = File.new("/tmp/liveblog.out", "w")
|
13
|
+
# STDERR.reopen(errfile)
|
10
14
|
|
11
15
|
def init_liveblog # FIXME - a lot of this logic sucks
|
12
16
|
here = Dir.pwd
|
@@ -24,21 +28,17 @@ end
|
|
24
28
|
|
25
29
|
# FIXME - stale? and livetext are duplicated from helpers-blog
|
26
30
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
else
|
38
|
-
dst = src.sub(/.lt3$/, "")
|
31
|
+
def livetext(src, dst=nil, cwd=Dir.pwd)
|
32
|
+
Dir.chdir(cwd) do
|
33
|
+
src += ".lt3" unless src.end_with?(".lt3")
|
34
|
+
if dst
|
35
|
+
dst += ".html" unless dst.end_with?(".html")
|
36
|
+
else
|
37
|
+
dst = src.sub(/.lt3$/, "")
|
38
|
+
end
|
39
|
+
return unless stale?(src, dst)
|
40
|
+
system("livetext #{src} >#{dst}")
|
39
41
|
end
|
40
|
-
return unless stale?(src, dst)
|
41
|
-
system("livetext #{src} >#{dst}")
|
42
42
|
end
|
43
43
|
|
44
44
|
def post
|
@@ -103,7 +103,7 @@ def _html_body(file)
|
|
103
103
|
end
|
104
104
|
|
105
105
|
def _write_card(cardfile, mainfile, pairs, card_title, tag, relative: true)
|
106
|
-
# HTML for
|
106
|
+
# HTML for card
|
107
107
|
log!(str: "Creating #{cardfile}.html", pwd: true)
|
108
108
|
# TTY.puts "Creating #{cardfile}.html - pwd = #{Dir.pwd}"
|
109
109
|
File.open("#{cardfile}.html", "w") do |f|
|
@@ -120,7 +120,6 @@ def _write_card(cardfile, mainfile, pairs, card_title, tag, relative: true)
|
|
120
120
|
top = ""
|
121
121
|
top = :widgets/tag + "/" unless tag == "news" # FIXME !!
|
122
122
|
pairs.each do |file, title|
|
123
|
-
# took out #{top}#{file}
|
124
123
|
f.puts <<-EOS
|
125
124
|
<li class="list-group-item"> <a href="javascript: void(0)"
|
126
125
|
onclick="javascript:open_main('#{top}#{file}')">#{title}</a> </li>
|
@@ -134,7 +133,6 @@ def _write_card(cardfile, mainfile, pairs, card_title, tag, relative: true)
|
|
134
133
|
end
|
135
134
|
|
136
135
|
def _write_main(mainfile, pairs, card_title)
|
137
|
-
# HTML for main area (iframe)
|
138
136
|
log!(str: "Creating #{mainfile}.html", pwd: true)
|
139
137
|
File.open("#{mainfile}.html", "w") do |f|
|
140
138
|
_html_body(f) do
|
@@ -286,25 +284,18 @@ def teaser
|
|
286
284
|
end
|
287
285
|
|
288
286
|
def finalize
|
289
|
-
STDERR.puts :cp1
|
290
287
|
unless @meta
|
291
288
|
puts @live.body
|
292
289
|
return
|
293
290
|
end
|
294
|
-
STDERR.puts :cp4
|
295
291
|
if @blog.nil?
|
296
292
|
return @meta
|
297
293
|
end
|
298
294
|
|
299
|
-
STDERR.puts :cp6
|
300
295
|
@slug = @blog.make_slug(@meta)
|
301
|
-
STDERR.puts :cp7
|
302
296
|
slug_dir = @slug
|
303
297
|
@postdir = @blog.view.dir/:posts/slug_dir
|
304
|
-
STDERR.puts "--- finalize: pwd = #{Dir.pwd} postdir = #@postdir"
|
305
|
-
STDERR.puts :cp8
|
306
298
|
write_post
|
307
|
-
STDERR.puts :cp9
|
308
299
|
@meta
|
309
300
|
end
|
310
301
|
|
@@ -397,10 +388,8 @@ def head # Does NOT output tags
|
|
397
388
|
# Later: allow other overrides
|
398
389
|
when ""; break
|
399
390
|
else
|
400
|
-
STDERR.puts "-- got '#{word}'; old value = #{result[word].inspect}"
|
401
391
|
if defaults[word]
|
402
392
|
result[word] = %[<meta property="#{word}" content="#{remain}">]
|
403
|
-
STDERR.puts "-- new value = #{result[word].inspect}"
|
404
393
|
else
|
405
394
|
puts "Unknown tag '#{word}'"
|
406
395
|
end
|
@@ -408,7 +397,6 @@ STDERR.puts "-- new value = #{result[word].inspect}"
|
|
408
397
|
end
|
409
398
|
hash = defaults.dup.update(result) # FIXME collisions?
|
410
399
|
|
411
|
-
# _out "<!-- "; _out hash.inspect; _out "--> "
|
412
400
|
hash.each_value {|x| _out " " + x }
|
413
401
|
_out "<body>"
|
414
402
|
end
|
@@ -445,16 +433,34 @@ def recent_posts # side-effect
|
|
445
433
|
end
|
446
434
|
|
447
435
|
def sidebar
|
436
|
+
STDERR.puts "---- SIDEBAR pwd = #{Dir.pwd}"
|
437
|
+
_out %[<div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">]
|
438
|
+
_body do |token|
|
439
|
+
tag = token.chomp.strip.downcase
|
440
|
+
wtag = :widgets/tag
|
441
|
+
raise "Can't find #{wtag}" unless Dir.exist?(wtag)
|
442
|
+
tcard = "#{tag}-card.html"
|
443
|
+
# livetext tag, tcard, wtag
|
444
|
+
xlate cwd: wtag, src: tag, dst: tcard, debug: true
|
445
|
+
_include_file wtag/tcard
|
446
|
+
end
|
447
|
+
_out %[</div>]
|
448
|
+
end
|
449
|
+
|
450
|
+
def sidebar!
|
451
|
+
# if _args.include? "off"
|
452
|
+
# _body { } # iterate, do nothing
|
453
|
+
# return
|
454
|
+
# end
|
448
455
|
_out %[<div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">]
|
449
456
|
_args do |token|
|
450
457
|
tag = token.chomp.strip.downcase
|
451
458
|
wtag = :widgets/tag
|
452
459
|
raise "Can't find #{wtag}" unless Dir.exist?(wtag)
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
end
|
460
|
+
tcard = "#{tag}-card.html"
|
461
|
+
# livetext tag, tcard, wtag
|
462
|
+
xlate cwd: wtag, src: tag, dst: tcard, debug: true
|
463
|
+
_include_file wtag/tcard
|
458
464
|
end
|
459
465
|
_out %[</div>]
|
460
466
|
end
|
@@ -475,44 +481,6 @@ def script
|
|
475
481
|
_out %[<script src="#{url}" integrity="#{integ}" crossorigin="#{cross}"></script>]
|
476
482
|
end
|
477
483
|
|
478
|
-
# def _find_recent_posts
|
479
|
-
# @vdir = _var(:FileDir).match(%r[(^.*/views/.*?)/])[1]
|
480
|
-
# posts = nil
|
481
|
-
# dir_posts = @vdir + "/posts"
|
482
|
-
# entries = Dir.entries(dir_posts)
|
483
|
-
# posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
|
484
|
-
# posts.select! {|x| File.directory?(x) }
|
485
|
-
# # directories that start with four digits
|
486
|
-
# posts = posts.sort {|a, b| b.to_i <=> a.to_i } # sort descending
|
487
|
-
# posts[0..19] # return 20 at most
|
488
|
-
# end
|
489
|
-
#
|
490
|
-
# def all_teasers
|
491
|
-
# open = <<-HTML
|
492
|
-
# <section class="posts">
|
493
|
-
# HTML
|
494
|
-
# close = <<-HTML
|
495
|
-
# </section>
|
496
|
-
# HTML
|
497
|
-
#
|
498
|
-
# text = <<-HTML
|
499
|
-
# <html>
|
500
|
-
# <head><link rel="stylesheet" href="etc/blog.css"></head>
|
501
|
-
# <body>
|
502
|
-
# HTML
|
503
|
-
# posts = _find_recent_posts
|
504
|
-
# wanted = [5, posts.size].min # estimate how many we want?
|
505
|
-
# enum = posts.each
|
506
|
-
# wanted.times do
|
507
|
-
# postid = File.basename(enum.next)
|
508
|
-
# postid = postid.to_i
|
509
|
-
# text << _teaser(postid) # side effect! calls _out
|
510
|
-
# end
|
511
|
-
# text << "</body></html>"
|
512
|
-
# File.write("recent.html", text)
|
513
|
-
# _out %[<iframe id="main" style="width: 100vw; height: 100vh; position: relative;" src='recent.html' width=100% frameborder="0" allowfullscreen></iframe>]
|
514
|
-
# end
|
515
|
-
|
516
484
|
def _post_lookup(postid) # side-effect
|
517
485
|
# .. = templates, ../.. = views/thisview
|
518
486
|
slug = title = date = teaser_text = nil
|
@@ -533,22 +501,6 @@ def _interpolate(str, context) # FIXME move this later
|
|
533
501
|
eval(wrapped, context)
|
534
502
|
end
|
535
503
|
|
536
|
-
# def _teaser(slug)
|
537
|
-
# id = slug.to_i
|
538
|
-
# text = nil
|
539
|
-
# post_entry_name = @theme + "blog/post_entry.lt3"
|
540
|
-
# @_post_entry ||= File.read(post_entry_name)
|
541
|
-
# vp = _post_lookup(id)
|
542
|
-
# nslug, aslug, title, date, teaser_text =
|
543
|
-
# vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
|
544
|
-
# path = vp.path
|
545
|
-
# url = "#{path}/#{aslug}.html" # Should be relative to .blogs!! FIXME
|
546
|
-
# date = Date.parse(date)
|
547
|
-
# date = date.strftime("%B %e<br>%Y")
|
548
|
-
# text = _interpolate(@_post_entry, binding)
|
549
|
-
# text
|
550
|
-
# end
|
551
|
-
|
552
504
|
def _card_generic(card_title:, middle:, extra: "")
|
553
505
|
front = <<-HTML
|
554
506
|
<div class="card #{extra} mb-3">
|
data/lib/logging.rb
CHANGED
@@ -31,28 +31,5 @@ unless self.respond_to?("log!")
|
|
31
31
|
$log = File.new("/tmp/runeblog.log","a")
|
32
32
|
end
|
33
33
|
|
34
|
-
# def log(str: "", enter: nil, args: [], pwd: false, dir: false)
|
35
|
-
# return unless $logging
|
36
|
-
# time = Time.now.strftime("%H:%M:%S")
|
37
|
-
# meth = ""
|
38
|
-
# meth = "#{enter}" if enter
|
39
|
-
# para = " args: #{args.inspect[1..-2]}"
|
40
|
-
# source = caller[0].sub(/.*\//, " in ").sub(/:/, " line ").sub(/:.*/, "")
|
41
|
-
# source = " in #{source} (probably liveblog.rb)" if source.include? "(eval)"
|
42
|
-
# str = " ... #{str}" unless str.empty?
|
43
|
-
# indent = " "*12
|
44
|
-
# STDERR.puts "#{time} #{str} #{meth}"
|
45
|
-
# STDERR.puts "#{indent} #{source}"
|
46
|
-
# STDERR.puts "#{indent} pwd = #{Dir.pwd} " if pwd
|
47
|
-
# if dir
|
48
|
-
# files = (Dir.entries('.') - %w[. ..]).join(" ")
|
49
|
-
# STDERR.puts "#{indent} dir/* = #{files}"
|
50
|
-
# end
|
51
|
-
# STDERR.puts "#{indent} #{para} " unless args.empty?
|
52
|
-
# # STDERR.puts "#{indent} livetext params = #{livedata.inpect} " unless livedata.nil?
|
53
|
-
# STDERR.puts
|
54
|
-
# # $log.close
|
55
|
-
# # $log = File.new("/tmp/runeblog.log","a")
|
56
|
-
# end
|
57
34
|
end
|
58
35
|
|
data/lib/post.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
# require 'helpers-blog'
|
2
1
|
require 'runeblog'
|
3
2
|
require 'global'
|
3
|
+
require 'pathmagic'
|
4
4
|
|
5
5
|
class RuneBlog::Post
|
6
6
|
|
7
7
|
attr_reader :num, :title, :date, :views, :num, :slug
|
8
|
-
|
9
8
|
attr_accessor :meta, :blog, :draft
|
10
9
|
|
11
10
|
include RuneBlog::Helpers
|
@@ -22,17 +21,11 @@ class RuneBlog::Post
|
|
22
21
|
raise "Doesn't work right now"
|
23
22
|
raise NoBlogAccessor if RuneBlog.blog.nil?
|
24
23
|
# "post" is a slug
|
25
|
-
pdir = RuneBlog.blog.view.dir
|
24
|
+
pdir = RuneBlog.blog.view.dir/post
|
26
25
|
verify(Dir.exist?(pdir) => "Directory #{pdir} not found")
|
27
26
|
meta = nil
|
28
27
|
Dir.chdir(pdir) do
|
29
|
-
verify(File.exist?("metadata.txt") => "metadata.txt not found",
|
30
|
-
File.exist?("teaser.txt") => "teaser.txt not found")
|
31
|
-
# File.exist?("body.txt") => "body.txt not found")
|
32
28
|
meta = read_config("metadata.txt")
|
33
|
-
verify(meta.date => "meta.date is nil",
|
34
|
-
meta.views => "meta.views is nil",
|
35
|
-
meta.tags => "meta.tags is nil")
|
36
29
|
meta.date = Date.parse(meta.date)
|
37
30
|
meta.views = meta.views.split
|
38
31
|
meta.tags = meta.tags.split
|
@@ -50,8 +43,6 @@ class RuneBlog::Post
|
|
50
43
|
hash = meta.to_h
|
51
44
|
|
52
45
|
File.write("teaser.txt", hash[:teaser])
|
53
|
-
# STDERR.puts ">>>> #{__method__}: writing #{@live.body.size} bytes to #{Dir.pwd}/body.txt"
|
54
|
-
# File.write("body.txt", hash[:body])
|
55
46
|
hash.delete(:teaser)
|
56
47
|
hash.delete(:body)
|
57
48
|
|
@@ -75,7 +66,7 @@ class RuneBlog::Post
|
|
75
66
|
other_views:[])
|
76
67
|
log!(enter: __method__, args: [title, teaser, body, pubdate, other_views])
|
77
68
|
post = self.new
|
78
|
-
# ONLY place next_sequence is called!
|
69
|
+
# NOTE: This is the ONLY place next_sequence is called!
|
79
70
|
num = post.meta.num = post.blog.next_sequence
|
80
71
|
|
81
72
|
# new_metadata
|
@@ -91,10 +82,8 @@ class RuneBlog::Post
|
|
91
82
|
text = RuneBlog.post_template(num: meta.num, title: meta.title, date: meta.pubdate,
|
92
83
|
view: meta.view, teaser: meta.teaser, body: meta.body,
|
93
84
|
views: meta.views, tags: meta.tags, home: viewhome)
|
94
|
-
srcdir =
|
95
|
-
vpdir =
|
96
|
-
verify(Dir.exist?(srcdir) => "#{srcdir} not found",
|
97
|
-
meta.slug.is_a?(String) => "slug #{meta.slug.inspect} is invalid")
|
85
|
+
srcdir = post.blog.root/:drafts + "/"
|
86
|
+
vpdir = post.blog.root/:drafts + "/"
|
98
87
|
fname = meta.slug + ".lt3"
|
99
88
|
post.draft = srcdir + fname
|
100
89
|
dump(text, post.draft)
|
@@ -134,7 +123,7 @@ class RuneBlog::ViewPost
|
|
134
123
|
fname = "#{postdir}/teaser.txt"
|
135
124
|
@teaser_text = File.read(fname).chomp
|
136
125
|
# FIXME dumb hacks...
|
137
|
-
mdfile =
|
126
|
+
mdfile = postdir/"metadata.txt"
|
138
127
|
lines = File.readlines(mdfile)
|
139
128
|
@title = lines.grep(/title:/).first[7..-1].chomp
|
140
129
|
@date = lines.grep(/pubdate:/).first[9..-1].chomp
|
@@ -144,12 +133,12 @@ class RuneBlog::ViewPost
|
|
144
133
|
log!(enter: __method__, args: [view, postdir])
|
145
134
|
fname = File.basename(draft)
|
146
135
|
noext = fname.sub(/.lt3$/, "")
|
147
|
-
vdir =
|
148
|
-
dir =
|
136
|
+
vdir = @root/:views/view
|
137
|
+
dir = vdir/:posts/noext + "/"
|
149
138
|
Dir.mkdir(dir) unless Dir.exist?(dir)
|
150
139
|
system("cp #{draft} #{dir}")
|
151
140
|
viewdir, slugdir, aslug = vdir, dir, noext[5..-1]
|
152
|
-
theme = viewdir
|
141
|
+
theme = viewdir/:themes/:standard
|
153
142
|
[noext, viewdir, slugdir, aslug, theme]
|
154
143
|
end
|
155
144
|
|
data/lib/publish.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
# require 'helpers-blog'
|
2
|
-
# require 'runeblog'
|
3
1
|
require 'global'
|
2
|
+
require 'pathmagic'
|
4
3
|
|
5
4
|
class RuneBlog::Publishing
|
6
5
|
attr_reader :user, :server, :docroot, :path
|
@@ -42,15 +41,14 @@ class RuneBlog::Publishing
|
|
42
41
|
|
43
42
|
def publish(files, assets=[])
|
44
43
|
log!(enter: __method__, args: [files, assets])
|
45
|
-
dir =
|
44
|
+
dir = @docroot/@path
|
46
45
|
view_name = @blog.view.name
|
47
|
-
viewpath =
|
46
|
+
viewpath = dir/view_name
|
48
47
|
result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}")
|
49
48
|
result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}/assets")
|
50
49
|
files.each do |file|
|
51
|
-
dest = "#@user@#@server
|
50
|
+
dest = "#@user@#@server:" + dir/view_name
|
52
51
|
file.gsub!(/\/\//, "/") # weird... :-/
|
53
|
-
dest.gsub!(/\/\//, "/") # weird... :-/
|
54
52
|
cmd = "scp -r #{file} #{dest} >/dev/null 2>/tmp/wtf"
|
55
53
|
debug "cmd = #{cmd.inspect} - see /tmp/wtf"
|
56
54
|
result = system!(cmd) || puts("\n Could not copy #{file} to #{dest}")
|
@@ -74,8 +72,8 @@ class RuneBlog::Publishing
|
|
74
72
|
|
75
73
|
def remote_permissions?
|
76
74
|
log!(enter: __method__)
|
77
|
-
dir =
|
78
|
-
temp =
|
75
|
+
dir = @docroot/@path
|
76
|
+
temp = @path/"__only_testing"
|
79
77
|
try1 = system("ssh -o BatchMode=yes -o ConnectTimeout=1 #@user@#@server -x mkdir -p #{temp} >/dev/null 2>&1")
|
80
78
|
return nil unless try1
|
81
79
|
try2 = system("ssh -o BatchMode=yes -o ConnectTimeout=1 #@user@#@server -x rmdir #{temp} >/dev/null 2>&1")
|
@@ -84,4 +82,3 @@ class RuneBlog::Publishing
|
|
84
82
|
end
|
85
83
|
end
|
86
84
|
|
87
|
-
|
data/lib/repl.rb
CHANGED
@@ -10,7 +10,6 @@ module RuneBlog::REPL
|
|
10
10
|
|
11
11
|
def edit_file(file)
|
12
12
|
result = system("#{@blog.editor} #{file}")
|
13
|
-
STDERR.puts "editor = #{@blog.editor} FILE = #{file}"
|
14
13
|
raise EditorProblem(file) unless result
|
15
14
|
sleep 0.1
|
16
15
|
STDSCR.clear
|
@@ -222,7 +221,6 @@ STDERR.puts "editor = #{@blog.editor} FILE = #{file}"
|
|
222
221
|
id = get_integer(arg)
|
223
222
|
result = @blog.remove_post(id)
|
224
223
|
output! "Post #{id} not found" if result.nil?
|
225
|
-
# puts "Post #{id} not found" if result.nil?
|
226
224
|
@out
|
227
225
|
end
|
228
226
|
|
data/lib/runeblog.rb
CHANGED
@@ -114,7 +114,7 @@ class RuneBlog
|
|
114
114
|
nslug = sourcefile.sub(/.lt3/, "")
|
115
115
|
dir = @root/:posts/nslug
|
116
116
|
create_dir(dir)
|
117
|
-
xlate cwd: dir, src: sourcefile, debug: true
|
117
|
+
xlate cwd: dir, src: sourcefile # , debug: true
|
118
118
|
_deploy_local(dir)
|
119
119
|
end
|
120
120
|
|
@@ -323,12 +323,6 @@ class RuneBlog
|
|
323
323
|
end
|
324
324
|
text << "</body></html>"
|
325
325
|
File.write(@vdir/:remote/file, text)
|
326
|
-
# iframe_text = <<-HTML
|
327
|
-
# <iframe name="main" style="width: 100vw;height: 100vh;position: relative;"
|
328
|
-
# src='recent.html' width=100% frameborder="0" allowfullscreen>
|
329
|
-
# </iframe>
|
330
|
-
# HTML
|
331
|
-
# FIXME ^ serves no purpose??
|
332
326
|
end
|
333
327
|
|
334
328
|
def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
|
@@ -380,7 +374,7 @@ class RuneBlog
|
|
380
374
|
self.view = view # error checking?
|
381
375
|
end
|
382
376
|
|
383
|
-
def generate_index(view)
|
377
|
+
def generate_index(view)
|
384
378
|
log!(enter: __method__, args: [view], pwd: true, dir: true)
|
385
379
|
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
386
380
|
@vdir = @root/:views/view
|
@@ -423,7 +417,6 @@ class RuneBlog
|
|
423
417
|
log!(enter: __method__, args: [draft, pdraft])
|
424
418
|
title_line = File.readlines(draft).grep(/^.title /).first
|
425
419
|
title = title_line.split(" ", 2)[1]
|
426
|
-
# pdir = "
|
427
420
|
Dir.chdir(pdraft) do
|
428
421
|
excerpt = File.read("teaser.txt")
|
429
422
|
vars = %[.set title="#{title.chomp}"\n] +
|
@@ -442,13 +435,15 @@ class RuneBlog
|
|
442
435
|
dir = File.basename(w)
|
443
436
|
rem = w.sub(/themes.standard/, "remote")
|
444
437
|
create_dirs(rem)
|
445
|
-
|
438
|
+
files = Dir[w/"*"]
|
439
|
+
next unless files.any? {|x| x =~ /html$/ }
|
446
440
|
system("cp #{w}/*html #{rem}")
|
447
441
|
end
|
448
442
|
end
|
449
443
|
|
450
444
|
def _handle_post(draft, view)
|
451
445
|
log!(enter: __method__, args: [draft, view])
|
446
|
+
# break into separate methods?
|
452
447
|
|
453
448
|
fname = File.basename(draft) # 0001-this-is-a-post.lt3
|
454
449
|
nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
|
@@ -469,9 +464,9 @@ class RuneBlog
|
|
469
464
|
copy(pdraft/"vars.lt3", @theme/:post)
|
470
465
|
# Step 4...
|
471
466
|
xlate cwd: @theme/:post, src: "generate.lt3",
|
472
|
-
dst: remote/ahtml, copy: @theme/:post
|
467
|
+
dst: remote/ahtml, copy: @theme/:post # , debug: true
|
473
468
|
xlate cwd: @theme/:post, src: "permalink.lt3",
|
474
|
-
dst: remote/:permalink/ahtml
|
469
|
+
dst: remote/:permalink/ahtml # , debug: true
|
475
470
|
copy_widget_html(view)
|
476
471
|
end
|
477
472
|
|
@@ -480,11 +475,11 @@ class RuneBlog
|
|
480
475
|
views = _get_views(draft)
|
481
476
|
views.each do |view|
|
482
477
|
_handle_post(draft, view)
|
483
|
-
generate_view(view)
|
478
|
+
generate_view(view) # FIXME leads to inefficiency?
|
484
479
|
end
|
485
480
|
end
|
486
481
|
|
487
|
-
def relink
|
482
|
+
def relink # FIXME no longer used?
|
488
483
|
log!(enter: __method__)
|
489
484
|
self.views.each {|view| generate_index(view) }
|
490
485
|
end
|
data/lib/runeblog_version.rb
CHANGED
data/lib/view.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
# require 'helpers-blog'
|
2
|
-
# require 'runeblog'
|
3
1
|
require 'global'
|
2
|
+
require 'logging'
|
4
3
|
|
5
4
|
class RuneBlog::View
|
6
5
|
attr_reader :name, :state
|
@@ -22,7 +21,7 @@ class RuneBlog::View
|
|
22
21
|
end
|
23
22
|
|
24
23
|
def dir
|
25
|
-
|
24
|
+
log!(enter: __method__)
|
26
25
|
@blog.root + "/views/#@name/"
|
27
26
|
end
|
28
27
|
|
data/lib/xlate.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
LEXT = ".lt3"
|
3
|
+
|
4
|
+
def stale?(src, dst, force = false)
|
5
|
+
log!(enter: __method__, args: [src, dst])
|
6
|
+
raise "Source #{src} not found in #{Dir.pwd}" unless File.exist?(src)
|
7
|
+
return true if force
|
8
|
+
return true unless File.exist?(dst)
|
9
|
+
return true if File.mtime(src) > File.mtime(dst)
|
10
|
+
return false
|
11
|
+
end
|
12
|
+
|
13
|
+
def xlate(cwd: Dir.pwd, src:,
|
14
|
+
dst: (strip = true; src.sub(/.lt3$/,"")),
|
15
|
+
copy: nil, debug: false, force: false)
|
16
|
+
src += LEXT unless src.end_with?(LEXT)
|
17
|
+
dst += ".html" unless dst.end_with?(".html") || strip
|
18
|
+
STDERR.puts "-- xlate: pwd = #{cwd}"
|
19
|
+
Dir.chdir(cwd) do
|
20
|
+
return unless stale?(src, dst, force)
|
21
|
+
if debug
|
22
|
+
STDERR.puts "-- xlate #{src} >#{dst}"
|
23
|
+
STDERR.puts " in: #{Dir.pwd}"
|
24
|
+
STDERR.puts " from: #{caller[0]}"
|
25
|
+
STDERR.puts " copy: #{copy}" if copy
|
26
|
+
end
|
27
|
+
rc = system("livetext #{src} >#{dst}")
|
28
|
+
STDERR.puts "...completed (shell returned #{rc})" if debug
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
data/test/make_blog.rb
CHANGED
@@ -15,14 +15,18 @@ def getch
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def debug(str)
|
18
|
-
|
18
|
+
STDERR.puts ">>> #{str} #{Time.now}"
|
19
19
|
end
|
20
20
|
|
21
21
|
def make_post(x, title, teaser, body, views=[])
|
22
|
-
|
23
|
-
|
22
|
+
debug " make_post '#{title}'"
|
23
|
+
# print "."
|
24
24
|
x.create_new_post(title, true, teaser: teaser, body: body, other_views: views)
|
25
|
-
views.each
|
25
|
+
views.each do |view|
|
26
|
+
debug " generate_index #{view}"
|
27
|
+
x.generate_index(view)
|
28
|
+
end # recent.html
|
29
|
+
STDERR.puts
|
26
30
|
end
|
27
31
|
|
28
32
|
def show_lines(text)
|
@@ -40,6 +44,7 @@ system("rm -rf .blogs")
|
|
40
44
|
RuneBlog.create_new_blog_repo(".blogs")
|
41
45
|
x = RuneBlog.new(".blogs")
|
42
46
|
|
47
|
+
debug("create_view 'around_austin'")
|
43
48
|
x.create_view("around_austin") # FIXME remember view title!
|
44
49
|
|
45
50
|
# Hack:
|
@@ -47,8 +52,10 @@ if File.exist?("publish")
|
|
47
52
|
system("cp publish .blogs/views/around_austin/publish")
|
48
53
|
end
|
49
54
|
|
55
|
+
debug("create_view 'computing'")
|
50
56
|
x.create_view("computing")
|
51
57
|
|
58
|
+
debug("create_view 'music'")
|
52
59
|
x.create_view("music")
|
53
60
|
|
54
61
|
x.change_view("around_austin") # 1 2 7 8 9
|
@@ -126,6 +133,7 @@ But I first heard of them
|
|
126
133
|
in 2005.
|
127
134
|
BODY
|
128
135
|
|
136
|
+
debug("GENERATE_view 'around_austin'")
|
129
137
|
x.generate_view("around_austin")
|
130
138
|
|
131
139
|
x.change_view("around_austin")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runeblog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/runeblog.rb
|
77
77
|
- lib/runeblog_version.rb
|
78
78
|
- lib/view.rb
|
79
|
+
- lib/xlate.rb
|
79
80
|
- test/config
|
80
81
|
- test/fakeimage.jpg
|
81
82
|
- test/general_test.rb
|