runeblog 0.2.90 → 0.2.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/blog +10 -7
- data/{lib → empty_view/config}/exper/2svg.lt3 +0 -0
- data/{lib → empty_view/config}/exper/gen_svg.rb +0 -0
- data/empty_view/config/exper/meta.html +10 -0
- data/{lib → empty_view/config}/exper/s2.html +0 -0
- data/{lib → empty_view/config}/exper/varmint.rb +0 -0
- data/empty_view/config/facebook/facebook.rb +37 -0
- data/empty_view/config/facebook/fb.html +10 -0
- data/empty_view/config/facebook/fb.js +13 -0
- data/empty_view/config/reddit/config.txt +6 -0
- data/empty_view/config/reddit/notes.txt +4 -0
- data/empty_view/config/reddit/reddit_post_url.py +34 -0
- data/empty_view/config/reddit/redpost.rb +43 -0
- data/empty_view/config/reddit/the-graffiti-wall.html +91 -0
- data/empty_view/config/twitter/tw.html +12 -0
- data/empty_view/config/twitter/tw.js +5 -0
- data/{lib/exper/fbtw.rb → empty_view/config/twitter/twitter.rb} +1 -23
- data/empty_view/themes/standard/{blog → banner}/banner.lt3 +0 -0
- data/empty_view/themes/standard/banner/{about.lt3 → navbar/about.lt3} +0 -0
- data/empty_view/themes/standard/banner/{contact.lt3 → navbar/contact.lt3} +0 -0
- data/empty_view/themes/standard/banner/navbar/faq.lt3 +1 -0
- data/empty_view/themes/standard/banner/{list.data → navbar/list.data} +0 -0
- data/empty_view/themes/standard/blog/generate.lt3 +1 -1
- data/empty_view/themes/standard/global.lt3 +1 -1
- data/empty_view/themes/standard/post/generate.lt3 +1 -1
- data/empty_view/themes/standard/post/index.lt3 +8 -8
- data/empty_view/themes/standard/widgets/links/links.rb +1 -1
- data/empty_view/themes/standard/widgets/news/news.rb +1 -1
- data/empty_view/themes/standard/widgets/pages/pages.rb +2 -2
- data/empty_view/themes/standard/widgets/pinned/pinned.rb +1 -1
- data/lib/helpers-blog.rb +30 -63
- data/lib/helpers-repl.rb +3 -13
- data/lib/liveblog.rb +56 -42
- data/lib/lowlevel.rb +73 -0
- data/lib/publish.rb +6 -22
- data/lib/repl.rb +25 -16
- data/lib/runeblog.rb +46 -15
- data/lib/runeblog_version.rb +1 -17
- metadata +24 -16
- data/empty_view/remote/banner/austin-pano.jpg +0 -0
- data/empty_view/themes/standard/banner/faq.lt3 +0 -1
- data/lib/default.rb +0 -31
- data/lib/exper/callout.js +0 -10
- data/lib/exper/fbtw-js +0 -48
@@ -4,12 +4,12 @@
|
|
4
4
|
|
5
5
|
class ::RuneBlog::Widget
|
6
6
|
class Pages
|
7
|
-
Type, Title = "pages", "Pages"
|
7
|
+
Type, Title = "pages", "My Pages"
|
8
8
|
|
9
9
|
def initialize(repo)
|
10
10
|
@blog = repo
|
11
11
|
@datafile = "list.data"
|
12
|
-
@lines =
|
12
|
+
@lines = _get_data(@datafile)
|
13
13
|
@data = @lines.map {|x| x.chomp.split(/, */, 2) }
|
14
14
|
end
|
15
15
|
|
data/lib/helpers-blog.rb
CHANGED
@@ -3,20 +3,15 @@ require 'fileutils'
|
|
3
3
|
|
4
4
|
require 'processing'
|
5
5
|
|
6
|
-
|
6
|
+
require 'lowlevel'
|
7
7
|
|
8
|
-
|
9
|
-
log!(enter: __method__, args: [src, dst], level: 2)
|
10
|
-
cmd = "cp #{src} #{dst} 2>/dev/null"
|
11
|
-
rc = system!(cmd)
|
12
|
-
puts " Failed: #{cmd} - from #{caller[0]}" unless rc
|
13
|
-
end
|
8
|
+
module RuneBlog::Helpers
|
14
9
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
10
|
+
def quit_RubyText
|
11
|
+
return unless defined? RubyText
|
12
|
+
sleep 6
|
13
|
+
RubyText.stop
|
14
|
+
exit
|
20
15
|
end
|
21
16
|
|
22
17
|
def get_repo_config
|
@@ -31,11 +26,16 @@ module RuneBlog::Helpers
|
|
31
26
|
end
|
32
27
|
|
33
28
|
def copy_data(tag, dest)
|
34
|
-
data
|
29
|
+
data = RuneBlog::Path + "/../data" # files kept inside gem
|
30
|
+
extra = RuneBlog::Path + "/../config" # files kept inside gem
|
31
|
+
# FIXME names are confusing
|
35
32
|
case tag
|
36
|
-
when :config
|
33
|
+
when :config
|
34
|
+
files = %w[ROOT VIEW EDITOR universal.lt3 global.lt3]
|
35
|
+
files.each {|file| copy(data + "/" + file, dest) }
|
36
|
+
when :extra
|
37
|
+
copy!(extra, dest)
|
37
38
|
end
|
38
|
-
files.each {|file| copy(data + "/" + file, dest) }
|
39
39
|
end
|
40
40
|
|
41
41
|
def read_vars(file)
|
@@ -54,8 +54,7 @@ module RuneBlog::Helpers
|
|
54
54
|
puts "Can't read vars file '#{file}': #{err}"
|
55
55
|
puts err.backtrace.join("\n")
|
56
56
|
puts "dir = #{Dir.pwd}"
|
57
|
-
|
58
|
-
exit
|
57
|
+
stop_RubyText
|
59
58
|
end
|
60
59
|
|
61
60
|
def read_config(file, *syms)
|
@@ -81,8 +80,7 @@ module RuneBlog::Helpers
|
|
81
80
|
puts "Can't read config file '#{file}': #{err}"
|
82
81
|
puts err.backtrace.join("\n")
|
83
82
|
puts "dir = #{Dir.pwd}"
|
84
|
-
|
85
|
-
exit
|
83
|
+
stop_RubyText
|
86
84
|
end
|
87
85
|
|
88
86
|
def try_read_config(file, hash)
|
@@ -100,32 +98,33 @@ module RuneBlog::Helpers
|
|
100
98
|
end
|
101
99
|
end
|
102
100
|
|
103
|
-
def
|
101
|
+
def retrieve_views # read from filesystem
|
104
102
|
log!(enter: __method__, level: 3)
|
105
103
|
dirs = subdirs("#@root/views/").sort
|
106
104
|
dirs.map {|name| RuneBlog::View.new(name) }
|
107
105
|
end
|
108
106
|
|
109
|
-
def write_repo_config(root: "#{Dir.pwd}/.blogs", view:
|
107
|
+
def write_repo_config(root: "#{Dir.pwd}/.blogs", view: nil, editor: "/usr/local/bin/vim")
|
108
|
+
view ||= File.read("#{root}/data/VIEW").chomp rescue "[no view]"
|
110
109
|
File.write(root + "/data/ROOT", root + "\n")
|
111
110
|
File.write(root + "/data/VIEW", view.to_s + "\n")
|
112
111
|
File.write(root + "/data/EDITOR", editor + "\n")
|
113
112
|
end
|
114
113
|
|
115
|
-
def new_dotfile(root: ".blogs", current_view: "test_view", editor: "vi")
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
114
|
+
# def new_dotfile(root: ".blogs", current_view: "test_view", editor: "vi")
|
115
|
+
# log!(enter: __method__, args: [root, current_view, editor], level: 3)
|
116
|
+
# root = Dir.pwd + "/" + root
|
117
|
+
# x = OpenStruct.new
|
118
|
+
# x.root, x.current_view, x.editor = root, current_view, editor
|
119
|
+
# write_config(x, root + "/" + RuneBlog::ConfigFile)
|
120
|
+
# write_repo_config
|
121
|
+
# end
|
123
122
|
|
124
123
|
def new_sequence
|
125
124
|
log!(enter: __method__, level: 3)
|
126
|
-
dump(0, "sequence")
|
125
|
+
dump(0, "data/sequence")
|
127
126
|
version_info = "#{RuneBlog::VERSION}\nBlog created: #{Time.now.to_s}"
|
128
|
-
dump(version_info, "VERSION")
|
127
|
+
dump(version_info, "data/VERSION")
|
129
128
|
end
|
130
129
|
|
131
130
|
def subdirs(dir)
|
@@ -147,38 +146,6 @@ module RuneBlog::Helpers
|
|
147
146
|
files
|
148
147
|
end
|
149
148
|
|
150
|
-
def create_dirs(*dirs)
|
151
|
-
log!(enter: __method__, args: [*dirs], level: 3)
|
152
|
-
dirs.each do |dir|
|
153
|
-
dir = dir.to_s # symbols allowed
|
154
|
-
next if Dir.exist?(dir)
|
155
|
-
cmd = "mkdir -p #{dir} >/dev/null"
|
156
|
-
result = system!(cmd)
|
157
|
-
raise CantCreateDir(dir) unless result
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def interpolate(str, bind)
|
162
|
-
log!(enter: __method__, args: [str, bind], level: 3)
|
163
|
-
wrap = "<<-EOS\n#{str}\nEOS"
|
164
|
-
eval wrap, bind
|
165
|
-
end
|
166
|
-
|
167
|
-
def error(err) # Hmm, this is duplicated
|
168
|
-
log!(str: "duplicated method", enter: __method__, args: [err], level: 2)
|
169
|
-
str = "\n Error: #{err}"
|
170
|
-
puts str
|
171
|
-
puts err.backtrace.join("\n")
|
172
|
-
end
|
173
|
-
|
174
|
-
def dump(obj, name)
|
175
|
-
log!(enter: __method__, args: [obj, name], level: 3)
|
176
|
-
File.write(name, obj)
|
177
|
-
end
|
178
149
|
end
|
179
150
|
|
180
|
-
def dump(obj, name) # FIXME scope
|
181
|
-
log!(str: "scope problem", enter: __method__, args: [obj, name], level: 3)
|
182
|
-
File.write(name, obj)
|
183
|
-
end
|
184
151
|
|
data/lib/helpers-repl.rb
CHANGED
@@ -109,26 +109,16 @@ module RuneBlog::REPL
|
|
109
109
|
end
|
110
110
|
meth = found || :cmd_INVALID
|
111
111
|
params = cmd if meth == :cmd_INVALID
|
112
|
-
# puts "choose: #{[meth, params].inspect}"
|
113
112
|
[meth, params]
|
114
113
|
end
|
115
114
|
|
116
|
-
def error(err) # Hmm, this is duplicated
|
117
|
-
str = "\n Error: #{err}"
|
118
|
-
puts str
|
119
|
-
puts err.backtrace.join("\n")
|
120
|
-
end
|
121
|
-
|
122
115
|
def ask(prompt, meth = :to_s)
|
123
116
|
print prompt
|
124
|
-
|
125
|
-
str.chomp!
|
126
|
-
str.send(meth)
|
117
|
+
gets.chomp.send(meth)
|
127
118
|
end
|
128
119
|
|
129
|
-
def
|
130
|
-
|
131
|
-
gets.chomp.upcase[0] == "Y"
|
120
|
+
def ask!(prompt, meth = :to_s)
|
121
|
+
ask(fx(prompt, :bold), meth)
|
132
122
|
end
|
133
123
|
|
134
124
|
def reset_output(initial = "")
|
data/lib/liveblog.rb
CHANGED
@@ -7,6 +7,9 @@ require 'runeblog'
|
|
7
7
|
require 'pathmagic'
|
8
8
|
require 'processing'
|
9
9
|
|
10
|
+
# top = Livetext::Path + "/../plugin/liveblog/"
|
11
|
+
# eval(File.read("#{top}/testing.rb"))
|
12
|
+
|
10
13
|
|
11
14
|
def init_liveblog # FIXME - a lot of this logic sucks
|
12
15
|
dir = Dir.pwd.sub(/\.blogs.*/, "")
|
@@ -42,23 +45,59 @@ def post
|
|
42
45
|
_out " <!-- Post number #{@meta.num} -->\n "
|
43
46
|
end
|
44
47
|
|
48
|
+
def _got_python?
|
49
|
+
# Dumb - fix later - check up front as needed
|
50
|
+
# Should also check for praw lib
|
51
|
+
str = `which python3`
|
52
|
+
str.length > 0
|
53
|
+
end
|
54
|
+
|
55
|
+
def _reddit_post_url(vdir, title, url)
|
56
|
+
_got_python?
|
57
|
+
tmpfile = "/tmp/reddit-post-url.txt"
|
58
|
+
File.open(tmpfile, "w") do |tmp|
|
59
|
+
tmp.puts "[Post] " + title
|
60
|
+
tmp.puts url
|
61
|
+
end
|
62
|
+
rid = nil
|
63
|
+
Dir.chdir(vdir/:config) { rid = `python3 reddit/reddit_post_url.py` }
|
64
|
+
system("rm #{tmpfile}")
|
65
|
+
rid # returns reddit id
|
66
|
+
end
|
67
|
+
|
45
68
|
def post_trailer
|
46
69
|
perma = _var("publish.proto") + "://" + _var("publish.server") +
|
47
|
-
"/" + _var("publish.path") + "/
|
70
|
+
"/" + _var("publish.path") + "/" + _var("post.aslug") +
|
48
71
|
".html"
|
49
72
|
tags = _var("post.tags")
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
73
|
+
taglist = tags.empty? ? "" : "Tags: #{tags}"
|
74
|
+
|
75
|
+
reddit_enabled = false # FIXME
|
76
|
+
reddit_txt = ""
|
77
|
+
if reddit_enabled
|
78
|
+
vdir = @blog.root/:views/@blog.view
|
79
|
+
nslug = "#{_var("post.num")}-#{_var("post.aslug")}"
|
80
|
+
rid_file = vdir/:posts/nslug/"reddit.id"
|
81
|
+
rid = File.exist?(rid_file) ? File.read(rid_file).chomp : nil
|
82
|
+
if rid.nil?
|
83
|
+
title = _var("title")
|
84
|
+
rid = _reddit_post_url(vdir, title, perma)
|
85
|
+
dump(rid, rid_file)
|
86
|
+
end
|
87
|
+
reddit_txt = <<~HTML
|
88
|
+
<hr>
|
89
|
+
<script src='https://redditjs.com/post.js'
|
90
|
+
data-url="#{rid}" data-width=800 ></script>
|
91
|
+
HTML
|
92
|
+
# damned syntax highlighting </>
|
54
93
|
end
|
55
94
|
_out <<~HTML
|
56
95
|
<table width=100%><tr>
|
57
96
|
<td width=10%><a style="text-decoration: none" href="javascript:history.go(-1)">[Back]</a></td>
|
58
97
|
<td width=10%><a style="text-decoration: none" href="#{perma}"> [permalink] </a></td>
|
59
98
|
<td width=80% align=right><font size=-3>#{taglist}</font></td></tr></table>
|
99
|
+
#{reddit_txt}
|
60
100
|
HTML
|
61
|
-
# damned syntax highlighting
|
62
101
|
end
|
63
102
|
|
64
103
|
def faq
|
@@ -85,9 +124,10 @@ def code
|
|
85
124
|
end
|
86
125
|
|
87
126
|
def _read_navbar_data
|
88
|
-
|
127
|
+
vdir = @blog.root/:views/@blog.view
|
128
|
+
dir = vdir/"themes/standard/banner/navbar/"
|
89
129
|
datafile = dir/"list.data"
|
90
|
-
|
130
|
+
_get_data(datafile)
|
91
131
|
end
|
92
132
|
|
93
133
|
def banner
|
@@ -97,6 +137,7 @@ def banner
|
|
97
137
|
high = 250
|
98
138
|
str2 = ""
|
99
139
|
navbar = nil
|
140
|
+
vdir = @blog.root/:views/@blog.view
|
100
141
|
lines = _body.to_a
|
101
142
|
|
102
143
|
lines.each do |line|
|
@@ -130,15 +171,9 @@ def banner
|
|
130
171
|
end
|
131
172
|
str2 << "<td>" + File.read(file) + "</td>" + "\n"
|
132
173
|
when "navbar"
|
133
|
-
|
134
|
-
_make_navbar # horiz is default
|
135
|
-
file = "banner/navbar.html"
|
136
|
-
navbar = File.read(file)
|
174
|
+
navbar = _make_navbar # horiz is default
|
137
175
|
when "vnavbar"
|
138
|
-
|
139
|
-
_make_navbar(:vert)
|
140
|
-
file = "banner/vnavbar.html"
|
141
|
-
navbar = File.read(file)
|
176
|
+
navbar = _make_navbar(:vert)
|
142
177
|
when "break"
|
143
178
|
str2 << " </tr>\n <tr>" + "\n"
|
144
179
|
else
|
@@ -347,7 +382,7 @@ def pin
|
|
347
382
|
pinned.each do |pinview|
|
348
383
|
dir = @blog.root/:views/pinview/"themes/standard/widgets/pinned/"
|
349
384
|
datafile = dir/"list.data"
|
350
|
-
pins =
|
385
|
+
pins = _get_data?(datafile)
|
351
386
|
pins << "#{@meta.num} #{@meta.title}\n"
|
352
387
|
pins.uniq!
|
353
388
|
File.open(datafile, "w") {|out| pins.each {|pin| out.puts pin } }
|
@@ -502,22 +537,6 @@ rescue => err
|
|
502
537
|
exit
|
503
538
|
end
|
504
539
|
|
505
|
-
# def pinned_rebuild
|
506
|
-
# view = @blog.view
|
507
|
-
# view = _args[0] unless _args.empty?
|
508
|
-
# Dir.chdir(@blog.root/:views/view/"themes/standard/") do
|
509
|
-
# wtag = "widgets/pinned"
|
510
|
-
# code = _load_local("pinned")
|
511
|
-
# if code
|
512
|
-
# Dir.chdir(wtag) do
|
513
|
-
# widget = code.new(@blog)
|
514
|
-
# widget.build
|
515
|
-
# end
|
516
|
-
# # _include_file wtag/"pinned-card.html"
|
517
|
-
# end
|
518
|
-
# end
|
519
|
-
# end
|
520
|
-
|
521
540
|
def _handle_standard_widget(tag)
|
522
541
|
wtag = :widgets/tag
|
523
542
|
code = _load_local(tag)
|
@@ -688,20 +707,20 @@ def _make_navbar(orient = :horiz)
|
|
688
707
|
</td></tr></table>
|
689
708
|
HTML
|
690
709
|
|
691
|
-
html_file = @blog.root/:views/@blog.view/"themes/standard/banner"/name
|
710
|
+
html_file = @blog.root/:views/@blog.view/"themes/standard/banner/navbar"/name
|
692
711
|
output = File.new(html_file, "w")
|
693
712
|
output.puts start
|
694
713
|
lines = _read_navbar_data
|
695
714
|
lines = ["index Home"] + lines unless _args.include?("nohome")
|
696
715
|
lines.each do |line|
|
697
716
|
basename, cdata = line.chomp.strip.split(" ", 2)
|
698
|
-
full = :banner/basename+".html"
|
717
|
+
full = :banner/:navbar/basename+".html"
|
699
718
|
href_main = _main(full)
|
700
719
|
if basename == "index" # special case
|
701
720
|
output.puts %[#{li1} <a class="nav-link" href="index.html">#{cdata}<span class="sr-only">(current)</span></a> #{li2}]
|
702
721
|
else
|
703
|
-
dir = @blog.root/:views/@blog.view/"themes/standard/banner"
|
704
|
-
dest = vdir/"remote/banner"/basename+".html"
|
722
|
+
dir = @blog.root/:views/@blog.view/"themes/standard/banner/navbar"
|
723
|
+
dest = vdir/"remote/banner/navbar"/basename+".html"
|
705
724
|
preprocess cwd: dir, src: basename, dst: dest, call: ".nopara" # , debug: true
|
706
725
|
output.puts %[#{li1} <a class="nav-link" #{href_main}>#{cdata}</a> #{li2}]
|
707
726
|
end
|
@@ -770,11 +789,6 @@ def _post_lookup(postid) # side-effect
|
|
770
789
|
vp
|
771
790
|
end
|
772
791
|
|
773
|
-
def _interpolate(str, context) # FIXME move this later
|
774
|
-
wrapped = "%[" + str.dup + "]" # could fail...
|
775
|
-
eval(wrapped, context)
|
776
|
-
end
|
777
|
-
|
778
792
|
def _card_generic(card_title:, middle:, extra: "")
|
779
793
|
front = <<-HTML
|
780
794
|
<div class="card #{extra} mb-3">
|
data/lib/lowlevel.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
def dump(obj, name)
|
3
|
+
File.write(name, obj)
|
4
|
+
end
|
5
|
+
|
6
|
+
def system!(str, show: false)
|
7
|
+
log!(enter: __method__, args: [str], level: 2)
|
8
|
+
STDERR.puts str if show
|
9
|
+
rc = system(str)
|
10
|
+
return rc if rc
|
11
|
+
STDERR.puts "FAILED: #{str.inspect}"
|
12
|
+
STDERR.puts "\ncaller = \n#{caller.join("\n ")}\n"
|
13
|
+
if defined?(RubyText)
|
14
|
+
sleep 6
|
15
|
+
RubyText.stop
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
return rc
|
19
|
+
end
|
20
|
+
|
21
|
+
def _get_data?(file) # File need not exist
|
22
|
+
if File.exist?(file)
|
23
|
+
_get_data(file)
|
24
|
+
else
|
25
|
+
[]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def _get_data(file)
|
30
|
+
lines = File.readlines(file)
|
31
|
+
lines.reject! {|line| line[0] == "-" } # allow rejection of lines
|
32
|
+
lines = lines.map do |line|
|
33
|
+
line.sub(/ *# .*$/, "") # allow trailing comments
|
34
|
+
end
|
35
|
+
lines
|
36
|
+
end
|
37
|
+
|
38
|
+
def copy(src, dst)
|
39
|
+
log!(enter: __method__, args: [src, dst], level: 2)
|
40
|
+
cmd = "cp #{src} #{dst} 2>/dev/null"
|
41
|
+
system!(cmd)
|
42
|
+
end
|
43
|
+
|
44
|
+
def copy!(src, dst)
|
45
|
+
log!(enter: __method__, args: [src, dst], level: 2)
|
46
|
+
cmd = "cp -r #{src} #{dst} 2>/dev/null"
|
47
|
+
system!(cmd)
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_dirs(*dirs)
|
51
|
+
log!(enter: __method__, args: [*dirs], level: 3)
|
52
|
+
dirs.each do |dir|
|
53
|
+
dir = dir.to_s # symbols allowed
|
54
|
+
next if Dir.exist?(dir)
|
55
|
+
cmd = "mkdir -p #{dir} >/dev/null"
|
56
|
+
result = system!(cmd)
|
57
|
+
raise CantCreateDir(dir) unless result
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def interpolate(str, bind)
|
62
|
+
log!(enter: __method__, args: [str, bind], level: 3)
|
63
|
+
wrap = "<<-EOS\n#{str}\nEOS"
|
64
|
+
eval wrap, bind
|
65
|
+
end
|
66
|
+
|
67
|
+
def error(err)
|
68
|
+
log!(str: err, enter: __method__, args: [err], level: 2)
|
69
|
+
str = "\n Error: #{err}"
|
70
|
+
puts str
|
71
|
+
puts err.backtrace.join("\n")
|
72
|
+
end
|
73
|
+
|