runeblog 0.0.29 → 0.0.30
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 +3 -1
- data/data/VERSION +1 -1
- data/lib/repl.rb +428 -0
- data/lib/runeblog.rb +1 -424
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca084cb0f44eb31904d67f7383c9f0283c0c2808
|
4
|
+
data.tar.gz: 35ba1e215e33565207549b71f50f10e414de0d64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f638fde1609ad5b567a2989d434de1f542c72bced11a6177acb87cdb69188734d2ac785f38f6919201836d772f3e2d9d1f653cd85e69e344b49f9f06b7d5af6
|
7
|
+
data.tar.gz: a8e4b677be56cbfb942fef36cfac5c92fa0fc08b08086fc69be7b9bd8e596cd0dfc79fd78c3ac2adaa155f7e24ede32594a4c54a04020586fd81ceac3aea2a5d
|
data/bin/blog
CHANGED
data/data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
RuneBlog v 0.0.
|
1
|
+
RuneBlog v 0.0.30 2017-05-11
|
data/lib/repl.rb
ADDED
@@ -0,0 +1,428 @@
|
|
1
|
+
require 'runeblog'
|
2
|
+
|
3
|
+
module RuneBlog::REPL
|
4
|
+
|
5
|
+
def clear
|
6
|
+
puts "\e[H\e[2J" # clear screen
|
7
|
+
end
|
8
|
+
|
9
|
+
def red(text)
|
10
|
+
"\e[31m#{text}\e[0m"
|
11
|
+
end
|
12
|
+
|
13
|
+
def blue(text)
|
14
|
+
"\e[34m#{text}\e[0m"
|
15
|
+
end
|
16
|
+
|
17
|
+
def bold(str)
|
18
|
+
"\e[1m#{str}\e[22m"
|
19
|
+
end
|
20
|
+
|
21
|
+
def interpolate(str)
|
22
|
+
wrap = "<<-EOS\n#{str}\nEOS"
|
23
|
+
eval wrap
|
24
|
+
end
|
25
|
+
|
26
|
+
def colored_slug(slug)
|
27
|
+
red(slug[0..3])+blue(slug[4..-1])
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
### ask
|
32
|
+
|
33
|
+
def ask(prompt, meth = :to_s)
|
34
|
+
print prompt
|
35
|
+
STDOUT.flush
|
36
|
+
STDIN.gets.chomp.send(meth)
|
37
|
+
end
|
38
|
+
|
39
|
+
### quit
|
40
|
+
|
41
|
+
def quit
|
42
|
+
puts
|
43
|
+
exit
|
44
|
+
end
|
45
|
+
|
46
|
+
### version
|
47
|
+
|
48
|
+
def version
|
49
|
+
puts "\n " + RuneBlog::VERSION
|
50
|
+
end
|
51
|
+
|
52
|
+
### new_blog!
|
53
|
+
|
54
|
+
def new_blog!
|
55
|
+
unless File.exist?(".blog")
|
56
|
+
yn = ask(red(" No .blog found. Create new blog? "))
|
57
|
+
if yn.upcase == "Y"
|
58
|
+
#-- what if data already exists?
|
59
|
+
system("cp -r #{RuneBlog::DefaultData} .")
|
60
|
+
File.open(".blog", "w") do |f|
|
61
|
+
f.puts "data"
|
62
|
+
f.puts "no_default"
|
63
|
+
end
|
64
|
+
File.open("data/VERSION", "a") {|f| f.puts "\nBlog created: " + Time.now.to_s }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
### make_slug
|
70
|
+
|
71
|
+
def make_slug(title, seq=nil)
|
72
|
+
num = '%04d' % (seq || @config.next_sequence) # FIXME can do better
|
73
|
+
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
|
74
|
+
"#{num}-#{slug}"
|
75
|
+
end
|
76
|
+
|
77
|
+
### read_config
|
78
|
+
|
79
|
+
def read_config
|
80
|
+
# Crude - FIXME later
|
81
|
+
cfg_file = ".blog"
|
82
|
+
new_blog! unless File.exist?(cfg_file)
|
83
|
+
@config = RuneBlog::Config.new(".blog")
|
84
|
+
|
85
|
+
@view = @config.view # current view
|
86
|
+
@sequence = @config.sequence
|
87
|
+
@root = @config.root
|
88
|
+
end
|
89
|
+
|
90
|
+
### create_empty_post
|
91
|
+
|
92
|
+
def create_empty_post
|
93
|
+
@template = <<-EOS
|
94
|
+
.mixin liveblog
|
95
|
+
|
96
|
+
.liveblog_version
|
97
|
+
|
98
|
+
.title #@title
|
99
|
+
.pubdate #@date
|
100
|
+
.views #@view
|
101
|
+
|
102
|
+
Teaser goes here.
|
103
|
+
.readmore
|
104
|
+
Remainder of post goes here.
|
105
|
+
EOS
|
106
|
+
|
107
|
+
@slug = make_slug(@title)
|
108
|
+
@fname = @slug + ".lt3"
|
109
|
+
File.open("#@root/src/#@fname", "w") {|f| f.puts @template }
|
110
|
+
@fname
|
111
|
+
end
|
112
|
+
|
113
|
+
### edit_post
|
114
|
+
|
115
|
+
def edit_post(file)
|
116
|
+
system("vi #@root/src/#{file} +8 ")
|
117
|
+
end
|
118
|
+
|
119
|
+
### open_remote
|
120
|
+
|
121
|
+
def open_remote
|
122
|
+
@deploy ||= {}
|
123
|
+
unless @deploy[@view]
|
124
|
+
puts red("\n Deploy first.")
|
125
|
+
return
|
126
|
+
end
|
127
|
+
lines = @deploy[@view]
|
128
|
+
user, server, sroot, spath = *lines
|
129
|
+
system("open 'http://#{server}/#{spath}'")
|
130
|
+
end
|
131
|
+
|
132
|
+
### open_local
|
133
|
+
|
134
|
+
def open_local
|
135
|
+
system("open #{@config.viewdir(@view)}/index.html")
|
136
|
+
end
|
137
|
+
|
138
|
+
def deploy
|
139
|
+
# TBD clunky FIXME
|
140
|
+
@deploy ||= {}
|
141
|
+
deployment = @config.viewdir(@view) + "deploy"
|
142
|
+
lines = File.readlines(deployment).map {|x| x.chomp }
|
143
|
+
@deploy[@view] = lines
|
144
|
+
user, server, sroot, spath = *lines
|
145
|
+
vdir = @config.viewdir(@view)
|
146
|
+
files = ["#{vdir}/index.html"]
|
147
|
+
files += Dir.entries(vdir).grep(/^\d\d\d\d/).map {|x| "#{vdir}/#{x}" }
|
148
|
+
files.reject! {|f| File.mtime(f) < File.mtime("#{vdir}/last_deployed") }
|
149
|
+
puts "\n Files:"
|
150
|
+
files.each {|f| puts " " + f }
|
151
|
+
puts
|
152
|
+
dir = "#{sroot}/#{spath}"
|
153
|
+
cmd = "scp -r #{files.join(' ')} root@#{server}:#{dir} >/dev/null 2>&1"
|
154
|
+
print red("\n Deploying #{files.size} files... ")
|
155
|
+
# puts cmd
|
156
|
+
system(cmd)
|
157
|
+
File.write("#{vdir}/last_deployed", files)
|
158
|
+
puts red("finished.")
|
159
|
+
end
|
160
|
+
|
161
|
+
### process_post
|
162
|
+
|
163
|
+
def process_post(file)
|
164
|
+
@main ||= Livetext.new
|
165
|
+
@main.main.output = File.new("/tmp/WHOA","w")
|
166
|
+
# puts " Processing: #{Dir.pwd} :: #{file}"
|
167
|
+
path = @root + "/src/#{file}"
|
168
|
+
@meta = @main.process_file(path)
|
169
|
+
@meta.slug = make_slug(@meta.title, @config.sequence)
|
170
|
+
@meta.slug = file.sub(/.lt3$/, "")
|
171
|
+
@meta
|
172
|
+
end
|
173
|
+
|
174
|
+
### reload_post
|
175
|
+
|
176
|
+
def reload_post(file)
|
177
|
+
@main ||= Livetext.new
|
178
|
+
@main.main.output = File.new("/tmp/WHOA","w")
|
179
|
+
@meta = process_post(file)
|
180
|
+
@meta.slug = file.sub(/.lt3$/, "")
|
181
|
+
@meta
|
182
|
+
end
|
183
|
+
|
184
|
+
### posting
|
185
|
+
|
186
|
+
def posting(view, meta)
|
187
|
+
ref = "#{view}/#{meta.slug}/index.html"
|
188
|
+
<<-HTML
|
189
|
+
<br>
|
190
|
+
<font size=+1>#{meta.pubdate} </font>
|
191
|
+
<font size=+2 color=blue><a href=../#{ref} style="text-decoration: none">#{meta.title}</font></a>
|
192
|
+
<br>
|
193
|
+
#{meta.teaser}
|
194
|
+
<a href=../#{ref} style="text-decoration: none">Read more...</a>
|
195
|
+
<br><br>
|
196
|
+
<hr>
|
197
|
+
HTML
|
198
|
+
end
|
199
|
+
|
200
|
+
### generate_index
|
201
|
+
|
202
|
+
def generate_index(view)
|
203
|
+
# Gather all posts, create list
|
204
|
+
vdir = "#@root/views/#{view}"
|
205
|
+
posts = Dir.entries(vdir).grep /^\d\d\d\d/
|
206
|
+
posts = posts.sort.reverse
|
207
|
+
|
208
|
+
# Add view header/trailer
|
209
|
+
head = File.read("#{vdir}/custom/blog_header.html") rescue RuneBlog::BlogHeader
|
210
|
+
tail = File.read("#{vdir}/custom/blog_trailer.html") rescue RuneBlog::BlogTrailer
|
211
|
+
@bloghead = interpolate(head)
|
212
|
+
@blogtail = interpolate(tail)
|
213
|
+
|
214
|
+
# Output view
|
215
|
+
posts.map! {|post| YAML.load(File.read("#{vdir}/#{post}/metadata.yaml")) }
|
216
|
+
File.open("#{vdir}/index.html", "w") do |f|
|
217
|
+
f.puts @bloghead
|
218
|
+
posts.each {|post| f.puts posting(view, post) }
|
219
|
+
f.puts @blogtail
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
### link_post_view
|
224
|
+
|
225
|
+
def link_post_view(view)
|
226
|
+
# Create dir using slug (index.html, metadata?)
|
227
|
+
vdir = @config.viewdir(view)
|
228
|
+
dir = vdir + @meta.slug + "/"
|
229
|
+
cmd = "mkdir -p #{dir}" #-- FIXME what if this exists??
|
230
|
+
system(cmd)
|
231
|
+
File.write("#{dir}/metadata.yaml", @meta.to_yaml)
|
232
|
+
template = File.read(vdir + "custom/post_template.html")
|
233
|
+
post = interpolate(template)
|
234
|
+
File.write(dir + "index.html", post)
|
235
|
+
generate_index(view)
|
236
|
+
end
|
237
|
+
|
238
|
+
### link_post
|
239
|
+
|
240
|
+
def link_post(meta)
|
241
|
+
puts " #{colored_slug(meta.slug)}"
|
242
|
+
# First gather the views
|
243
|
+
views = meta.views
|
244
|
+
print " Views: "
|
245
|
+
views.each do |view|
|
246
|
+
print "#{view} "
|
247
|
+
link_post_view(view)
|
248
|
+
end
|
249
|
+
puts
|
250
|
+
end
|
251
|
+
|
252
|
+
### rebuild
|
253
|
+
|
254
|
+
def rebuild
|
255
|
+
puts
|
256
|
+
files = Dir.entries("#@root/src/").grep /\d\d\d\d.*.lt3$/
|
257
|
+
files.map! {|f| File.basename(f) }
|
258
|
+
files = files.sort.reverse
|
259
|
+
files.each do |file|
|
260
|
+
reload_post(file)
|
261
|
+
link_post(@meta)
|
262
|
+
publish_post
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
### relink
|
267
|
+
|
268
|
+
def relink
|
269
|
+
@config.views.each do |view|
|
270
|
+
generate_index(view)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
### publish?
|
275
|
+
|
276
|
+
def publish?
|
277
|
+
yn = ask(red(" Publish? y/n "))
|
278
|
+
yn.upcase == "Y"
|
279
|
+
end
|
280
|
+
|
281
|
+
### publish_post
|
282
|
+
|
283
|
+
def publish_post
|
284
|
+
# Grab destination data
|
285
|
+
# scp changed files over
|
286
|
+
# puts " Publish: Not implemented yet"
|
287
|
+
end
|
288
|
+
|
289
|
+
### list_views
|
290
|
+
|
291
|
+
def list_views
|
292
|
+
abort "Config file not read" unless @config
|
293
|
+
puts
|
294
|
+
@config.views.each {|v| puts " #{v}" }
|
295
|
+
end
|
296
|
+
|
297
|
+
### change_view
|
298
|
+
|
299
|
+
def change_view(arg = nil)
|
300
|
+
if arg.nil?
|
301
|
+
puts "\n #@view"
|
302
|
+
elsif @config.views.include?(arg)
|
303
|
+
@view = arg
|
304
|
+
else
|
305
|
+
puts "view #{arg.inspect} does not exist"
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
### new_view
|
310
|
+
|
311
|
+
def new_view(arg = nil)
|
312
|
+
arg = nil if arg == ""
|
313
|
+
read_config unless @config
|
314
|
+
arg ||= ask("New view: ") # check validity later
|
315
|
+
raise "view #{arg} already exists" if @config.views.include?(arg)
|
316
|
+
|
317
|
+
dir = @root + "/views/" + arg + "/"
|
318
|
+
cmd = "mkdir -p #{dir + 'custom'}"
|
319
|
+
system(cmd)
|
320
|
+
File.write(dir + "custom/blog_header.html", RuneBlog::BlogHeader)
|
321
|
+
File.write(dir + "custom/blog_trailer.html", RuneBlog::BlogTrailer)
|
322
|
+
File.write(dir + "last_deployed", "Initial creation")
|
323
|
+
@config.views << arg
|
324
|
+
end
|
325
|
+
|
326
|
+
### import
|
327
|
+
|
328
|
+
def import(arg = nil)
|
329
|
+
read_config unless @config
|
330
|
+
arg = nil if arg == ""
|
331
|
+
arg ||= ask("Filename: ") # check validity later
|
332
|
+
name = arg
|
333
|
+
grep = `grep ^.title #{name}`
|
334
|
+
@title = grep.sub(/^.title /, "")
|
335
|
+
@slug = make_slug(@title)
|
336
|
+
@fname = @slug + ".lt3"
|
337
|
+
system("cp #{name} #@root/src/#@fname")
|
338
|
+
edit_post(@fname)
|
339
|
+
process_post(@fname)
|
340
|
+
if publish?
|
341
|
+
link_post(@meta)
|
342
|
+
publish_post
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
### new_post
|
347
|
+
|
348
|
+
def new_post
|
349
|
+
read_config unless @config
|
350
|
+
@title = ask("Title: ")
|
351
|
+
@today = Time.now.strftime("%Y%m%d")
|
352
|
+
@date = Time.now.strftime("%Y-%m-%d")
|
353
|
+
|
354
|
+
file = create_empty_post
|
355
|
+
edit_post(file)
|
356
|
+
# file = @root + "/src/" + file
|
357
|
+
process_post(file) #- FIXME handle each view
|
358
|
+
if publish?
|
359
|
+
link_post(@meta)
|
360
|
+
publish_post
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
### remove_post
|
365
|
+
|
366
|
+
#-- FIXME affects linking, building, deployment...
|
367
|
+
|
368
|
+
def remove_post(arg)
|
369
|
+
id = Integer(arg) rescue raise("'#{arg}' is not an integer")
|
370
|
+
tag = "#{'%04d' % id}-"
|
371
|
+
files = Find.find(@root).to_a
|
372
|
+
files = files.grep(/#{tag}/)
|
373
|
+
if files.empty?
|
374
|
+
puts red("\n No such post found")
|
375
|
+
return
|
376
|
+
end
|
377
|
+
puts
|
378
|
+
files.each {|f| puts " #{f}" }
|
379
|
+
ques = files.size > 1 ? "\n Delete all these? " : "\n Delete? "
|
380
|
+
yn = ask red(ques)
|
381
|
+
if yn.downcase == "y" #-- maybe implement trash later?
|
382
|
+
system("rm -rf #{files.join(' ')}")
|
383
|
+
puts red("\n Deleted")
|
384
|
+
else
|
385
|
+
puts red("\n No action taken")
|
386
|
+
end
|
387
|
+
rescue => err
|
388
|
+
puts err
|
389
|
+
puts
|
390
|
+
end
|
391
|
+
|
392
|
+
### list_posts
|
393
|
+
|
394
|
+
def list_posts
|
395
|
+
dir = @config.viewdir(@view)
|
396
|
+
Dir.chdir(dir) do
|
397
|
+
posts = Dir.entries(".").grep(/^0.*/)
|
398
|
+
puts
|
399
|
+
if posts.empty?
|
400
|
+
puts " No posts"
|
401
|
+
else
|
402
|
+
posts.each {|post| puts " #{colored_slug(post)}" }
|
403
|
+
end
|
404
|
+
end
|
405
|
+
rescue
|
406
|
+
puts "Oops? cwd = #{Dir.pwd} dir = #{dir}"
|
407
|
+
exit
|
408
|
+
end
|
409
|
+
|
410
|
+
### list_drafts
|
411
|
+
|
412
|
+
def list_drafts
|
413
|
+
dir = "#@root/src"
|
414
|
+
Dir.chdir(dir) do
|
415
|
+
posts = Dir.entries(".").grep(/^0.*.lt3/)
|
416
|
+
puts
|
417
|
+
if posts.empty?
|
418
|
+
puts " No posts"
|
419
|
+
else
|
420
|
+
posts.each {|post| puts " #{colored_slug(post.sub(/.lt3$/, ""))}" }
|
421
|
+
end
|
422
|
+
end
|
423
|
+
rescue
|
424
|
+
puts "Oops? cwd = #{Dir.pwd} dir = #{dir}"
|
425
|
+
exit
|
426
|
+
end
|
427
|
+
|
428
|
+
end
|
data/lib/runeblog.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
class RuneBlog
|
3
|
-
VERSION = "0.0.
|
3
|
+
VERSION = "0.0.30"
|
4
4
|
|
5
5
|
Path = File.expand_path(File.join(File.dirname(__FILE__)))
|
6
6
|
DefaultData = Path + "/../data"
|
@@ -45,426 +45,3 @@ require 'rubygems'
|
|
45
45
|
require 'ostruct'
|
46
46
|
require 'livetext'
|
47
47
|
|
48
|
-
def clear
|
49
|
-
puts "\e[H\e[2J" # clear screen
|
50
|
-
end
|
51
|
-
|
52
|
-
def red(text)
|
53
|
-
"\e[31m#{text}\e[0m"
|
54
|
-
end
|
55
|
-
|
56
|
-
def blue(text)
|
57
|
-
"\e[34m#{text}\e[0m"
|
58
|
-
end
|
59
|
-
|
60
|
-
def bold(str)
|
61
|
-
"\e[1m#{str}\e[22m"
|
62
|
-
end
|
63
|
-
|
64
|
-
def interpolate(str)
|
65
|
-
wrap = "<<-EOS\n#{str}\nEOS"
|
66
|
-
eval wrap
|
67
|
-
end
|
68
|
-
|
69
|
-
def colored_slug(slug)
|
70
|
-
red(slug[0..3])+blue(slug[4..-1])
|
71
|
-
end
|
72
|
-
|
73
|
-
|
74
|
-
### ask
|
75
|
-
|
76
|
-
def ask(prompt, meth = :to_s)
|
77
|
-
print prompt
|
78
|
-
STDOUT.flush
|
79
|
-
STDIN.gets.chomp.send(meth)
|
80
|
-
end
|
81
|
-
|
82
|
-
### quit
|
83
|
-
|
84
|
-
def quit
|
85
|
-
puts
|
86
|
-
exit
|
87
|
-
end
|
88
|
-
|
89
|
-
### version
|
90
|
-
|
91
|
-
def version
|
92
|
-
puts "\n " + RuneBlog::VERSION
|
93
|
-
end
|
94
|
-
|
95
|
-
### new_blog!
|
96
|
-
|
97
|
-
def new_blog!
|
98
|
-
unless File.exist?(".blog")
|
99
|
-
yn = ask(red(" No .blog found. Create new blog? "))
|
100
|
-
if yn.upcase == "Y"
|
101
|
-
#-- what if data already exists?
|
102
|
-
system("cp -r #{RuneBlog::DefaultData} .")
|
103
|
-
File.open(".blog", "w") do |f|
|
104
|
-
f.puts "data"
|
105
|
-
f.puts "no_default"
|
106
|
-
end
|
107
|
-
File.open("data/VERSION", "a") {|f| f.puts "\nBlog created: " + Time.now.to_s }
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
### make_slug
|
113
|
-
|
114
|
-
def make_slug(title, seq=nil)
|
115
|
-
num = '%04d' % (seq || @config.next_sequence) # FIXME can do better
|
116
|
-
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
|
117
|
-
"#{num}-#{slug}"
|
118
|
-
end
|
119
|
-
|
120
|
-
### read_config
|
121
|
-
|
122
|
-
def read_config
|
123
|
-
# Crude - FIXME later
|
124
|
-
cfg_file = ".blog"
|
125
|
-
new_blog! unless File.exist?(cfg_file)
|
126
|
-
@config = RuneBlog::Config.new(".blog")
|
127
|
-
|
128
|
-
@view = @config.view # current view
|
129
|
-
@sequence = @config.sequence
|
130
|
-
@root = @config.root
|
131
|
-
end
|
132
|
-
|
133
|
-
### create_empty_post
|
134
|
-
|
135
|
-
def create_empty_post
|
136
|
-
@template = <<-EOS
|
137
|
-
.mixin liveblog
|
138
|
-
|
139
|
-
.liveblog_version
|
140
|
-
|
141
|
-
.title #@title
|
142
|
-
.pubdate #@date
|
143
|
-
.views #@view
|
144
|
-
|
145
|
-
Teaser goes here.
|
146
|
-
.readmore
|
147
|
-
Remainder of post goes here.
|
148
|
-
EOS
|
149
|
-
|
150
|
-
@slug = make_slug(@title)
|
151
|
-
@fname = @slug + ".lt3"
|
152
|
-
File.open("#@root/src/#@fname", "w") {|f| f.puts @template }
|
153
|
-
@fname
|
154
|
-
end
|
155
|
-
|
156
|
-
### edit_post
|
157
|
-
|
158
|
-
def edit_post(file)
|
159
|
-
system("vi #@root/src/#{file} +8 ")
|
160
|
-
end
|
161
|
-
|
162
|
-
### open_remote
|
163
|
-
|
164
|
-
def open_remote
|
165
|
-
@deploy ||= {}
|
166
|
-
unless @deploy[@view]
|
167
|
-
puts red("\n Deploy first.")
|
168
|
-
return
|
169
|
-
end
|
170
|
-
lines = @deploy[@view]
|
171
|
-
user, server, sroot, spath = *lines
|
172
|
-
system("open 'http://#{server}/#{spath}'")
|
173
|
-
end
|
174
|
-
|
175
|
-
### open_local
|
176
|
-
|
177
|
-
def open_local
|
178
|
-
system("open #{@config.viewdir(@view)}/index.html")
|
179
|
-
end
|
180
|
-
|
181
|
-
def deploy
|
182
|
-
# TBD clunky FIXME
|
183
|
-
@deploy ||= {}
|
184
|
-
deployment = @config.viewdir(@view) + "deploy"
|
185
|
-
lines = File.readlines(deployment).map {|x| x.chomp }
|
186
|
-
@deploy[@view] = lines
|
187
|
-
user, server, sroot, spath = *lines
|
188
|
-
vdir = @config.viewdir(@view)
|
189
|
-
files = ["#{vdir}/index.html"]
|
190
|
-
files += Dir.entries(vdir).grep(/^\d\d\d\d/).map {|x| "#{vdir}/#{x}" }
|
191
|
-
files.reject! {|f| File.mtime(f) < File.mtime("#{vdir}/last_deployed") }
|
192
|
-
puts "\n Files:"
|
193
|
-
files.each {|f| puts " " + f }
|
194
|
-
puts
|
195
|
-
dir = "#{sroot}/#{spath}"
|
196
|
-
cmd = "scp -r #{files.join(' ')} root@#{server}:#{dir} >/dev/null 2>&1"
|
197
|
-
print red("\n Deploying #{files.size} files... ")
|
198
|
-
# puts cmd
|
199
|
-
system(cmd)
|
200
|
-
File.write("#{vdir}/last_deployed", files)
|
201
|
-
puts red("finished.")
|
202
|
-
end
|
203
|
-
|
204
|
-
### process_post
|
205
|
-
|
206
|
-
def process_post(file)
|
207
|
-
@main ||= Livetext.new
|
208
|
-
@main.main.output = File.new("/tmp/WHOA","w")
|
209
|
-
# puts " Processing: #{Dir.pwd} :: #{file}"
|
210
|
-
path = @root + "/src/#{file}"
|
211
|
-
@meta = @main.process_file(path)
|
212
|
-
@meta.slug = make_slug(@meta.title, @config.sequence)
|
213
|
-
@meta.slug = file.sub(/.lt3$/, "")
|
214
|
-
@meta
|
215
|
-
end
|
216
|
-
|
217
|
-
### reload_post
|
218
|
-
|
219
|
-
def reload_post(file)
|
220
|
-
@main ||= Livetext.new
|
221
|
-
@main.main.output = File.new("/tmp/WHOA","w")
|
222
|
-
@meta = process_post(file)
|
223
|
-
@meta.slug = file.sub(/.lt3$/, "")
|
224
|
-
@meta
|
225
|
-
end
|
226
|
-
|
227
|
-
### posting
|
228
|
-
|
229
|
-
def posting(view, meta)
|
230
|
-
ref = "#{view}/#{meta.slug}/index.html"
|
231
|
-
<<-HTML
|
232
|
-
<br>
|
233
|
-
<font size=+1>#{meta.pubdate} </font>
|
234
|
-
<font size=+2 color=blue><a href=../#{ref} style="text-decoration: none">#{meta.title}</font></a>
|
235
|
-
<br>
|
236
|
-
#{meta.teaser}
|
237
|
-
<a href=../#{ref} style="text-decoration: none">Read more...</a>
|
238
|
-
<br><br>
|
239
|
-
<hr>
|
240
|
-
HTML
|
241
|
-
end
|
242
|
-
|
243
|
-
### generate_index
|
244
|
-
|
245
|
-
def generate_index(view)
|
246
|
-
# Gather all posts, create list
|
247
|
-
vdir = "#@root/views/#{view}"
|
248
|
-
posts = Dir.entries(vdir).grep /^\d\d\d\d/
|
249
|
-
posts = posts.sort.reverse
|
250
|
-
|
251
|
-
# Add view header/trailer
|
252
|
-
head = File.read("#{vdir}/custom/blog_header.html") rescue RuneBlog::BlogHeader
|
253
|
-
tail = File.read("#{vdir}/custom/blog_trailer.html") rescue RuneBlog::BlogTrailer
|
254
|
-
@bloghead = interpolate(head)
|
255
|
-
@blogtail = interpolate(tail)
|
256
|
-
|
257
|
-
# Output view
|
258
|
-
posts.map! {|post| YAML.load(File.read("#{vdir}/#{post}/metadata.yaml")) }
|
259
|
-
File.open("#{vdir}/index.html", "w") do |f|
|
260
|
-
f.puts @bloghead
|
261
|
-
posts.each {|post| f.puts posting(view, post) }
|
262
|
-
f.puts @blogtail
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
### link_post_view
|
267
|
-
|
268
|
-
def link_post_view(view)
|
269
|
-
# Create dir using slug (index.html, metadata?)
|
270
|
-
vdir = @config.viewdir(view)
|
271
|
-
dir = vdir + @meta.slug + "/"
|
272
|
-
cmd = "mkdir -p #{dir}" #-- FIXME what if this exists??
|
273
|
-
system(cmd)
|
274
|
-
File.write("#{dir}/metadata.yaml", @meta.to_yaml)
|
275
|
-
template = File.read(vdir + "custom/post_template.html")
|
276
|
-
post = interpolate(template)
|
277
|
-
File.write(dir + "index.html", post)
|
278
|
-
generate_index(view)
|
279
|
-
end
|
280
|
-
|
281
|
-
### link_post
|
282
|
-
|
283
|
-
def link_post(meta)
|
284
|
-
puts " #{colored_slug(meta.slug)}"
|
285
|
-
# First gather the views
|
286
|
-
views = meta.views
|
287
|
-
print " Views: "
|
288
|
-
views.each do |view|
|
289
|
-
print "#{view} "
|
290
|
-
link_post_view(view)
|
291
|
-
end
|
292
|
-
puts
|
293
|
-
end
|
294
|
-
|
295
|
-
### rebuild
|
296
|
-
|
297
|
-
def rebuild
|
298
|
-
puts
|
299
|
-
files = Dir.entries("#@root/src/").grep /\d\d\d\d.*.lt3$/
|
300
|
-
files.map! {|f| File.basename(f) }
|
301
|
-
files = files.sort.reverse
|
302
|
-
files.each do |file|
|
303
|
-
reload_post(file)
|
304
|
-
link_post(@meta)
|
305
|
-
publish_post
|
306
|
-
end
|
307
|
-
end
|
308
|
-
|
309
|
-
### relink
|
310
|
-
|
311
|
-
def relink
|
312
|
-
@config.views.each do |view|
|
313
|
-
generate_index(view)
|
314
|
-
end
|
315
|
-
end
|
316
|
-
|
317
|
-
### publish?
|
318
|
-
|
319
|
-
def publish?
|
320
|
-
yn = ask(red(" Publish? y/n "))
|
321
|
-
yn.upcase == "Y"
|
322
|
-
end
|
323
|
-
|
324
|
-
### publish_post
|
325
|
-
|
326
|
-
def publish_post
|
327
|
-
# Grab destination data
|
328
|
-
# scp changed files over
|
329
|
-
# puts " Publish: Not implemented yet"
|
330
|
-
end
|
331
|
-
|
332
|
-
### list_views
|
333
|
-
|
334
|
-
def list_views
|
335
|
-
abort "Config file not read" unless @config
|
336
|
-
puts
|
337
|
-
@config.views.each {|v| puts " #{v}" }
|
338
|
-
end
|
339
|
-
|
340
|
-
### change_view
|
341
|
-
|
342
|
-
def change_view(arg = nil)
|
343
|
-
if arg.nil?
|
344
|
-
puts "\n #@view"
|
345
|
-
elsif @config.views.include?(arg)
|
346
|
-
@view = arg
|
347
|
-
else
|
348
|
-
puts "view #{arg.inspect} does not exist"
|
349
|
-
end
|
350
|
-
end
|
351
|
-
|
352
|
-
### new_view
|
353
|
-
|
354
|
-
def new_view(arg = nil)
|
355
|
-
arg = nil if arg == ""
|
356
|
-
read_config unless @config
|
357
|
-
arg ||= ask("New view: ") # check validity later
|
358
|
-
raise "view #{arg} already exists" if @config.views.include?(arg)
|
359
|
-
|
360
|
-
dir = @root + "/views/" + arg + "/"
|
361
|
-
cmd = "mkdir -p #{dir + 'custom'}"
|
362
|
-
system(cmd)
|
363
|
-
File.write(dir + "custom/blog_header.html", RuneBlog::BlogHeader)
|
364
|
-
File.write(dir + "custom/blog_trailer.html", RuneBlog::BlogTrailer)
|
365
|
-
File.write(dir + "last_deployed", "Initial creation")
|
366
|
-
@config.views << arg
|
367
|
-
end
|
368
|
-
|
369
|
-
### import
|
370
|
-
|
371
|
-
def import(arg = nil)
|
372
|
-
read_config unless @config
|
373
|
-
arg = nil if arg == ""
|
374
|
-
arg ||= ask("Filename: ") # check validity later
|
375
|
-
name = arg
|
376
|
-
grep = `grep ^.title #{name}`
|
377
|
-
@title = grep.sub(/^.title /, "")
|
378
|
-
@slug = make_slug(@title)
|
379
|
-
@fname = @slug + ".lt3"
|
380
|
-
system("cp #{name} #@root/src/#@fname")
|
381
|
-
edit_post(@fname)
|
382
|
-
process_post(@fname)
|
383
|
-
if publish?
|
384
|
-
link_post(@meta)
|
385
|
-
publish_post
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
### new_post
|
390
|
-
|
391
|
-
def new_post
|
392
|
-
read_config unless @config
|
393
|
-
@title = ask("Title: ")
|
394
|
-
@today = Time.now.strftime("%Y%m%d")
|
395
|
-
@date = Time.now.strftime("%Y-%m-%d")
|
396
|
-
|
397
|
-
file = create_empty_post
|
398
|
-
edit_post(file)
|
399
|
-
# file = @root + "/src/" + file
|
400
|
-
process_post(file) #- FIXME handle each view
|
401
|
-
if publish?
|
402
|
-
link_post(@meta)
|
403
|
-
publish_post
|
404
|
-
end
|
405
|
-
end
|
406
|
-
|
407
|
-
### remove_post
|
408
|
-
|
409
|
-
#-- FIXME affects linking, building, deployment...
|
410
|
-
|
411
|
-
def remove_post(arg)
|
412
|
-
id = Integer(arg) rescue raise("'#{arg}' is not an integer")
|
413
|
-
tag = "#{'%04d' % id}-"
|
414
|
-
files = Find.find(@root).to_a
|
415
|
-
files = files.grep(/#{tag}/)
|
416
|
-
if files.empty?
|
417
|
-
puts red("\n No such post found")
|
418
|
-
return
|
419
|
-
end
|
420
|
-
puts
|
421
|
-
files.each {|f| puts " #{f}" }
|
422
|
-
ques = files.size > 1 ? "\n Delete all these? " : "\n Delete? "
|
423
|
-
yn = ask red(ques)
|
424
|
-
if yn.downcase == "y" #-- maybe implement trash later?
|
425
|
-
system("rm -rf #{files.join(' ')}")
|
426
|
-
puts red("\n Deleted")
|
427
|
-
else
|
428
|
-
puts red("\n No action taken")
|
429
|
-
end
|
430
|
-
rescue => err
|
431
|
-
puts err
|
432
|
-
puts
|
433
|
-
end
|
434
|
-
|
435
|
-
### list_posts
|
436
|
-
|
437
|
-
def list_posts
|
438
|
-
dir = @config.viewdir(@view)
|
439
|
-
Dir.chdir(dir) do
|
440
|
-
posts = Dir.entries(".").grep(/^0.*/)
|
441
|
-
puts
|
442
|
-
if posts.empty?
|
443
|
-
puts " No posts"
|
444
|
-
else
|
445
|
-
posts.each {|post| puts " #{colored_slug(post)}" }
|
446
|
-
end
|
447
|
-
end
|
448
|
-
rescue
|
449
|
-
puts "Oops? cwd = #{Dir.pwd} dir = #{dir}"
|
450
|
-
exit
|
451
|
-
end
|
452
|
-
|
453
|
-
### list_drafts
|
454
|
-
|
455
|
-
def list_drafts
|
456
|
-
dir = "#@root/src"
|
457
|
-
Dir.chdir(dir) do
|
458
|
-
posts = Dir.entries(".").grep(/^0.*.lt3/)
|
459
|
-
puts
|
460
|
-
if posts.empty?
|
461
|
-
puts " No posts"
|
462
|
-
else
|
463
|
-
posts.each {|post| puts " #{colored_slug(post.sub(/.lt3$/, ""))}" }
|
464
|
-
end
|
465
|
-
end
|
466
|
-
rescue
|
467
|
-
puts "Oops? cwd = #{Dir.pwd} dir = #{dir}"
|
468
|
-
exit
|
469
|
-
end
|
470
|
-
|
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.0.
|
4
|
+
version: 0.0.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A blog system based on Ruby and Livetext
|
14
14
|
email: rubyhacker@gmail.com
|
@@ -26,6 +26,7 @@ files:
|
|
26
26
|
- data/views/_default/custom/blog_trailer.html
|
27
27
|
- data/views/_default/custom/post_template.html
|
28
28
|
- data/views/_default/last_deployed
|
29
|
+
- lib/repl.rb
|
29
30
|
- lib/runeblog.rb
|
30
31
|
- runeblog.gemspec
|
31
32
|
homepage: https://github.com/Hal9000/runeblog
|