runeblog 0.2.46 → 0.2.51
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/bin/blog +4 -3
- data/empty_view/assets/austin-pano.jpg +0 -0
- data/empty_view/themes/standard/banner/about.lt3 +18 -0
- data/empty_view/themes/standard/banner/blog-banner.jpg +0 -0
- data/empty_view/themes/standard/banner/contact.lt3 +18 -0
- data/empty_view/themes/standard/banner/faq.lt3 +1 -0
- data/empty_view/themes/standard/banner/navbar.lt3 +17 -0
- data/empty_view/themes/standard/blog/generate.lt3 +5 -3
- data/empty_view/themes/standard/blog/post_entry.lt3 +4 -1
- data/empty_view/themes/standard/navbar/navbar.lt3 +1 -1
- data/empty_view/themes/standard/widgets/pages/faq.lt3 +34 -3
- data/lib/global.rb +13 -39
- data/lib/helpers-blog.rb +0 -29
- data/lib/helpers-repl.rb +1 -0
- data/lib/liveblog.rb +142 -10
- data/lib/post.rb +18 -14
- data/lib/publish.rb +0 -1
- data/lib/repl.rb +127 -13
- data/lib/runeblog.rb +95 -59
- data/lib/runeblog_version.rb +1 -1
- data/lib/view.rb +0 -1
- data/lib/xlate.rb +38 -32
- data/test/austin.rb +2 -0
- metadata +8 -2
data/lib/post.rb
CHANGED
@@ -11,7 +11,7 @@ class RuneBlog::Post
|
|
11
11
|
|
12
12
|
def self.files(num, root)
|
13
13
|
log!(enter: __method__, args: [num, root], level: 3)
|
14
|
-
files = Find.find(root).to_a
|
14
|
+
files = ::Find.find(root).to_a
|
15
15
|
result = files.grep(/#{prefix(num)}-/)
|
16
16
|
result
|
17
17
|
end
|
@@ -22,7 +22,6 @@ class RuneBlog::Post
|
|
22
22
|
raise NoBlogAccessor if RuneBlog.blog.nil?
|
23
23
|
# "post" is a slug
|
24
24
|
pdir = RuneBlog.blog.view.dir/post
|
25
|
-
verify(Dir.exist?(pdir) => "Directory #{pdir} not found")
|
26
25
|
meta = nil
|
27
26
|
Dir.chdir(pdir) do
|
28
27
|
meta = read_config("metadata.txt")
|
@@ -63,8 +62,8 @@ class RuneBlog::Post
|
|
63
62
|
end
|
64
63
|
|
65
64
|
def self.create(title:, teaser:, body:, pubdate: Time.now.strftime("%Y-%m-%d"),
|
66
|
-
views:[])
|
67
|
-
log!(enter: __method__, args: [title, teaser, body, pubdate, views])
|
65
|
+
views:[], file: nil)
|
66
|
+
log!(enter: __method__, args: [title, teaser, body, pubdate, views], stderr: true)
|
68
67
|
post = self.new
|
69
68
|
# NOTE: This is the ONLY place next_sequence is called!
|
70
69
|
num = post.meta.num = post.blog.next_sequence
|
@@ -73,27 +72,29 @@ class RuneBlog::Post
|
|
73
72
|
post.meta.title, post.meta.teaser, post.meta.body, post.meta.pubdate =
|
74
73
|
title, teaser, body, pubdate
|
75
74
|
post.meta.views = [post.blog.view.to_s] + views
|
76
|
-
# STDERR.puts "Post.create: views = #{views.inspect}"
|
77
75
|
post.meta.tags = []
|
78
76
|
post.blog.make_slug(post.meta) # adds to meta
|
79
77
|
|
80
78
|
# create_draft
|
81
79
|
viewhome = post.blog.view.publisher.url
|
82
80
|
meta = post.meta
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
81
|
+
if file.nil?
|
82
|
+
text = RuneBlog.post_template(num: meta.num, title: meta.title, date: meta.pubdate,
|
83
|
+
view: meta.view, teaser: meta.teaser, body: meta.body,
|
84
|
+
views: meta.views, tags: meta.tags, home: viewhome)
|
85
|
+
srcdir = post.blog.root/:drafts + "/"
|
86
|
+
vpdir = post.blog.root/:drafts + "/"
|
87
|
+
fname = meta.slug + ".lt3"
|
88
|
+
post.draft = srcdir + fname
|
89
|
+
dump(text, post.draft)
|
90
|
+
else
|
91
|
+
dump(File.read(file), post.draft)
|
92
|
+
end
|
91
93
|
return post
|
92
94
|
end
|
93
95
|
|
94
96
|
def edit
|
95
97
|
log!(enter: __method__)
|
96
|
-
verify(File.exist?(@draft) => "File #{@draft} not found")
|
97
98
|
result = system!("vi #@draft +8") # TODO improve this
|
98
99
|
raise EditorProblem(draft) unless result
|
99
100
|
nil
|
@@ -128,6 +129,9 @@ class RuneBlog::ViewPost
|
|
128
129
|
lines = File.readlines(mdfile)
|
129
130
|
@title = lines.grep(/title:/).first[7..-1].chomp
|
130
131
|
@date = lines.grep(/pubdate:/).first[9..-1].chomp
|
132
|
+
# print "-- date = #{@date.inspect} "; gets
|
133
|
+
rescue => err
|
134
|
+
STDERR.puts "--- #{err}\n #{err.backtrace.join("\n ")}"
|
131
135
|
end
|
132
136
|
|
133
137
|
def get_dirs
|
data/lib/publish.rb
CHANGED
@@ -43,7 +43,6 @@ class RuneBlog::Publishing
|
|
43
43
|
dir = @docroot/@path
|
44
44
|
view_name = @blog.view.name
|
45
45
|
viewpath = dir # /view_name
|
46
|
-
# result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}")
|
47
46
|
result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}/assets")
|
48
47
|
files.each do |file|
|
49
48
|
dest = "#@user@#@server:" + dir # /view_name
|
data/lib/repl.rb
CHANGED
@@ -7,18 +7,19 @@ make_exception(:PublishError, "Error during publishing")
|
|
7
7
|
make_exception(:EditorProblem, "Could not edit $1")
|
8
8
|
|
9
9
|
module RuneBlog::REPL
|
10
|
-
|
11
10
|
def edit_file(file)
|
12
11
|
result = system!("#{@blog.editor} #{file}")
|
13
12
|
raise EditorProblem(file) unless result
|
14
13
|
sleep 0.1
|
15
|
-
|
14
|
+
cmd_clear(nil)
|
16
15
|
end
|
17
16
|
|
18
17
|
def cmd_quit(arg, testing = false)
|
19
18
|
check_empty(arg)
|
20
19
|
RubyText.stop
|
21
|
-
|
20
|
+
sleep 0.1
|
21
|
+
cmd_clear(nil)
|
22
|
+
sleep 0.1
|
22
23
|
exit
|
23
24
|
end
|
24
25
|
|
@@ -36,7 +37,77 @@ module RuneBlog::REPL
|
|
36
37
|
@out
|
37
38
|
end
|
38
39
|
|
39
|
-
def
|
40
|
+
def cmd_config(arg, testing = false)
|
41
|
+
list = ["global.lt3", "blog/generate.lt3", " head.lt3", " index.lt3",
|
42
|
+
" post_entry.lt3", "etc/blog.css.lt3", " externals.lt3",
|
43
|
+
"post/generate.lt3", " head.lt3", " index.lt3",
|
44
|
+
" permalink.lt3"]
|
45
|
+
name = ["global.lt3", "blog/generate.lt3", "blog/head.lt3", "blog/index.lt3",
|
46
|
+
"blog/post_entry.lt3", "etc/blog.css.lt3", "blog/externals.lt3",
|
47
|
+
"post/generate.lt3", "post/head.lt3", "post/index.lt3",
|
48
|
+
"post/permalink.lt3"]
|
49
|
+
dir = @blog.view.dir/"themes/standard/"
|
50
|
+
num, str = STDSCR.menu(title: "Edit file:", items: list)
|
51
|
+
target = name[num]
|
52
|
+
edit_file(dir/target)
|
53
|
+
end
|
54
|
+
|
55
|
+
def cmd_manage(arg, testing = false)
|
56
|
+
case arg
|
57
|
+
when "pages"; _manage_pages(nil, testing = false)
|
58
|
+
when "links"; _manage_links(nil, testing = false)
|
59
|
+
when "navbar"; _manage_navbar(nil, testing = false)
|
60
|
+
# when "pinned"; _manage_pinned(nil, testing = false) # ditch this??
|
61
|
+
else
|
62
|
+
puts "#{arg} is unknown"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def _manage_pinned(arg, testing = false) # cloned from manage_links
|
67
|
+
check_empty(arg)
|
68
|
+
dir = @blog.view.dir/"themes/standard/widgets/pinned"
|
69
|
+
data = dir/"list.data"
|
70
|
+
edit_file(data)
|
71
|
+
end
|
72
|
+
|
73
|
+
def _manage_navbar(arg, testing = false) # cloned from manage_pages
|
74
|
+
puts "Got to #{__method__}"
|
75
|
+
check_empty(arg)
|
76
|
+
dir = @blog.view.dir/"themes/standard/navbar"
|
77
|
+
files = Dir.entries(dir) - %w[. .. navbar.lt3]
|
78
|
+
new_item = " [New item] "
|
79
|
+
main_file = "[ navbar.lt3 ]"
|
80
|
+
files = [main_file] + files + [new_item]
|
81
|
+
num, fname = STDSCR.menu(title: "Edit navbar:", items: files)
|
82
|
+
return if fname.nil?
|
83
|
+
case fname
|
84
|
+
when new_item
|
85
|
+
print "Page title: "
|
86
|
+
title = RubyText.gets
|
87
|
+
title.chomp!
|
88
|
+
print "File name (.lt3): "
|
89
|
+
fname = RubyText.gets
|
90
|
+
fname << ".lt3" unless fname.end_with?(".lt3")
|
91
|
+
new_file = dir/fname
|
92
|
+
File.open(new_file, "w") do |f|
|
93
|
+
f.puts "<h1>#{title}</h1>\n\n\n "
|
94
|
+
f.puts ".backlink"
|
95
|
+
end
|
96
|
+
edit_file(new_file)
|
97
|
+
when main_file
|
98
|
+
edit_file(main_file[2..-3])
|
99
|
+
else
|
100
|
+
edit_file(dir/fname)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def _manage_links(arg, testing = false)
|
105
|
+
dir = @blog.view.dir/"themes/standard/widgets/links"
|
106
|
+
data = dir/"list.data"
|
107
|
+
edit_file(data)
|
108
|
+
end
|
109
|
+
|
110
|
+
def _manage_pages(arg, testing = false)
|
40
111
|
check_empty(arg)
|
41
112
|
dir = @blog.view.dir/"themes/standard/widgets/pages"
|
42
113
|
# Assume child files already generated (and list.data??)
|
@@ -99,6 +170,13 @@ module RuneBlog::REPL
|
|
99
170
|
result = system!("open #{local}")
|
100
171
|
raise CantOpen(local) unless result
|
101
172
|
@out
|
173
|
+
rescue => err
|
174
|
+
out = "/tmp/blog#{rand(100)}.txt"
|
175
|
+
File.open(out, "w") do |f|
|
176
|
+
f.puts err
|
177
|
+
f.puts err.backtrace.join("\n")
|
178
|
+
end
|
179
|
+
puts "Error: See #{out}"
|
102
180
|
end
|
103
181
|
|
104
182
|
def cmd_publish(arg, testing = false)
|
@@ -136,6 +214,13 @@ module RuneBlog::REPL
|
|
136
214
|
output! "...finished.\n"
|
137
215
|
end
|
138
216
|
return @out
|
217
|
+
rescue => err
|
218
|
+
out = "/tmp/blog#{rand(100)}.txt"
|
219
|
+
File.open(out, "w") do |f|
|
220
|
+
f.puts err
|
221
|
+
f.puts err.backtrace.join("\n")
|
222
|
+
end
|
223
|
+
puts "Error: See #{out}"
|
139
224
|
end
|
140
225
|
|
141
226
|
def cmd_rebuild(arg, testing = false)
|
@@ -146,6 +231,13 @@ module RuneBlog::REPL
|
|
146
231
|
@blog.generate_view(@blog.view)
|
147
232
|
@blog.generate_index(@blog.view)
|
148
233
|
@out
|
234
|
+
rescue => err
|
235
|
+
out = "/tmp/blog#{rand(100)}.txt"
|
236
|
+
File.open(out, "w") do |f|
|
237
|
+
f.puts err
|
238
|
+
f.puts err.backtrace.join("\n")
|
239
|
+
end
|
240
|
+
puts "Error: See #{out}"
|
149
241
|
end
|
150
242
|
|
151
243
|
def cmd_change_view(arg, testing = false)
|
@@ -173,24 +265,40 @@ module RuneBlog::REPL
|
|
173
265
|
|
174
266
|
def cmd_new_view(arg, testing = false)
|
175
267
|
reset_output
|
268
|
+
if arg.nil?
|
269
|
+
arg = ask("\nFilename: ")
|
270
|
+
puts
|
271
|
+
end
|
176
272
|
@blog.create_view(arg)
|
177
273
|
edit_file(@blog.view.dir/"themes/standard/global.lt3")
|
178
274
|
@blog.change_view(arg)
|
179
275
|
@out
|
180
276
|
rescue ViewAlreadyExists
|
181
277
|
puts 'Blog already exists'
|
278
|
+
rescue => err
|
279
|
+
out = "/tmp/blog#{rand(100)}.txt"
|
280
|
+
File.open(out, "w") do |f|
|
281
|
+
f.puts err
|
282
|
+
f.puts err.backtrace.join("\n")
|
283
|
+
end
|
284
|
+
puts "Error: See #{out}"
|
182
285
|
end
|
183
286
|
|
184
287
|
def cmd_new_post(arg, testing = false)
|
185
288
|
reset_output
|
186
289
|
check_empty(arg)
|
187
290
|
title = ask("\nTitle: ")
|
291
|
+
puts
|
188
292
|
@blog.create_new_post(title)
|
189
293
|
# STDSCR.clear
|
190
294
|
@out
|
191
295
|
rescue => err
|
192
|
-
|
193
|
-
|
296
|
+
out = "/tmp/blog#{rand(100)}.txt"
|
297
|
+
File.open(out, "w") do |f|
|
298
|
+
f.puts err
|
299
|
+
f.puts err.backtrace.join("\n")
|
300
|
+
end
|
301
|
+
puts "Error: See #{out}"
|
194
302
|
end
|
195
303
|
|
196
304
|
def _remove_post(arg, testing=false)
|
@@ -200,7 +308,6 @@ module RuneBlog::REPL
|
|
200
308
|
end
|
201
309
|
|
202
310
|
def cmd_remove_post(arg, testing = false)
|
203
|
-
puts "arg = #{arg.inspect} is a #{arg.class}"
|
204
311
|
reset_output
|
205
312
|
args = arg.split
|
206
313
|
args.each do |x|
|
@@ -212,14 +319,12 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
|
|
212
319
|
@out
|
213
320
|
end
|
214
321
|
|
215
|
-
#-- FIXME affects linking, building, publishing...
|
216
|
-
|
217
322
|
def cmd_edit_post(arg, testing = false)
|
218
323
|
reset_output
|
219
324
|
id = get_integer(arg)
|
220
325
|
# Simplify this
|
221
326
|
tag = "#{'%04d' % id}"
|
222
|
-
files = Find.find(@blog.root+"/drafts").to_a
|
327
|
+
files = ::Find.find(@blog.root+"/drafts").to_a
|
223
328
|
files = files.grep(/#{tag}-.*lt3/)
|
224
329
|
files = files.map {|f| File.basename(f) }
|
225
330
|
if files.size > 1
|
@@ -239,6 +344,13 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
|
|
239
344
|
draft = "#{@blog.root}/drafts/#{file}"
|
240
345
|
result = edit_file(draft)
|
241
346
|
@blog.generate_post(draft)
|
347
|
+
rescue => err
|
348
|
+
out = "/tmp/blog#{rand(100)}.txt"
|
349
|
+
File.open(out, "w") do |f|
|
350
|
+
f.puts err
|
351
|
+
f.puts err.backtrace.join("\n")
|
352
|
+
end
|
353
|
+
puts "Error: See #{out}"
|
242
354
|
end
|
243
355
|
|
244
356
|
def cmd_list_views(arg, testing = false)
|
@@ -322,7 +434,10 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
|
|
322
434
|
|
323
435
|
def cmd_ssh(arg, testing = false)
|
324
436
|
pub = @blog.view.publisher
|
325
|
-
|
437
|
+
puts
|
438
|
+
system!("tputs clear; ssh #{pub.user}@#{pub.server}")
|
439
|
+
sleep 0.1
|
440
|
+
cmd_clear(nil)
|
326
441
|
end
|
327
442
|
|
328
443
|
def cmd_INVALID(arg, testing = false)
|
@@ -352,7 +467,7 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
|
|
352
467
|
list views List all views available
|
353
468
|
lsv Same as: list views
|
354
469
|
|
355
|
-
|
470
|
+
config Edit various system files
|
356
471
|
* customize (BUGGY) Change set of tags, extra views
|
357
472
|
|
358
473
|
p, post Create a new post
|
@@ -385,6 +500,5 @@ puts "arg = #{arg.inspect} is a #{arg.class}"
|
|
385
500
|
puts unless testing
|
386
501
|
@out
|
387
502
|
end
|
388
|
-
|
389
503
|
end
|
390
504
|
|
data/lib/runeblog.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'date'
|
2
|
+
require 'find'
|
2
3
|
|
3
4
|
require 'logging'
|
4
5
|
|
@@ -42,6 +43,15 @@ class RuneBlog
|
|
42
43
|
|
43
44
|
include Helpers
|
44
45
|
|
46
|
+
def _tmp_error(err) # FIXME move to helpers
|
47
|
+
out = "/tmp/blog#{rand(100)}.txt"
|
48
|
+
File.open(out, "w") do |f|
|
49
|
+
f.puts err
|
50
|
+
f.puts err.backtrace.join("\n")
|
51
|
+
end
|
52
|
+
puts "Error: See #{out}"
|
53
|
+
end
|
54
|
+
|
45
55
|
def self.create_new_blog_repo(dir = ".blogs")
|
46
56
|
log!(enter: __method__, args: [dir])
|
47
57
|
raise ArgumentError unless dir.is_a?(String) && ! dir.empty?
|
@@ -63,13 +73,13 @@ class RuneBlog
|
|
63
73
|
create_dirs(:drafts, :views, :posts)
|
64
74
|
new_sequence
|
65
75
|
end
|
66
|
-
# put_config(root: root)
|
67
76
|
x = OpenStruct.new
|
68
77
|
x.root, x.current_view, x.editor = root, "test_view", "/usr/bin/vim " # dumb - FIXME later
|
69
78
|
write_config(x, root/ConfigFile)
|
70
79
|
@blog = self.new(root)
|
71
|
-
@blog.create_view("test_view")
|
72
80
|
@blog
|
81
|
+
rescue => err
|
82
|
+
_tmp_error(err)
|
73
83
|
end
|
74
84
|
|
75
85
|
def self.open(root = ".blogs")
|
@@ -78,6 +88,8 @@ class RuneBlog
|
|
78
88
|
self.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
79
89
|
root = Dir.pwd/root
|
80
90
|
blog = self.new(root)
|
91
|
+
rescue => err
|
92
|
+
_tmp_error(err)
|
81
93
|
end
|
82
94
|
|
83
95
|
def initialize(root_dir = ".blogs") # always assumes existing blog
|
@@ -104,8 +116,16 @@ class RuneBlog
|
|
104
116
|
log!(enter: __method__, args: [dir], level: 1)
|
105
117
|
Dir.chdir(dir) do
|
106
118
|
views = _retrieve_metadata(:views)
|
107
|
-
views.each
|
119
|
+
views.each do |v|
|
120
|
+
unless @blog.view?(v)
|
121
|
+
puts "Warning: '#{v}' is not a view"
|
122
|
+
next
|
123
|
+
end
|
124
|
+
system!("cp *html #@root/views/#{v}/remote")
|
125
|
+
end
|
108
126
|
end
|
127
|
+
rescue => err
|
128
|
+
_tmp_error(err)
|
109
129
|
end
|
110
130
|
|
111
131
|
def _retrieve_metadata(key)
|
@@ -129,6 +149,8 @@ class RuneBlog
|
|
129
149
|
raise "Too many #{key} instances in metadata.txt!"
|
130
150
|
end
|
131
151
|
return result
|
152
|
+
rescue => err
|
153
|
+
_tmp_error(err)
|
132
154
|
end
|
133
155
|
|
134
156
|
def process_post(sourcefile)
|
@@ -136,8 +158,11 @@ class RuneBlog
|
|
136
158
|
nslug = sourcefile.sub(/.lt3/, "")
|
137
159
|
dir = @root/:posts/nslug
|
138
160
|
create_dir(dir)
|
161
|
+
# FIXME dependencies?
|
139
162
|
xlate cwd: dir, src: sourcefile # , debug: true
|
140
163
|
_deploy_local(dir)
|
164
|
+
rescue => err
|
165
|
+
_tmp_error(err)
|
141
166
|
end
|
142
167
|
|
143
168
|
def inspect
|
@@ -172,6 +197,8 @@ class RuneBlog
|
|
172
197
|
def _set_publisher
|
173
198
|
log!(enter: __method__, level: 3)
|
174
199
|
@view.publisher = RuneBlog::Publishing.new(@view.to_s) # FIXME refactor
|
200
|
+
rescue => err
|
201
|
+
_tmp_error(err)
|
175
202
|
end
|
176
203
|
|
177
204
|
def view=(arg)
|
@@ -188,6 +215,8 @@ class RuneBlog
|
|
188
215
|
else
|
189
216
|
raise CantAssignView(arg.class.to_s)
|
190
217
|
end
|
218
|
+
rescue => err
|
219
|
+
_tmp_error(err)
|
191
220
|
end
|
192
221
|
|
193
222
|
def get_sequence
|
@@ -234,6 +263,8 @@ class RuneBlog
|
|
234
263
|
cmd = "cp -r #{RuneBlog::Path}/../empty_view views/#{view_name}"
|
235
264
|
system!(cmd)
|
236
265
|
end
|
266
|
+
rescue => err
|
267
|
+
_tmp_error(err)
|
237
268
|
end
|
238
269
|
|
239
270
|
def check_valid_new_view(view_name)
|
@@ -252,10 +283,10 @@ class RuneBlog
|
|
252
283
|
log!(enter: __method__, args: [view_name], level: 2)
|
253
284
|
check_valid_new_view(view_name)
|
254
285
|
make_empty_view_tree(view_name)
|
255
|
-
# STDERR.puts "Made empty tree!"
|
256
|
-
# system("bash")
|
257
286
|
add_view(view_name)
|
258
287
|
mark_last_published("Initial creation")
|
288
|
+
rescue => err
|
289
|
+
_tmp_error(err)
|
259
290
|
end
|
260
291
|
|
261
292
|
def delete_view(name, force = false)
|
@@ -289,6 +320,8 @@ class RuneBlog
|
|
289
320
|
postdir = post.first
|
290
321
|
vp = RuneBlog::ViewPost.new(self.view, postdir)
|
291
322
|
vp
|
323
|
+
rescue => err
|
324
|
+
_tmp_error(err)
|
292
325
|
end
|
293
326
|
|
294
327
|
def index_entry(slug)
|
@@ -297,17 +330,21 @@ class RuneBlog
|
|
297
330
|
text = nil
|
298
331
|
@theme = @view.dir/"themes/standard"
|
299
332
|
post_entry_name = @theme/"blog/post_entry.lt3"
|
300
|
-
|
333
|
+
depend = [post_entry_name]
|
334
|
+
xlate src: post_entry_name, dst: "/tmp/post_entry.html", deps: depend # , debug: true
|
301
335
|
@_post_entry ||= File.read("/tmp/post_entry.html")
|
302
336
|
vp = post_lookup(id)
|
303
337
|
nslug, aslug, title, date, teaser_text =
|
304
338
|
vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
|
305
339
|
path = vp.path
|
306
340
|
url = aslug + ".html"
|
341
|
+
# puts "--- vp = #{[vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text].inspect}"; gets
|
307
342
|
date = ::Date.parse(date)
|
308
343
|
date = date.strftime("%B %e<br><div style='float: right'>%Y</div>")
|
309
344
|
text = interpolate(@_post_entry, binding)
|
310
345
|
text
|
346
|
+
rescue => err
|
347
|
+
_tmp_error(err)
|
311
348
|
end
|
312
349
|
|
313
350
|
def collect_recent_posts(file)
|
@@ -318,14 +355,20 @@ class RuneBlog
|
|
318
355
|
posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts/x }
|
319
356
|
posts.select! {|x| File.directory?(x) }
|
320
357
|
# directories that start with four digits
|
321
|
-
posts = posts.sort
|
358
|
+
posts = posts.sort do |a, b|
|
359
|
+
ai = a.index(/\d\d\d\d-/)
|
360
|
+
bi = b.index(/\d\d\d\d-/)
|
361
|
+
na = a[ai..(ai+3)].to_i
|
362
|
+
nb = b[bi..(bi+3)].to_i
|
363
|
+
nb <=> na
|
364
|
+
end # sort descending
|
322
365
|
posts = posts[0..19] # return 20 at most
|
323
366
|
text = <<-HTML
|
324
367
|
<html>
|
325
368
|
<head><link rel="stylesheet" href="etc/blog.css"></head>
|
326
369
|
<body>
|
327
370
|
HTML
|
328
|
-
wanted = [
|
371
|
+
wanted = [8, posts.size].min # estimate how many we want?
|
329
372
|
enum = posts.each
|
330
373
|
wanted.times do
|
331
374
|
postid = File.basename(enum.next)
|
@@ -334,13 +377,16 @@ class RuneBlog
|
|
334
377
|
end
|
335
378
|
text << "</body></html>"
|
336
379
|
File.write(@vdir/:remote/file, text)
|
380
|
+
rescue => err
|
381
|
+
_tmp_error(err)
|
337
382
|
end
|
338
383
|
|
339
384
|
def create_new_post(title, testing = false, teaser: nil, body: nil,
|
340
385
|
pubdate: Time.now.strftime("%Y-%m-%d"), views: [])
|
341
|
-
log!(enter: __method__, args: [title, testing, teaser, body, views], level: 1)
|
386
|
+
log!(enter: __method__, args: [title, testing, teaser, body, views], level: 1, stderr: true)
|
342
387
|
meta = nil
|
343
388
|
views = views + [self.view.to_s]
|
389
|
+
views.uniq!
|
344
390
|
Dir.chdir(@root/:posts) do
|
345
391
|
post = Post.create(title: title, teaser: teaser, body: body, pubdate: pubdate, views: views)
|
346
392
|
post.edit unless testing
|
@@ -349,14 +395,12 @@ class RuneBlog
|
|
349
395
|
end
|
350
396
|
return meta.num
|
351
397
|
rescue => err
|
352
|
-
|
353
|
-
puts err.backtrace.join("\n")
|
398
|
+
_tmp_error(err)
|
354
399
|
end
|
355
400
|
|
356
401
|
def edit_initial_post(file, testing = false)
|
357
402
|
log!(enter: __method__, args: [file, testing], level: 3)
|
358
403
|
debug "=== edit_initial_post #{file.inspect} => #{sourcefile}"
|
359
|
-
sourcefile = @root/:drafts/file
|
360
404
|
result = system!("#@editor #{sourcefile} +8") unless testing
|
361
405
|
raise EditorProblem(sourcefile) unless result
|
362
406
|
process_post(sourcefile)
|
@@ -392,25 +436,24 @@ class RuneBlog
|
|
392
436
|
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
393
437
|
@vdir = @root/:views/view
|
394
438
|
collect_recent_posts("recent.html")
|
439
|
+
rescue => err
|
440
|
+
_tmp_error(err)
|
395
441
|
end
|
396
442
|
|
397
443
|
def generate_view(view) # huh?
|
398
444
|
log!(enter: __method__, args: [view])
|
399
|
-
# generate_index(view) # recent posts (recent.html)
|
400
445
|
vdir = @root/:views/view
|
401
446
|
@theme = @root/:views/view/:themes/:standard
|
402
|
-
|
447
|
+
depend = [vdir/"remote/etc/blog.css", @theme/"global.lt3",
|
448
|
+
@theme/"blog/head.lt3", @theme/"navbar/navbar.lt3",
|
449
|
+
@theme/"blog/index.lt3"] # FIXME what about assets?
|
450
|
+
xlate cwd: vdir/"themes/standard/etc", deps: depend,
|
403
451
|
src: "blog.css.lt3", copy: vdir/"remote/etc/blog.css" # , debug: true
|
404
|
-
xlate cwd: vdir/"themes/standard",
|
452
|
+
xlate cwd: vdir/"themes/standard", deps: depend,
|
405
453
|
src: "blog/generate.lt3", dst: vdir/:remote/"index.html"
|
406
|
-
# generate_index(view) # recent posts (recent.html)
|
407
|
-
# ^ HERE
|
408
454
|
copy("#{vdir}/assets/*", "#{vdir}/remote/assets/")
|
409
455
|
rescue => err
|
410
|
-
|
411
|
-
puts err.backtrace.join("\n")
|
412
|
-
print "Pause... "
|
413
|
-
gets
|
456
|
+
_tmp_error(err)
|
414
457
|
end
|
415
458
|
|
416
459
|
def _get_views(draft)
|
@@ -421,7 +464,9 @@ class RuneBlog
|
|
421
464
|
raise "No .views call!" if view_line.size < 1
|
422
465
|
view_line = view_line.first
|
423
466
|
views = view_line[7..-1].split
|
424
|
-
views
|
467
|
+
views.uniq
|
468
|
+
rescue => err
|
469
|
+
_tmp_error(err)
|
425
470
|
end
|
426
471
|
|
427
472
|
def _copy_get_dirs(draft, view)
|
@@ -435,6 +480,8 @@ class RuneBlog
|
|
435
480
|
viewdir, slugdir, aslug = vdir, dir, noext[5..-1]
|
436
481
|
theme = viewdir/:themes/:standard
|
437
482
|
[noext, viewdir, slugdir, aslug, theme]
|
483
|
+
rescue => err
|
484
|
+
_tmp_error(err)
|
438
485
|
end
|
439
486
|
|
440
487
|
def _post_metadata(draft, pdraft)
|
@@ -450,6 +497,7 @@ class RuneBlog
|
|
450
497
|
longdate = ::Date.parse(date).strftime("%B %e, %Y")
|
451
498
|
title = _retrieve_metadata(:title)
|
452
499
|
tags = _retrieve_metadata(:tags)
|
500
|
+
# FIXME simplify
|
453
501
|
vars = <<~LIVE
|
454
502
|
.set post.num = #{pnum}
|
455
503
|
.heredoc post.aslug
|
@@ -470,6 +518,8 @@ class RuneBlog
|
|
470
518
|
LIVE
|
471
519
|
File.open(pdraft/"vars.lt3", "w") {|f| f.puts vars }
|
472
520
|
end
|
521
|
+
rescue => err
|
522
|
+
_tmp_error(err)
|
473
523
|
end
|
474
524
|
|
475
525
|
def copy_widget_html(view)
|
@@ -484,15 +534,15 @@ class RuneBlog
|
|
484
534
|
create_dirs(rem)
|
485
535
|
files = Dir[w/"*"]
|
486
536
|
files = files.select {|x| x =~ /(html|css)$/ }
|
487
|
-
# files.each {|f| STDERR.puts " #{f.inspect}" }
|
488
537
|
tag = File.basename(w)
|
489
|
-
# STDERR.puts "--- tag: #{tag.inspect}"
|
490
538
|
files.each {|file| system!("cp #{file} #{rem}", show: (tag == "zzz")) }
|
491
539
|
end
|
540
|
+
rescue => err
|
541
|
+
_tmp_error(err)
|
492
542
|
end
|
493
543
|
|
494
|
-
def _handle_post(draft, view)
|
495
|
-
log!(enter: __method__, args: [draft,
|
544
|
+
def _handle_post(draft, view_name = self.view.to_s)
|
545
|
+
log!(enter: __method__, args: [draft, view_name], level: 2)
|
496
546
|
# break into separate methods?
|
497
547
|
|
498
548
|
fname = File.basename(draft) # 0001-this-is-a-post.lt3
|
@@ -500,55 +550,43 @@ class RuneBlog
|
|
500
550
|
aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
|
501
551
|
ahtml = aslug + ".html" # this-is-a-post.html
|
502
552
|
pdraft = @root/:posts/nslug
|
503
|
-
remote = @root/:views/
|
504
|
-
@theme = @root/:views/
|
553
|
+
remote = @root/:views/view_name/:remote
|
554
|
+
@theme = @root/:views/view_name/:themes/:standard
|
505
555
|
# Step 1...
|
506
556
|
create_dirs(pdraft)
|
507
|
-
|
557
|
+
# FIXME dependencies?
|
558
|
+
xlate cwd: pdraft, src: draft, dst: "guts.html" # , debug: true
|
508
559
|
_post_metadata(draft, pdraft)
|
509
560
|
# Step 2...
|
510
|
-
vposts = @root/:views/
|
561
|
+
vposts = @root/:views/view_name/:posts
|
511
562
|
copy!(pdraft, vposts) # ??
|
512
563
|
# Step 3..
|
513
564
|
copy(pdraft/"guts.html", @theme/:post)
|
514
565
|
copy(pdraft/"vars.lt3", @theme/:post)
|
515
566
|
# Step 4...
|
516
|
-
|
517
|
-
|
567
|
+
# FIXME dependencies?
|
568
|
+
xlate cwd: @theme/:post, src: "generate.lt3", force: true,
|
569
|
+
dst: remote/ahtml, copy: @theme/:post # , debug: true
|
570
|
+
# FIXME dependencies?
|
518
571
|
xlate cwd: @theme/:post, src: "permalink.lt3",
|
519
572
|
dst: remote/:permalink/ahtml # , debug: true
|
520
|
-
copy_widget_html(
|
573
|
+
copy_widget_html(view_name)
|
574
|
+
rescue => err
|
575
|
+
_tmp_error(err)
|
521
576
|
end
|
522
577
|
|
523
578
|
def generate_post(draft)
|
524
579
|
log!(enter: __method__, args: [draft], level: 1)
|
525
580
|
views = _get_views(draft)
|
526
581
|
views.each do |view|
|
582
|
+
unless self.view?(view)
|
583
|
+
puts "Warning: '#{view}' is not a view"
|
584
|
+
next
|
585
|
+
end
|
527
586
|
_handle_post(draft, view)
|
528
|
-
# generate_view(view) # FIXME leads to inefficiency?
|
529
|
-
# ^ HERE
|
530
587
|
end
|
531
|
-
|
532
|
-
|
533
|
-
def OLD_index_entry(view, meta)
|
534
|
-
log!(enter: __method__, args: [view, meta])
|
535
|
-
debug "=== index_entry #{view.to_s.inspect} #{meta.num} #{meta.title.inspect}"
|
536
|
-
check_meta(meta, "index_entry1")
|
537
|
-
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
538
|
-
check_meta(meta, "index_entry2")
|
539
|
-
self.make_slug(meta)
|
540
|
-
check_meta(meta, "index_entry3")
|
541
|
-
# FIXME clean up and generalize
|
542
|
-
ref = view/meta.slug/"index.html"
|
543
|
-
<<-HTML
|
544
|
-
<font size=-1>#{meta.date} </font> <br>
|
545
|
-
<font size=+2 color=blue><a href=../#{ref} style="text-decoration: none">#{meta.title}</font></a>
|
546
|
-
<br>
|
547
|
-
<font size=+1>#{meta.teaser} </font>
|
548
|
-
<a href=../#{ref} style="text-decoration: none">Read more...</a>
|
549
|
-
<br>
|
550
|
-
<hr>
|
551
|
-
HTML
|
588
|
+
rescue => err
|
589
|
+
_tmp_error(err)
|
552
590
|
end
|
553
591
|
|
554
592
|
def rebuild_post(file)
|
@@ -562,8 +600,7 @@ class RuneBlog
|
|
562
600
|
@views_dirty.flatten!
|
563
601
|
@views_dirty.uniq!
|
564
602
|
rescue => err
|
565
|
-
|
566
|
-
getch
|
603
|
+
_tmp_error(err)
|
567
604
|
end
|
568
605
|
|
569
606
|
def remove_post(num)
|
@@ -615,6 +652,5 @@ class RuneBlog
|
|
615
652
|
meta.slug = str
|
616
653
|
str
|
617
654
|
end
|
618
|
-
|
619
655
|
end
|
620
656
|
|