runeblog 0.1.81 → 0.1.86
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 +31 -5
- data/lib/liveblog.rb +12 -4
- data/lib/post.rb +14 -0
- data/lib/runeblog.rb +129 -42
- data/lib/runeblog_version.rb +3 -2
- data/lib/view.rb +2 -2
- data/runeblog.gemspec +5 -11
- data/test/make_blog.rb +40 -34
- data/themes/standard/README +26 -0
- data/themes/standard/about.html +4 -0
- data/themes/standard/assets/blog.css +32 -0
- data/themes/standard/assets/favicon.ico +0 -0
- data/themes/standard/blog-_postentry.lt3 +19 -0
- data/themes/standard/blog-generate.lt3 +17 -0
- data/themes/standard/blog-head.lt3 +28 -0
- data/themes/standard/blog-index.lt3 +11 -0
- data/themes/standard/blog-meta.lt3 +3 -0
- data/themes/standard/blog-navbar.lt3 +6 -0
- data/themes/standard/global.lt3 +7 -0
- data/themes/standard/head.lt3 +28 -0
- data/themes/standard/meta.lt3 +3 -0
- data/themes/standard/navbar.lt3 +6 -0
- data/themes/standard/post-generate.lt3 +5 -0
- data/themes/standard/post-head.lt3 +4 -0
- data/themes/standard/post-index.lt3 +16 -0
- data/themes/standard/sidebar-ad.lt3 +5 -0
- data/themes/standard/sidebar-calendar.lt3 +6 -0
- data/themes/standard/sidebar-news.lt3 +7 -0
- data/themes/standard/sidebar-tag-cloud.lt3 +10 -0
- data/themes/standard/sidebar/ad.lt3 +5 -0
- data/themes/standard/sidebar/calendar.lt3 +6 -0
- data/themes/standard/sidebar/news.lt3 +7 -0
- data/themes/standard/sidebar/tag-cloud.lt3 +10 -0
- metadata +27 -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: ba9b860dd117682b59ecd6b7c6f1fcc10272b7a1e556ac98c3f3206dbfe3bed3
|
4
|
+
data.tar.gz: 7ddc0c9c23b85eeac21c63cd673340ccf2a17f79d2e8a668627f39fb67602cab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd69ba907ebcf89687c6e1549b72f47ce5173ca38c8e5eec6d795e82b7c4a123c9d8557efe953389a97d90b97d0906f0d03386651e8ba448cd4971fca351e488
|
7
|
+
data.tar.gz: 94c47ec9b446b857991776d1b147817310344f5f25daddeff1735b5439438425f8703ed9f9df6093463d2f2326cd90d63f47ac601f98fe9b11436d64a8523db2
|
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
|
@@ -51,6 +65,17 @@ module RuneBlog::Helpers
|
|
51
65
|
vals
|
52
66
|
end
|
53
67
|
|
68
|
+
def put_config(root:, view:"test_view", editor: "/bin/vim")
|
69
|
+
Dir.mkdir(root) unless Dir.exist?(root)
|
70
|
+
Dir.chdir(root) do
|
71
|
+
File.open("config", "w") do |cfg|
|
72
|
+
cfg.puts "root: #{root}"
|
73
|
+
cfg.puts "current_view: #{view}"
|
74
|
+
cfg.puts "editor: #{editor}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
54
79
|
def write_config(obj, file)
|
55
80
|
hash = obj.to_h
|
56
81
|
# Dir.chdir(::Home)
|
@@ -72,9 +97,10 @@ module RuneBlog::Helpers
|
|
72
97
|
# end
|
73
98
|
end
|
74
99
|
|
75
|
-
def new_dotfile(root: "
|
76
|
-
|
77
|
-
|
100
|
+
def new_dotfile(root: ".blogs", current_view: "test_view", editor: "vi")
|
101
|
+
# raise BlogAlreadyExists if Dir.exist?(".blogs")
|
102
|
+
# Dir.mkdir(".blogs")
|
103
|
+
root = Dir.pwd + "/" + root
|
78
104
|
x = OpenStruct.new
|
79
105
|
x.root, x.current_view, x.editor = root, current_view, editor
|
80
106
|
write_config(x, ".blogs/" + RuneBlog::ConfigFile)
|
@@ -114,9 +140,9 @@ module RuneBlog::Helpers
|
|
114
140
|
raise CantCreateDir(dir) unless result
|
115
141
|
end
|
116
142
|
|
117
|
-
def interpolate(str)
|
143
|
+
def interpolate(str, binding)
|
118
144
|
wrap = "<<-EOS\n#{str}\nEOS"
|
119
|
-
eval wrap
|
145
|
+
eval wrap, binding
|
120
146
|
end
|
121
147
|
|
122
148
|
def error(err) # Hmm, this is duplicated
|
data/lib/liveblog.rb
CHANGED
@@ -20,7 +20,11 @@ STDERR.reopen(errfile)
|
|
20
20
|
=end
|
21
21
|
|
22
22
|
def init_liveblog # FIXME - a lot of this logic sucks
|
23
|
-
|
23
|
+
here = Dir.pwd
|
24
|
+
dir = here
|
25
|
+
loop { dir = Dir.pwd; break if File.exist?("config"); Dir.chdir("..") }
|
26
|
+
Dir.chdir(here)
|
27
|
+
@blog = $_blog = RuneBlog.new(dir)
|
24
28
|
@root = @blog.root
|
25
29
|
@view = @blog.view
|
26
30
|
@view_name = @blog.view.name
|
@@ -32,6 +36,7 @@ end
|
|
32
36
|
def post
|
33
37
|
@meta = OpenStruct.new
|
34
38
|
@meta.num = _args[0]
|
39
|
+
_out " <!-- Post number #{@meta.num} -->\n "
|
35
40
|
end
|
36
41
|
|
37
42
|
def _view_from_cwd
|
@@ -235,6 +240,7 @@ def finalize
|
|
235
240
|
@slug = @blog.make_slug(@meta)
|
236
241
|
slug_dir = @slug
|
237
242
|
@postdir = @blog.view.dir + "/posts/#{slug_dir}"
|
243
|
+
STDERR.puts "--- finalize: pwd = #{Dir.pwd} postdir = #@postdir"
|
238
244
|
write_post
|
239
245
|
@meta
|
240
246
|
end
|
@@ -300,7 +306,7 @@ def head
|
|
300
306
|
"linkc" => %[<link rel="canonical" href="#{_var(:host)}">],
|
301
307
|
"og:url" => %[<meta property="og:url" content="#{_var(:host)}">],
|
302
308
|
"og:site_name" => %[<meta property="og:site_name" content="#{_var(:title)}">],
|
303
|
-
"style" => %[<link rel="stylesheet" href="blog
|
309
|
+
"style" => %[<link rel="stylesheet" href="assets/blog.css">],
|
304
310
|
"feed" => %[<link type="application/atom+xml" rel="alternate" href="#{_var(:host)}/feed.xml" title="#{_var(:title)}">],
|
305
311
|
"favicon" => %[<link rel="shortcut icon" type="image/x-icon" href="../assets/favicon.ico">\n <link rel="apple-touch-icon" href="../assets/favicon.ico">]
|
306
312
|
}
|
@@ -325,7 +331,7 @@ def head
|
|
325
331
|
end
|
326
332
|
end
|
327
333
|
hash = defaults.dup.update(result) # FIXME collisions?
|
328
|
-
_out "<html lang=en_US>"
|
334
|
+
# _out "<html lang=en_US>"
|
329
335
|
_out "<head>"
|
330
336
|
hash.each_value {|x| _out " " + x }
|
331
337
|
_out "</head>"
|
@@ -402,6 +408,7 @@ def script
|
|
402
408
|
_out %[<script src="#{url}" integrity="#{integ}" crossorigin="#{cross}"></script>]
|
403
409
|
end
|
404
410
|
|
411
|
+
|
405
412
|
### How this next bit works:
|
406
413
|
###
|
407
414
|
### all_teasers will call _find_recent_posts
|
@@ -439,7 +446,7 @@ def all_teasers
|
|
439
446
|
|
440
447
|
text = <<-HTML
|
441
448
|
<html>
|
442
|
-
<head><link rel="stylesheet" href="blog
|
449
|
+
<head><link rel="stylesheet" href="assets/blog.css"></head>
|
443
450
|
<body>
|
444
451
|
HTML
|
445
452
|
posts = _find_recent_posts
|
@@ -491,6 +498,7 @@ def _teaser(slug)
|
|
491
498
|
text
|
492
499
|
end
|
493
500
|
|
501
|
+
|
494
502
|
def card_iframe
|
495
503
|
title = _data
|
496
504
|
lines = _body
|
data/lib/post.rb
CHANGED
@@ -139,6 +139,7 @@ end
|
|
139
139
|
class RuneBlog::ViewPost
|
140
140
|
attr_reader :path, :nslug, :aslug, :title, :date,
|
141
141
|
:teaser_text
|
142
|
+
|
142
143
|
def initialize(view, postdir)
|
143
144
|
# Assumes already parsed/processed
|
144
145
|
@blog = RuneBlog.blog || raise(NoBlogAccessor)
|
@@ -153,5 +154,18 @@ class RuneBlog::ViewPost
|
|
153
154
|
@title = lines.grep(/title:/).first[7..-1].chomp
|
154
155
|
@date = lines.grep(/pubdate:/).first[9..-1].chomp
|
155
156
|
end
|
157
|
+
|
158
|
+
def get_dirs
|
159
|
+
fname = File.basename(draft)
|
160
|
+
noext = fname.sub(/.lt3$/, "")
|
161
|
+
vdir = "#@root/views/#{view}"
|
162
|
+
dir = "#{vdir}/posts/#{noext}/"
|
163
|
+
Dir.mkdir(dir) unless Dir.exist?(dir)
|
164
|
+
system("cp #{draft} #{dir}")
|
165
|
+
viewdir, slugdir, aslug = vdir, dir, noext[5..-1]
|
166
|
+
theme = viewdir + "/themes/standard"
|
167
|
+
[noext, viewdir, slugdir, aslug, theme]
|
168
|
+
end
|
169
|
+
|
156
170
|
end
|
157
171
|
|
data/lib/runeblog.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require '
|
1
|
+
require 'date'
|
2
|
+
# require 'livetext'
|
2
3
|
|
3
4
|
require 'runeblog_version'
|
4
5
|
require 'global'
|
@@ -14,7 +15,7 @@ class RuneBlog
|
|
14
15
|
|
15
16
|
DotDir = ".blogs"
|
16
17
|
ConfigFile = "config"
|
17
|
-
|
18
|
+
Themes = RuneBlog::Path + "/../themes"
|
18
19
|
|
19
20
|
make_exception(:FileNotFound, "File $1 was not found")
|
20
21
|
make_exception(:BlogRepoAlreadyExists, "Blog repo $1 already exists")
|
@@ -24,7 +25,7 @@ class RuneBlog
|
|
24
25
|
make_exception(:CantCreateDir, "Can't create directory $1")
|
25
26
|
make_exception(:EditorProblem, "Could not edit $1")
|
26
27
|
make_exception(:NoSuchView, "No such view: $1")
|
27
|
-
|
28
|
+
# make_exception(:LivetextError, "Livetext#process_file returned nil for $1")
|
28
29
|
make_exception(:NoBlogAccessor, "Runeblog.blog is not set")
|
29
30
|
|
30
31
|
|
@@ -40,40 +41,53 @@ class RuneBlog
|
|
40
41
|
|
41
42
|
include Helpers
|
42
43
|
|
43
|
-
def self.create_new_blog_repo(
|
44
|
+
def self.create_new_blog_repo(dir = ".blogs")
|
44
45
|
raise ArgumentError unless dir.is_a?(String) && ! dir.empty?
|
45
46
|
root_dir = Dir.pwd + "/" + dir
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
self.create(dir)
|
48
|
+
rescue => err
|
49
|
+
puts "Can't create blog repo: '#{dir}' - #{err}"
|
50
|
+
puts err.backtrace.join("\n")
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.create(root = ".blogs")
|
54
|
+
# Crude - FIXME later - # What views are there? Publishing, etc.
|
55
|
+
self.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
56
|
+
$_blog = self # Dumber still?
|
57
|
+
root = Dir.pwd + "/" + root
|
58
|
+
raise BlogRepoAlreadyExists if Dir.exist?(root)
|
59
|
+
create_dir(root)
|
60
|
+
Dir.chdir(root) do
|
50
61
|
create_dir("drafts")
|
51
62
|
create_dir("views")
|
52
63
|
#? create_dir("assets")
|
53
64
|
new_sequence
|
54
65
|
end
|
55
|
-
|
56
|
-
blog.
|
57
|
-
|
58
|
-
|
59
|
-
|
66
|
+
put_config(root: root)
|
67
|
+
@blog = self.new(root)
|
68
|
+
@blog.create_view("test_view")
|
69
|
+
@blog
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.open(root = ".blogs")
|
73
|
+
# Crude - FIXME later - # What views are there? Publishing, etc.
|
74
|
+
self.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
75
|
+
$_blog = self # Dumber still?
|
76
|
+
root = Dir.pwd + "/" + root
|
77
|
+
blog = self.new(root)
|
60
78
|
end
|
61
79
|
|
62
|
-
def initialize(
|
80
|
+
def initialize(root_dir = ".blogs") # always assumes existing blog
|
63
81
|
# Crude - FIXME later - # What views are there? Publishing, etc.
|
64
82
|
self.class.blog = self # Weird. Like a singleton - dumbass circular dependency?
|
65
83
|
$_blog = self # Dumber still?
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
dir = md[0]
|
70
|
-
end
|
71
|
-
file = dir.empty? ? ConfigFile : dir + "/" + ConfigFile
|
84
|
+
|
85
|
+
@root = root_dir
|
86
|
+
file = @root + "/" + ConfigFile
|
72
87
|
errmsg = "No config file! file = #{file.inspect} dir = #{Dir.pwd}"
|
73
88
|
raise errmsg unless File.exist?(file)
|
74
|
-
# Hmm. current_view doesn't belong?
|
75
|
-
@root, @view_name, @editor = read_config(file, :root, :current_view, :editor)
|
76
89
|
|
90
|
+
@root, @view_name, @editor = read_config(file, :root, :current_view, :editor)
|
77
91
|
md = Dir.pwd.match(%r[.*/views/(.*?)/])
|
78
92
|
@view_name = md[1] if md
|
79
93
|
@views = get_views
|
@@ -165,13 +179,19 @@ class RuneBlog
|
|
165
179
|
|
166
180
|
Dir.chdir(vdir)
|
167
181
|
x = RuneBlog::Default
|
168
|
-
|
182
|
+
# create_dir('themes')
|
183
|
+
copy!("#{Themes}", "themes")
|
169
184
|
create_dir('assets')
|
170
185
|
create_dir('posts')
|
171
186
|
|
172
|
-
|
173
|
-
|
174
|
-
|
187
|
+
create_dir('staging')
|
188
|
+
create_dir('staging/assets')
|
189
|
+
create_dir('remote')
|
190
|
+
create_dir('remote/assets')
|
191
|
+
|
192
|
+
copy!("themes/standard/*", "staging/")
|
193
|
+
copy("themes/standard/assets/*", "remote/assets/")
|
194
|
+
|
175
195
|
pub = "user: xxx\nserver: xxx\ndocroot: xxx\npath: xxx\nproto: xxx\n"
|
176
196
|
dump(pub, "publish")
|
177
197
|
|
@@ -210,6 +230,71 @@ class RuneBlog
|
|
210
230
|
result
|
211
231
|
end
|
212
232
|
|
233
|
+
def post_lookup(postid) # side-effect?
|
234
|
+
# .. = templates, ../.. = views/thisview
|
235
|
+
slug = title = date = teaser_text = nil
|
236
|
+
|
237
|
+
dir_posts = @vdir + "/posts"
|
238
|
+
posts = Dir.entries(dir_posts).grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
|
239
|
+
posts.select! {|x| File.directory?(x) }
|
240
|
+
|
241
|
+
post = posts.select {|x| File.basename(x).to_i == postid }
|
242
|
+
raise "Error: More than one post #{postid}" if post.size > 1
|
243
|
+
postdir = post.first
|
244
|
+
vp = RuneBlog::ViewPost.new(self.view, postdir)
|
245
|
+
vp
|
246
|
+
end
|
247
|
+
|
248
|
+
def teaser(slug)
|
249
|
+
id = slug.to_i
|
250
|
+
text = nil
|
251
|
+
post_entry_name = @theme + "/blog-_postentry.lt3"
|
252
|
+
@_post_entry ||= File.read(post_entry_name)
|
253
|
+
vp = post_lookup(id)
|
254
|
+
nslug, aslug, title, date, teaser_text =
|
255
|
+
vp.nslug, vp.aslug, vp.title, vp.date, vp.teaser_text
|
256
|
+
path = vp.path
|
257
|
+
# url = "#{path}/#{aslug}.html" # Should be relative to .blogs!! FIXME
|
258
|
+
url = "#{aslug}.html" # Should be relative to .blogs!! FIXME
|
259
|
+
date = ::Date.parse(date)
|
260
|
+
date = date.strftime("%B %e<br>%Y")
|
261
|
+
text = interpolate(@_post_entry, binding)
|
262
|
+
text
|
263
|
+
end
|
264
|
+
|
265
|
+
def collect_recent_posts(file)
|
266
|
+
@vdir = ".."
|
267
|
+
posts = nil
|
268
|
+
dir_posts = @vdir + "/posts"
|
269
|
+
entries = Dir.entries(dir_posts)
|
270
|
+
posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
|
271
|
+
posts.select! {|x| File.directory?(x) }
|
272
|
+
# directories that start with four digits
|
273
|
+
posts = posts.sort {|a, b| b.to_i <=> a.to_i } # sort descending
|
274
|
+
posts = posts[0..19] # return 20 at most
|
275
|
+
text = <<-HTML
|
276
|
+
<html>
|
277
|
+
<head><link rel="stylesheet" href="assets/blog.css"></head>
|
278
|
+
<body>
|
279
|
+
HTML
|
280
|
+
# posts = _find_recent_posts
|
281
|
+
wanted = [5, posts.size].min # estimate how many we want?
|
282
|
+
enum = posts.each
|
283
|
+
wanted.times do
|
284
|
+
postid = File.basename(enum.next)
|
285
|
+
postid = postid.to_i
|
286
|
+
text << teaser(postid) # side effect! calls _out
|
287
|
+
end
|
288
|
+
text << "</body></html>"
|
289
|
+
File.write(file, text) # FIXME ???
|
290
|
+
iframe_text = <<-HTML
|
291
|
+
<iframe style="width: 100vw;height: 100vh;position: relative;"
|
292
|
+
src='recent.html' width=100% frameborder="0" allowfullscreen>
|
293
|
+
</iframe>
|
294
|
+
HTML
|
295
|
+
# _out iframe_text # FIXME ??
|
296
|
+
end
|
297
|
+
|
213
298
|
def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
|
214
299
|
save = Dir.pwd
|
215
300
|
Dir.chdir(self.view.dir)
|
@@ -276,6 +361,7 @@ class RuneBlog
|
|
276
361
|
raise "No .views call!" if view_line.size < 1
|
277
362
|
view_line = view_line.first
|
278
363
|
views = view_line[7..-1].split
|
364
|
+
views
|
279
365
|
end
|
280
366
|
|
281
367
|
# Remember: A post in multiple views will trigger multiple
|
@@ -309,25 +395,26 @@ class RuneBlog
|
|
309
395
|
def generate_post(draft)
|
310
396
|
views = _get_views(draft)
|
311
397
|
views.each do |view|
|
312
|
-
noext, viewdir, slugdir, aslug, theme = _copy_get_dirs(draft, view)
|
398
|
+
noext, viewdir, slugdir, aslug, @theme = _copy_get_dirs(draft, view)
|
399
|
+
staging = viewdir + "/staging"
|
313
400
|
Dir.chdir(slugdir) do
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
401
|
+
copy(draft, ".")
|
402
|
+
lt3 = draft.split("/")[-1]
|
403
|
+
# Remember: Some posts may be in more than one view -- careful with links back
|
404
|
+
# system("livetext #{draft} >staging/#{name}/index.html") # permalink?
|
405
|
+
# Structure is borked?
|
406
|
+
copy!("#{@theme}/*", "#{staging}")
|
407
|
+
copy(lt3, staging)
|
408
|
+
html = noext[5..-1]
|
409
|
+
Dir.chdir(staging) do
|
410
|
+
livetext draft, html
|
411
|
+
# link to POST??
|
412
|
+
copy html, "../remote"
|
413
|
+
collect_recent_posts("recent.html")
|
414
|
+
copy("recent.html", "../remote")
|
415
|
+
livetext "blog-generate", "../remote/index"
|
324
416
|
end
|
325
|
-
|
326
|
-
# system("livetext blog-generate.lt3 >bgen.html")
|
327
|
-
# files.each {|fname| system("rm ./#{fname}") }
|
328
|
-
# system("rm -rf ./sidebar/")
|
329
417
|
end
|
330
|
-
# create framed pure slug (where?)
|
331
418
|
end
|
332
419
|
end
|
333
420
|
|
data/lib/runeblog_version.rb
CHANGED
@@ -2,9 +2,10 @@
|
|
2
2
|
if ! (Object.constants.include?(:RuneBlog) && RuneBlog.constants.include?(:Path))
|
3
3
|
|
4
4
|
class RuneBlog
|
5
|
-
VERSION = "0.1.
|
5
|
+
VERSION = "0.1.86"
|
6
6
|
|
7
|
-
|
7
|
+
path = Gem.find_files("runeblog").grep(/runeblog-/).first
|
8
|
+
Path = File.dirname(path)
|
8
9
|
end
|
9
10
|
|
10
11
|
end
|
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
@@ -24,19 +24,13 @@ spec = Gem::Specification.new do |s|
|
|
24
24
|
s.add_runtime_dependency 'rubytext', '~> 0.1', '>= 0.1.16'
|
25
25
|
|
26
26
|
# Files...
|
27
|
-
main = Find.find("bin").to_a
|
28
|
-
Find.find("lib").to_a
|
29
|
-
|
30
|
-
Dir.chdir("data") do
|
31
|
-
system("tar zcvf standard.tgz standard/ >/dev/null 2>&1")
|
32
|
-
end
|
33
|
-
|
34
|
-
std_theme = ["data/standard.tgz"]
|
35
|
-
|
36
|
-
misc = %w[./README.lt3 ./README.md ./runeblog.gemspec]
|
27
|
+
main = Find.find("bin").to_a +
|
28
|
+
Find.find("lib").to_a +
|
29
|
+
Find.find("themes").to_a
|
37
30
|
test = Find.find("test").to_a
|
31
|
+
misc = %w[./README.lt3 ./README.md ./runeblog.gemspec]
|
38
32
|
|
39
|
-
s.files = main +
|
33
|
+
s.files = main + misc + test
|
40
34
|
s.homepage = 'https://github.com/Hal9000/runeblog'
|
41
35
|
s.license = "Ruby"
|
42
36
|
end
|
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,15 +33,19 @@ def show_lines(text)
|
|
32
33
|
str
|
33
34
|
end
|
34
35
|
|
36
|
+
|
37
|
+
|
38
|
+
puts
|
39
|
+
|
35
40
|
system("rm -rf .blogs")
|
36
|
-
RuneBlog.create_new_blog_repo(
|
37
|
-
x = RuneBlog.new
|
41
|
+
RuneBlog.create_new_blog_repo(".blogs")
|
42
|
+
x = RuneBlog.new(".blogs")
|
38
43
|
|
39
44
|
x.create_view("around_austin") # FIXME remember view title!
|
40
45
|
|
41
46
|
# Hack:
|
42
47
|
if File.exist?("publish")
|
43
|
-
system("cp publish .blogs/
|
48
|
+
system("cp publish .blogs/views/around_austin/publish")
|
44
49
|
end
|
45
50
|
|
46
51
|
x.create_view("computing")
|
@@ -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
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
templates The first "default theme" - more later
|
3
|
+
├── README This file
|
4
|
+
├── about.html An "about" file (will move)
|
5
|
+
├── assets Assets for entire view (blog)
|
6
|
+
│ ├── application.css "Global" CSS
|
7
|
+
│ ├── favicon.ico Favicon
|
8
|
+
│ └── ... Other files later, images, etc.
|
9
|
+
├── blog ** The whole template for this view (blog)
|
10
|
+
│ ├── _postentry.lt3 Used repeatedly in list of blog posts
|
11
|
+
│ ├── generate.lt3 The "main wrapper" that actually generates everything
|
12
|
+
│ ├── index.lt3 The main "user editable" portion of the template
|
13
|
+
│ ├── navbar.lt3 The navigation bar
|
14
|
+
│ └── sidebar The sidebar (which may include different things)
|
15
|
+
│ ├── ad.lt3 Code to generate an advertisement
|
16
|
+
│ ├── calendar.lt3 Code for a calendar
|
17
|
+
│ ├── news.lt3 Recent news
|
18
|
+
│ └── tag-cloud.lt3 Tag cloud (generated automatically of course)
|
19
|
+
├── global.lt3 Some global settings
|
20
|
+
├── head.lt3 A standard <head> section
|
21
|
+
├── meta.lt3 Standard meta tags
|
22
|
+
└── post
|
23
|
+
├── head.lt3 Specific to post (adds to higher-level head)
|
24
|
+
├── generate.lt3 The "main wrapper" that actually generates the post
|
25
|
+
└── index.lt3 The main "user editable" portion of the post template
|
26
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
.post-title a {
|
2
|
+
color: #010101;
|
3
|
+
font-size: 28px;
|
4
|
+
float: right;
|
5
|
+
display: inline-block;
|
6
|
+
text-align: top;
|
7
|
+
text-decoration: none;
|
8
|
+
}
|
9
|
+
|
10
|
+
.post-title a:hover {
|
11
|
+
text-decoration: none;
|
12
|
+
}
|
13
|
+
|
14
|
+
.post-title-text a {
|
15
|
+
color: #0101a1;
|
16
|
+
font-size: 22px;
|
17
|
+
# float: right;
|
18
|
+
display: block;
|
19
|
+
text-decoration: none;
|
20
|
+
}
|
21
|
+
|
22
|
+
.post-title-text a:hover {
|
23
|
+
text-decoration: none;
|
24
|
+
}
|
25
|
+
|
26
|
+
.post-date {
|
27
|
+
color: #9a9a9a;
|
28
|
+
font-size: 15px;
|
29
|
+
display: block;
|
30
|
+
float: left;
|
31
|
+
text-align: top;
|
32
|
+
}
|
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<div class="post">
|
2
|
+
<table width=100%>
|
3
|
+
<tr>
|
4
|
+
<td width=8% valign=top>
|
5
|
+
<span class="post-date mt-1 mb-1">
|
6
|
+
<b>#{date}</b>
|
7
|
+
</span>
|
8
|
+
</td>
|
9
|
+
<td> <!-- <span class="post-title-box"> -->
|
10
|
+
<span class="post-title-text"><a href="#{url}">#{title}</a></span>
|
11
|
+
<p><b>#{teaser_text}</b>
|
12
|
+
<br>
|
13
|
+
<a style="text-decoration: none" href="#{url}"><small>Keep reading...</small></a></p> <!-- </span> -->
|
14
|
+
</td>
|
15
|
+
</tr>
|
16
|
+
</table>
|
17
|
+
<br>
|
18
|
+
<br>
|
19
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
.mixin liveblog
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<!-- Editing this file is not recommended. -->
|
5
|
+
<!-- It was generated from $File on $$date. -->
|
6
|
+
|
7
|
+
.include global.lt3
|
8
|
+
.include blog-head.lt3
|
9
|
+
<body>
|
10
|
+
$.include navbar.lt3
|
11
|
+
<div class="content container-fluid mt-4">
|
12
|
+
<div class="row">
|
13
|
+
$.include blog-index.lt3
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</body>
|
17
|
+
</html>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<head> <!-- fix this later -->
|
2
|
+
|
3
|
+
.include meta.lt3
|
4
|
+
|
5
|
+
.stylesheet
|
6
|
+
https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css
|
7
|
+
sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T
|
8
|
+
.end
|
9
|
+
|
10
|
+
.script
|
11
|
+
https://code.jquery.com/jquery-3.3.1.slim.min.js
|
12
|
+
sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo
|
13
|
+
.end
|
14
|
+
|
15
|
+
.script
|
16
|
+
https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js
|
17
|
+
sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1
|
18
|
+
.end
|
19
|
+
|
20
|
+
.script
|
21
|
+
https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js
|
22
|
+
sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM
|
23
|
+
.end
|
24
|
+
|
25
|
+
</head>
|
26
|
+
|
27
|
+
.head # fix/remove later
|
28
|
+
.end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<head> <!-- fix this later -->
|
2
|
+
|
3
|
+
.include meta.lt3
|
4
|
+
|
5
|
+
.stylesheet
|
6
|
+
https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css
|
7
|
+
sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T
|
8
|
+
.end
|
9
|
+
|
10
|
+
.script
|
11
|
+
https://code.jquery.com/jquery-3.3.1.slim.min.js
|
12
|
+
sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo
|
13
|
+
.end
|
14
|
+
|
15
|
+
.script
|
16
|
+
https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js
|
17
|
+
sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1
|
18
|
+
.end
|
19
|
+
|
20
|
+
.script
|
21
|
+
https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js
|
22
|
+
sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM
|
23
|
+
.end
|
24
|
+
|
25
|
+
</head>
|
26
|
+
|
27
|
+
.head # fix/remove later
|
28
|
+
.end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
.mixin liveblog
|
2
|
+
. ^ get rid of this later
|
3
|
+
|
4
|
+
.post 0
|
5
|
+
|
6
|
+
.title The new amphitheatre is overrated
|
7
|
+
.pubdate 2019-07-09
|
8
|
+
.views around_austin
|
9
|
+
.tags
|
10
|
+
|
11
|
+
.teaser
|
12
|
+
It used to be that all major concerts played the Erwin Center.
|
13
|
+
|
14
|
+
.end
|
15
|
+
Now, depending on what you consider "major," blah blah blah...
|
16
|
+
|
@@ -0,0 +1,7 @@
|
|
1
|
+
.card2 Recent News
|
2
|
+
https://nest.com/whats-happening/,_blank,Google Is Turning Off the Works-with-Nest API
|
3
|
+
https://developers.googleblog.com/2019/05/Flutter-io19.html,_blank,Flutter: a Portable UI Framework for Mobile, Web, Embedded, and Desktop
|
4
|
+
https://github.com/kkuchta/css-only-chat,_blank,Css-only-chat: A truly monstrous async web chat using no JS on the front end
|
5
|
+
https://jaycarlson.net/microcontrollers/,_blank,The Amazing $1 Microcontroller (2017)
|
6
|
+
.end
|
7
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
.tag_cloud
|
2
|
+
https://google.com/,_blank,btn btn-dark m-1,Programming
|
3
|
+
https://google.com/,_blank,btn btn-danger m-1,Science Fiction
|
4
|
+
https://google.com/,_blank,btn btn-light m-1,Art
|
5
|
+
https://google.com/,_blank,btn btn-dark m-1,Robotics
|
6
|
+
https://google.com/,_blank,btn btn-warning m-1,Food and Travel
|
7
|
+
https://google.com/,_blank,btn btn-light m-1,DIY Hacks
|
8
|
+
https://google.com/,_blank,btn btn-info m-1,Surfing
|
9
|
+
.end
|
10
|
+
|
@@ -0,0 +1,7 @@
|
|
1
|
+
.card2 Recent News
|
2
|
+
https://nest.com/whats-happening/,_blank,Google Is Turning Off the Works-with-Nest API
|
3
|
+
https://developers.googleblog.com/2019/05/Flutter-io19.html,_blank,Flutter: a Portable UI Framework for Mobile, Web, Embedded, and Desktop
|
4
|
+
https://github.com/kkuchta/css-only-chat,_blank,Css-only-chat: A truly monstrous async web chat using no JS on the front end
|
5
|
+
https://jaycarlson.net/microcontrollers/,_blank,The Amazing $1 Microcontroller (2017)
|
6
|
+
.end
|
7
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
.tag_cloud
|
2
|
+
https://google.com/,_blank,btn btn-dark m-1,Programming
|
3
|
+
https://google.com/,_blank,btn btn-danger m-1,Science Fiction
|
4
|
+
https://google.com/,_blank,btn btn-light m-1,Art
|
5
|
+
https://google.com/,_blank,btn btn-dark m-1,Robotics
|
6
|
+
https://google.com/,_blank,btn btn-warning m-1,Food and Travel
|
7
|
+
https://google.com/,_blank,btn btn-light m-1,DIY Hacks
|
8
|
+
https://google.com/,_blank,btn btn-info m-1,Surfing
|
9
|
+
.end
|
10
|
+
|
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.86
|
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-10 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,31 @@ files:
|
|
78
77
|
- test/general_test.rb
|
79
78
|
- test/make_blog.rb
|
80
79
|
- test/test
|
80
|
+
- themes/standard/README
|
81
|
+
- themes/standard/about.html
|
82
|
+
- themes/standard/assets/blog.css
|
83
|
+
- themes/standard/assets/favicon.ico
|
84
|
+
- themes/standard/blog-_postentry.lt3
|
85
|
+
- themes/standard/blog-generate.lt3
|
86
|
+
- themes/standard/blog-head.lt3
|
87
|
+
- themes/standard/blog-index.lt3
|
88
|
+
- themes/standard/blog-meta.lt3
|
89
|
+
- themes/standard/blog-navbar.lt3
|
90
|
+
- themes/standard/global.lt3
|
91
|
+
- themes/standard/head.lt3
|
92
|
+
- themes/standard/meta.lt3
|
93
|
+
- themes/standard/navbar.lt3
|
94
|
+
- themes/standard/post-generate.lt3
|
95
|
+
- themes/standard/post-head.lt3
|
96
|
+
- themes/standard/post-index.lt3
|
97
|
+
- themes/standard/sidebar-ad.lt3
|
98
|
+
- themes/standard/sidebar-calendar.lt3
|
99
|
+
- themes/standard/sidebar-news.lt3
|
100
|
+
- themes/standard/sidebar-tag-cloud.lt3
|
101
|
+
- themes/standard/sidebar/ad.lt3
|
102
|
+
- themes/standard/sidebar/calendar.lt3
|
103
|
+
- themes/standard/sidebar/news.lt3
|
104
|
+
- themes/standard/sidebar/tag-cloud.lt3
|
81
105
|
homepage: https://github.com/Hal9000/runeblog
|
82
106
|
licenses:
|
83
107
|
- Ruby
|
data/data/standard.tgz
DELETED
Binary file
|