runeblog 0.3.02 → 0.3.07
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/blog +17 -16
- data/data/features.txt +1 -1
- data/empty_view/settings/features.txt +1 -1
- data/empty_view/settings/recent.txt +5 -0
- data/lib/helpers-blog.rb +13 -58
- data/lib/helpers-repl.rb +3 -41
- data/lib/liveblog.rb +7 -8
- data/lib/lowlevel.rb +42 -8
- data/lib/post.rb +16 -38
- data/lib/repl.rb +111 -217
- data/lib/runeblog.rb +30 -73
- data/lib/runeblog_version.rb +1 -2
- data/lib/view.rb +4 -0
- data/test/austin.rb +6 -7
- metadata +2 -2
data/lib/runeblog.rb
CHANGED
@@ -75,15 +75,6 @@ class RuneBlog
|
|
75
75
|
|
76
76
|
end
|
77
77
|
|
78
|
-
def _tmp_error(err) # FIXME move to helpers
|
79
|
-
out = "/tmp/blog#{rand(100)}.txt"
|
80
|
-
File.open(out, "w") do |f|
|
81
|
-
f.puts err
|
82
|
-
f.puts err.backtrace.join("\n")
|
83
|
-
end
|
84
|
-
puts "Error: See #{out}"
|
85
|
-
end
|
86
|
-
|
87
78
|
def self.create_new_blog_repo(root_rel = ".blogs")
|
88
79
|
log!(enter: __method__, args: [root_rel])
|
89
80
|
raise ArgumentError unless root_rel.is_a?(String) && ! root_rel.empty?
|
@@ -122,6 +113,7 @@ class RuneBlog
|
|
122
113
|
@root = Dir.pwd/root_rel
|
123
114
|
write_repo_config(root: @root) # ?? FIXME
|
124
115
|
get_repo_config
|
116
|
+
read_features # top level
|
125
117
|
@views = retrieve_views
|
126
118
|
self.view = File.read(@root/"data/VIEW").chomp
|
127
119
|
md = Dir.pwd.match(%r[.*/views/(.*?)/])
|
@@ -197,11 +189,20 @@ class RuneBlog
|
|
197
189
|
_generate_settings
|
198
190
|
end
|
199
191
|
|
192
|
+
# FIXME reconcile with _get_draft data
|
193
|
+
|
194
|
+
def read_metadata
|
195
|
+
meta = read_pairs!("metadata.txt")
|
196
|
+
meta.views = meta.views.split
|
197
|
+
meta.tags = meta.tags.split
|
198
|
+
meta
|
199
|
+
end
|
200
|
+
|
200
201
|
def _deploy_local(dir)
|
201
202
|
log!(enter: __method__, args: [dir], level: 1)
|
202
203
|
Dir.chdir(dir) do
|
203
|
-
|
204
|
-
views.each do |v|
|
204
|
+
meta = read_metadata
|
205
|
+
meta.views.each do |v|
|
205
206
|
next unless _check_view?(v)
|
206
207
|
system!("cp *html #@root/views/#{v}/remote", show: true)
|
207
208
|
end
|
@@ -210,33 +211,6 @@ class RuneBlog
|
|
210
211
|
_tmp_error(err)
|
211
212
|
end
|
212
213
|
|
213
|
-
# FIXME reconcile with _get_draft data
|
214
|
-
|
215
|
-
def _retrieve_metadata(key)
|
216
|
-
key = key.to_s
|
217
|
-
lines = File.readlines("metadata.txt")
|
218
|
-
lines = lines.grep(/^#{key}: /)
|
219
|
-
case lines.size
|
220
|
-
when 0
|
221
|
-
result = nil # not found
|
222
|
-
when 1
|
223
|
-
front = "#{key}: "
|
224
|
-
n = front.size
|
225
|
-
str = lines.first.chomp[n..-1]
|
226
|
-
case key
|
227
|
-
when "views", "tags" # plurals
|
228
|
-
result = str.split
|
229
|
-
else
|
230
|
-
result = str
|
231
|
-
end
|
232
|
-
else
|
233
|
-
raise "Too many #{key} instances in metadata.txt!"
|
234
|
-
end
|
235
|
-
return result
|
236
|
-
rescue => err
|
237
|
-
_tmp_error(err)
|
238
|
-
end
|
239
|
-
|
240
214
|
def process_post(sourcefile)
|
241
215
|
log!(enter: __method__, args: [sourcefile], level: 2)
|
242
216
|
nslug = sourcefile.sub(/.lt3/, "")
|
@@ -294,11 +268,15 @@ class RuneBlog
|
|
294
268
|
@view = nil
|
295
269
|
when RuneBlog::View
|
296
270
|
@view = arg
|
271
|
+
read_features(@view)
|
272
|
+
@view.get_globals
|
297
273
|
_set_publisher
|
298
274
|
when String
|
299
275
|
new_view = str2view(arg)
|
300
276
|
raise NoSuchView(arg) if new_view.nil?
|
301
277
|
@view = new_view
|
278
|
+
read_features(@view)
|
279
|
+
@view.get_globals
|
302
280
|
_set_publisher
|
303
281
|
else
|
304
282
|
raise CantAssignView(arg.class.to_s)
|
@@ -374,6 +352,7 @@ class RuneBlog
|
|
374
352
|
add_view(view_name)
|
375
353
|
mark_last_published("Initial creation")
|
376
354
|
system("cp #@root/data/global.lt3 #@root/views/#{view_name}/themes/standard/global.lt3")
|
355
|
+
@view.get_globals
|
377
356
|
rescue => err
|
378
357
|
_tmp_error(err)
|
379
358
|
end
|
@@ -404,9 +383,8 @@ class RuneBlog
|
|
404
383
|
posts = Dir.entries(dir_posts).grep(/^\d\d\d\d/).map {|x| dir_posts/x }
|
405
384
|
posts.select! {|x| File.directory?(x) }
|
406
385
|
|
407
|
-
|
408
|
-
|
409
|
-
postdir = post.first
|
386
|
+
posts = posts.select {|x| File.basename(x).to_i == postid }
|
387
|
+
postdir = exactly_one(posts)
|
410
388
|
vp = RuneBlog::ViewPost.new(self.view, postdir)
|
411
389
|
vp
|
412
390
|
rescue => err
|
@@ -454,16 +432,18 @@ class RuneBlog
|
|
454
432
|
return posts[0..19] # return 20 at most
|
455
433
|
end
|
456
434
|
|
457
|
-
def collect_recent_posts(file)
|
435
|
+
def collect_recent_posts(file = "recent.html")
|
458
436
|
log!(enter: __method__, args: [file], level: 3)
|
437
|
+
vars = self.view.globals
|
459
438
|
text = <<-HTML
|
460
439
|
<html>
|
461
440
|
<head><link rel="stylesheet" href="etc/blog.css"></head>
|
462
|
-
<body>
|
441
|
+
<body style="background-color: #{vars["recent.bgcolor"]}">
|
463
442
|
HTML
|
464
443
|
posts = _sorted_posts
|
465
444
|
if posts.size > 0
|
466
|
-
|
445
|
+
# estimate how many we want
|
446
|
+
wanted = [vars["recent.count"].to_i, posts.size].min
|
467
447
|
enum = posts.each
|
468
448
|
entries = []
|
469
449
|
wanted.times do
|
@@ -535,7 +515,7 @@ class RuneBlog
|
|
535
515
|
log!(enter: __method__, args: [view], pwd: true, dir: true)
|
536
516
|
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
537
517
|
@vdir = @root/:views/view
|
538
|
-
num = collect_recent_posts
|
518
|
+
num = collect_recent_posts
|
539
519
|
return num
|
540
520
|
rescue => err
|
541
521
|
_tmp_error(err)
|
@@ -564,34 +544,10 @@ class RuneBlog
|
|
564
544
|
# _tmp_error(err)
|
565
545
|
end
|
566
546
|
|
567
|
-
def _get_draft_data(num, sym)
|
568
|
-
tag = prefix(num)
|
569
|
-
front = @blog.root/:drafts/tag
|
570
|
-
files = Dir[front + "*"]
|
571
|
-
raise "No draft #{num} found" if files.empty?
|
572
|
-
raise "Too many files found for #{num}!" if files.size > 1
|
573
|
-
file = files.first
|
574
|
-
lines = File.readlines(file)
|
575
|
-
case sym
|
576
|
-
when :views
|
577
|
-
view_line = lines.grep(/^.views /)
|
578
|
-
raise "More than one .views call in #{draft}" if view_line.size > 1
|
579
|
-
raise "No .views call in #{draft}" if view_line.size < 1
|
580
|
-
view_line = view_line.first
|
581
|
-
views = view_line[7..-1].split
|
582
|
-
return views.uniq
|
583
|
-
else
|
584
|
-
raise "Unknown symbol #{sym.inspect}"
|
585
|
-
end
|
586
|
-
end
|
587
|
-
|
588
547
|
def _get_views(draft)
|
589
548
|
log!(enter: __method__, args: [draft], level: 2)
|
590
549
|
# FIXME dumb code
|
591
|
-
view_line = File.readlines(draft).grep(/^.views /)
|
592
|
-
raise "More than one .views call in #{draft}" if view_line.size > 1
|
593
|
-
raise "No .views call in #{draft}" if view_line.size < 1
|
594
|
-
view_line = view_line.first
|
550
|
+
view_line = exactly_one(File.readlines(draft).grep(/^.views /))
|
595
551
|
views = view_line[7..-1].split
|
596
552
|
views.uniq
|
597
553
|
rescue => err
|
@@ -622,10 +578,11 @@ class RuneBlog
|
|
622
578
|
pnum = nslug[0..3] # 0001
|
623
579
|
Dir.chdir(pdraft) do
|
624
580
|
excerpt = File.read("teaser.txt")
|
625
|
-
|
581
|
+
meta = read_metadata
|
582
|
+
date = meta.date
|
626
583
|
longdate = ::Date.parse(date).strftime("%B %e, %Y")
|
627
|
-
title =
|
628
|
-
tags =
|
584
|
+
title = meta.title
|
585
|
+
tags = meta.tags
|
629
586
|
# FIXME simplify
|
630
587
|
vars = <<~LIVE
|
631
588
|
.set post.num = #{pnum}
|
data/lib/runeblog_version.rb
CHANGED
@@ -3,7 +3,7 @@ if !defined?(RuneBlog::Path)
|
|
3
3
|
# if ! (Object.constants.include?(:RuneBlog) && RuneBlog.constants.include?(:Path))
|
4
4
|
|
5
5
|
class RuneBlog
|
6
|
-
VERSION = "0.3.
|
6
|
+
VERSION = "0.3.07"
|
7
7
|
|
8
8
|
path = Gem.find_files("runeblog").grep(/runeblog-/).first
|
9
9
|
Path = File.dirname(path)
|
@@ -46,5 +46,4 @@ def prefix(num)
|
|
46
46
|
"#{'%04d' % num.to_i}"
|
47
47
|
end
|
48
48
|
|
49
|
-
|
50
49
|
end
|
data/lib/view.rb
CHANGED
@@ -14,6 +14,10 @@ class RuneBlog::View
|
|
14
14
|
@publisher = RuneBlog::Publishing.new(name)
|
15
15
|
@can_publish = true # FIXME
|
16
16
|
@blog.view = self
|
17
|
+
get_globals
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_globals
|
17
21
|
gfile = @blog.root/"views/#{name}/themes/standard/global.lt3"
|
18
22
|
return unless File.exist?(gfile) # Hackish!! how is View.new called from create_view??
|
19
23
|
|
data/test/austin.rb
CHANGED
@@ -31,7 +31,7 @@ end
|
|
31
31
|
@fake_date = Date.today - 20
|
32
32
|
|
33
33
|
def make_post(x, title, teaser, body, views=[])
|
34
|
-
debug "
|
34
|
+
debug " make_post #{bold(title)}"
|
35
35
|
pubdate = @fake_date.strftime("%Y-%m-%d")
|
36
36
|
@fake_date += (rand(2) + 1)
|
37
37
|
x.create_new_post(title, true, teaser: teaser, body: body, views: views,
|
@@ -53,8 +53,8 @@ puts
|
|
53
53
|
debug bold("Generating test blog...")
|
54
54
|
|
55
55
|
system("rm -rf .blogs")
|
56
|
-
RuneBlog.create_new_blog_repo(".blogs")
|
57
|
-
x = RuneBlog.new(".blogs")
|
56
|
+
RuneBlog.create_new_blog_repo # (".blogs")
|
57
|
+
x = RuneBlog.new # (".blogs")
|
58
58
|
|
59
59
|
debug("create_view: #{bold('around_austin')}")
|
60
60
|
x.create_view("around_austin") # FIXME remember view title!
|
@@ -72,7 +72,7 @@ File.open(vfile, "w") {|f| f.puts vars }
|
|
72
72
|
|
73
73
|
####
|
74
74
|
|
75
|
-
debug("
|
75
|
+
debug("change_view: #{bold('around_austin')}")
|
76
76
|
x.change_view("around_austin") # 1 2 7 8 9
|
77
77
|
|
78
78
|
make_post(x, "What's at Stubbs...", <<-EXCERPT, <<-BODY)
|
@@ -142,11 +142,10 @@ But I first heard of them
|
|
142
142
|
in 2005.
|
143
143
|
BODY
|
144
144
|
|
145
|
-
debug
|
146
|
-
debug "** generate_index #{bold("around_austin")}"
|
145
|
+
debug "generate_index #{bold("around_austin")}"
|
147
146
|
x.generate_index("around_austin")
|
148
147
|
|
149
|
-
debug("
|
148
|
+
debug("generate_view: #{bold('around_austin')}")
|
150
149
|
x.generate_view("around_austin")
|
151
150
|
|
152
151
|
debug bold("...finished.\n")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runeblog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.07
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: livetext
|