runeblog 0.1.79 → 0.1.84
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/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
|