runeblog 0.2.3 → 0.2.5
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/empty_view.tgz +0 -0
- data/lib/BAD.liveblog.rb +724 -0
- data/lib/KEEP.liveblog +646 -0
- data/lib/NEW-liveblog.rb +757 -0
- data/lib/OLD-liveblog.rb +661 -0
- data/lib/default.rb +1 -0
- data/lib/global.rb +5 -0
- data/lib/helpers-blog.rb +40 -14
- data/lib/liveblog.rb +7 -3
- data/lib/logging.rb +58 -0
- data/lib/post.rb +9 -0
- data/lib/publish.rb +7 -0
- data/lib/runeblog.rb +112 -43
- data/lib/runeblog_version.rb +1 -1
- data/lib/view.rb +8 -0
- data/runeblog.gemspec +1 -1
- data/test/make_blog.rb +8 -2
- data/themes/standard/blog/index.lt3 +3 -4
- data/themes/standard/blog/recent.lt3 +2 -0
- data/themes/standard/widgets/news/news.lt3 +1 -2
- data/themes/standard/widgets/pages/disclaim.html +6 -0
- data/themes/standard/widgets/pages/disclaim.lt3 +2 -3
- data/themes/standard/widgets/pages/faq.html +7 -0
- data/themes/standard/widgets/pages/faq.lt3 +1 -1
- data/themes/standard/widgets/pages/lifestory.html +7 -0
- data/themes/standard/widgets/pages/lifestory.lt3 +1 -1
- data/themes/standard/widgets/pages/like-dislike.html +7 -0
- data/themes/standard/widgets/pages/like-dislike.lt3 +1 -1
- data/themes/standard/widgets/pages/list.data +4 -4
- data/themes/standard/widgets/pages/pages.lt3 +2 -0
- metadata +14 -3
- data/themes/standard/widgets/pages/main.lt3 +0 -18
data/lib/default.rb
CHANGED
@@ -6,6 +6,7 @@ class RuneBlog::Default
|
|
6
6
|
def RuneBlog.post_template(num: 0, title: "No title", date: nil, view: "test_view",
|
7
7
|
teaser: "No teaser", body: "No body", tags: ["untagged"],
|
8
8
|
views: [], back: "javascript:history.go(-1)", home: "no url")
|
9
|
+
log!(enter: __method__, args: [num, title, date, view, teaser, body, tags, views, back, home])
|
9
10
|
viewlist = (views + [view.to_s]).join(" ")
|
10
11
|
taglist = ".tags " + tags.join(" ")
|
11
12
|
<<-TEXT
|
data/lib/global.rb
CHANGED
@@ -20,6 +20,7 @@ end
|
|
20
20
|
# Refactor, move stuff elsewhere?
|
21
21
|
|
22
22
|
def make_exception(sym, str)
|
23
|
+
log!(enter: __method__, args: [sym, str])
|
23
24
|
return if Object.constants.include?(sym)
|
24
25
|
Object.const_set(sym, StandardError.dup)
|
25
26
|
define_method(sym) do |*args|
|
@@ -30,10 +31,12 @@ def make_exception(sym, str)
|
|
30
31
|
end
|
31
32
|
|
32
33
|
def prefix(num)
|
34
|
+
log!(enter: __method__, args: [num])
|
33
35
|
"#{'%04d' % num.to_i}"
|
34
36
|
end
|
35
37
|
|
36
38
|
def check_meta(meta, where = "")
|
39
|
+
log!(enter: __method__, args: [meta, where])
|
37
40
|
str = "--- #{where}\n"
|
38
41
|
str << "\ncheck_meta: \n" + caller.join("\n") + "\n meta = #{meta.inspect}\n"
|
39
42
|
str << " title missing!\n" unless meta.title
|
@@ -46,12 +49,14 @@ def check_meta(meta, where = "")
|
|
46
49
|
end
|
47
50
|
|
48
51
|
def verify(hash)
|
52
|
+
log!(enter: __method__, args: [hash])
|
49
53
|
hash.each_pair do |expr, msg|
|
50
54
|
puts "<< #{msg}" unless expr
|
51
55
|
end
|
52
56
|
end
|
53
57
|
|
54
58
|
def assure(hash) # really the same as verify for now...
|
59
|
+
log!(enter: __method__, args: [hash])
|
55
60
|
hash.each_pair do |expr, msg|
|
56
61
|
puts "<< #{msg}" unless expr
|
57
62
|
end
|
data/lib/helpers-blog.rb
CHANGED
@@ -6,39 +6,52 @@ require 'fileutils'
|
|
6
6
|
module RuneBlog::Helpers
|
7
7
|
|
8
8
|
def copy(src, dst)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
log!(enter: __method__, args: [src, dst])
|
10
|
+
cmd = "cp #{src} #{dst} 2>/dev/null"
|
11
|
+
# puts "\n--- pwd = #{Dir.pwd} \n Trying: #{cmd}"
|
12
|
+
# if src =~ /\*/
|
13
|
+
rc = system(cmd)
|
14
|
+
puts " FROM #{caller[0]}" unless rc
|
15
|
+
exit unless rc
|
16
|
+
# else
|
17
|
+
# FileUtils.cp(src, dst)
|
18
|
+
# end
|
14
19
|
end
|
15
20
|
|
16
21
|
def copy!(src, dst)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
+
log!(enter: __method__, args: [src, dst])
|
23
|
+
cmd = "cp -r #{src} #{dst} 2>/dev/null"
|
24
|
+
# puts "\n--- pwd = #{Dir.pwd} \n Trying: #{cmd}"
|
25
|
+
# if src =~ /\*/
|
26
|
+
rc = system(cmd)
|
27
|
+
puts " FROM #{caller[0]}" unless rc
|
28
|
+
exit unless rc
|
29
|
+
# else
|
30
|
+
# FileUtils.cp_r(src, dst)
|
31
|
+
# end
|
22
32
|
end
|
23
33
|
|
24
34
|
def stale?(src, dst)
|
35
|
+
log!(enter: __method__, args: [src, dst])
|
25
36
|
return true unless File.exist?(dst)
|
26
37
|
return true if File.mtime(src) > File.mtime(dst)
|
27
38
|
return false
|
28
39
|
end
|
29
40
|
|
30
41
|
def livetext(src, dst=nil)
|
42
|
+
log!(enter: __method__, args: [src, dst])
|
31
43
|
src << ".lt3" unless src.end_with?(".lt3")
|
32
44
|
if dst
|
33
45
|
dst << ".html" unless dst.end_with?(".html")
|
34
46
|
else
|
35
47
|
dst = src.sub(/.lt3$/, "")
|
36
48
|
end
|
37
|
-
|
49
|
+
# return unless stale?(src, dst)
|
38
50
|
system("livetext #{src} >#{dst}")
|
39
51
|
end
|
40
52
|
|
41
53
|
def get_root
|
54
|
+
log!(enter: __method__)
|
42
55
|
if $_blog
|
43
56
|
if $_blog.root
|
44
57
|
puts "0. Returned: #{$_blog.root}/"
|
@@ -54,7 +67,7 @@ module RuneBlog::Helpers
|
|
54
67
|
end
|
55
68
|
|
56
69
|
def read_config(file, *syms)
|
57
|
-
|
70
|
+
log!(enter: __method__, args: [file, *syms])
|
58
71
|
lines = File.readlines(file).map(&:chomp)
|
59
72
|
obj = ::OpenStruct.new
|
60
73
|
lines.each do |line|
|
@@ -79,6 +92,7 @@ module RuneBlog::Helpers
|
|
79
92
|
end
|
80
93
|
|
81
94
|
def try_read_config(file, hash)
|
95
|
+
log!(enter: __method__, args: [file, hash])
|
82
96
|
return hash.values unless File.exist?(file)
|
83
97
|
vals = read_config(file, *hash.keys)
|
84
98
|
# STDERR.puts vals.inspect
|
@@ -86,6 +100,7 @@ module RuneBlog::Helpers
|
|
86
100
|
end
|
87
101
|
|
88
102
|
def put_config(root:, view:"test_view", editor: "/usr/local/bin/vim")
|
103
|
+
log!(enter: __method__, args: [root, view, editor])
|
89
104
|
Dir.mkdir(root) unless Dir.exist?(root)
|
90
105
|
Dir.chdir(root) do
|
91
106
|
File.open("config", "w") do |cfg|
|
@@ -97,6 +112,7 @@ def put_config(root:, view:"test_view", editor: "/usr/local/bin/vim")
|
|
97
112
|
end
|
98
113
|
|
99
114
|
def write_config(obj, file)
|
115
|
+
log!(enter: __method__, args: [obj, file])
|
100
116
|
hash = obj.to_h
|
101
117
|
# Dir.chdir(::Home)
|
102
118
|
# puts "--- wc: pwd = #{Dir.pwd}"
|
@@ -108,6 +124,7 @@ end
|
|
108
124
|
end
|
109
125
|
|
110
126
|
def get_views # read from filesystem
|
127
|
+
log!(enter: __method__)
|
111
128
|
# Dir.chdir(::Home) do
|
112
129
|
verify(@root => "#@root is nil",
|
113
130
|
Dir.exist?(@root) => "#@root doesn't exist",
|
@@ -118,6 +135,7 @@ end
|
|
118
135
|
end
|
119
136
|
|
120
137
|
def new_dotfile(root: ".blogs", current_view: "test_view", editor: "vi")
|
138
|
+
log!(enter: __method__, args: [root, current_view, editor])
|
121
139
|
# raise BlogAlreadyExists if Dir.exist?(".blogs")
|
122
140
|
# Dir.mkdir(".blogs")
|
123
141
|
root = Dir.pwd + "/" + root
|
@@ -127,12 +145,14 @@ end
|
|
127
145
|
end
|
128
146
|
|
129
147
|
def new_sequence
|
148
|
+
log!(enter: __method__)
|
130
149
|
dump(0, "sequence")
|
131
150
|
version_info = "#{RuneBlog::VERSION}\nBlog created: #{Time.now.to_s}"
|
132
151
|
dump(version_info, "VERSION")
|
133
152
|
end
|
134
153
|
|
135
154
|
def subdirs(dir)
|
155
|
+
log!(enter: __method__, args: [dir])
|
136
156
|
verify(Dir.exist?(dir) => "Directory #{dir} not found")
|
137
157
|
dirs = Dir.entries(dir) - %w[. ..]
|
138
158
|
dirs.reject! {|x| ! File.directory?("#@root/views/#{x}") }
|
@@ -140,6 +160,7 @@ end
|
|
140
160
|
end
|
141
161
|
|
142
162
|
def find_draft_slugs
|
163
|
+
log!(enter: __method__)
|
143
164
|
verify(@root => "#@root is nil",
|
144
165
|
Dir.exist?(@root) => "#@root doesn't exist",
|
145
166
|
Dir.exist?("#@root/drafts") => "#@root/drafts doesn't exist")
|
@@ -154,6 +175,7 @@ end
|
|
154
175
|
end
|
155
176
|
|
156
177
|
def create_dirs(*dirs)
|
178
|
+
log!(enter: __method__, args: [*dirs])
|
157
179
|
dirs.each do |dir|
|
158
180
|
dir = dir.to_s # symbols allowed
|
159
181
|
next if Dir.exist?(dir)
|
@@ -163,24 +185,28 @@ end
|
|
163
185
|
end
|
164
186
|
end
|
165
187
|
|
166
|
-
def interpolate(str,
|
188
|
+
def interpolate(str, bind)
|
189
|
+
log!(enter: __method__, args: [str, bind])
|
167
190
|
wrap = "<<-EOS\n#{str}\nEOS"
|
168
|
-
eval wrap,
|
191
|
+
eval wrap, bind
|
169
192
|
end
|
170
193
|
|
171
194
|
def error(err) # Hmm, this is duplicated
|
195
|
+
log!(str: "duplicated method", enter: __method__, args: [err])
|
172
196
|
str = "\n Error: #{err}"
|
173
197
|
puts str
|
174
198
|
puts err.backtrace.join("\n")
|
175
199
|
end
|
176
200
|
|
177
201
|
def dump(obj, name)
|
202
|
+
log!(enter: __method__, args: [obj, name])
|
178
203
|
File.write(name, obj)
|
179
204
|
end
|
180
205
|
|
181
206
|
end
|
182
207
|
|
183
208
|
def dump(obj, name) # FIXME scope
|
209
|
+
log!(str: "scope problem", enter: __method__, args: [obj, name])
|
184
210
|
File.write(name, obj)
|
185
211
|
end
|
186
212
|
|
data/lib/liveblog.rb
CHANGED
@@ -410,9 +410,13 @@ def meta
|
|
410
410
|
end
|
411
411
|
|
412
412
|
def recent_posts # side-effect
|
413
|
-
_out
|
414
|
-
|
415
|
-
|
413
|
+
_out <<-HTML
|
414
|
+
<div class="col-lg-9 col-md-9 col-sm-9 col-xs-12">
|
415
|
+
<iframe id="main" style="width: 100vw; height: 100vh; position: relative;"
|
416
|
+
src='recent.html' width=100% frameborder="0" allowfullscreen>
|
417
|
+
</iframe>
|
418
|
+
</div>
|
419
|
+
HTML
|
416
420
|
end
|
417
421
|
|
418
422
|
def sidebar
|
data/lib/logging.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
unless self.respond_to?("log!")
|
2
|
+
$logging = true
|
3
|
+
$log = File.new("/tmp/runeblog}.log","w")
|
4
|
+
|
5
|
+
def log!(str: "", enter: nil, args: [], pwd: false, dir: false)
|
6
|
+
return unless $logging
|
7
|
+
time = Time.now.strftime("%H:%M:%S")
|
8
|
+
|
9
|
+
meth = ""
|
10
|
+
meth = "#{enter}" if enter
|
11
|
+
|
12
|
+
para = "(#{args.inspect[1..-2]})"
|
13
|
+
|
14
|
+
source = caller[0].sub(/.*\//, " in ").sub(/:/, " line ").sub(/:.*/, "")
|
15
|
+
source = "in #{source} (probably liveblog.rb)" if source.include? "(eval)"
|
16
|
+
|
17
|
+
str = " ... #{str}" unless str.empty?
|
18
|
+
indent = " "*12
|
19
|
+
|
20
|
+
$log.puts "#{time} #{meth}#{para}"
|
21
|
+
$log.puts "#{indent} #{str} " unless str.empty?
|
22
|
+
$log.puts "#{indent} #{source}"
|
23
|
+
$log.puts "#{indent} pwd = #{Dir.pwd} " if pwd
|
24
|
+
if dir
|
25
|
+
files = (Dir.entries('.') - %w[. ..]).join(" ")
|
26
|
+
$log.puts "#{indent} dir/* = #{files}"
|
27
|
+
end
|
28
|
+
# $log.puts "#{indent} livetext params = #{livedata.inpect} " unless livedata.nil?
|
29
|
+
$log.puts
|
30
|
+
$log.close
|
31
|
+
$log = File.new("/tmp/runeblog.log","a")
|
32
|
+
end
|
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
|
+
end
|
58
|
+
|
data/lib/post.rb
CHANGED
@@ -11,12 +11,14 @@ class RuneBlog::Post
|
|
11
11
|
include RuneBlog::Helpers
|
12
12
|
|
13
13
|
def self.files(num, root)
|
14
|
+
log!(enter: __method__, args: [num, root])
|
14
15
|
files = Find.find(root).to_a
|
15
16
|
result = files.grep(/#{prefix(num)}-/)
|
16
17
|
result
|
17
18
|
end
|
18
19
|
|
19
20
|
def self.load(post)
|
21
|
+
log!(enter: __method__, args: [post])
|
20
22
|
raise "Doesn't work right now"
|
21
23
|
raise NoBlogAccessor if RuneBlog.blog.nil?
|
22
24
|
# "post" is a slug
|
@@ -41,6 +43,7 @@ class RuneBlog::Post
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def write_metadata(meta) # FIXME ???
|
46
|
+
log!(enter: __method__, args: [meta])
|
44
47
|
debug "=== write_metadata:"
|
45
48
|
debug "-----\n#{meta.inspect}\n-----"
|
46
49
|
fname2 = "metadata.txt"
|
@@ -63,12 +66,14 @@ class RuneBlog::Post
|
|
63
66
|
end
|
64
67
|
|
65
68
|
def initialize
|
69
|
+
log!(enter: __method__)
|
66
70
|
@blog = RuneBlog.blog || raise(NoBlogAccessor)
|
67
71
|
@meta = OpenStruct.new
|
68
72
|
end
|
69
73
|
|
70
74
|
def self.create(title:, teaser:, body:, pubdate: Time.now.strftime("%Y-%m-%d"),
|
71
75
|
other_views:[])
|
76
|
+
log!(enter: __method__, args: [title, teaser, body, pubdate, other_views])
|
72
77
|
post = self.new
|
73
78
|
# ONLY place next_sequence is called!
|
74
79
|
num = post.meta.num = post.blog.next_sequence
|
@@ -97,6 +102,7 @@ class RuneBlog::Post
|
|
97
102
|
end
|
98
103
|
|
99
104
|
def edit
|
105
|
+
log!(enter: __method__)
|
100
106
|
verify(File.exist?(@draft) => "File #{@draft} not found")
|
101
107
|
result = system("vi #@draft +8") # TODO improve this
|
102
108
|
raise EditorProblem(draft) unless result
|
@@ -106,6 +112,7 @@ class RuneBlog::Post
|
|
106
112
|
end
|
107
113
|
|
108
114
|
def build
|
115
|
+
log!(enter: __method__)
|
109
116
|
post = self
|
110
117
|
views = post.meta.views
|
111
118
|
text = File.read(@draft)
|
@@ -118,6 +125,7 @@ class RuneBlog::ViewPost
|
|
118
125
|
:teaser_text
|
119
126
|
|
120
127
|
def initialize(view, postdir)
|
128
|
+
log!(enter: __method__, args: [view, postdir])
|
121
129
|
# Assumes already parsed/processed
|
122
130
|
@blog = RuneBlog.blog || raise(NoBlogAccessor)
|
123
131
|
@path = postdir.dup
|
@@ -133,6 +141,7 @@ class RuneBlog::ViewPost
|
|
133
141
|
end
|
134
142
|
|
135
143
|
def get_dirs
|
144
|
+
log!(enter: __method__, args: [view, postdir])
|
136
145
|
fname = File.basename(draft)
|
137
146
|
noext = fname.sub(/.lt3$/, "")
|
138
147
|
vdir = "#@root/views/#{view}"
|
data/lib/publish.rb
CHANGED
@@ -9,6 +9,7 @@ class RuneBlog::Publishing
|
|
9
9
|
BadRemotePerms = Exception.new("Bad remote permissions")
|
10
10
|
|
11
11
|
def initialize(*params)
|
12
|
+
log!(enter: __method__, args: [*params])
|
12
13
|
@blog = RuneBlog.blog
|
13
14
|
# Clunky...
|
14
15
|
if params.size == 1 && params[0].is_a?(OpenStruct)
|
@@ -22,21 +23,25 @@ class RuneBlog::Publishing
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def to_h
|
26
|
+
log!(enter: __method__)
|
25
27
|
{user: @user, server: @server, docroot: @docroot,
|
26
28
|
path: @path, proto: @proto}
|
27
29
|
end
|
28
30
|
|
29
31
|
def url
|
32
|
+
log!(enter: __method__)
|
30
33
|
vname = @blog.view.name # .gsub(/_/, "\\_")
|
31
34
|
url = "#@proto://#@server/#@path/#{vname}"
|
32
35
|
end
|
33
36
|
|
34
37
|
def system!(str)
|
38
|
+
log!(enter: __method__, args: [str])
|
35
39
|
rc = system(str)
|
36
40
|
rc
|
37
41
|
end
|
38
42
|
|
39
43
|
def publish(files, assets=[])
|
44
|
+
log!(enter: __method__, args: [files, assets])
|
40
45
|
dir = "#@docroot/#@path"
|
41
46
|
view_name = @blog.view.name
|
42
47
|
viewpath = "#{dir}/#{view_name}"
|
@@ -60,6 +65,7 @@ class RuneBlog::Publishing
|
|
60
65
|
end
|
61
66
|
|
62
67
|
def remote_login?
|
68
|
+
log!(enter: __method__)
|
63
69
|
cmd = "ssh -o BatchMode=yes #@user@#@server -x date >/dev/null 2>&1"
|
64
70
|
result = system(cmd)
|
65
71
|
return nil unless result
|
@@ -67,6 +73,7 @@ class RuneBlog::Publishing
|
|
67
73
|
end
|
68
74
|
|
69
75
|
def remote_permissions?
|
76
|
+
log!(enter: __method__)
|
70
77
|
dir = "#@docroot/#@path"
|
71
78
|
temp = "#@path/__only_testing"
|
72
79
|
try1 = system("ssh -o BatchMode=yes -o ConnectTimeout=1 #@user@#@server -x mkdir -p #{temp} >/dev/null 2>&1")
|
data/lib/runeblog.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'date'
|
2
2
|
|
3
|
+
require 'logging'
|
4
|
+
|
3
5
|
require 'runeblog_version'
|
4
6
|
require 'global'
|
5
7
|
require 'helpers-blog'
|
@@ -26,7 +28,6 @@ class RuneBlog
|
|
26
28
|
make_exception(:NoSuchView, "No such view: $1")
|
27
29
|
make_exception(:NoBlogAccessor, "Runeblog.blog is not set")
|
28
30
|
|
29
|
-
|
30
31
|
class << self
|
31
32
|
attr_accessor :blog
|
32
33
|
include Helpers
|
@@ -40,6 +41,7 @@ class RuneBlog
|
|
40
41
|
include Helpers
|
41
42
|
|
42
43
|
def self.create_new_blog_repo(dir = ".blogs")
|
44
|
+
log!(enter: __method__, args: [dir])
|
43
45
|
raise ArgumentError unless dir.is_a?(String) && ! dir.empty?
|
44
46
|
root_dir = Dir.pwd + "/" + dir
|
45
47
|
self.create(dir)
|
@@ -49,6 +51,7 @@ class RuneBlog
|
|
49
51
|
end
|
50
52
|
|
51
53
|
def self.create(root = ".blogs")
|
54
|
+
log!(enter: __method__, args: [root])
|
52
55
|
# Crude - FIXME later - # What views are there? Publishing, etc.
|
53
56
|
self.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
54
57
|
$_blog = self # Dumber still?
|
@@ -56,6 +59,8 @@ class RuneBlog
|
|
56
59
|
raise BlogRepoAlreadyExists if Dir.exist?(root)
|
57
60
|
create_dirs(root)
|
58
61
|
Dir.chdir(root) do
|
62
|
+
# puts " pwd = #{Dir.pwd} Trying: cp #{RuneBlog::Path}/../empty_view.tgz ."
|
63
|
+
system("cp #{RuneBlog::Path}/../empty_view.tgz .")
|
59
64
|
create_dirs(:drafts, :views)
|
60
65
|
new_sequence
|
61
66
|
end
|
@@ -66,6 +71,7 @@ class RuneBlog
|
|
66
71
|
end
|
67
72
|
|
68
73
|
def self.open(root = ".blogs")
|
74
|
+
log!(enter: __method__, args: [root])
|
69
75
|
# Crude - FIXME later - # What views are there? Publishing, etc.
|
70
76
|
self.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
71
77
|
$_blog = self # Dumber still?
|
@@ -74,6 +80,7 @@ class RuneBlog
|
|
74
80
|
end
|
75
81
|
|
76
82
|
def initialize(root_dir = ".blogs") # always assumes existing blog
|
83
|
+
log!(enter: "initialize", args: [root_dir])
|
77
84
|
# Crude - FIXME later - # What views are there? Publishing, etc.
|
78
85
|
self.class.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
79
86
|
$_blog = self # Dumber still?
|
@@ -94,32 +101,37 @@ class RuneBlog
|
|
94
101
|
end
|
95
102
|
|
96
103
|
def inspect
|
97
|
-
|
104
|
+
log!(enter: __method__)
|
105
|
+
str = "blog: "
|
98
106
|
ivars = ["@root", "@sequence"] # self.instance_variables
|
99
107
|
ivars.each do |iv|
|
100
108
|
val = self.instance_variable_get(iv)
|
101
|
-
str << "#{iv}
|
109
|
+
str << "#{iv}: #{val} "
|
102
110
|
end
|
103
|
-
|
111
|
+
# str << "]]"
|
104
112
|
str
|
105
113
|
end
|
106
114
|
|
107
115
|
def view?(name)
|
116
|
+
log!(enter: __method__, args: [name])
|
108
117
|
raise ArgumentError unless name.is_a?(String) && ! name.empty?
|
109
118
|
views.any? {|x| x.name == name }
|
110
119
|
end
|
111
120
|
|
112
121
|
def view(name = nil)
|
122
|
+
log!(enter: __method__, args: [name])
|
113
123
|
raise ArgumentError unless name.nil? || (name.is_a?(String) && ! name.empty?)
|
114
124
|
name.nil? ? @view : str2view(name)
|
115
125
|
end
|
116
126
|
|
117
127
|
def str2view(str)
|
128
|
+
log!(enter: __method__, args: [str])
|
118
129
|
raise ArgumentError unless str.is_a?(String) && ! str.empty?
|
119
130
|
@views.find {|x| x.name == str }
|
120
131
|
end
|
121
132
|
|
122
133
|
def _set_publisher
|
134
|
+
log!(enter: __method__)
|
123
135
|
file = @view.dir + "/publish"
|
124
136
|
@view.publisher = nil
|
125
137
|
return unless File.exist?(file)
|
@@ -127,6 +139,7 @@ class RuneBlog
|
|
127
139
|
end
|
128
140
|
|
129
141
|
def view=(arg)
|
142
|
+
log!(enter: __method__, args: [arg])
|
130
143
|
case arg
|
131
144
|
when RuneBlog::View
|
132
145
|
@view = arg
|
@@ -142,16 +155,19 @@ class RuneBlog
|
|
142
155
|
end
|
143
156
|
|
144
157
|
def get_sequence
|
158
|
+
log!(enter: __method__)
|
145
159
|
File.read(root + "/sequence").to_i
|
146
160
|
end
|
147
161
|
|
148
162
|
def next_sequence
|
163
|
+
log!(enter: __method__)
|
149
164
|
@sequence += 1
|
150
165
|
dump(@sequence, "#@root/sequence")
|
151
166
|
@sequence
|
152
167
|
end
|
153
168
|
|
154
169
|
def viewdir(v = nil) # delete?
|
170
|
+
log!(enter: __method__, args: [v])
|
155
171
|
v = str2view(v) if v.is_a?(String)
|
156
172
|
raise ArgumentError unless v.nil? || v.is_a?(RuneBlog::View)
|
157
173
|
v ||= @view
|
@@ -159,38 +175,62 @@ class RuneBlog
|
|
159
175
|
end
|
160
176
|
|
161
177
|
def self.exist?
|
178
|
+
log!(enter: __method__)
|
162
179
|
Dir.exist?(DotDir) && File.exist?(DotDir + "/" + ConfigFile)
|
163
180
|
end
|
164
181
|
|
182
|
+
def _copy_to_staging
|
183
|
+
copy!("themes/standard/", "staging/")
|
184
|
+
copy!("themes/standard/widgets/", "staging/")
|
185
|
+
end
|
186
|
+
|
187
|
+
def _copy_to_remote
|
188
|
+
copy!("themes/standard/etc", "remote/")
|
189
|
+
copy!("themes/standard/assets", "remote/")
|
190
|
+
copy!("themes/standard/widgets", "remote/")
|
191
|
+
end
|
192
|
+
|
165
193
|
def create_view(arg)
|
194
|
+
log!(enter: __method__, args: [arg])
|
166
195
|
raise ArgumentError unless arg.is_a?(String) && ! arg.empty?
|
167
196
|
|
168
197
|
names = self.views.map(&:to_s)
|
169
198
|
raise ViewAlreadyExists(arg) if names.include?(arg)
|
170
199
|
|
171
|
-
vdir =
|
200
|
+
vdir = arg.dup
|
172
201
|
raise DirAlreadyExists(vdir) if Dir.exist?(vdir)
|
173
|
-
create_dirs(vdir)
|
174
|
-
up = Dir.pwd
|
175
|
-
|
176
|
-
Dir.chdir(vdir) do
|
177
|
-
x = RuneBlog::Default
|
178
|
-
copy!("#{Themes}", "themes")
|
179
|
-
create_dirs(:assets, :posts)
|
180
|
-
create_dirs(:staging, "remote/permalink", "remote/navbar")
|
181
|
-
livetext "themes/standard/etc/blog.css.lt3" # strip ext
|
182
|
-
copy!("themes/standard/*", "staging/")
|
183
|
-
|
184
|
-
copy!("themes/standard/etc", "remote/")
|
185
|
-
copy!("themes/standard/assets", "remote/")
|
186
|
-
copy!("themes/standard/widgets", "remote/")
|
187
202
|
|
203
|
+
# puts "cv: pwd = #{Dir.pwd} file = #{`ls`}"
|
204
|
+
Dir.chdir(@root) do
|
205
|
+
# puts "---- (#{arg}) tar operation..."
|
206
|
+
|
207
|
+
# system("bash")
|
208
|
+
cmd1 = "tar zxvf empty_view.tgz >/dev/null 2>&1"
|
209
|
+
cmd2 = "cp -r empty_view views/#{arg}"
|
210
|
+
system(cmd1)
|
211
|
+
# puts " pwd = #{Dir.pwd}"
|
212
|
+
# puts " . => #{`echo *`}"
|
213
|
+
# puts " ./views => #{`ls views`}"
|
214
|
+
# puts " #{cmd1}\n #{cmd2}"
|
215
|
+
system(cmd2)
|
216
|
+
end
|
217
|
+
# create_dirs(vdir)
|
218
|
+
|
219
|
+
# puts "vdir = #{vdir} pwd = #{Dir.pwd}"
|
220
|
+
Dir.chdir("#@root/views/#{vdir}") do
|
221
|
+
# system("bash")
|
222
|
+
# x = RuneBlog::Default
|
223
|
+
# copy!("#{Themes}", "themes")
|
224
|
+
# create_dirs(:assets, :posts, :staging, "remote/permalink", "remote/navbar")
|
225
|
+
# livetext "themes/standard/etc/blog.css.lt3" # strip ext
|
226
|
+
# _copy_to_staging
|
227
|
+
# _copy_to_remote
|
228
|
+
livetext "themes/standard/blog/generate", "remote/index"
|
188
229
|
pub = "user: xxx\nserver: xxx\ndocroot: xxx\npath: xxx\nproto: xxx\n"
|
189
230
|
dump(pub, "publish")
|
190
231
|
|
191
232
|
view = RuneBlog::View.new(arg)
|
192
233
|
self.view = view
|
193
|
-
vdir = self.view.dir
|
194
234
|
dump("Initial creation", "last_published")
|
195
235
|
end
|
196
236
|
@views << view
|
@@ -198,6 +238,7 @@ class RuneBlog
|
|
198
238
|
end
|
199
239
|
|
200
240
|
def delete_view(name, force = false)
|
241
|
+
log!(enter: __method__, args: [name, force])
|
201
242
|
raise ArgumentError unless name.is_a?(String) && ! name.empty?
|
202
243
|
if force
|
203
244
|
system("rm -rf #@root/views/#{name}")
|
@@ -206,6 +247,7 @@ class RuneBlog
|
|
206
247
|
end
|
207
248
|
|
208
249
|
def view_files
|
250
|
+
log!(enter: __method__)
|
209
251
|
vdir = self.view.dir
|
210
252
|
files = ["#{vdir}/index.html"]
|
211
253
|
files += posts.map {|x| "#{vdir}/#{x}" }
|
@@ -214,6 +256,7 @@ class RuneBlog
|
|
214
256
|
end
|
215
257
|
|
216
258
|
def post_lookup(postid) # side-effect?
|
259
|
+
log!(enter: __method__, args: [postid])
|
217
260
|
# .. = templates, ../.. = views/thisview
|
218
261
|
slug = title = date = teaser_text = nil
|
219
262
|
|
@@ -229,6 +272,7 @@ class RuneBlog
|
|
229
272
|
end
|
230
273
|
|
231
274
|
def teaser(slug)
|
275
|
+
log!(enter: __method__, args: [slug])
|
232
276
|
id = slug.to_i
|
233
277
|
text = nil
|
234
278
|
post_entry_name = @theme + "/blog/post_entry.lt3"
|
@@ -246,7 +290,7 @@ class RuneBlog
|
|
246
290
|
end
|
247
291
|
|
248
292
|
def collect_recent_posts(file)
|
249
|
-
|
293
|
+
log!(enter: __method__, args: [file])
|
250
294
|
posts = nil
|
251
295
|
dir_posts = @vdir + "/posts"
|
252
296
|
entries = Dir.entries(dir_posts)
|
@@ -269,15 +313,17 @@ class RuneBlog
|
|
269
313
|
text << teaser(postid) # side effect! calls _out
|
270
314
|
end
|
271
315
|
text << "</body></html>"
|
272
|
-
File.write(file, text) # FIXME ???
|
316
|
+
File.write("#@vdir/remote/"+file, text) # FIXME ???
|
273
317
|
iframe_text = <<-HTML
|
274
318
|
<iframe name="main" style="width: 100vw;height: 100vh;position: relative;"
|
275
319
|
src='recent.html' width=100% frameborder="0" allowfullscreen>
|
276
320
|
</iframe>
|
277
321
|
HTML
|
322
|
+
# FIXME ^ serves no purpose??
|
278
323
|
end
|
279
324
|
|
280
325
|
def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
|
326
|
+
log!(enter: __method__, args: [title, testing, teaser, body, other_views])
|
281
327
|
meta = nil
|
282
328
|
Dir.chdir(self.view.dir) do
|
283
329
|
post = Post.create(title: title, teaser: teaser, body: body, other_views: other_views)
|
@@ -292,6 +338,7 @@ class RuneBlog
|
|
292
338
|
end
|
293
339
|
|
294
340
|
def edit_initial_post(file, testing = false)
|
341
|
+
log!(enter: __method__, args: [file, testing])
|
295
342
|
debug "=== edit_initial_post #{file.inspect} => #{sourcefile}"
|
296
343
|
sourcefile = "#@root/drafts/#{file}"
|
297
344
|
result = system("#@editor #{sourcefile} +8") unless testing
|
@@ -302,17 +349,20 @@ class RuneBlog
|
|
302
349
|
end
|
303
350
|
|
304
351
|
def posts
|
352
|
+
log!(enter: __method__)
|
305
353
|
dir = self.view.dir + "/posts"
|
306
354
|
posts = Dir.entries(dir).grep(/^\d{4}/)
|
307
355
|
posts
|
308
356
|
end
|
309
357
|
|
310
358
|
def drafts
|
359
|
+
log!(enter: __method__)
|
311
360
|
dir = "#@root/drafts"
|
312
361
|
drafts = Dir.entries(dir).grep(/^\d{4}.*/)
|
313
362
|
end
|
314
363
|
|
315
364
|
def change_view(view)
|
365
|
+
log!(enter: __method__, args: [view])
|
316
366
|
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
317
367
|
x = OpenStruct.new
|
318
368
|
x.root, x.current_view, x.editor = @root, view.to_s, @editor # dumb - FIXME later
|
@@ -321,20 +371,22 @@ class RuneBlog
|
|
321
371
|
end
|
322
372
|
|
323
373
|
def generate_index(view) # FIXME delete?
|
324
|
-
|
374
|
+
log!(enter: __method__, args: [view], pwd: true, dir: true)
|
325
375
|
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
326
|
-
|
327
|
-
|
328
|
-
dir0 = "#{vdir}/themes/standard/blog"
|
329
|
-
rescue => err
|
330
|
-
error(err)
|
331
|
-
exit
|
376
|
+
@vdir = @root + "/views/#{view}"
|
377
|
+
collect_recent_posts("recent.html")
|
332
378
|
end
|
333
379
|
|
334
380
|
def generate_view(view) # huh?
|
381
|
+
log!(enter: __method__, args: [view])
|
382
|
+
generate_index(view)
|
383
|
+
Dir.chdir(@root + "/views/#{view}/themes/standard") do
|
384
|
+
livetext "blog/generate.lt3", "../../remote/index.html"
|
385
|
+
end
|
335
386
|
end
|
336
387
|
|
337
388
|
def _get_views(draft)
|
389
|
+
log!(enter: __method__, args: [draft])
|
338
390
|
# FIXME dumb code
|
339
391
|
view_line = File.readlines(draft).grep(/^.views /)
|
340
392
|
raise "More than one .views call!" if view_line.size > 1
|
@@ -361,6 +413,7 @@ class RuneBlog
|
|
361
413
|
# livetext VIEW/blog/generate.lt3 ??
|
362
414
|
|
363
415
|
def _copy_get_dirs(draft, view)
|
416
|
+
log!(enter: __method__, args: [draft, view])
|
364
417
|
fname = File.basename(draft)
|
365
418
|
noext = fname.sub(/.lt3$/, "")
|
366
419
|
vdir = "#@root/views/#{view}"
|
@@ -373,45 +426,56 @@ class RuneBlog
|
|
373
426
|
end
|
374
427
|
|
375
428
|
def generate_post(draft)
|
429
|
+
log!(enter: __method__, args: [draft])
|
376
430
|
views = _get_views(draft)
|
377
431
|
views.each do |view|
|
378
432
|
noext, viewdir, slugdir, aslug, @theme = _copy_get_dirs(draft, view)
|
379
|
-
|
433
|
+
# staging = viewdir + "/staging"
|
434
|
+
remote = viewdir + "/remote"
|
380
435
|
Dir.chdir(slugdir) do
|
381
436
|
copy(draft, ".")
|
382
437
|
lt3 = draft.split("/")[-1]
|
383
438
|
# Remember: Some posts may be in more than one view -- careful with links back
|
384
439
|
# system("livetext #{draft} >staging/#{name}/index.html") # permalink?
|
385
|
-
|
386
|
-
|
440
|
+
# copy!("#{@theme}/*", "#{staging}")
|
441
|
+
# copy(lt3, staging)
|
442
|
+
copy(lt3, remote)
|
387
443
|
html = noext[5..-1]
|
388
444
|
livetext draft, html # livetext "foobar.lt3", "foobar.html"
|
389
|
-
|
445
|
+
# copy(html, "../../staging/post/index.html")
|
446
|
+
copy(html, "../../remote/post/index.html")
|
390
447
|
title_line = File.readlines(draft).grep(/^.title /).first
|
391
448
|
title = title_line.split(" ", 2)[1]
|
392
449
|
excerpt = File.read("teaser.txt")
|
393
450
|
vars = %[.set title="#{title.chomp}"\n] +
|
394
451
|
%[.set teaser="#{excerpt.chomp}"]
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
452
|
+
theme = "../../theme/standard"
|
453
|
+
File.open("vars.lt3", "w") {|f| f.puts vars }
|
454
|
+
livetext "#{theme}/post/generate.lt3", "#{remote}/#{html}"
|
455
|
+
livetext "#{theme}/post/permalink.lt3", "#{remote}/permalink/#{html}"
|
456
|
+
# puts <<-TEXT
|
457
|
+
# File.open("vars.lt3", "w") {|f| f.puts vars }
|
458
|
+
# livetext "../post/generate.lt3", "#{remote}/#{html}"
|
459
|
+
# livetext "../post/permalink.lt3", "#{remote}/permalink/#{html}"
|
460
|
+
# TEXT
|
461
|
+
# system("bash")
|
462
|
+
log!(str: "About to enter remote/", pwd: true, dir: true)
|
463
|
+
Dir.chdir(remote) do
|
464
|
+
log!(str: "Now in remote/", pwd: true, dir: true)
|
465
|
+
system("cp -r ../themes/standard/widgets .")
|
466
|
+
log!(str: "finished with remote/", pwd: true, dir: true)
|
405
467
|
end
|
406
468
|
end
|
407
469
|
end
|
408
470
|
end
|
409
471
|
|
410
472
|
def relink
|
473
|
+
log!(enter: __method__)
|
411
474
|
self.views.each {|view| generate_index(view) }
|
412
475
|
end
|
413
476
|
|
414
477
|
def index_entry(view, meta)
|
478
|
+
log!(enter: __method__, args: [view, meta])
|
415
479
|
debug "=== index_entry #{view.to_s.inspect} #{meta.num} #{meta.title.inspect}"
|
416
480
|
check_meta(meta, "index_entry1")
|
417
481
|
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
@@ -432,6 +496,7 @@ class RuneBlog
|
|
432
496
|
end
|
433
497
|
|
434
498
|
def rebuild_post(file)
|
499
|
+
log!(enter: __method__, args: [file])
|
435
500
|
raise "Doesn't currently work"
|
436
501
|
debug "Called rebuild_post(#{file.inspect})"
|
437
502
|
raise ArgumentError unless file.is_a?(String)
|
@@ -446,6 +511,7 @@ class RuneBlog
|
|
446
511
|
end
|
447
512
|
|
448
513
|
def remove_post(num)
|
514
|
+
log!(enter: __method__, args: [num])
|
449
515
|
raise ArgumentError unless num.is_a?(Integer)
|
450
516
|
tag = prefix(num)
|
451
517
|
files = Find.find(self.view.dir).to_a
|
@@ -461,6 +527,7 @@ class RuneBlog
|
|
461
527
|
end
|
462
528
|
|
463
529
|
def undelete_post(num)
|
530
|
+
log!(enter: __method__, args: [num])
|
464
531
|
raise ArgumentError unless num.is_a?(Integer)
|
465
532
|
files = Find.find("#@root/views/").to_a
|
466
533
|
tag = prefix(num)
|
@@ -476,12 +543,14 @@ class RuneBlog
|
|
476
543
|
end
|
477
544
|
|
478
545
|
def delete_draft(num)
|
546
|
+
log!(enter: __method__, args: [num])
|
479
547
|
raise ArgumentError unless num.is_a?(Integer)
|
480
548
|
tag = prefix(num)
|
481
549
|
system("rm -rf #@root/drafts/#{tag}-*")
|
482
550
|
end
|
483
551
|
|
484
552
|
def make_slug(meta)
|
553
|
+
log!(enter: __method__, args: [meta])
|
485
554
|
raise ArgumentError unless meta.title.is_a?(String)
|
486
555
|
label = '%04d' % meta.num # FIXME can do better
|
487
556
|
slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
|