runeblog 0.3.19 → 0.3.24
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 +80 -52
- data/data/global.lt3 +3 -3
- data/data/universal.lt3 +2 -0
- data/empty_view/data/GIT_IS_DUMB +0 -0
- data/empty_view/themes/standard/banner/top.lt3 +1 -1
- data/empty_view/themes/standard/blog/generate.lt3 +1 -1
- data/empty_view/themes/standard/etc/blog.css.lt3 +1 -1
- data/empty_view/themes/standard/etc/github.css +209 -0
- data/empty_view/themes/standard/post/generate.lt3 +8 -5
- data/empty_view/themes/standard/post/permalink.lt3 +1 -1
- data/lib/exceptions.rb +1 -1
- data/lib/helpers-blog.rb +6 -4
- data/lib/liveblog.rb +99 -20
- data/lib/lowlevel.rb +25 -8
- data/lib/menus.rb +5 -3
- data/lib/newpost.rb +82 -0
- data/lib/post.rb +3 -2
- data/lib/processing.rb +29 -1
- data/lib/publish.rb +3 -1
- data/lib/repl.rb +72 -18
- data/lib/runeblog.rb +86 -46
- data/lib/runeblog_version.rb +1 -1
- data/lib/view.rb +22 -3
- data/runeblog.gemspec +4 -2
- metadata +32 -9
data/lib/lowlevel.rb
CHANGED
@@ -1,11 +1,18 @@
|
|
1
1
|
|
2
2
|
def _tmp_error(err)
|
3
|
+
STDERR.puts err
|
4
|
+
STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
|
5
|
+
log!(str: "#{err} - see also stderr.out")
|
6
|
+
log!(str: err.backtrace.join("\n")) if err.respond_to?(:backtrace)
|
7
|
+
return
|
8
|
+
|
3
9
|
out = "/tmp/blog#{rand(100)}.txt"
|
4
10
|
File.open(out, "w") do |f|
|
5
11
|
f.puts err.to_s + "\n--------"
|
6
12
|
f.puts err.backtrace.join("\n")
|
7
13
|
end
|
8
14
|
puts "Error: See #{out}"
|
15
|
+
# sleep 3
|
9
16
|
end
|
10
17
|
|
11
18
|
def dump(obj, name)
|
@@ -20,6 +27,7 @@
|
|
20
27
|
log!(enter: __method__, args: [str], level: 2)
|
21
28
|
STDERR.puts str if show
|
22
29
|
rc = system(str)
|
30
|
+
STDERR.puts " rc = #{rc.inspect}" if show
|
23
31
|
return rc if rc
|
24
32
|
STDERR.puts "FAILED: #{str.inspect}"
|
25
33
|
STDERR.puts "\ncaller = \n#{caller.join("\n ")}\n"
|
@@ -32,10 +40,12 @@
|
|
32
40
|
end
|
33
41
|
|
34
42
|
def _get_data?(file) # File need not exist
|
43
|
+
log!(enter: __method__, args: [file], level: 2)
|
35
44
|
File.exist?(file) ? _get_data(file) : []
|
36
45
|
end
|
37
46
|
|
38
47
|
def _get_data(file)
|
48
|
+
log!(enter: __method__, args: [file], level: 2)
|
39
49
|
lines = File.readlines(file)
|
40
50
|
lines = lines.map do |line|
|
41
51
|
line = line.chomp.strip
|
@@ -46,6 +56,7 @@
|
|
46
56
|
end
|
47
57
|
|
48
58
|
def read_pairs(file) # returns a hash
|
59
|
+
log!(enter: __method__, args: [file], level: 2)
|
49
60
|
lines = _get_data(file)
|
50
61
|
hash = {}
|
51
62
|
lines.each do |line|
|
@@ -57,6 +68,7 @@
|
|
57
68
|
end
|
58
69
|
|
59
70
|
def read_pairs!(file) # returns an openstruct
|
71
|
+
log!(enter: __method__, args: [file], level: 2)
|
60
72
|
lines = _get_data(file)
|
61
73
|
obj = OpenStruct.new
|
62
74
|
lines.each do |line|
|
@@ -97,27 +109,32 @@
|
|
97
109
|
end
|
98
110
|
|
99
111
|
def error(err)
|
100
|
-
|
101
|
-
str = "\n Error
|
112
|
+
log!(str: err, enter: __method__, args: [err], level: 2)
|
113
|
+
str = "\n Error... #{err}"
|
102
114
|
puts str
|
103
115
|
puts err.backtrace.join("\n")
|
104
116
|
end
|
105
117
|
|
106
|
-
def find_item(list)
|
118
|
+
def find_item(list, &block)
|
119
|
+
log!(enter: __method__, args: [list], level: 2)
|
107
120
|
list2 = list.select(&block)
|
108
|
-
exactly_one(list2)
|
121
|
+
exactly_one(list2, list.join("/"))
|
109
122
|
end
|
110
123
|
|
111
124
|
def find_item!(list, &block)
|
125
|
+
log!(enter: __method__, args: [list], level: 2)
|
126
|
+
list2 = list.select(&block)
|
112
127
|
list2 = list.select(&block)
|
113
|
-
item = exactly_one(list2)
|
128
|
+
item = exactly_one(list2, list.join("/"))
|
114
129
|
n = list.index(&block)
|
115
130
|
[n, item]
|
116
131
|
end
|
117
132
|
|
118
|
-
def exactly_one(list)
|
119
|
-
|
120
|
-
|
133
|
+
def exactly_one(list, tag = nil, &block)
|
134
|
+
log!(enter: __method__, args: [list], level: 2)
|
135
|
+
list2 = list.select(&block)
|
136
|
+
raise "List: Zero instances #{"- #{tag}" if tag}" if list.empty?
|
137
|
+
raise "List: More than one instance #{"- #{tag}" if tag}" if list.size > 1
|
121
138
|
list.first
|
122
139
|
end
|
123
140
|
|
data/lib/menus.rb
CHANGED
@@ -18,9 +18,10 @@ top_help = proc { RubyText.splash(RuneBlog::REPL::Help.gsub(/[{}]/, " ")) }
|
|
18
18
|
# dir = @blog.view.dir/"themes/standard/"
|
19
19
|
|
20
20
|
std = "themes/standard"
|
21
|
+
data = "." # CHANGED
|
21
22
|
|
22
23
|
Menu.top_config = {
|
23
|
-
"Variables (general)" => edit("#{
|
24
|
+
"Variables (general)" => edit("#{data}/global.lt3"),
|
24
25
|
" View-specific" => edit("settings/view.txt"),
|
25
26
|
" Recent posts" => edit("settings/recent.txt"),
|
26
27
|
" Publishing" => edit("settings/publish.txt"),
|
@@ -32,8 +33,9 @@ Menu.top_config = {
|
|
32
33
|
" HEAD info" => edit("#{std}/blog/head.lt3"),
|
33
34
|
" Layout " => edit("#{std}/blog/index.lt3"),
|
34
35
|
" Recent-posts entry" => edit("#{std}/blog/post_entry.lt3"),
|
35
|
-
" Banner: Description" => edit("#{std}/
|
36
|
-
"
|
36
|
+
" Banner: Description" => edit("#{std}/banner/banner.lt3"),
|
37
|
+
" Navbar" => edit("#{std}/navbar/navbar.lt3"),
|
38
|
+
# " Text portion" => edit("#{std}/banner/top.lt3"),
|
37
39
|
"Generator for a post" => edit("#{std}/post/generate.lt3"),
|
38
40
|
" HEAD info for post" => edit("#{std}/post/head.lt3"),
|
39
41
|
" Content for post" => edit("#{std}/post/index.lt3"),
|
data/lib/newpost.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'rubytext'
|
2
|
+
|
3
|
+
RubyText.start
|
4
|
+
|
5
|
+
# Idea: A special sub-environment for creating a post
|
6
|
+
#
|
7
|
+
# 1. Display: view, post number, date
|
8
|
+
# 2. Menu?
|
9
|
+
# 3. - Edit/enter title
|
10
|
+
# 4. - Edit teaser
|
11
|
+
# 5. - Add views
|
12
|
+
# 6. - Add tags
|
13
|
+
# 7. - Import assets
|
14
|
+
# 8. - Save
|
15
|
+
# 9. - Quit
|
16
|
+
# Edit body after save/quit
|
17
|
+
|
18
|
+
def ask(prompt) # elsewhere?
|
19
|
+
print prompt
|
20
|
+
str = gets
|
21
|
+
str.chomp! if str
|
22
|
+
str
|
23
|
+
end
|
24
|
+
|
25
|
+
def enter_title
|
26
|
+
puts __method__
|
27
|
+
str = ask("Title: ")
|
28
|
+
puts str.inspect
|
29
|
+
end
|
30
|
+
|
31
|
+
def edit_teaser
|
32
|
+
puts __method__
|
33
|
+
str = ask("Teaser: ")
|
34
|
+
puts str.inspect
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_views
|
38
|
+
puts __method__
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_tags
|
42
|
+
puts __method__
|
43
|
+
end
|
44
|
+
|
45
|
+
def import_assets
|
46
|
+
puts __method__
|
47
|
+
end
|
48
|
+
|
49
|
+
def save_post
|
50
|
+
puts __method__
|
51
|
+
end
|
52
|
+
|
53
|
+
def quit_post
|
54
|
+
puts __method__
|
55
|
+
end
|
56
|
+
|
57
|
+
items = {
|
58
|
+
"Enter title" => proc { enter_title },
|
59
|
+
"Edit teaser" => proc { edit_teaser },
|
60
|
+
"Add views" => proc { add_views },
|
61
|
+
"Add tags" => proc { add_tags },
|
62
|
+
"Import assets" => proc { import_assets },
|
63
|
+
"Save" => proc { save_post },
|
64
|
+
"Quit" => proc { quit_post }
|
65
|
+
}
|
66
|
+
|
67
|
+
enter_title
|
68
|
+
edit_teaser
|
69
|
+
add_views
|
70
|
+
add_tags
|
71
|
+
import_assets
|
72
|
+
save_post
|
73
|
+
quit_post
|
74
|
+
|
75
|
+
# getch
|
76
|
+
|
77
|
+
# curr = 0
|
78
|
+
# loop do
|
79
|
+
# str, curr = menu(c: 10, items: items, curr: curr, sticky: true)
|
80
|
+
# break if curr.nil?
|
81
|
+
# puts "str = #{str} curr = #{curr}"
|
82
|
+
# end
|
data/lib/post.rb
CHANGED
@@ -66,7 +66,7 @@ class RuneBlog::Post
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def edit
|
69
|
-
|
69
|
+
log!(enter: __method__)
|
70
70
|
edit_file(@draft, vim: "+8")
|
71
71
|
build
|
72
72
|
rescue => err
|
@@ -169,7 +169,8 @@ class RuneBlog::ViewPost
|
|
169
169
|
@date = meta.pubdate
|
170
170
|
end
|
171
171
|
rescue => err
|
172
|
-
STDERR.puts "--- #{err}
|
172
|
+
STDERR.puts "--- #{err}"
|
173
|
+
STDERR.puts " #{err.backtrace.join("\n ")}" if err.respond_to?(:backtrace)
|
173
174
|
end
|
174
175
|
|
175
176
|
def get_dirs
|
data/lib/processing.rb
CHANGED
@@ -23,7 +23,8 @@ end
|
|
23
23
|
def preprocess(cwd: Dir.pwd, src:,
|
24
24
|
dst: nil, strip: false,
|
25
25
|
deps: [], copy: nil, debug: false, force: false,
|
26
|
-
mix: [], call: [],
|
26
|
+
mix: [], call: [],
|
27
|
+
vars: {})
|
27
28
|
src += LEXT unless src.end_with?(LEXT)
|
28
29
|
if strip
|
29
30
|
dst = File.basename(src).sub(/.lt3$/,"")
|
@@ -31,6 +32,9 @@ def preprocess(cwd: Dir.pwd, src:,
|
|
31
32
|
dst += ".html" unless dst.end_with?(".html")
|
32
33
|
end
|
33
34
|
sp = " "*12
|
35
|
+
|
36
|
+
|
37
|
+
|
34
38
|
Dir.chdir(cwd) do
|
35
39
|
if debug
|
36
40
|
STDERR.puts "#{sp} -- preprocess "
|
@@ -40,20 +44,44 @@ def preprocess(cwd: Dir.pwd, src:,
|
|
40
44
|
STDERR.puts "#{sp} from: #{caller[0]}"
|
41
45
|
STDERR.puts "#{sp} copy: #{copy}" if copy
|
42
46
|
STDERR.puts "#{sp} vars: #{vars.inspect}" unless vars == {}
|
47
|
+
STDERR.flush
|
43
48
|
end
|
44
49
|
stale = stale?(src, dst, deps, force)
|
50
|
+
STDERR.puts <<~EOF if debug
|
51
|
+
STALE = #{stale}
|
52
|
+
cwd = #{cwd.inspect}
|
53
|
+
src = #{src.inspect}
|
54
|
+
dst = #{dst.inspect}
|
55
|
+
strip = #{strip.inspect}
|
56
|
+
deps = #{deps.inspect}
|
57
|
+
copy = #{copy.inspect}
|
58
|
+
debug = #{debug.inspect}
|
59
|
+
force = #{force.inspect}
|
60
|
+
mix = #{mix.inspect}
|
61
|
+
call = #{call.inspect}
|
62
|
+
vars = #{vars.inspect}
|
63
|
+
EOF
|
45
64
|
if stale
|
46
65
|
live = Livetext.customize(mix: "liveblog", call: call, vars: vars)
|
66
|
+
log!(str: "Calling xform_file... src = #{src} pwd = #{Dir.pwd}")
|
47
67
|
out = live.xform_file(src)
|
48
68
|
File.write(dst, out)
|
49
69
|
system!("cp #{dst} #{copy}") if copy
|
50
70
|
end
|
51
71
|
puts "#{sp} -- ^ Already up to date!" if debug && ! stale
|
52
72
|
end
|
73
|
+
rescue => err
|
74
|
+
msg = err.to_s
|
75
|
+
msg << err.backtrace.join("\n") if err.respond_to?(:backtrace)
|
76
|
+
STDERR.puts msg
|
77
|
+
STDERR.flush
|
78
|
+
log!(str: msg)
|
53
79
|
end
|
54
80
|
|
55
81
|
def get_live_vars(src)
|
56
82
|
live = Livetext.customize(call: [".nopara"])
|
83
|
+
# puts "glv: src = #{src.inspect}"
|
84
|
+
# STDERR.puts "glv: src = #{src.inspect}"
|
57
85
|
live.xform_file(src)
|
58
86
|
live
|
59
87
|
end
|
data/lib/publish.rb
CHANGED
@@ -14,7 +14,9 @@ class RuneBlog::Publishing
|
|
14
14
|
def initialize(view)
|
15
15
|
log!(enter: __method__, args: [view.to_s])
|
16
16
|
@blog = RuneBlog.blog
|
17
|
-
|
17
|
+
dir0 = @blog.root/:views/view/"themes/standard/"
|
18
|
+
# CHANGED
|
19
|
+
dir = @blog.root/:views/view/:data
|
18
20
|
gfile = dir/"global.lt3"
|
19
21
|
return unless File.exist?(gfile) # FIXME Hackish as hell
|
20
22
|
|
data/lib/repl.rb
CHANGED
@@ -176,7 +176,10 @@ module RuneBlog::REPL
|
|
176
176
|
result = system!("open #{local}")
|
177
177
|
raise CantOpen(local) unless result
|
178
178
|
rescue => err
|
179
|
-
|
179
|
+
msg = err.to_s
|
180
|
+
msg << "\n" << err.backtrace.join("\n") if err.respond_to?(:backtrace)
|
181
|
+
puts msg
|
182
|
+
log!(str: msg)
|
180
183
|
end
|
181
184
|
|
182
185
|
def cmd_publish
|
@@ -206,13 +209,14 @@ module RuneBlog::REPL
|
|
206
209
|
|
207
210
|
def regen_posts
|
208
211
|
drafts = @blog.drafts # current view
|
209
|
-
|
212
|
+
log! str: "=== Regenerating posts..." unless drafts.empty?
|
210
213
|
drafts.each do |draft|
|
211
214
|
orig = @blog.root/:drafts/draft
|
212
215
|
postdir = @blog.root/:posts/draft.sub(/.lt3$/, "")
|
213
216
|
content = postdir/"/guts.html"
|
214
217
|
next if fresh?(orig, content)
|
215
218
|
|
219
|
+
log! str: "=== Calling generate_post(#{orig})"
|
216
220
|
@blog.generate_post(orig) # rebuild post
|
217
221
|
Dir.chdir(postdir) do
|
218
222
|
meta = @blog.read_metadata
|
@@ -224,28 +228,34 @@ module RuneBlog::REPL
|
|
224
228
|
end
|
225
229
|
|
226
230
|
def cmd_rebuild
|
227
|
-
|
231
|
+
log! str: "=== Starting cmd_rebuild..."
|
228
232
|
puts
|
229
233
|
regen_posts
|
230
|
-
|
234
|
+
log! str: "=== Generating view..."
|
231
235
|
@blog.generate_view(@blog.view)
|
232
|
-
|
236
|
+
log! str: "=== Generating index..."
|
233
237
|
@blog.generate_index(@blog.view)
|
234
|
-
|
238
|
+
log! str: "=== ...finished!"
|
235
239
|
rescue => err
|
236
240
|
_tmp_error(err)
|
237
241
|
end
|
238
242
|
|
239
243
|
def cmd_change_view(arg = nil)
|
240
244
|
if arg.nil?
|
241
|
-
viewnames =
|
242
|
-
|
245
|
+
viewnames = {}
|
246
|
+
@blog.views.each do |v|
|
247
|
+
name = v.to_s
|
248
|
+
title = view2title(name)
|
249
|
+
string = "#{'%-25s' % title} #{name}"
|
250
|
+
viewnames[string] = name
|
251
|
+
end
|
252
|
+
n = viewnames.values.find_index(@blog.view.name)
|
243
253
|
name = @blog.view.name
|
244
|
-
# TODO: Add view description
|
245
254
|
k, name = STDSCR.menu(title: "Views", items: viewnames, curr: n)
|
246
255
|
return if name.nil?
|
256
|
+
log! str: "cv Setting to #{name.inspect}"
|
247
257
|
@blog.view = name
|
248
|
-
|
258
|
+
# puts "\n ", fx(name, :bold), "\n"
|
249
259
|
return
|
250
260
|
else
|
251
261
|
if @blog.view?(arg)
|
@@ -255,17 +265,56 @@ module RuneBlog::REPL
|
|
255
265
|
end
|
256
266
|
end
|
257
267
|
|
268
|
+
# move to helpers
|
269
|
+
def modify_view_global(view_name)
|
270
|
+
gfile = "#{@blog.root}/views/#{view_name}/data/global.lt3"
|
271
|
+
lines = File.readlines(gfile).map(&:chomp)
|
272
|
+
vars = <<~EOF
|
273
|
+
.variables
|
274
|
+
View #{view_name}
|
275
|
+
ViewDir #{@blog.root}/views/#{view_name}
|
276
|
+
.end
|
277
|
+
|
278
|
+
EOF
|
279
|
+
# lines.insert(5, vars)
|
280
|
+
text = lines.join("\n")
|
281
|
+
File.write(gfile, text)
|
282
|
+
end
|
283
|
+
|
284
|
+
def modify_view_settings(name:, title:, subtitle:, domain:)
|
285
|
+
vfile = "#{@blog.root}/views/#{name}/settings/view.txt"
|
286
|
+
hash = {/VIEW_NAME/ => name,
|
287
|
+
/VIEW_TITLE/ => title,
|
288
|
+
/VIEW_SUBTITLE/ => subtitle,
|
289
|
+
/VIEW_DOMAIN/ => domain}
|
290
|
+
@blog.complete_file(vfile, nil, hash)
|
291
|
+
end
|
292
|
+
|
258
293
|
def cmd_new_view(arg)
|
294
|
+
view_name = ask!(" Filename: ")
|
295
|
+
@blog.create_view(view_name) # call change_view??
|
296
|
+
title = ask!(" View title: ")
|
297
|
+
subtitle = ask!(" Subtitle : ")
|
298
|
+
domain = ask!(" Domain : ")
|
299
|
+
modify_view_global(view_name)
|
300
|
+
modify_view_settings(name: view_name, title: title, subtitle: subtitle,
|
301
|
+
domain: domain)
|
302
|
+
@blog.change_view(view_name)
|
303
|
+
end
|
304
|
+
|
305
|
+
def cmd_new_view_ORIG(arg)
|
259
306
|
if arg.nil?
|
260
307
|
arg = ask(fx("\nFilename: ", :bold))
|
261
308
|
puts
|
262
309
|
end
|
263
310
|
@blog.create_view(arg)
|
264
|
-
|
265
|
-
File.write("#{@blog.root}/views/#{@blog.view}/themes/standard/global.lt3",
|
311
|
+
lines = File.read("#{@blog.root}/data/global.lt3")
|
312
|
+
# File.write("#{@blog.root}/views/#{@blog.view}/themes/standard/global.lt3",
|
313
|
+
File.write("#{@blog.root}/views/#{@blog.view}/data/global.lt3",
|
266
314
|
text.gsub(/VIEW_NAME/, @blog.view.to_s))
|
267
315
|
vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(VIEW_.*\|SITE.*\)"'
|
268
|
-
edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
|
316
|
+
# edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
|
317
|
+
edit_file(@blog.view.dir/"data/global.lt3", vim: vim_params)
|
269
318
|
@blog.change_view(arg)
|
270
319
|
rescue ViewAlreadyExists
|
271
320
|
puts 'Blog already exists'
|
@@ -306,22 +355,26 @@ module RuneBlog::REPL
|
|
306
355
|
tag = "#{'%04d' % id}"
|
307
356
|
files = ::Find.find(@blog.root/:drafts).to_a
|
308
357
|
files = files.grep(/#{tag}-.*lt3/)
|
309
|
-
draft = exactly_one(files)
|
358
|
+
draft = exactly_one(files, files.join("/"))
|
310
359
|
result = edit_file(draft, vim: '-c$')
|
311
360
|
@blog.generate_post(draft)
|
312
361
|
rescue => err
|
313
362
|
_tmp_error(err)
|
314
363
|
end
|
315
364
|
|
365
|
+
def view2title(name) # FIXME: crufty as hell
|
366
|
+
lines = File.readlines(@blog.root/"views/#{name}/settings/view.txt")
|
367
|
+
lines.map!(&:chomp)
|
368
|
+
lines = lines.select {|x| x =~ /^title / && x !~ /VIEW_/ }
|
369
|
+
title = lines.first.split(" ", 2)[1]
|
370
|
+
end
|
371
|
+
|
316
372
|
def cmd_list_views
|
317
373
|
puts
|
318
374
|
@blog.views.each do |v|
|
319
375
|
v = v.to_s
|
376
|
+
title = view2title(v)
|
320
377
|
v = fx(v, :bold) if v == @blog.view.name
|
321
|
-
# FIXME: next 3 lines are crufty as hell
|
322
|
-
lines = File.readlines(@blog.root/"views/#{v}/settings/view.txt")
|
323
|
-
lines = lines.select {|x| x =~ /^title / && x !~ /VIEW_/ }
|
324
|
-
title = lines.first.split(" ", 2)[1]
|
325
378
|
print " ", ('%15s' % v)
|
326
379
|
puts " ", fx(title, Black)
|
327
380
|
end
|
@@ -365,6 +418,7 @@ module RuneBlog::REPL
|
|
365
418
|
base = draft.sub(/.lt3$/, "")
|
366
419
|
dir = @blog.root/:posts/base
|
367
420
|
meta = nil
|
421
|
+
puts "Trying chdir into #{dir}..."
|
368
422
|
Dir.chdir(dir) { meta = @blog.read_metadata }
|
369
423
|
num, title = meta.num, meta.title
|
370
424
|
num = '%4d' % num.to_s
|