runeblog 0.2.16 → 0.2.17
Sign up to get free protection for your applications and to get access to all the features.
- 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
|