runeblog 0.1.79 → 0.1.84
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/default.rb +3 -0
- data/lib/helpers-blog.rb +16 -2
- data/lib/liveblog.rb +18 -91
- data/lib/post.rb +13 -0
- data/lib/runeblog.rb +114 -125
- data/lib/runeblog_version.rb +1 -1
- data/lib/view.rb +2 -2
- data/runeblog.gemspec +1 -5
- data/test/make_blog.rb +37 -31
- data/themes/standard.tgz +0 -0
- metadata +3 -3
- data/data/standard.tgz +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b18c3d8c6c7a36be892a6ad4f5d1343839da39d8a151ac2a9600cb29389a855d
|
4
|
+
data.tar.gz: e18259284be9484e35e800c60ee531b4678ea9ad9c1ce85994d36362d92d7f66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19bcba26366d495a4c879f79b5fcc0b068cbca46f1a40e1f2959864bd7ed9b9d5a5c80cf07d5aeeb0fde5d72ce146d63b6aff99df81d5e1b62b5a8689357da91
|
7
|
+
data.tar.gz: 947861e8132ac5fa801398e81fed3e0fad60d1a10f210478e8a248583e57a40b6000b7b7940cfc56fadd11d73c2328f21bca137168a81b96d1855ca4a8ecf519
|
data/lib/default.rb
CHANGED
data/lib/helpers-blog.rb
CHANGED
@@ -4,6 +4,20 @@ require 'runeblog_version'
|
|
4
4
|
|
5
5
|
module RuneBlog::Helpers
|
6
6
|
|
7
|
+
def copy(src, dst)
|
8
|
+
system("cp #{src} #{dst}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def copy!(src, dst)
|
12
|
+
system("cp -r #{src} #{dst}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def livetext(src, dst)
|
16
|
+
src << ".lt3" unless src.end_with?(".lt3")
|
17
|
+
dst << ".html" unless src.end_with?(".html")
|
18
|
+
system("livetext #{src} >#{dst}")
|
19
|
+
end
|
20
|
+
|
7
21
|
def get_root
|
8
22
|
if $_blog
|
9
23
|
if $_blog.root
|
@@ -114,9 +128,9 @@ module RuneBlog::Helpers
|
|
114
128
|
raise CantCreateDir(dir) unless result
|
115
129
|
end
|
116
130
|
|
117
|
-
def interpolate(str)
|
131
|
+
def interpolate(str, binding)
|
118
132
|
wrap = "<<-EOS\n#{str}\nEOS"
|
119
|
-
eval wrap
|
133
|
+
eval wrap, binding
|
120
134
|
end
|
121
135
|
|
122
136
|
def error(err) # Hmm, this is duplicated
|
data/lib/liveblog.rb
CHANGED
@@ -8,8 +8,6 @@ require 'runeblog'
|
|
8
8
|
errfile = File.new("liveblog.out", "w")
|
9
9
|
STDERR.reopen(errfile)
|
10
10
|
|
11
|
-
# ::Home = Dir.pwd unless defined?(::Home)
|
12
|
-
|
13
11
|
=begin
|
14
12
|
123:def title # side-effect
|
15
13
|
133:def pubdate # side-effect
|
@@ -21,11 +19,20 @@ STDERR.reopen(errfile)
|
|
21
19
|
491:def _post_lookup(postid) # side-effect
|
22
20
|
=end
|
23
21
|
|
22
|
+
def init_liveblog # FIXME - a lot of this logic sucks
|
23
|
+
@blog = $_blog = RuneBlog.new(false)
|
24
|
+
@root = @blog.root
|
25
|
+
@view = @blog.view
|
26
|
+
@view_name = @blog.view.name
|
27
|
+
@vdir = @blog.view.dir
|
28
|
+
@version = RuneBlog::VERSION
|
29
|
+
@theme = @vdir + "/themes/standard/"
|
30
|
+
end
|
31
|
+
|
24
32
|
def post
|
25
33
|
@meta = OpenStruct.new
|
26
34
|
@meta.num = _args[0]
|
27
|
-
#
|
28
|
-
# STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
35
|
+
_out " <!-- Post number #{@meta.num} -->\n "
|
29
36
|
end
|
30
37
|
|
31
38
|
def _view_from_cwd
|
@@ -95,31 +102,6 @@ def inset
|
|
95
102
|
_optional_blank_line
|
96
103
|
end
|
97
104
|
|
98
|
-
### copy_asset
|
99
|
-
|
100
|
-
# def copy_asset(asset)
|
101
|
-
# vdir = @blog.view.dir
|
102
|
-
# return if File.exist?(vdir + "/assets/" + asset)
|
103
|
-
# top = vdir + "/../../assets/"
|
104
|
-
# if File.exist?(top + asset)
|
105
|
-
# system("cp #{top}/#{asset} #{vdir}/assets/#{asset}")
|
106
|
-
# return
|
107
|
-
# end
|
108
|
-
# raise "Can't find #{asset.inspect}"
|
109
|
-
# end
|
110
|
-
|
111
|
-
#############
|
112
|
-
|
113
|
-
def init_liveblog # FIXME - a lot of this logic sucks
|
114
|
-
@blog = $_blog = RuneBlog.new(false)
|
115
|
-
@root = @blog.root
|
116
|
-
@view = @blog.view
|
117
|
-
@view_name = @blog.view.name
|
118
|
-
@vdir = @blog.view.dir
|
119
|
-
@version = RuneBlog::VERSION
|
120
|
-
@theme = @vdir + "/themes/standard/"
|
121
|
-
end
|
122
|
-
|
123
105
|
def _errout(*args)
|
124
106
|
::STDERR.puts *args
|
125
107
|
end
|
@@ -142,8 +124,6 @@ def title # side-effect
|
|
142
124
|
raise "'post' was not called" unless @meta
|
143
125
|
title = @_data.chomp
|
144
126
|
@meta.title = title
|
145
|
-
# STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
146
|
-
# @live.setvar :title, title
|
147
127
|
setvar :title, title
|
148
128
|
_out %[<h1 class="post-title">#{title}</h1><br>]
|
149
129
|
_optional_blank_line
|
@@ -158,7 +138,6 @@ def pubdate # side-effect
|
|
158
138
|
y, m, d = y.to_i, m.to_i, d.to_i
|
159
139
|
@meta.date = ::Date.new(y, m, d)
|
160
140
|
@meta.pubdate = "%04d-%02d-%02d" % [y, m, d]
|
161
|
-
# STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
162
141
|
_optional_blank_line
|
163
142
|
end
|
164
143
|
|
@@ -174,7 +153,6 @@ def tags # side-effect
|
|
174
153
|
raise "'post' was not called" unless @meta
|
175
154
|
_debug "args = #{_args}"
|
176
155
|
@meta.tags = _args.dup || []
|
177
|
-
# STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
178
156
|
_optional_blank_line
|
179
157
|
end
|
180
158
|
|
@@ -182,7 +160,6 @@ def views # side-effect
|
|
182
160
|
raise "'post' was not called" unless @meta
|
183
161
|
_debug "data = #{_args}"
|
184
162
|
@meta.views = _args.dup # + ["main"]
|
185
|
-
# STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
186
163
|
_optional_blank_line
|
187
164
|
end
|
188
165
|
|
@@ -191,13 +168,9 @@ def pin # side-effect
|
|
191
168
|
_debug "data = #{_args}"
|
192
169
|
# verify only already-specified views?
|
193
170
|
@meta.pinned = _args.dup
|
194
|
-
# STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
195
171
|
_optional_blank_line
|
196
172
|
end
|
197
173
|
|
198
|
-
# def liveblog_version
|
199
|
-
# end
|
200
|
-
|
201
174
|
def list
|
202
175
|
_out "<ul>"
|
203
176
|
_body {|line| _out "<li>#{line}</li>" }
|
@@ -221,38 +194,14 @@ def list!
|
|
221
194
|
_optional_blank_line
|
222
195
|
end
|
223
196
|
|
224
|
-
def asset
|
225
|
-
raise "'post' was not called" unless @meta
|
226
|
-
@meta.assets ||= {}
|
227
|
-
# STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
228
|
-
list = _args
|
229
|
-
# For now: copies, doesn't keep record
|
230
|
-
# Later: Add to file and uniq; use in publishing
|
231
|
-
list.each {|asset| copy_asset(asset) }
|
232
|
-
_optional_blank_line
|
233
|
-
end
|
234
|
-
|
235
|
-
def assets
|
236
|
-
raise "'post' was not called" unless @meta
|
237
|
-
@meta.assets ||= []
|
238
|
-
@meta.assets += _body
|
239
|
-
# STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
240
|
-
_optional_blank_line
|
241
|
-
end
|
242
|
-
|
243
197
|
def write_post # side-effect
|
244
198
|
raise "'post' was not called" unless @meta
|
245
|
-
# return
|
246
199
|
save = Dir.pwd
|
247
200
|
@postdir.gsub!(/\/\//, "/") # FIXME unneeded?
|
248
201
|
Dir.mkdir(@postdir) unless Dir.exist?(@postdir) # FIXME remember assets!
|
249
202
|
Dir.chdir(@postdir)
|
250
|
-
STDERR.puts "------ cd into #@postdir"
|
251
203
|
@meta.views = @meta.views.join(" ")
|
252
204
|
@meta.tags = @meta.tags.join(" ") rescue ""
|
253
|
-
# STDERR.puts ">>>> #{__method__}: writing #{@live.body.size} bytes to #{Dir.pwd}/body.txt"
|
254
|
-
# File.write("body.txt", @live.body) # Actually HTML...
|
255
|
-
# p Dir.pwd
|
256
205
|
File.write("teaser.txt", @meta.teaser)
|
257
206
|
|
258
207
|
fields = [:num, :title, :date, :pubdate, :views, :tags]
|
@@ -261,7 +210,6 @@ STDERR.puts "------ cd into #@postdir"
|
|
261
210
|
f2 = File.open(fname2, "w") do |f2|
|
262
211
|
fields.each {|fld| f2.puts "#{fld}: #{@meta.send(fld)}" }
|
263
212
|
end
|
264
|
-
STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
265
213
|
Dir.chdir(save)
|
266
214
|
rescue => err
|
267
215
|
puts "err = #{err}"
|
@@ -271,11 +219,8 @@ end
|
|
271
219
|
def teaser
|
272
220
|
raise "'post' was not called" unless @meta
|
273
221
|
@meta.teaser = _body_text
|
274
|
-
STDERR.puts ">>> #{__method__}: @meta = #{@meta.to_h.inspect}"
|
275
222
|
_out @meta.teaser + "\n"
|
276
223
|
STDERR.puts "TEASER cwd = #{Dir.pwd}"
|
277
|
-
# file = @vdir + "/teaser.txt"
|
278
|
-
# File.write(file, @meta.teaser)
|
279
224
|
# FIXME
|
280
225
|
end
|
281
226
|
|
@@ -291,7 +236,6 @@ def finalize
|
|
291
236
|
@slug = @blog.make_slug(@meta)
|
292
237
|
slug_dir = @slug
|
293
238
|
@postdir = @blog.view.dir + "/posts/#{slug_dir}"
|
294
|
-
STDERR.puts "Got here!"
|
295
239
|
write_post
|
296
240
|
@meta
|
297
241
|
end
|
@@ -329,23 +273,17 @@ end
|
|
329
273
|
###### experimental...
|
330
274
|
|
331
275
|
class Livetext::Functions
|
332
|
-
|
333
276
|
def _var(name)
|
334
277
|
::Livetext::Vars[name] || "[:#{name} is undefined]"
|
335
278
|
end
|
336
279
|
|
337
|
-
|
338
280
|
def link
|
339
281
|
file, cdata = self.class.param.split("||", 2)
|
340
282
|
%[<link type="application/atom+xml" rel="alternate" href="#{_var(:host)}#{file}" title="#{_var(:title)}">]
|
341
283
|
end
|
342
|
-
|
343
284
|
end
|
344
285
|
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
def _var(name) # FIXME later
|
286
|
+
def _var(name) # FIXME scope issue!
|
349
287
|
::Livetext::Vars[name] || "[:#{name} is undefined]"
|
350
288
|
end
|
351
289
|
|
@@ -363,7 +301,7 @@ def head
|
|
363
301
|
"linkc" => %[<link rel="canonical" href="#{_var(:host)}">],
|
364
302
|
"og:url" => %[<meta property="og:url" content="#{_var(:host)}">],
|
365
303
|
"og:site_name" => %[<meta property="og:site_name" content="#{_var(:title)}">],
|
366
|
-
"style" => %[<link rel="stylesheet" href="blog
|
304
|
+
"style" => %[<link rel="stylesheet" href="assets/blog.css">],
|
367
305
|
"feed" => %[<link type="application/atom+xml" rel="alternate" href="#{_var(:host)}/feed.xml" title="#{_var(:title)}">],
|
368
306
|
"favicon" => %[<link rel="shortcut icon" type="image/x-icon" href="../assets/favicon.ico">\n <link rel="apple-touch-icon" href="../assets/favicon.ico">]
|
369
307
|
}
|
@@ -388,7 +326,7 @@ def head
|
|
388
326
|
end
|
389
327
|
end
|
390
328
|
hash = defaults.dup.update(result) # FIXME collisions?
|
391
|
-
_out "<html lang=en_US>"
|
329
|
+
# _out "<html lang=en_US>"
|
392
330
|
_out "<head>"
|
393
331
|
hash.each_value {|x| _out " " + x }
|
394
332
|
_out "</head>"
|
@@ -423,11 +361,8 @@ STDERR.puts "--- inside #main: which = #{which.inspect}"
|
|
423
361
|
case which
|
424
362
|
when "recent_posts"
|
425
363
|
all_teasers
|
426
|
-
when "post" #
|
427
|
-
# _out "<iframe src='./0001-whats-at-stubbs/whats-at-stubbs.html'><iframe>"
|
364
|
+
when "post" # No longer needed??
|
428
365
|
_out %[<iframe style="width: 100vw;height: 100vh;position: relative;" src='whats-at-stubbs.html' width=100% frameborder="0" allowfullscreen></iframe>]
|
429
|
-
# self.data = "post-index.lt3"
|
430
|
-
# _include
|
431
366
|
end
|
432
367
|
_out %[</div>]
|
433
368
|
end
|
@@ -468,6 +403,7 @@ def script
|
|
468
403
|
_out %[<script src="#{url}" integrity="#{integ}" crossorigin="#{cross}"></script>]
|
469
404
|
end
|
470
405
|
|
406
|
+
|
471
407
|
### How this next bit works:
|
472
408
|
###
|
473
409
|
### all_teasers will call _find_recent_posts
|
@@ -484,12 +420,10 @@ end
|
|
484
420
|
###
|
485
421
|
|
486
422
|
def _find_recent_posts
|
487
|
-
STDERR.puts "--- frp: $FileDir = #{_var(:FileDir)}"
|
488
423
|
@vdir = _var(:FileDir).match(%r[(^.*/views/.*?)/])[1]
|
489
424
|
posts = nil
|
490
425
|
dir_posts = @vdir + "/posts"
|
491
426
|
entries = Dir.entries(dir_posts)
|
492
|
-
STDERR.puts "--- frp: dir_posts = #{dir_posts} ent = #{entries.inspect}"
|
493
427
|
posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
|
494
428
|
posts.select! {|x| File.directory?(x) }
|
495
429
|
# directories that start with four digits
|
@@ -498,7 +432,6 @@ STDERR.puts "--- frp: dir_posts = #{dir_posts} ent = #{entries.inspect}"
|
|
498
432
|
end
|
499
433
|
|
500
434
|
def all_teasers
|
501
|
-
STDERR.puts "-- inside #all_teasers..."
|
502
435
|
open = <<-HTML
|
503
436
|
<section class="posts">
|
504
437
|
HTML
|
@@ -508,10 +441,9 @@ STDERR.puts "-- inside #all_teasers..."
|
|
508
441
|
|
509
442
|
text = <<-HTML
|
510
443
|
<html>
|
511
|
-
<head><link rel="stylesheet" href="blog
|
444
|
+
<head><link rel="stylesheet" href="assets/blog.css"></head>
|
512
445
|
<body>
|
513
446
|
HTML
|
514
|
-
# _out open
|
515
447
|
posts = _find_recent_posts
|
516
448
|
wanted = [5, posts.size].min # estimate how many we want?
|
517
449
|
enum = posts.each
|
@@ -522,8 +454,6 @@ STDERR.puts "-- inside #all_teasers..."
|
|
522
454
|
end
|
523
455
|
text << "</body></html>"
|
524
456
|
File.write("recent.html", text)
|
525
|
-
# _out close
|
526
|
-
# _out "<iframe src='./recent.html'><iframe>"
|
527
457
|
_out %[<iframe style="width: 100vw;height: 100vh;position: relative;" src='recent.html' width=100% frameborder="0" allowfullscreen></iframe>]
|
528
458
|
end
|
529
459
|
|
@@ -556,17 +486,14 @@ def _teaser(slug)
|
|
556
486
|
nslug, aslug, title, date, teaser_text =
|
557
487
|
vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
|
558
488
|
path = vp.path
|
559
|
-
STDERR.puts [">>>>> vp = ", vp].inspect
|
560
489
|
url = "#{path}/#{aslug}.html" # Should be relative to .blogs!! FIXME
|
561
|
-
STDERR.puts [slug, url].inspect
|
562
490
|
date = Date.parse(date)
|
563
491
|
date = date.strftime("%B %e<br>%Y")
|
564
492
|
text = _interpolate(@_post_entry, binding)
|
565
|
-
# File.write("../../../generated/#{slug}.html", text)
|
566
|
-
# _out text
|
567
493
|
text
|
568
494
|
end
|
569
495
|
|
496
|
+
|
570
497
|
def card_iframe
|
571
498
|
title = _data
|
572
499
|
lines = _body
|
data/lib/post.rb
CHANGED
@@ -153,5 +153,18 @@ class RuneBlog::ViewPost
|
|
153
153
|
@title = lines.grep(/title:/).first[7..-1].chomp
|
154
154
|
@date = lines.grep(/pubdate:/).first[9..-1].chomp
|
155
155
|
end
|
156
|
+
|
157
|
+
def get_dirs
|
158
|
+
fname = File.basename(draft)
|
159
|
+
noext = fname.sub(/.lt3$/, "")
|
160
|
+
vdir = "#@root/views/#{view}"
|
161
|
+
dir = "#{vdir}/posts/#{noext}/"
|
162
|
+
Dir.mkdir(dir) unless Dir.exist?(dir)
|
163
|
+
system("cp #{draft} #{dir}")
|
164
|
+
viewdir, slugdir, aslug = vdir, dir, noext[5..-1]
|
165
|
+
theme = viewdir + "/themes/standard"
|
166
|
+
[noext, viewdir, slugdir, aslug, theme]
|
167
|
+
end
|
168
|
+
|
156
169
|
end
|
157
170
|
|
data/lib/runeblog.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
require 'livetext'
|
1
|
+
require 'date'
|
2
|
+
# require 'livetext'
|
3
3
|
|
4
4
|
require 'runeblog_version'
|
5
5
|
require 'global'
|
@@ -9,17 +9,13 @@ require 'view'
|
|
9
9
|
require 'publish'
|
10
10
|
require 'post'
|
11
11
|
|
12
|
-
# ::Home = Dir.pwd unless defined?(::Home)
|
13
|
-
|
14
12
|
###
|
15
13
|
|
16
14
|
class RuneBlog
|
17
15
|
|
18
16
|
DotDir = ".blogs"
|
19
17
|
ConfigFile = "config"
|
20
|
-
GemData = RuneBlog::Path + "/../
|
21
|
-
|
22
|
-
# ::Home = Dir.pwd
|
18
|
+
GemData = RuneBlog::Path + "/../themes"
|
23
19
|
|
24
20
|
make_exception(:FileNotFound, "File $1 was not found")
|
25
21
|
make_exception(:BlogRepoAlreadyExists, "Blog repo $1 already exists")
|
@@ -29,7 +25,7 @@ class RuneBlog
|
|
29
25
|
make_exception(:CantCreateDir, "Can't create directory $1")
|
30
26
|
make_exception(:EditorProblem, "Could not edit $1")
|
31
27
|
make_exception(:NoSuchView, "No such view: $1")
|
32
|
-
|
28
|
+
# make_exception(:LivetextError, "Livetext#process_file returned nil for $1")
|
33
29
|
make_exception(:NoBlogAccessor, "Runeblog.blog is not set")
|
34
30
|
|
35
31
|
|
@@ -51,7 +47,6 @@ class RuneBlog
|
|
51
47
|
raise BlogRepoAlreadyExists if Dir.exist?(root_dir)
|
52
48
|
new_dotfile(root: root_dir, current_view: first_view)
|
53
49
|
create_dir(dir)
|
54
|
-
# New code goes here!
|
55
50
|
Dir.chdir(dir) do
|
56
51
|
create_dir("drafts")
|
57
52
|
create_dir("views")
|
@@ -66,8 +61,7 @@ class RuneBlog
|
|
66
61
|
end
|
67
62
|
|
68
63
|
def initialize(top = true) # at top? always assumes existing blog
|
69
|
-
# Crude - FIXME later -
|
70
|
-
# What views are there? Publishing, etc.
|
64
|
+
# Crude - FIXME later - # What views are there? Publishing, etc.
|
71
65
|
self.class.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
72
66
|
$_blog = self # Dumber still?
|
73
67
|
dir = ""
|
@@ -78,11 +72,11 @@ class RuneBlog
|
|
78
72
|
file = dir.empty? ? ConfigFile : dir + "/" + ConfigFile
|
79
73
|
errmsg = "No config file! file = #{file.inspect} dir = #{Dir.pwd}"
|
80
74
|
raise errmsg unless File.exist?(file)
|
81
|
-
# Hmm. current_view doesn't belong?
|
75
|
+
# Hmm. current_view doesn't belong?
|
82
76
|
@root, @view_name, @editor = read_config(file, :root, :current_view, :editor)
|
77
|
+
|
83
78
|
md = Dir.pwd.match(%r[.*/views/(.*?)/])
|
84
79
|
@view_name = md[1] if md
|
85
|
-
# STDERR.puts "---- vname = #@view_name"
|
86
80
|
@views = get_views
|
87
81
|
@view = str2view(@view_name)
|
88
82
|
@sequence = get_sequence
|
@@ -173,17 +167,22 @@ class RuneBlog
|
|
173
167
|
Dir.chdir(vdir)
|
174
168
|
x = RuneBlog::Default
|
175
169
|
create_dir('themes')
|
176
|
-
# create_dir("generated")
|
177
170
|
create_dir('assets')
|
178
171
|
create_dir('posts')
|
179
172
|
|
173
|
+
create_dir('staging')
|
174
|
+
create_dir('staging/assets')
|
175
|
+
create_dir('remote')
|
176
|
+
create_dir('remote/assets')
|
177
|
+
|
180
178
|
Dir.chdir("themes") { system("tar zxvf #{GemData}/standard.tgz >/dev/null 2>&1") }
|
181
|
-
|
179
|
+
copy!("themes/standard/*", "staging/")
|
180
|
+
copy("themes/standard/assets/*", "remote/assets/")
|
182
181
|
|
183
182
|
pub = "user: xxx\nserver: xxx\ndocroot: xxx\npath: xxx\nproto: xxx\n"
|
184
183
|
dump(pub, "publish")
|
185
184
|
|
186
|
-
# Add to global.lt3 here? FIXME
|
185
|
+
# Add to global.lt3 here? FIXME
|
187
186
|
|
188
187
|
view = RuneBlog::View.new(arg)
|
189
188
|
self.view = view
|
@@ -218,22 +217,82 @@ class RuneBlog
|
|
218
217
|
result
|
219
218
|
end
|
220
219
|
|
220
|
+
def post_lookup(postid) # side-effect?
|
221
|
+
# .. = templates, ../.. = views/thisview
|
222
|
+
slug = title = date = teaser_text = nil
|
223
|
+
|
224
|
+
dir_posts = @vdir + "/posts"
|
225
|
+
posts = Dir.entries(dir_posts).grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
|
226
|
+
posts.select! {|x| File.directory?(x) }
|
227
|
+
|
228
|
+
post = posts.select {|x| File.basename(x).to_i == postid }
|
229
|
+
raise "Error: More than one post #{postid}" if post.size > 1
|
230
|
+
postdir = post.first
|
231
|
+
vp = RuneBlog::ViewPost.new(self.view, postdir)
|
232
|
+
vp
|
233
|
+
end
|
234
|
+
|
235
|
+
def teaser(slug)
|
236
|
+
id = slug.to_i
|
237
|
+
text = nil
|
238
|
+
post_entry_name = @theme + "/blog-_postentry.lt3"
|
239
|
+
@_post_entry ||= File.read(post_entry_name)
|
240
|
+
vp = post_lookup(id)
|
241
|
+
nslug, aslug, title, date, teaser_text =
|
242
|
+
vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
|
243
|
+
path = vp.path
|
244
|
+
# url = "#{path}/#{aslug}.html" # Should be relative to .blogs!! FIXME
|
245
|
+
url = "#{aslug}.html" # Should be relative to .blogs!! FIXME
|
246
|
+
date = ::Date.parse(date)
|
247
|
+
date = date.strftime("%B %e<br>%Y")
|
248
|
+
text = interpolate(@_post_entry, binding)
|
249
|
+
text
|
250
|
+
end
|
251
|
+
|
252
|
+
def collect_recent_posts(file)
|
253
|
+
@vdir = ".."
|
254
|
+
posts = nil
|
255
|
+
dir_posts = @vdir + "/posts"
|
256
|
+
entries = Dir.entries(dir_posts)
|
257
|
+
posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
|
258
|
+
posts.select! {|x| File.directory?(x) }
|
259
|
+
# directories that start with four digits
|
260
|
+
posts = posts.sort {|a, b| b.to_i <=> a.to_i } # sort descending
|
261
|
+
posts = posts[0..19] # return 20 at most
|
262
|
+
text = <<-HTML
|
263
|
+
<html>
|
264
|
+
<head><link rel="stylesheet" href="assets/blog.css"></head>
|
265
|
+
<body>
|
266
|
+
HTML
|
267
|
+
# posts = _find_recent_posts
|
268
|
+
wanted = [5, posts.size].min # estimate how many we want?
|
269
|
+
enum = posts.each
|
270
|
+
wanted.times do
|
271
|
+
postid = File.basename(enum.next)
|
272
|
+
postid = postid.to_i
|
273
|
+
text << teaser(postid) # side effect! calls _out
|
274
|
+
end
|
275
|
+
text << "</body></html>"
|
276
|
+
File.write(file, text) # FIXME ???
|
277
|
+
iframe_text = <<-HTML
|
278
|
+
<iframe style="width: 100vw;height: 100vh;position: relative;"
|
279
|
+
src='recent.html' width=100% frameborder="0" allowfullscreen>
|
280
|
+
</iframe>
|
281
|
+
HTML
|
282
|
+
# _out iframe_text # FIXME ??
|
283
|
+
end
|
284
|
+
|
221
285
|
def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
|
222
286
|
save = Dir.pwd
|
223
287
|
Dir.chdir(self.view.dir)
|
224
288
|
# change to create_draft ?
|
225
289
|
post = Post.create(title: title, teaser: teaser, body: body, other_views: other_views)
|
226
|
-
puts "cnp: num = #{post.meta.num}"
|
227
290
|
post.edit unless testing
|
228
291
|
post.build
|
229
292
|
meta = post.meta
|
230
293
|
Dir.chdir(save)
|
231
|
-
|
232
|
-
meta.num
|
233
|
-
return meta.num
|
234
|
-
Dir.chdir(save)
|
235
|
-
meta.num = 999
|
236
|
-
meta.num
|
294
|
+
meta.num ||= 999 # ??
|
295
|
+
return meta.num
|
237
296
|
rescue => err
|
238
297
|
puts err
|
239
298
|
puts err.backtrace.join("\n")
|
@@ -268,37 +327,18 @@ return meta.num
|
|
268
327
|
self.view = view # error checking?
|
269
328
|
end
|
270
329
|
|
271
|
-
def
|
272
|
-
raise ArgumentError unless file.is_a?(String)
|
273
|
-
path = @root + "/drafts/#{file}"
|
274
|
-
raise FileNotFound(path) unless File.exist?(path)
|
275
|
-
num = file.to_i # e.g. 0098-this-is-a-title
|
276
|
-
live = Livetext.new # (STDOUT) # (nil)
|
277
|
-
Livetext.parameters = [self, num, live]
|
278
|
-
text = File.read(path)
|
279
|
-
live.process_text(text)
|
280
|
-
rescue => err
|
281
|
-
error(err)
|
282
|
-
getch
|
283
|
-
end
|
284
|
-
|
285
|
-
def generate_index(view)
|
286
|
-
# FIXME
|
330
|
+
def generate_index(view) # FIXME delete?
|
287
331
|
debug "=== generate_index view = #{view.to_s}"
|
288
332
|
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
|
289
333
|
|
290
334
|
vdir = self.view.dir
|
291
335
|
dir0 = "#{vdir}/themes/standard/blog"
|
292
|
-
# dir1 = "#{vdir}/generated"
|
293
|
-
# system("livetext #{dir0}/generate.lt3 >#{dir1}/index.html 2>#{dir1}/errors.txt")
|
294
336
|
rescue => err
|
295
337
|
error(err)
|
296
338
|
exit
|
297
339
|
end
|
298
340
|
|
299
|
-
|
300
|
-
|
301
|
-
def generate_view(view)
|
341
|
+
def generate_view(view) # huh?
|
302
342
|
end
|
303
343
|
|
304
344
|
def _get_views(draft)
|
@@ -306,7 +346,6 @@ return meta.num
|
|
306
346
|
view_line = File.readlines(draft).grep(/^.views /)
|
307
347
|
raise "More than one .views call!" if view_line.size > 1
|
308
348
|
raise "No .views call!" if view_line.size < 1
|
309
|
-
# STDERR.puts view_line.inspect
|
310
349
|
view_line = view_line.first
|
311
350
|
views = view_line[7..-1].split
|
312
351
|
end
|
@@ -314,18 +353,18 @@ return meta.num
|
|
314
353
|
# Remember: A post in multiple views will trigger multiple
|
315
354
|
# views needing to be rebuilt (and published)
|
316
355
|
|
317
|
-
# generate a post:
|
318
|
-
# given draft 9999-title.lt3
|
319
|
-
# create VIEW/posts/9999-title/index.lt3
|
320
|
-
# LATER: metadata!! or is it in head?
|
321
|
-
# Generate VIEW/posts/9999-title/head.lt3?
|
322
|
-
# livetext draft_wrapper_plain.lt3 >generated/posts/plain-title.html # unframed
|
323
|
-
# livetext draft_generate.lt3 >generated/posts/real-title.html # framed
|
324
|
-
# livetext draft_wrapper_perma.lt3 >generated/posts/perma-title.html # permaframed
|
325
|
-
#
|
326
|
-
# Generate associated views:
|
327
|
-
# livetext ??/recent.lt3 >VIEW/working/recent.html
|
328
|
-
# livetext VIEW/blog/generate.lt3 ??
|
356
|
+
# generate a post:
|
357
|
+
# given draft 9999-title.lt3
|
358
|
+
# create VIEW/posts/9999-title/index.lt3
|
359
|
+
# LATER: metadata!! or is it in head?
|
360
|
+
# Generate VIEW/posts/9999-title/head.lt3?
|
361
|
+
# livetext draft_wrapper_plain.lt3 >generated/posts/plain-title.html # unframed
|
362
|
+
# livetext draft_generate.lt3 >generated/posts/real-title.html # framed
|
363
|
+
# livetext draft_wrapper_perma.lt3 >generated/posts/perma-title.html # permaframed
|
364
|
+
#
|
365
|
+
# Generate associated views:
|
366
|
+
# livetext ??/recent.lt3 >VIEW/working/recent.html
|
367
|
+
# livetext VIEW/blog/generate.lt3 ??
|
329
368
|
|
330
369
|
def _copy_get_dirs(draft, view)
|
331
370
|
fname = File.basename(draft)
|
@@ -342,76 +381,29 @@ return meta.num
|
|
342
381
|
def generate_post(draft)
|
343
382
|
views = _get_views(draft)
|
344
383
|
views.each do |view|
|
345
|
-
noext, viewdir, slugdir, aslug, theme = _copy_get_dirs(draft, view)
|
384
|
+
noext, viewdir, slugdir, aslug, @theme = _copy_get_dirs(draft, view)
|
385
|
+
staging = viewdir + "/staging"
|
346
386
|
Dir.chdir(slugdir) do
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
387
|
+
copy(draft, ".")
|
388
|
+
lt3 = draft.split("/")[-1]
|
389
|
+
# Remember: Some posts may be in more than one view -- careful with links back
|
390
|
+
# system("livetext #{draft} >staging/#{name}/index.html") # permalink?
|
391
|
+
# Structure is borked?
|
392
|
+
copy!("#{@theme}/*", "#{staging}")
|
393
|
+
copy(lt3, staging)
|
394
|
+
html = noext[5..-1]
|
395
|
+
Dir.chdir(staging) do
|
396
|
+
livetext draft, html
|
397
|
+
# link to POST??
|
398
|
+
copy html, "../remote"
|
399
|
+
collect_recent_posts("recent.html")
|
400
|
+
copy("recent.html", "../remote")
|
401
|
+
livetext "blog-generate", "../remote/index"
|
358
402
|
end
|
359
|
-
|
360
|
-
# system("livetext blog-generate.lt3 >bgen.html")
|
361
|
-
# files.each {|fname| system("rm ./#{fname}") }
|
362
|
-
# system("rm -rf ./sidebar/")
|
363
403
|
end
|
364
|
-
# create framed pure slug (where?)
|
365
404
|
end
|
366
405
|
end
|
367
406
|
|
368
|
-
def old_generate_post(draft)
|
369
|
-
dir = File.dirname(draft)
|
370
|
-
fname = File.basename(draft)
|
371
|
-
# STDERR.puts "--- gp01 dir/fname = #{dir} #{fname}"
|
372
|
-
# FIXME dumb code
|
373
|
-
view_line = File.readlines(draft).grep(/^.views /)
|
374
|
-
raise "More than one .views call!" if view_line.size > 1
|
375
|
-
raise "No .views call!" if view_line.size < 1
|
376
|
-
view_line = view_line.first
|
377
|
-
|
378
|
-
views = view_line[7..-1].split
|
379
|
-
slug_dir = fname.sub(/.lt3$/, "")
|
380
|
-
views.each do |view|
|
381
|
-
vdir = "#@root/views/#{view}"
|
382
|
-
dir = "#{vdir}/posts/#{slug_dir}/"
|
383
|
-
Dir.mkdir(dir) unless Dir.exist?(dir)
|
384
|
-
system("cp #{draft} #{dir}")
|
385
|
-
Dir.chdir(dir) do
|
386
|
-
html = draft.sub(/.lt3$/, ".html")
|
387
|
-
STDERR.puts "--- gp05 into #{dir}: livetext #{draft} >#{html}"
|
388
|
-
system("livetext #{draft} >#{html}")
|
389
|
-
|
390
|
-
# copy from theme?
|
391
|
-
theme = vdir + "/themes/standard"
|
392
|
-
Dir.mkdir("sidebar") unless Dir.exist?("sidebar")
|
393
|
-
system("cp #{theme}/sidebar/*.lt3 ./sidebar/")
|
394
|
-
files = ["blog-generate.lt3", "blog-index.lt3", "global.lt3", "blog-head.lt3",
|
395
|
-
"meta.lt3", "navbar.lt3"]
|
396
|
-
files2 = files.map {|x| theme + "/" + x }
|
397
|
-
# STDERR.puts "---- gp06: In #{Dir.pwd}: files = #{files.inspect}"
|
398
|
-
files2.each do |f|
|
399
|
-
# STDERR.puts "---- gp07: cp #{f} ."
|
400
|
-
system("cp #{f} .")
|
401
|
-
end
|
402
|
-
# STDERR.puts "---- gp08: Files copied from theme"
|
403
|
-
|
404
|
-
system("livetext blog-generate.lt3 >bgen.html")
|
405
|
-
# STDERR.puts "---- gp09: Files went thru livetext"
|
406
|
-
# files.each {|fname| system("rm ./#{fname}") }
|
407
|
-
# system("rm -rf ./sidebar/")
|
408
|
-
end
|
409
|
-
# create framed pure slug (where?)
|
410
|
-
end
|
411
|
-
end
|
412
|
-
|
413
|
-
########
|
414
|
-
|
415
407
|
def relink
|
416
408
|
self.views.each {|view| generate_index(view) }
|
417
409
|
end
|
@@ -437,11 +429,10 @@ STDERR.puts "--- gp05 into #{dir}: livetext #{draft} >#{html}"
|
|
437
429
|
end
|
438
430
|
|
439
431
|
def rebuild_post(file)
|
432
|
+
raise "Doesn't currently work"
|
440
433
|
debug "Called rebuild_post(#{file.inspect})"
|
441
434
|
raise ArgumentError unless file.is_a?(String)
|
442
435
|
meta = process_post(file)
|
443
|
-
# p meta
|
444
|
-
# sleep 4
|
445
436
|
@views_dirty ||= []
|
446
437
|
@views_dirty << meta.views
|
447
438
|
@views_dirty.flatten!
|
@@ -494,8 +485,6 @@ STDERR.puts "--- gp05 into #{dir}: livetext #{draft} >#{html}"
|
|
494
485
|
end
|
495
486
|
|
496
487
|
def make_slug(meta)
|
497
|
-
# check_meta(meta, "makeslug")
|
498
|
-
# meta.num = 9999 # FIXME
|
499
488
|
raise ArgumentError unless meta.title.is_a?(String)
|
500
489
|
label = '%04d' % meta.num # FIXME can do better
|
501
490
|
slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
|
data/lib/runeblog_version.rb
CHANGED
data/lib/view.rb
CHANGED
@@ -25,7 +25,7 @@ class RuneBlog::View
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def local_index
|
28
|
-
dir + "/
|
28
|
+
dir + "/remote/index.html"
|
29
29
|
end
|
30
30
|
|
31
31
|
def index
|
@@ -39,7 +39,7 @@ class RuneBlog::View
|
|
39
39
|
def publishable_files
|
40
40
|
vdir = dir()
|
41
41
|
files = [local_index()]
|
42
|
-
others = Dir.entries(vdir + "/
|
42
|
+
others = Dir.entries(vdir + "/remote").grep(/^\d\d\d\d/).map {|x| "#{vdir}/remote/#{x}" }
|
43
43
|
abort "FIXME... publishable_files"
|
44
44
|
deep_assets = Dir["#{vdir}/themes/standard/assets/*"]
|
45
45
|
deep_assets.each do |file| # Do this at view creation
|
data/runeblog.gemspec
CHANGED
@@ -27,11 +27,7 @@ spec = Gem::Specification.new do |s|
|
|
27
27
|
main = Find.find("bin").to_a +
|
28
28
|
Find.find("lib").to_a
|
29
29
|
|
30
|
-
|
31
|
-
system("tar zcvf standard.tgz standard/ >/dev/null 2>&1")
|
32
|
-
end
|
33
|
-
|
34
|
-
std_theme = ["data/standard.tgz"]
|
30
|
+
std_theme = ["themes/standard.tgz"]
|
35
31
|
|
36
32
|
misc = %w[./README.lt3 ./README.md ./runeblog.gemspec]
|
37
33
|
test = Find.find("test").to_a
|
data/test/make_blog.rb
CHANGED
@@ -19,7 +19,8 @@ def debug(str)
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def make_post(x, title, teaser, body, views=[])
|
22
|
-
STDERR.puts "\n========= make_post '#{title}'"
|
22
|
+
# STDERR.puts "\n========= make_post '#{title}'"
|
23
|
+
print "."
|
23
24
|
meta = OpenStruct.new
|
24
25
|
num = x.create_new_post(title, true, teaser: teaser, body: body, other_views: views)
|
25
26
|
num
|
@@ -32,6 +33,10 @@ def show_lines(text)
|
|
32
33
|
str
|
33
34
|
end
|
34
35
|
|
36
|
+
|
37
|
+
|
38
|
+
puts
|
39
|
+
|
35
40
|
system("rm -rf .blogs")
|
36
41
|
RuneBlog.create_new_blog_repo('test_view', ".blogs/data")
|
37
42
|
x = RuneBlog.new
|
@@ -61,36 +66,36 @@ EXCERPT
|
|
61
66
|
Now, depending on what you consider "major," blah blah blah...
|
62
67
|
BODY
|
63
68
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
69
|
+
x.change_view("computing") # 3 5 6
|
70
|
+
|
71
|
+
make_post(x, "Elixir Conf coming up...", <<-EXCERPT, <<-BODY)
|
72
|
+
The next Elixir Conf is always coming up.
|
73
|
+
EXCERPT
|
74
|
+
I mean, unless the previous one was the last one ever, which I don't expect to
|
75
|
+
happen for a couple of decades.
|
76
|
+
BODY
|
77
|
+
|
78
|
+
x.change_view("music") # 4 10
|
79
|
+
|
80
|
+
make_post(x, "Does indie still matter?", <<-EXCERPT, <<-BODY)
|
81
|
+
Indie msic blah blah blah blah....
|
82
|
+
EXCERPT
|
83
|
+
And more about indie music.
|
84
|
+
BODY
|
85
|
+
|
86
|
+
x.change_view("computing")
|
87
|
+
|
88
|
+
make_post(x, "The genius of Scenic", <<-EXCERPT, <<-BODY)
|
89
|
+
Boyd Multerer is a genius.
|
90
|
+
EXCERPT
|
91
|
+
And so is Scenic.
|
92
|
+
BODY
|
93
|
+
|
94
|
+
make_post(x, "The future of coding", <<-EXCERPT, <<-BODY)
|
95
|
+
Someday you can forget your text editor entirely.
|
96
|
+
EXCERPT
|
97
|
+
But that day hasn't come yet.
|
98
|
+
BODY
|
94
99
|
|
95
100
|
x.change_view("around_austin")
|
96
101
|
|
@@ -124,3 +129,4 @@ BODY
|
|
124
129
|
|
125
130
|
x.change_view("around_austin")
|
126
131
|
|
132
|
+
puts
|
data/themes/standard.tgz
ADDED
Binary file
|
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.1.
|
4
|
+
version: 0.1.84
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: livetext
|
@@ -61,7 +61,6 @@ files:
|
|
61
61
|
- "./README.md"
|
62
62
|
- "./runeblog.gemspec"
|
63
63
|
- bin/blog
|
64
|
-
- data/standard.tgz
|
65
64
|
- lib/Javascript.stuff
|
66
65
|
- lib/default.rb
|
67
66
|
- lib/global.rb
|
@@ -78,6 +77,7 @@ files:
|
|
78
77
|
- test/general_test.rb
|
79
78
|
- test/make_blog.rb
|
80
79
|
- test/test
|
80
|
+
- themes/standard.tgz
|
81
81
|
homepage: https://github.com/Hal9000/runeblog
|
82
82
|
licenses:
|
83
83
|
- Ruby
|
data/data/standard.tgz
DELETED
Binary file
|