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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9c40711649cc90ed5892d256311a01c9841655a1945cc2dcfcc9bd8dd0e77e5
|
4
|
+
data.tar.gz: ff3b53cdf4d0f6d7136e31cef2aca74a4843d836d45518909baa082f134ec089
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 667ae25acb4c5230f9674fc067bbfca36b18562f8bf9f740f066e39621ae3eff9a952309eb28b3ed754c8f4c4acc0cc7a25054db1f7999844c8f49ac6621cb9c
|
7
|
+
data.tar.gz: cda360ef27a9733285d4aa0c50f402cd00c385f30f49f40d0fd1d61fc1046aec84dc2b0d8f6bb9e4db018c8f4266eb7381c1e9171ff5096166a7054fda98e8ea
|
data/bin/blog
CHANGED
@@ -25,14 +25,13 @@ end
|
|
25
25
|
def get_universal
|
26
26
|
univ = "#{@blog.root}/data/universal.lt3"
|
27
27
|
if yesno("Faster initial setup? (no: edit universal.lt3)")
|
28
|
-
author = ask!("
|
29
|
-
site = ask!("
|
28
|
+
author = ask!(" Author name: ")
|
29
|
+
site = ask!(" Site/domain: ")
|
30
30
|
# Now stash it...
|
31
31
|
str = File.read(univ)
|
32
32
|
str = str.gsub(/AUTHOR/, author)
|
33
33
|
str = str.gsub(/SITE_DOMAIN/, site)
|
34
34
|
File.write(univ, str)
|
35
|
-
# STDERR.puts "------ universal ------\n#{`cat #{univ}`}\n------------------------"
|
36
35
|
else
|
37
36
|
vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(AUTHOR.*\|SITE.*\)"'
|
38
37
|
edit_file(univ, vim: vim_params)
|
@@ -41,11 +40,11 @@ end
|
|
41
40
|
|
42
41
|
def get_global
|
43
42
|
if yesno("Faster view setup? (no: edit global.lt3)")
|
44
|
-
view_name = ask!("
|
43
|
+
view_name = ask!(" Filename: ")
|
45
44
|
@blog.create_view(view_name) # call change_view??
|
46
|
-
title = ask!("
|
47
|
-
subtitle = ask!("
|
48
|
-
domain = ask!("
|
45
|
+
title = ask!(" View title: ")
|
46
|
+
subtitle = ask!(" Subtitle : ")
|
47
|
+
domain = ask!(" Domain : ")
|
49
48
|
|
50
49
|
vfile = "#{@blog.root}/views/#{view_name}/settings/view.txt"
|
51
50
|
hash = {/VIEW_NAME/ => view_name,
|
@@ -54,7 +53,7 @@ def get_global
|
|
54
53
|
/VIEW_DOMAIN/ => domain}
|
55
54
|
@blog.complete_file(vfile, nil, hash)
|
56
55
|
else
|
57
|
-
view_name = ask!("
|
56
|
+
view_name = ask!(" Filename: ")
|
58
57
|
@blog.create_view(view_name) # call change_view??
|
59
58
|
vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(VIEW_.*\|SITE.*\)"'
|
60
59
|
edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
|
@@ -66,6 +65,8 @@ def get_started
|
|
66
65
|
puts " First choose your editor."
|
67
66
|
@blog.editor = pick_editor
|
68
67
|
File.write("#{@blog.root}/data/EDITOR", @blog.editor)
|
68
|
+
print " Default editor is "
|
69
|
+
puts fx(@blog.editor, :bold)
|
69
70
|
|
70
71
|
get_universal
|
71
72
|
# Now create a custom global.lt3
|
@@ -73,11 +74,10 @@ def get_started
|
|
73
74
|
puts fx("\n Quick setup complete!", :bold)
|
74
75
|
if yesno("Create your first view now?")
|
75
76
|
get_global
|
76
|
-
puts "\n
|
77
|
+
puts fx("\n View #{@blog.view} created!\n ", :bold)
|
77
78
|
end
|
78
79
|
end
|
79
80
|
|
80
|
-
puts
|
81
81
|
print fx(" For help", :bold)
|
82
82
|
puts " type h or help."
|
83
83
|
print fx(" Create a view", :bold)
|
@@ -90,11 +90,11 @@ def mainloop
|
|
90
90
|
info = @blog.view || "no view"
|
91
91
|
print fx("[#{info}] ", Red, :bold)
|
92
92
|
cmd = STDSCR.gets(history: @cmdhist, tab: @tabcom)
|
93
|
-
cmd_quit
|
93
|
+
cmd_quit if cmd.nil? # ^D
|
94
94
|
cmd.chomp!
|
95
95
|
return if cmd.empty? # CR does nothing
|
96
|
-
|
97
|
-
ret
|
96
|
+
invoking = RuneBlog::REPL.choose_method(cmd)
|
97
|
+
ret = send(*invoking)
|
98
98
|
rescue => err
|
99
99
|
puts err
|
100
100
|
end
|
@@ -106,7 +106,7 @@ def cmdline_preview
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def cmdline_publish
|
109
|
-
abort "
|
109
|
+
abort "Not implemented yet"
|
110
110
|
_need_view
|
111
111
|
end
|
112
112
|
|
@@ -152,7 +152,8 @@ major, minor = RUBY_VERSION.split(".").values_at(0,1)
|
|
152
152
|
ver = major.to_i*10 + minor.to_i
|
153
153
|
unless ver >= 24
|
154
154
|
RubyText.stop
|
155
|
-
|
155
|
+
sleep 0.2
|
156
|
+
abort "Needs Ruby 2.4 or greater"
|
156
157
|
end
|
157
158
|
|
158
159
|
include RuneBlog::Helpers # for try_read_config
|
@@ -194,7 +195,7 @@ puts fx("\n RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red)
|
|
194
195
|
|
195
196
|
loop { mainloop }
|
196
197
|
|
197
|
-
system("tput clear")
|
198
|
+
# system("tput clear")
|
198
199
|
sleep 0.2
|
199
200
|
puts
|
200
201
|
|
data/data/features.txt
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# 1 = enabled (implies installed)
|
3
3
|
# x = excluded (not installed; does it even exist?)
|
4
4
|
|
5
|
-
reddit
|
5
|
+
reddit 0 # autopost, embed thread after blog post
|
6
6
|
facebook 0 # reader-like, reader post, autopost?
|
7
7
|
twitter 0 # reader-tweet, reader-follow, autotweet?
|
8
8
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# 1 = enabled (implies installed)
|
3
3
|
# x = excluded (not installed; does it even exist?)
|
4
4
|
|
5
|
-
reddit
|
5
|
+
reddit 0 # autopost, embed thread after blog post
|
6
6
|
facebook 0 # reader-like, reader post, autopost?
|
7
7
|
twitter 0 # reader-tweet, reader-follow, autotweet?
|
8
8
|
|
data/lib/helpers-blog.rb
CHANGED
@@ -14,16 +14,18 @@ module RuneBlog::Helpers
|
|
14
14
|
exit
|
15
15
|
end
|
16
16
|
|
17
|
-
def read_features
|
17
|
+
def read_features(view = nil)
|
18
18
|
hash = {}
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
name = line.strip
|
24
|
-
hash[name] = (char != "-")
|
19
|
+
if view.nil? # toplevel default
|
20
|
+
dir = @root/"data"
|
21
|
+
else
|
22
|
+
dir = @root/:views/self.view/:settings
|
25
23
|
end
|
26
|
-
|
24
|
+
file = dir/"features.txt"
|
25
|
+
pairs = read_pairs(file)
|
26
|
+
enabled = {}
|
27
|
+
pairs.each {|k,v| enabled[k] = (v == "1") }
|
28
|
+
@features = enabled
|
27
29
|
end
|
28
30
|
|
29
31
|
def get_repo_config
|
@@ -39,15 +41,9 @@ module RuneBlog::Helpers
|
|
39
41
|
|
40
42
|
def copy_data(tag, dest)
|
41
43
|
data = RuneBlog::Path + "/../data" # files kept inside gem
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
when :config
|
46
|
-
files = %w[ROOT VIEW EDITOR universal.lt3 global.lt3]
|
47
|
-
files.each {|file| copy(data + "/" + file, dest) }
|
48
|
-
when :extra # FIXME remove later
|
49
|
-
# copy!(extra, dest)
|
50
|
-
end
|
44
|
+
# FIXME tag no longer used
|
45
|
+
files = %w[ROOT VIEW EDITOR universal.lt3 global.lt3 features.txt]
|
46
|
+
files.each {|file| copy(data + "/" + file, dest) unless File.exist?(dest/file) }
|
51
47
|
end
|
52
48
|
|
53
49
|
def read_vars(file)
|
@@ -70,47 +66,6 @@ module RuneBlog::Helpers
|
|
70
66
|
stop_RubyText rescue nil
|
71
67
|
end
|
72
68
|
|
73
|
-
def read_config(file, *syms)
|
74
|
-
log!(enter: __method__, args: [file, *syms], level: 3)
|
75
|
-
lines = File.readlines(file).map(&:chomp)
|
76
|
-
obj = ::OpenStruct.new
|
77
|
-
skip = ["\n", "#", "."]
|
78
|
-
lines.each do |line|
|
79
|
-
next if skip.include?(line[0])
|
80
|
-
key, val = line.split(/: +/, 2)
|
81
|
-
obj.send(key+"=", val)
|
82
|
-
end
|
83
|
-
return obj if syms.empty?
|
84
|
-
|
85
|
-
vals = []
|
86
|
-
if syms.empty?
|
87
|
-
vals = obj.to_hash.values
|
88
|
-
else
|
89
|
-
syms.each {|sym| vals << obj.send(sym) }
|
90
|
-
end
|
91
|
-
return vals
|
92
|
-
rescue => err
|
93
|
-
puts "Can't read config file '#{file}': #{err}"
|
94
|
-
puts err.backtrace.join("\n")
|
95
|
-
puts "dir = #{Dir.pwd}"
|
96
|
-
stop_RubyText
|
97
|
-
end
|
98
|
-
|
99
|
-
def try_read_config(file, hash)
|
100
|
-
log!(enter: __method__, args: [file, hash], level: 3)
|
101
|
-
return hash.values unless File.exist?(file)
|
102
|
-
vals = read_config(file, *hash.keys)
|
103
|
-
vals
|
104
|
-
end
|
105
|
-
|
106
|
-
def write_config(obj, file)
|
107
|
-
log!(enter: __method__, args: [obj, file], level: 2)
|
108
|
-
hash = obj.to_h
|
109
|
-
File.open(file, "w") do |out|
|
110
|
-
hash.each_pair {|key, val| out.puts "#{key}: #{val}" }
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
69
|
def retrieve_views # read from filesystem
|
115
70
|
log!(enter: __method__, level: 3)
|
116
71
|
dirs = subdirs("#@root/views/").sort
|
data/lib/helpers-repl.rb
CHANGED
@@ -109,7 +109,9 @@ module RuneBlog::REPL
|
|
109
109
|
end
|
110
110
|
meth = found || :cmd_INVALID
|
111
111
|
params = cmd if meth == :cmd_INVALID
|
112
|
-
[meth
|
112
|
+
result = [meth]
|
113
|
+
result << params unless params.nil?
|
114
|
+
result
|
113
115
|
end
|
114
116
|
|
115
117
|
def ask(prompt, meth = :to_s)
|
@@ -121,42 +123,6 @@ module RuneBlog::REPL
|
|
121
123
|
ask(fx(prompt, :bold), meth)
|
122
124
|
end
|
123
125
|
|
124
|
-
def reset_output(initial = "")
|
125
|
-
@out ||= ""
|
126
|
-
@out.replace initial
|
127
|
-
end
|
128
|
-
|
129
|
-
def flush_output(initial = "")
|
130
|
-
CantOpen
|
131
|
-
@out ||= ""
|
132
|
-
puts @out
|
133
|
-
reset_output
|
134
|
-
end
|
135
|
-
|
136
|
-
def output(str) # \n and indent
|
137
|
-
@out ||= ""
|
138
|
-
@out << " " + str.to_s
|
139
|
-
end
|
140
|
-
|
141
|
-
def outstr(str) # indent
|
142
|
-
@out ||= ""
|
143
|
-
@out << str
|
144
|
-
end
|
145
|
-
|
146
|
-
def output!(str) # \n and indent
|
147
|
-
@out ||= ""
|
148
|
-
@out << " " + str
|
149
|
-
end
|
150
|
-
|
151
|
-
def output_newline(n = 1)
|
152
|
-
@out ||= ""
|
153
|
-
n.times { @out << "\n" }
|
154
|
-
end
|
155
|
-
|
156
|
-
def check_empty(arg)
|
157
|
-
raise InternalError(caller[0], arg.inspect) unless arg.nil?
|
158
|
-
end
|
159
|
-
|
160
126
|
def get_integer(arg)
|
161
127
|
Integer(arg)
|
162
128
|
rescue
|
@@ -176,10 +142,6 @@ module RuneBlog::REPL
|
|
176
142
|
end
|
177
143
|
end
|
178
144
|
|
179
|
-
def colored_slug(slug)
|
180
|
-
slug[0..3] + slug[4..-1]
|
181
|
-
end
|
182
|
-
|
183
145
|
def tags_for_view(vname = @blog.view)
|
184
146
|
Dir.chdir(vname) do
|
185
147
|
fname = "tagpool"
|
data/lib/liveblog.rb
CHANGED
@@ -72,7 +72,7 @@ def post_trailer
|
|
72
72
|
tags = _var("post.tags")
|
73
73
|
taglist = tags.empty? ? "" : "Tags: #{tags}"
|
74
74
|
|
75
|
-
reddit_enabled = @blog.features["reddit"]
|
75
|
+
reddit_enabled = @blog.features["reddit"]
|
76
76
|
reddit_txt = ""
|
77
77
|
if reddit_enabled
|
78
78
|
vdir = @blog.root/:views/@blog.view
|
@@ -110,7 +110,7 @@ def faq
|
|
110
110
|
_out %[ <a data-toggle="collapse" href="##{id}" role="button" aria-expanded="false" aria-controls="collapseExample"><font size=+3>⌄</font></a>]
|
111
111
|
_out %[ <b>#{ques}</b>]
|
112
112
|
_out %[<div class="collapse" id="#{id}"><br><font size=+1> #{ans}</font></div>\n]
|
113
|
-
_out "<br>" unless @faq_count == 1
|
113
|
+
_out "<br>" # unless @faq_count == 1
|
114
114
|
_optional_blank_line
|
115
115
|
end
|
116
116
|
|
@@ -775,9 +775,9 @@ end
|
|
775
775
|
def _write_metadata
|
776
776
|
File.write("teaser.txt", @meta.teaser)
|
777
777
|
fields = [:num, :title, :date, :pubdate, :views, :tags, :pinned]
|
778
|
-
|
779
|
-
|
780
|
-
fields.each {|fld|
|
778
|
+
fname = "metadata.txt"
|
779
|
+
File.open(fname, "w") do |f|
|
780
|
+
fields.each {|fld| f.puts "#{'%8s' % fld} #{@meta.send(fld)}" }
|
781
781
|
end
|
782
782
|
end
|
783
783
|
|
@@ -789,9 +789,8 @@ def _post_lookup(postid) # side-effect
|
|
789
789
|
posts = Dir.entries(dir_posts).grep(/^\d\d\d\d/).map {|x| dir_posts/x }
|
790
790
|
posts.select! {|x| File.directory?(x) }
|
791
791
|
|
792
|
-
|
793
|
-
|
794
|
-
postdir = post.first
|
792
|
+
posts = posts.select {|x| File.basename(x).to_i == postid }
|
793
|
+
postdir = exactly_one(posts)
|
795
794
|
vp = RuneBlog::ViewPost.new(@blog.view, postdir)
|
796
795
|
vp
|
797
796
|
end
|
data/lib/lowlevel.rb
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
|
2
|
+
def _tmp_error(err)
|
3
|
+
out = "/tmp/blog#{rand(100)}.txt"
|
4
|
+
File.open(out, "w") do |f|
|
5
|
+
f.puts err.to_s + "\n--------"
|
6
|
+
f.puts err.backtrace.join("\n")
|
7
|
+
end
|
8
|
+
puts "Error: See #{out}"
|
9
|
+
end
|
10
|
+
|
2
11
|
def dump(obj, name)
|
3
12
|
File.write(name, obj)
|
4
13
|
end
|
@@ -19,22 +28,41 @@
|
|
19
28
|
end
|
20
29
|
|
21
30
|
def _get_data?(file) # File need not exist
|
22
|
-
|
23
|
-
_get_data(file)
|
24
|
-
else
|
25
|
-
[]
|
26
|
-
end
|
31
|
+
File.exist?(file) ? _get_data(file) : []
|
27
32
|
end
|
28
33
|
|
29
34
|
def _get_data(file)
|
30
35
|
lines = File.readlines(file)
|
31
|
-
lines.reject! {|line| line[0] == "-" } # allow rejection of lines
|
32
36
|
lines = lines.map do |line|
|
33
|
-
line
|
37
|
+
line = line.chomp.strip
|
38
|
+
line.sub(/ *# .*$/, "") # allow leading/trailing comments
|
34
39
|
end
|
40
|
+
lines.reject! {|x| x.empty? }
|
35
41
|
lines
|
36
42
|
end
|
37
43
|
|
44
|
+
def read_pairs(file) # returns a hash
|
45
|
+
lines = _get_data(file)
|
46
|
+
hash = {}
|
47
|
+
lines.each do |line|
|
48
|
+
key, val = line.split(" ", 2)
|
49
|
+
val ||= ""
|
50
|
+
hash[key] = val
|
51
|
+
end
|
52
|
+
hash
|
53
|
+
end
|
54
|
+
|
55
|
+
def read_pairs!(file) # returns an openstruct
|
56
|
+
lines = _get_data(file)
|
57
|
+
obj = OpenStruct.new
|
58
|
+
lines.each do |line|
|
59
|
+
key, val = line.split(" ", 2)
|
60
|
+
val ||= ""
|
61
|
+
obj.send("#{key}=", val)
|
62
|
+
end
|
63
|
+
obj
|
64
|
+
end
|
65
|
+
|
38
66
|
def copy(src, dst)
|
39
67
|
log!(enter: __method__, args: [src, dst], level: 2)
|
40
68
|
cmd = "cp #{src} #{dst} 2>/dev/null"
|
@@ -65,9 +93,15 @@
|
|
65
93
|
end
|
66
94
|
|
67
95
|
def error(err)
|
68
|
-
log!(str: err, enter: __method__, args: [err], level: 2)
|
96
|
+
# log!(str: err, enter: __method__, args: [err], level: 2)
|
69
97
|
str = "\n Error: #{err}"
|
70
98
|
puts str
|
71
99
|
puts err.backtrace.join("\n")
|
72
100
|
end
|
73
101
|
|
102
|
+
def exactly_one(list)
|
103
|
+
raise "List: Zero instances" if list.empty?
|
104
|
+
raise "List: More than one instance" if list.size > 1
|
105
|
+
list.first
|
106
|
+
end
|
107
|
+
|
data/lib/post.rb
CHANGED
@@ -13,41 +13,20 @@ class RuneBlog::Post
|
|
13
13
|
log!(enter: __method__, args: [post], level: 3)
|
14
14
|
raise "Doesn't work right now"
|
15
15
|
raise NoBlogAccessor if RuneBlog.blog.nil?
|
16
|
-
# "post" is a slug
|
16
|
+
# "post" is a slug?
|
17
17
|
pdir = RuneBlog.blog.root/:drafts/post
|
18
18
|
meta = nil
|
19
19
|
Dir.chdir(pdir) do
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
# meta = read_config("metadata.txt")
|
21
|
+
# meta.date = Date.parse(meta.date)
|
22
|
+
# meta.views = meta.views.split
|
23
|
+
# meta.tags = meta.tags.split
|
24
|
+
# meta.teaser = File.read("teaser.txt")
|
25
25
|
# meta.body = File.read("body.txt")
|
26
26
|
end
|
27
27
|
meta
|
28
28
|
end
|
29
29
|
|
30
|
-
def write_metadata(meta) # FIXME ???
|
31
|
-
log!(enter: __method__, args: [meta], level: 3)
|
32
|
-
debug "=== write_metadata:"
|
33
|
-
debug "-----\n#{meta.inspect}\n-----"
|
34
|
-
fname2 = "metadata.txt"
|
35
|
-
hash = meta.to_h
|
36
|
-
|
37
|
-
File.write("teaser.txt", hash[:teaser])
|
38
|
-
hash.delete(:teaser)
|
39
|
-
hash.delete(:body)
|
40
|
-
|
41
|
-
hash[:views] = hash[:views].join(" ")
|
42
|
-
hash[:tags] = hash[:tags].join(" ")
|
43
|
-
|
44
|
-
fields = [:num, :title, :date, :pubdate, :views, :tags]
|
45
|
-
|
46
|
-
f2 = File.new(fname2, "w")
|
47
|
-
fields.each {|fld| f2.puts "#{fld}: #{hash[fld]}" }
|
48
|
-
f2.close
|
49
|
-
end
|
50
|
-
|
51
30
|
def initialize
|
52
31
|
log!(enter: __method__, level: 3)
|
53
32
|
@blog = RuneBlog.blog || raise(NoBlogAccessor)
|
@@ -87,10 +66,9 @@ class RuneBlog::Post
|
|
87
66
|
end
|
88
67
|
|
89
68
|
def edit
|
90
|
-
log!(enter: __method__)
|
91
|
-
|
92
|
-
|
93
|
-
nil
|
69
|
+
# log!(enter: __method__)
|
70
|
+
edit_file(@draft, vim: "+8")
|
71
|
+
build
|
94
72
|
rescue => err
|
95
73
|
error(err)
|
96
74
|
end
|
@@ -99,8 +77,8 @@ class RuneBlog::Post
|
|
99
77
|
log!(enter: __method__)
|
100
78
|
post = self
|
101
79
|
views = post.meta.views
|
102
|
-
text = File.read(@draft)
|
103
80
|
@blog.generate_post(@draft)
|
81
|
+
@blog.generate_index(@blog.view)
|
104
82
|
end
|
105
83
|
end
|
106
84
|
|
@@ -184,12 +162,12 @@ class RuneBlog::ViewPost
|
|
184
162
|
@aslug = @nslug[5..-1]
|
185
163
|
fname = "#{postdir}/teaser.txt" # ???
|
186
164
|
@teaser_text = File.read(fname).chomp
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
165
|
+
|
166
|
+
Dir.chdir(postdir) do
|
167
|
+
meta = @blog.read_metadata
|
168
|
+
@title = meta.title
|
169
|
+
@date = meta.pubdate
|
170
|
+
end
|
193
171
|
rescue => err
|
194
172
|
STDERR.puts "--- #{err}\n #{err.backtrace.join("\n ")}"
|
195
173
|
end
|