runeblog 0.3.27 → 0.3.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/blog +7 -3
- data/bin/blog.rb +237 -0
- data/data/global.lt3 +1 -1
- data/lib/helpers-blog.rb +0 -7
- data/lib/liveblog.rb +92 -91
- data/lib/lowlevel.rb +7 -6
- data/lib/menus.rb +1 -1
- data/lib/processing.rb +6 -3
- data/lib/repl.rb +22 -26
- data/lib/runeblog.rb +55 -43
- data/lib/runeblog_version.rb +1 -1
- data/runeblog.gemspec +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f73831245e7f26410b588d25eb8eaf411f199c3b138c07cbbdc1cd6ab17a0c9a
|
4
|
+
data.tar.gz: 985cc0eb1bef7e7f7d782e7f2f15f06c110351acc828de6e188f256f88800808
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a3ff11e051b4b35d3016f3494e8f296373cc9463255fcc2803cd30a1429772dcf4e35e2de8c80218b6ba96eb7da4b2884ba9cf478eadb940b4cc16c3bd7b464
|
7
|
+
data.tar.gz: 46adb7c62bedf13f9ccc4a4dcd1526764b0a6d6f3d6638c1e06bad3a49d0957e0858f5d979ca8fb61ca0f08183e8e76d82a07b4a9ec547474ee36e1fa538e1bf
|
data/bin/blog
CHANGED
@@ -87,7 +87,7 @@ def get_started
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def mainloop
|
90
|
-
info = @blog.view
|
90
|
+
info = @blog.view.name rescue "No view"
|
91
91
|
print fx("[#{info}] ", Red, :bold)
|
92
92
|
cmd = STDSCR.gets(history: @cmdhist, tab: @tabcom, capture: [" "])
|
93
93
|
case cmd
|
@@ -107,6 +107,8 @@ def mainloop
|
|
107
107
|
puts "Don't understand '#{cmd.inspect}'\n "
|
108
108
|
end
|
109
109
|
rescue => err
|
110
|
+
# puts "----- ML_RESCUE err = #{err.inspect} VIEW = #{@blog.view.inspect}"
|
111
|
+
puts "----- ML_RESCUE err = #{err.inspect} "
|
110
112
|
log!(str: err.to_s)
|
111
113
|
log!(str: err.backtrace.join("\n")) if err.respond_to?(:backtrace)
|
112
114
|
puts "Current dir = #{Dir.pwd}"
|
@@ -148,7 +150,7 @@ end
|
|
148
150
|
|
149
151
|
def handle_cmdline
|
150
152
|
cmd = ARGV[0]
|
151
|
-
@blog = RuneBlog.new
|
153
|
+
@blog = RuneBlog.read # was .new
|
152
154
|
abort "No blog found" if @blog.nil?
|
153
155
|
|
154
156
|
case cmd
|
@@ -193,15 +195,17 @@ def create_new_repo?
|
|
193
195
|
if ! RuneBlog.exist?
|
194
196
|
exit unless yesno("No blog repo found. Create new one?")
|
195
197
|
RuneBlog.create_new_blog_repo
|
198
|
+
puts "Sleeping..."; sleep 15
|
196
199
|
puts fx(" Blog repo successfully created.", :bold)
|
197
200
|
new_repo = true
|
198
201
|
end
|
199
202
|
|
200
|
-
@blog = RuneBlog.new
|
203
|
+
@blog = RuneBlog.read # was .new
|
201
204
|
get_started if new_repo
|
202
205
|
rescue => err
|
203
206
|
STDERR.puts "Error - #{err.to_s}"
|
204
207
|
STDERR.puts err.backtrace if err.respond_to?(:backtrace)
|
208
|
+
puts "Sleeping..."; sleep 10
|
205
209
|
end
|
206
210
|
|
207
211
|
def print_intro
|
data/bin/blog.rb
ADDED
@@ -0,0 +1,237 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# $LOAD_PATH << "./lib"
|
4
|
+
|
5
|
+
require 'runeblog'
|
6
|
+
require 'rubytext'
|
7
|
+
|
8
|
+
require 'menus'
|
9
|
+
|
10
|
+
require 'repl'
|
11
|
+
|
12
|
+
include RuneBlog::REPL
|
13
|
+
|
14
|
+
def yesno(question, noskip=false)
|
15
|
+
puts fx("\n #{question}", :bold)
|
16
|
+
puts unless noskip
|
17
|
+
STDSCR.yesno
|
18
|
+
end
|
19
|
+
|
20
|
+
def pick_editor
|
21
|
+
choices = %w[vim emacs vi nano]
|
22
|
+
r, c = STDSCR.rc
|
23
|
+
num, name = STDSCR.menu(r: r, c: c+6, title: "Default editor", items: choices)
|
24
|
+
file = `which #{name}`.chomp
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_universal
|
28
|
+
univ = "#{@blog.root}/data/universal.lt3"
|
29
|
+
if yesno("Faster initial setup? (no: edit universal.lt3)")
|
30
|
+
# author = ask!(" Author name: ")
|
31
|
+
# site = ask!(" Site/domain: ")
|
32
|
+
# Temporarily, for speed:
|
33
|
+
author, site = "Hal Fulton", "somedomain.com"
|
34
|
+
puts " Author name: #{author}"
|
35
|
+
puts " Site/domain: #{site}"
|
36
|
+
# Now stash it...
|
37
|
+
str = File.read(univ)
|
38
|
+
str = str.gsub(/AUTHOR/, author)
|
39
|
+
str = str.gsub(/SITE_DOMAIN/, site)
|
40
|
+
File.write(univ, str)
|
41
|
+
else
|
42
|
+
vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(AUTHOR.*\|SITE.*\)"'
|
43
|
+
edit_file(univ, vim: vim_params)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_global
|
48
|
+
view_name = ask!(" Filename: ")
|
49
|
+
@blog.create_view(view_name) # call change_view??
|
50
|
+
if yesno("Faster view setup? (no: edit global.lt3)")
|
51
|
+
title = ask!(" View title: ")
|
52
|
+
subtitle = ask!(" Subtitle : ")
|
53
|
+
domain = ask!(" Domain : ")
|
54
|
+
modify_view_global(view_name)
|
55
|
+
modify_view_settings(name: view_name, title: title, subtitle: subtitle,
|
56
|
+
domain: domain)
|
57
|
+
else
|
58
|
+
vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(VIEW_.*\|SITE.*\)"'
|
59
|
+
edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_started
|
64
|
+
if yesno("Do you want to qo a quick setup?")
|
65
|
+
puts " First choose your editor."
|
66
|
+
@blog.editor = pick_editor
|
67
|
+
File.write("#{@blog.root}/data/EDITOR", @blog.editor)
|
68
|
+
print " Default editor is "
|
69
|
+
puts fx(@blog.editor, :bold)
|
70
|
+
|
71
|
+
get_universal
|
72
|
+
# Now create a custom global.lt3
|
73
|
+
@blog._generate_global
|
74
|
+
puts fx("\n Quick setup complete!", :bold)
|
75
|
+
if yesno("Create your first view now?")
|
76
|
+
get_global
|
77
|
+
puts fx("\n View #{@blog.view} created!\n ", :bold)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
print fx(" For help", :bold); puts " type h or help."
|
82
|
+
print fx(" Create a view", :bold); puts " with: new view"
|
83
|
+
print fx(" Create a post", :bold); puts " (within current view): new post"
|
84
|
+
end
|
85
|
+
|
86
|
+
def mainloop
|
87
|
+
info = @blog.view || "no view"
|
88
|
+
print fx("[#{info}] ", Red, :bold)
|
89
|
+
cmd = STDSCR.gets(history: @cmdhist, tab: @tabcom, capture: [" "]).chomp
|
90
|
+
case cmd
|
91
|
+
when " ", RubyText::Keys::Escape
|
92
|
+
Dir.chdir(@blog.view.dir)
|
93
|
+
show_top_menu
|
94
|
+
puts
|
95
|
+
return
|
96
|
+
when RubyText::Keys::CtlD # ^D
|
97
|
+
cmd_quit
|
98
|
+
when String
|
99
|
+
return if cmd.empty? # CR does nothing
|
100
|
+
invoking = RuneBlog::REPL.choose_method(cmd)
|
101
|
+
ret = send(*invoking)
|
102
|
+
else
|
103
|
+
puts "Don't understand '#{cmd.inspect}'\n "
|
104
|
+
end
|
105
|
+
rescue => err
|
106
|
+
log!(str: err.to_s)
|
107
|
+
log!(str: err.backtrace.join("\n")) if err.respond_to?(:backtrace)
|
108
|
+
puts "Current dir = #{Dir.pwd}"
|
109
|
+
puts err
|
110
|
+
puts err.backtrace.join("\n")
|
111
|
+
puts "Pausing..."; gets
|
112
|
+
end
|
113
|
+
|
114
|
+
def cmdline_preview
|
115
|
+
_need_view
|
116
|
+
local = @blog.view.local_index
|
117
|
+
result = system("open #{local}")
|
118
|
+
end
|
119
|
+
|
120
|
+
def cmdline_publish
|
121
|
+
abort "Not implemented yet"
|
122
|
+
_need_view
|
123
|
+
end
|
124
|
+
|
125
|
+
def cmdline_browse
|
126
|
+
abort "Not implemented yet"
|
127
|
+
_need_view
|
128
|
+
end
|
129
|
+
|
130
|
+
def _need_view
|
131
|
+
@view = ARGV[1]
|
132
|
+
abort "Need 'view' parameter" if @view.nil?
|
133
|
+
abort "No such view '#{view}'" unless @blog.view?(@view)
|
134
|
+
end
|
135
|
+
|
136
|
+
def cmdline_rebuild
|
137
|
+
_need_view
|
138
|
+
print "Generating view... "
|
139
|
+
@blog.generate_view(@view)
|
140
|
+
print "Generating index... "
|
141
|
+
num = @blog.generate_index(@view)
|
142
|
+
puts "#{num} posts\n "
|
143
|
+
end
|
144
|
+
|
145
|
+
def handle_cmdline
|
146
|
+
cmd = ARGV[0]
|
147
|
+
@blog = RuneBlog.new
|
148
|
+
abort "No blog found" if @blog.nil?
|
149
|
+
|
150
|
+
case cmd
|
151
|
+
when "rebuild"; cmdline_rebuild
|
152
|
+
when "publish"; cmdline_publish
|
153
|
+
when "preview"; cmdline_preview
|
154
|
+
when "browse"; cmdline_browse
|
155
|
+
else
|
156
|
+
puts "Command '#{cmd}' is unknown"
|
157
|
+
end
|
158
|
+
exit
|
159
|
+
end
|
160
|
+
|
161
|
+
def check_ruby_version
|
162
|
+
major, minor = RUBY_VERSION.split(".").values_at(0,1)
|
163
|
+
ver = major.to_i*10 + minor.to_i
|
164
|
+
unless ver >= 24
|
165
|
+
RubyText.stop
|
166
|
+
sleep 0.2
|
167
|
+
puts "Needs Ruby 2.4 or greater"
|
168
|
+
exit
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def reopen_stderr
|
173
|
+
errfile = File.new("stderr.out", "w")
|
174
|
+
STDERR.reopen(errfile)
|
175
|
+
end
|
176
|
+
|
177
|
+
def set_fgbg
|
178
|
+
# read a .rubytext file here?? Call it something else?
|
179
|
+
home = ENV['HOME']
|
180
|
+
@fg, @bg = Blue, White ## FIXME!! try_read_config("#{home}/.rubytext", fg: Blue, bg: White)
|
181
|
+
@fg = @fg.downcase.to_sym
|
182
|
+
@bg = @bg.downcase.to_sym
|
183
|
+
|
184
|
+
RubyText.start(:_echo, :keypad, scroll: true, log: "binblog.txt", fg: @fg, bg: @bg)
|
185
|
+
end
|
186
|
+
|
187
|
+
def create_new_repo?
|
188
|
+
new_repo = false
|
189
|
+
if ! RuneBlog.exist?
|
190
|
+
exit unless yesno("No blog repo found. Create new one?")
|
191
|
+
RuneBlog.create_new_blog_repo
|
192
|
+
puts fx(" Blog repo successfully created.", :bold)
|
193
|
+
new_repo = true
|
194
|
+
end
|
195
|
+
|
196
|
+
@blog = RuneBlog.new
|
197
|
+
get_started if new_repo
|
198
|
+
rescue => err
|
199
|
+
STDERR.puts "Error - #{err.to_s}"
|
200
|
+
STDERR.puts err.backtrace if err.respond_to?(:backtrace)
|
201
|
+
end
|
202
|
+
|
203
|
+
def print_intro
|
204
|
+
print fx(" For help", :bold)
|
205
|
+
puts " type h or help.\n "
|
206
|
+
|
207
|
+
puts fx("\n RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red)
|
208
|
+
end
|
209
|
+
|
210
|
+
def cmd_history_etc
|
211
|
+
@cmdhist = []
|
212
|
+
@tabcom = RuneBlog::REPL::Patterns.keys.uniq - RuneBlog::REPL::Abbr.keys
|
213
|
+
@tabcom.map! {|x| x.sub(/ [\$\>].*/, "") + " " }
|
214
|
+
@tabcom.sort!
|
215
|
+
end
|
216
|
+
|
217
|
+
def exit_repl
|
218
|
+
# RubyText.stop
|
219
|
+
sleep 0.2
|
220
|
+
puts
|
221
|
+
end
|
222
|
+
|
223
|
+
### Main
|
224
|
+
|
225
|
+
include RuneBlog::Helpers # for try_read_config
|
226
|
+
|
227
|
+
reopen_stderr
|
228
|
+
check_ruby_version
|
229
|
+
|
230
|
+
handle_cmdline unless ARGV.empty?
|
231
|
+
set_fgbg
|
232
|
+
print_intro
|
233
|
+
create_new_repo?
|
234
|
+
|
235
|
+
cmd_history_etc
|
236
|
+
loop { mainloop }
|
237
|
+
exit_repl
|
data/data/global.lt3
CHANGED
data/lib/helpers-blog.rb
CHANGED
@@ -24,7 +24,6 @@ module RuneBlog::Helpers
|
|
24
24
|
dir = root/:views/view/:settings
|
25
25
|
end
|
26
26
|
file = dir/"features.txt"
|
27
|
-
# puts "-- in #{Dir.pwd} trying to read #{file}"
|
28
27
|
pairs = read_pairs(file)
|
29
28
|
enabled = {}
|
30
29
|
pairs.each {|k,v| enabled[k] = (v == "1") }
|
@@ -108,12 +107,6 @@ module RuneBlog::Helpers
|
|
108
107
|
stop_RubyText rescue nil
|
109
108
|
end
|
110
109
|
|
111
|
-
def retrieve_views # read from filesystem
|
112
|
-
log!(enter: __method__, level: 3)
|
113
|
-
dirs = subdirs("#@root/views/").sort
|
114
|
-
dirs.map {|name| RuneBlog::View.new(name) }
|
115
|
-
end
|
116
|
-
|
117
110
|
def write_repo_config(root: "#{Dir.pwd}/.blogs", view: nil, editor: "/usr/local/bin/vim")
|
118
111
|
view ||= File.read("#{root}/data/VIEW").chomp rescue "[no view]"
|
119
112
|
File.write(root + "/data/ROOT", root + "\n")
|
data/lib/liveblog.rb
CHANGED
@@ -49,20 +49,20 @@ end
|
|
49
49
|
def dropcap
|
50
50
|
log!(enter: __method__)
|
51
51
|
# Bad form: adds another HEAD
|
52
|
-
text =
|
53
|
-
|
52
|
+
text = api.data
|
53
|
+
api.out " "
|
54
54
|
letter = text[0]
|
55
55
|
remain = text[1..-1]
|
56
|
-
|
57
|
-
|
56
|
+
api.out %[<div class='mydrop'>#{letter}</div>]
|
57
|
+
api.out %[<div style="padding-top: 1px">#{remain}]
|
58
58
|
end
|
59
59
|
|
60
60
|
def post
|
61
61
|
log!(enter: __method__)
|
62
62
|
@meta = OpenStruct.new
|
63
|
-
@meta.num =
|
63
|
+
@meta.num = api.args[0]
|
64
64
|
setvar("post.num", @meta.num.to_i)
|
65
|
-
|
65
|
+
api.out " <!-- Post number #{@meta.num} -->\n "
|
66
66
|
end
|
67
67
|
|
68
68
|
def _got_python?
|
@@ -91,7 +91,7 @@ def post_toolbar
|
|
91
91
|
log!(enter: __method__)
|
92
92
|
back_icon = %[<img src="assets/back-icon.png" width=24 height=24 alt="Go back"></img>]
|
93
93
|
back = %[<a style="text-decoration: none" href="javascript:history.go(-1)">#{back_icon}</a>]
|
94
|
-
|
94
|
+
api.out <<~HTML
|
95
95
|
<div align='right'>#{back} #@reddit_comments</div>
|
96
96
|
HTML
|
97
97
|
end
|
@@ -138,7 +138,7 @@ log! str: " -- dir = #{dir}"
|
|
138
138
|
# damned syntax highlighting </>
|
139
139
|
end
|
140
140
|
# STDERR.print "Pausing... "; getch
|
141
|
-
|
141
|
+
api.out <<~HTML
|
142
142
|
#{reddit_txt}
|
143
143
|
<hr>
|
144
144
|
<table width=100%><tr>
|
@@ -151,27 +151,27 @@ end
|
|
151
151
|
def faq
|
152
152
|
log!(enter: __method__)
|
153
153
|
@faq_count ||= 0
|
154
|
-
|
154
|
+
api.out "<br>" if @faq_count == 0
|
155
155
|
@faq_count += 1
|
156
|
-
ques =
|
157
|
-
ans =
|
156
|
+
ques = api.data.chomp
|
157
|
+
ans = api.body.join("\n")
|
158
158
|
id = "faq#@faq_count"
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
159
|
+
api.out %[ <a data-toggle="collapse" href="##{id}" role="button" aria-expanded="false" aria-controls="collapseExample"><font size=+3>⌄</font></a>]
|
160
|
+
api.out %[ <b>#{ques}</b>]
|
161
|
+
api.out %[<div class="collapse" id="#{id}"><br><font size=+1> #{ans}</font></div>\n]
|
162
|
+
api.out "<br>" # unless @faq_count == 1
|
163
|
+
api.optional_blank_line
|
164
164
|
end
|
165
165
|
|
166
166
|
def backlink
|
167
167
|
log!(enter: __method__)
|
168
|
-
|
168
|
+
api.out %[<br><a href="javascript:history.go(-1)">[Back]</a>]
|
169
169
|
end
|
170
170
|
|
171
171
|
def code
|
172
172
|
log!(enter: __method__)
|
173
|
-
lines =
|
174
|
-
|
173
|
+
lines = api.body # _text
|
174
|
+
api.out "<font size=+1><pre>\n#{lines}\n</pre></font>"
|
175
175
|
end
|
176
176
|
|
177
177
|
def _read_navbar_data
|
@@ -191,7 +191,7 @@ def banner
|
|
191
191
|
str2 = ""
|
192
192
|
navbar = nil
|
193
193
|
vdir = @blog.root/:views/@blog.view
|
194
|
-
lines =
|
194
|
+
lines = api.body.to_a
|
195
195
|
|
196
196
|
lines.each do |line|
|
197
197
|
count += 1
|
@@ -234,14 +234,14 @@ def banner
|
|
234
234
|
str2 << " '#{tag}' isn't known" + "\n"
|
235
235
|
end
|
236
236
|
end
|
237
|
-
|
237
|
+
api.out <<~HTML
|
238
238
|
<table width=100% bgcolor=#{bg}>
|
239
239
|
<tr>
|
240
240
|
#{str2}
|
241
241
|
</tr>
|
242
242
|
</table>
|
243
243
|
HTML
|
244
|
-
|
244
|
+
api.out navbar if navbar
|
245
245
|
rescue => err
|
246
246
|
STDERR.puts "err = #{err}"
|
247
247
|
STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
|
@@ -306,7 +306,7 @@ end
|
|
306
306
|
def quote
|
307
307
|
log!(enter: __method__)
|
308
308
|
_passthru "<blockquote>"
|
309
|
-
_passthru
|
309
|
+
_passthru api.body.join(" ")
|
310
310
|
_passthru "</blockquote>"
|
311
311
|
_optional_blank_line
|
312
312
|
end
|
@@ -317,7 +317,7 @@ end
|
|
317
317
|
|
318
318
|
def style
|
319
319
|
log!(enter: __method__)
|
320
|
-
fname =
|
320
|
+
fname = api.args[0]
|
321
321
|
_passthru %[<link rel="stylesheet" href="???/etc/#{fname}')">]
|
322
322
|
end
|
323
323
|
|
@@ -333,43 +333,43 @@ def h6; _passthru "<h6>#{@_data}</h6>"; end
|
|
333
333
|
def hr; _passthru "<hr>"; end
|
334
334
|
|
335
335
|
def nlist
|
336
|
-
log!(enter:
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
336
|
+
log!(enter: api._method__)
|
337
|
+
api.out "<ol>"
|
338
|
+
api.body {|line| api.out "<li>#{line}</li>" }
|
339
|
+
api.out "</ol>"
|
340
|
+
api.optional_blank_line
|
341
341
|
end
|
342
342
|
|
343
343
|
def list
|
344
344
|
log!(enter: __method__)
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
345
|
+
api.out "<ul>"
|
346
|
+
api.body {|line| api.out "<li>#{line}</li>" }
|
347
|
+
api.out "</ul>"
|
348
|
+
api.optional_blank_line
|
349
349
|
end
|
350
350
|
|
351
351
|
def list!
|
352
352
|
log!(enter: __method__)
|
353
|
-
|
354
|
-
lines =
|
353
|
+
api.out "<ul>"
|
354
|
+
lines = api.body.each
|
355
355
|
loop do
|
356
356
|
line = lines.next
|
357
|
-
line =
|
357
|
+
line = api.format(line)
|
358
358
|
if line[0] == " "
|
359
|
-
|
359
|
+
api.out line
|
360
360
|
else
|
361
|
-
|
361
|
+
api.out "<li>#{line}</li>"
|
362
362
|
end
|
363
363
|
end
|
364
|
-
|
365
|
-
|
364
|
+
api.out "</ul>"
|
365
|
+
api.optional_blank_line
|
366
366
|
end
|
367
367
|
|
368
368
|
### inset
|
369
369
|
|
370
370
|
def inset
|
371
371
|
log!(enter: __method__)
|
372
|
-
lines =
|
372
|
+
lines = api.body
|
373
373
|
box = ""
|
374
374
|
output = []
|
375
375
|
lines.each do |line|
|
@@ -387,16 +387,16 @@ def inset
|
|
387
387
|
output << line
|
388
388
|
end
|
389
389
|
end
|
390
|
-
lr =
|
391
|
-
wide =
|
390
|
+
lr = api.args.first
|
391
|
+
wide = api.args[1] || "25"
|
392
392
|
stuff = "<div style='float:#{lr}; width: #{wide}%; padding:8px; padding-right:12px'>"
|
393
393
|
stuff << '<b><i>' + box + '</i></b></div>'
|
394
|
-
|
394
|
+
api.out "</p>" # kludge!! nopara
|
395
395
|
0.upto(2) {|i| _passthru output[i] }
|
396
396
|
_passthru stuff
|
397
397
|
3.upto(output.length-1) {|i| _passthru output[i] }
|
398
|
-
|
399
|
-
|
398
|
+
api.out "<p>" # kludge!! para
|
399
|
+
api.optional_blank_line
|
400
400
|
end
|
401
401
|
|
402
402
|
def title
|
@@ -406,42 +406,42 @@ def title
|
|
406
406
|
@meta.title = title
|
407
407
|
setvar :title, title
|
408
408
|
# FIXME refactor -- just output variables for a template
|
409
|
-
|
409
|
+
api.optional_blank_line
|
410
410
|
end
|
411
411
|
|
412
412
|
def pubdate
|
413
413
|
log!(enter: __method__)
|
414
414
|
raise NoPostCall unless @meta
|
415
|
-
|
415
|
+
api.debug "data = #@_data"
|
416
416
|
# Check for discrepancy?
|
417
417
|
match = /(\d{4}).(\d{2}).(\d{2})/.match @_data
|
418
418
|
junk, y, m, d = match.to_a
|
419
419
|
y, m, d = y.to_i, m.to_i, d.to_i
|
420
420
|
@meta.date = ::Date.new(y, m, d)
|
421
421
|
@meta.pubdate = "%04d-%02d-%02d" % [y, m, d]
|
422
|
-
|
422
|
+
api.optional_blank_line
|
423
423
|
end
|
424
424
|
|
425
425
|
def tags
|
426
426
|
log!(enter: __method__)
|
427
427
|
raise NoPostCall unless @meta
|
428
|
-
|
429
|
-
@meta.tags =
|
430
|
-
|
428
|
+
api.debug "args = #{_args}"
|
429
|
+
@meta.tags = api.args.dup || []
|
430
|
+
api.optional_blank_line
|
431
431
|
end
|
432
432
|
|
433
433
|
def views
|
434
434
|
log!(enter: __method__)
|
435
435
|
raise NoPostCall unless @meta
|
436
|
-
|
437
|
-
@meta.views =
|
438
|
-
|
436
|
+
api.debug "data = #{_args}"
|
437
|
+
@meta.views = api.args.dup
|
438
|
+
api.optional_blank_line
|
439
439
|
end
|
440
440
|
|
441
441
|
def pin
|
442
442
|
log!(enter: __method__)
|
443
443
|
raise NoPostCall unless @meta
|
444
|
-
|
444
|
+
api.debug "data = #{_args}" # verify only valid views?
|
445
445
|
pinned = @_args
|
446
446
|
@meta.pinned = pinned
|
447
447
|
pinned.each do |pinview|
|
@@ -452,7 +452,7 @@ def pin
|
|
452
452
|
pins.uniq!
|
453
453
|
File.open(datafile, "w") {|out| pins.each {|pin| out.puts pin } }
|
454
454
|
end
|
455
|
-
|
455
|
+
api.optional_blank_line
|
456
456
|
rescue => err
|
457
457
|
STDERR.puts "err = #{err}"
|
458
458
|
STDERR.puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
|
@@ -472,15 +472,15 @@ end
|
|
472
472
|
def teaser
|
473
473
|
log!(enter: __method__)
|
474
474
|
raise NoPostCall unless @meta
|
475
|
-
text =
|
475
|
+
text = api.body.join("\n")
|
476
476
|
@meta.teaser = text
|
477
477
|
setvar :teaser, @meta.teaser
|
478
|
-
if
|
478
|
+
if api.args[0] == "dropcap" # FIXME doesn't work yet!
|
479
479
|
letter, remain = text[0], text[1..-1]
|
480
|
-
|
481
|
-
|
480
|
+
api.out %[<div class='mydrop'>#{letter}</div>]
|
481
|
+
api.out %[<div style="padding-top: 1px">#{remain}] + "\n"
|
482
482
|
else
|
483
|
-
|
483
|
+
api.out @meta.teaser + "\n"
|
484
484
|
end
|
485
485
|
end
|
486
486
|
|
@@ -498,10 +498,10 @@ end
|
|
498
498
|
|
499
499
|
def head # Does NOT output <head> tags
|
500
500
|
log!(enter: __method__)
|
501
|
-
args =
|
501
|
+
args = api.args
|
502
502
|
args.each do |inc|
|
503
503
|
self.data = inc
|
504
|
-
|
504
|
+
dot_include
|
505
505
|
end
|
506
506
|
# Depends on vars: title, desc, host
|
507
507
|
defaults = {}
|
@@ -522,7 +522,7 @@ def head # Does NOT output <head> tags
|
|
522
522
|
"favicon" => %[<link rel="shortcut icon" type="image/x-icon" href="etc/favicon.ico">\n <link rel="apple-touch-icon" href="etc/favicon.ico">]
|
523
523
|
}
|
524
524
|
result = {}
|
525
|
-
lines =
|
525
|
+
lines = api.body
|
526
526
|
lines.each do |line|
|
527
527
|
line.chomp
|
528
528
|
word, remain = line.split(" ", 2)
|
@@ -547,14 +547,14 @@ def head # Does NOT output <head> tags
|
|
547
547
|
end
|
548
548
|
hash = defaults.dup.update(result) # FIXME collisions?
|
549
549
|
|
550
|
-
hash.each_value {|x|
|
550
|
+
hash.each_value {|x| api.out " " + x }
|
551
551
|
end
|
552
552
|
|
553
553
|
########## newer stuff...
|
554
554
|
|
555
555
|
def meta
|
556
556
|
log!(enter: __method__)
|
557
|
-
args =
|
557
|
+
args = api.args
|
558
558
|
enum = args.each
|
559
559
|
str = "<meta"
|
560
560
|
arg = enum.next
|
@@ -569,12 +569,12 @@ def meta
|
|
569
569
|
arg = enum.next
|
570
570
|
end
|
571
571
|
str << ">"
|
572
|
-
|
572
|
+
api.out str
|
573
573
|
end
|
574
574
|
|
575
575
|
def recent_posts # side-effect
|
576
576
|
log!(enter: __method__)
|
577
|
-
|
577
|
+
api.out <<-HTML
|
578
578
|
<div class="col-lg-9 col-md-9 col-sm-9 col-xs-12">
|
579
579
|
<iframe id="main" style="width: 70vw; height: 100vh; position: relative;"
|
580
580
|
src='recent.html' width=100% frameborder="0" allowfullscreen>
|
@@ -623,17 +623,18 @@ end
|
|
623
623
|
|
624
624
|
def sidebar
|
625
625
|
log!(enter: __method__)
|
626
|
-
|
627
|
-
if
|
628
|
-
|
626
|
+
api.debug "--- handling sidebar\r"
|
627
|
+
if api.args.include? "off"
|
628
|
+
api.body { } # iterate, do nothing
|
629
629
|
return
|
630
630
|
end
|
631
631
|
|
632
|
-
|
632
|
+
api.out %[<div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">]
|
633
633
|
|
634
634
|
standard = %w[pinned pages links news]
|
635
635
|
|
636
|
-
|
636
|
+
lines = api.body.to_a
|
637
|
+
lines.each do |token|
|
637
638
|
tag = token.chomp.strip.downcase
|
638
639
|
wtag = "../../widgets"/tag
|
639
640
|
raise CantFindWidgetDir(wtag) unless Dir.exist?(wtag)
|
@@ -645,9 +646,9 @@ def sidebar
|
|
645
646
|
raise "Nonstandard widget?"
|
646
647
|
end
|
647
648
|
|
648
|
-
|
649
|
+
api.include_file wtag/tcard
|
649
650
|
end
|
650
|
-
|
651
|
+
api.out %[</div>]
|
651
652
|
rescue => err
|
652
653
|
puts "err = #{err}"
|
653
654
|
puts err.backtrace.join("\n") if err.respond_to?(:backtrace)
|
@@ -657,20 +658,20 @@ end
|
|
657
658
|
|
658
659
|
def stylesheet
|
659
660
|
log!(enter: __method__)
|
660
|
-
lines =
|
661
|
+
lines = api.body
|
661
662
|
url = lines[0]
|
662
663
|
integ = lines[1]
|
663
664
|
cross = lines[2] || "anonymous"
|
664
|
-
|
665
|
+
api.out %[<link rel="stylesheet" href="#{url}" integrity="#{integ}" crossorigin="#{cross}"></link>]
|
665
666
|
end
|
666
667
|
|
667
668
|
def script
|
668
669
|
log!(enter: __method__)
|
669
|
-
lines =
|
670
|
+
lines = api.body
|
670
671
|
url = lines[0]
|
671
672
|
integ = lines[1]
|
672
673
|
cross = lines[2] || "anonymous"
|
673
|
-
|
674
|
+
api.out %[<script src="#{url}" integrity="#{integ}" crossorigin="#{cross}"></script>]
|
674
675
|
end
|
675
676
|
|
676
677
|
$Dot = self # Clunky! for dot commands called from Functions class
|
@@ -716,7 +717,7 @@ end
|
|
716
717
|
|
717
718
|
def tag_cloud
|
718
719
|
log!(enter: __method__)
|
719
|
-
title =
|
720
|
+
title = api.data
|
720
721
|
title = "Tag Cloud" if title.empty?
|
721
722
|
open = <<-HTML
|
722
723
|
<div class="card mb-3">
|
@@ -727,15 +728,15 @@ def tag_cloud
|
|
727
728
|
</h5>
|
728
729
|
<div class="collapse" id="tag-cloud">
|
729
730
|
HTML
|
730
|
-
|
731
|
-
|
731
|
+
api.out open
|
732
|
+
api.body do |line|
|
732
733
|
line.chomp!
|
733
734
|
url, classname, cdata = line.split(",", 3)
|
734
735
|
main = _main(url)
|
735
|
-
|
736
|
+
api.out %[<a #{main} class="#{classname}">#{cdata}</a>]
|
736
737
|
end
|
737
738
|
close = %[ </div>\n </div>\n </div>]
|
738
|
-
|
739
|
+
api.out close
|
739
740
|
end
|
740
741
|
|
741
742
|
def vnavbar
|
@@ -785,7 +786,7 @@ def _make_navbar(orient = :horiz)
|
|
785
786
|
output = File.new(html_file, "w")
|
786
787
|
output.puts start
|
787
788
|
lines = _read_navbar_data
|
788
|
-
lines = ["index Home"] + lines unless
|
789
|
+
lines = ["index Home"] + lines unless api.args.include?("nohome")
|
789
790
|
lines.each do |line|
|
790
791
|
basename, cdata = line.chomp.strip.split(" ", 2)
|
791
792
|
full = :banner/:navbar/basename+".html"
|
@@ -831,16 +832,16 @@ def _passthru(line)
|
|
831
832
|
log!(enter: __method__)
|
832
833
|
return if line.nil?
|
833
834
|
line = _format(line)
|
834
|
-
|
835
|
-
|
835
|
+
api.out line + "\n"
|
836
|
+
api.out "<p>" if line.empty? && ! @_nopara
|
836
837
|
end
|
837
838
|
|
838
839
|
def _passthru_noline(line)
|
839
840
|
log!(enter: __method__)
|
840
841
|
return if line.nil?
|
841
842
|
line = _format(line)
|
842
|
-
|
843
|
-
|
843
|
+
api.out line
|
844
|
+
api.out "<p>" if line.empty? && ! @_nopara
|
844
845
|
end
|
845
846
|
|
846
847
|
def _write_metadata
|
@@ -891,7 +892,7 @@ def _card_generic(card_title:, middle:, extra: "")
|
|
891
892
|
</div>
|
892
893
|
HTML
|
893
894
|
text = front + middle + tail
|
894
|
-
|
895
|
+
api.out text + "\n "
|
895
896
|
end
|
896
897
|
|
897
898
|
def _var(name) # FIXME scope issue!
|
data/lib/lowlevel.rb
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
f.puts err.backtrace.join("\n")
|
13
13
|
end
|
14
14
|
puts "Error: See #{out}"
|
15
|
-
|
15
|
+
puts "Sleeping..."; sleep 10
|
16
16
|
end
|
17
17
|
|
18
18
|
def dump(obj, name)
|
@@ -23,13 +23,14 @@
|
|
23
23
|
File.open(file, "a") {|f| f.puts "#{Time.now} #{line}" }
|
24
24
|
end
|
25
25
|
|
26
|
-
def system!(
|
27
|
-
log!(enter: __method__, args: [
|
28
|
-
|
29
|
-
|
26
|
+
def system!(os_cmd, show: false)
|
27
|
+
log!(enter: __method__, args: [os_cmd], level: 2)
|
28
|
+
caller.each {|x| print "::: "; p x }
|
29
|
+
STDERR.puts os_cmd if show
|
30
|
+
rc = system(os_cmd)
|
30
31
|
STDERR.puts " rc = #{rc.inspect}" if show
|
31
32
|
return rc if rc
|
32
|
-
STDERR.puts "FAILED: #{
|
33
|
+
STDERR.puts "FAILED: #{os_cmd.inspect}"
|
33
34
|
STDERR.puts "\ncaller = \n#{caller.join("\n ")}\n"
|
34
35
|
if defined?(RubyText)
|
35
36
|
sleep 6
|
data/lib/menus.rb
CHANGED
@@ -105,7 +105,7 @@ Menu.top_config = {
|
|
105
105
|
"Generator for a post" => proc { edit_post_generate },
|
106
106
|
" HEAD info for post" => proc { edit_post_head },
|
107
107
|
" Content for post" => proc { edit_post_index },
|
108
|
-
"Variables (general)" => proc { edit_view_global },
|
108
|
+
"Variables (general!)" => proc { edit_view_global },
|
109
109
|
" View-specific" => proc { edit_settings_view },
|
110
110
|
" Recent posts" => proc { edit_settings_recent },
|
111
111
|
" Publishing" => proc { edit_settings_publish },
|
data/lib/processing.rb
CHANGED
@@ -77,11 +77,14 @@ rescue => err
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def get_live_vars(src)
|
80
|
+
dir, base = File.dirname(src), File.basename(src)
|
80
81
|
live = Livetext.customize(call: [".nopara"])
|
81
|
-
|
82
|
-
# STDERR.puts "glv: src = #{src.inspect}"
|
83
|
-
live.xform_file(src)
|
82
|
+
Dir.chdir(dir) { live.xform_file(base) }
|
84
83
|
live
|
84
|
+
rescue => e
|
85
|
+
puts e
|
86
|
+
puts $!
|
87
|
+
gets
|
85
88
|
end
|
86
89
|
|
87
90
|
end
|
data/lib/repl.rb
CHANGED
@@ -11,8 +11,10 @@ Signal.trap("INT") { puts "Don't :)" }
|
|
11
11
|
module RuneBlog::REPL
|
12
12
|
def edit_file(file, vim: "")
|
13
13
|
ed = @blog.editor
|
14
|
+
STDERR.puts ">>> edit_file: ed = #{ed.inspect}"
|
14
15
|
params = vim if ed =~ /vim$/
|
15
16
|
result = system!("#{@blog.editor} #{file} #{params}")
|
17
|
+
STDERR.puts ">>> edit_file: after system call"
|
16
18
|
raise EditorProblem(file) unless result
|
17
19
|
cmd_clear
|
18
20
|
end
|
@@ -38,8 +40,8 @@ module RuneBlog::REPL
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def cmd_config
|
41
|
-
hash = {"Variables (
|
42
|
-
" View-specific" => "
|
43
|
+
hash = {"Variables (General)" => "global.lt3",
|
44
|
+
" View-specific" => "../settings/view.txt",
|
43
45
|
" Recent posts" => "../../settings/recent.txt",
|
44
46
|
" Publishing" => "../../settings/publish.txt",
|
45
47
|
"Configuration: enable/disable" => "../../settings/features.txt",
|
@@ -60,6 +62,7 @@ module RuneBlog::REPL
|
|
60
62
|
}
|
61
63
|
|
62
64
|
dir = @blog.view.dir/"themes/standard/"
|
65
|
+
STDERR.puts ">>> cmd_config: dir = #{dir.inspect}"
|
63
66
|
num, target = STDSCR.menu(title: "Edit file:", items: hash)
|
64
67
|
edit_file(dir/target)
|
65
68
|
end
|
@@ -253,7 +256,6 @@ log! str: "=== ...finished!"
|
|
253
256
|
name = @blog.view.name
|
254
257
|
k, name = STDSCR.menu(title: "Views", items: viewnames, curr: n, wrap: true)
|
255
258
|
return if name.nil?
|
256
|
-
log! str: "cv Setting to #{name.inspect}"
|
257
259
|
@blog.view = name
|
258
260
|
# puts "\n ", fx(name, :bold), "\n"
|
259
261
|
return
|
@@ -371,7 +373,8 @@ log! str: "cv Setting to #{name.inspect}"
|
|
371
373
|
|
372
374
|
def cmd_list_views
|
373
375
|
puts
|
374
|
-
@blog.views
|
376
|
+
list = @blog.views
|
377
|
+
list.each do |v|
|
375
378
|
v = v.to_s
|
376
379
|
title = view2title(v)
|
377
380
|
v = fx(v, :bold) if v == @blog.view.name
|
@@ -412,22 +415,16 @@ log! str: "cv Setting to #{name.inspect}"
|
|
412
415
|
if curr_drafts.empty?
|
413
416
|
puts "\n No drafts\n "
|
414
417
|
return
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
other = @blog._get_views(@blog.root/:drafts/draft) - [@blog.view.to_s]
|
426
|
-
unless other.empty?
|
427
|
-
print fx(" "*9 + "also in: ", :bold)
|
428
|
-
puts other.join(", ")
|
429
|
-
end
|
430
|
-
end
|
418
|
+
end
|
419
|
+
puts
|
420
|
+
curr_drafts.each do |draft|
|
421
|
+
base = draft.sub(/.lt3$/, "")
|
422
|
+
dir = @blog.root/:posts/base
|
423
|
+
meta = nil
|
424
|
+
Dir.chdir(dir) { meta = @blog.read_metadata }
|
425
|
+
num, title = meta.num, meta.title
|
426
|
+
num = '%4d' % num.to_s
|
427
|
+
puts " ", fx(num, Red), " ", fx(title, Black)
|
431
428
|
end
|
432
429
|
puts
|
433
430
|
end
|
@@ -438,12 +435,11 @@ log! str: "cv Setting to #{name.inspect}"
|
|
438
435
|
if assets.empty?
|
439
436
|
puts " No assets"
|
440
437
|
return
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
end
|
438
|
+
end
|
439
|
+
puts
|
440
|
+
assets.each do |name|
|
441
|
+
asset = File.basename(name)
|
442
|
+
puts " ", fx(asset, Blue)
|
447
443
|
end
|
448
444
|
puts
|
449
445
|
end
|
data/lib/runeblog.rb
CHANGED
@@ -58,9 +58,9 @@ class RuneBlog
|
|
58
58
|
include ErrorChecks
|
59
59
|
end
|
60
60
|
|
61
|
-
attr_reader
|
62
|
-
attr_accessor :root,
|
63
|
-
attr_accessor :view
|
61
|
+
attr_reader :views, :sequence
|
62
|
+
attr_accessor :root, :editor, :features
|
63
|
+
attr_accessor :view # overridden
|
64
64
|
attr_accessor :post
|
65
65
|
|
66
66
|
attr_accessor :post_views, :post_tags, :dirty_views
|
@@ -74,7 +74,7 @@ class RuneBlog
|
|
74
74
|
teaser: "No teaser", body: "No body", tags: ["untagged"],
|
75
75
|
views: [], back: "javascript:history.go(-1)", home: "no url")
|
76
76
|
log!(enter: __method__, args: [num, title, date, view, teaser, body, tags, views, back, home], level: 3)
|
77
|
-
viewlist = (views + [view.to_s]).join(" ")
|
77
|
+
viewlist = (views + [view.to_s]).join(" ").uniq
|
78
78
|
taglist = ".tags " + tags.join(" ")
|
79
79
|
|
80
80
|
<<~TEXT
|
@@ -96,9 +96,9 @@ class RuneBlog
|
|
96
96
|
|
97
97
|
def self.create_new_blog_repo(root_rel = ".blogs")
|
98
98
|
log!(enter: __method__, args: [root_rel])
|
99
|
+
check_error(BlogRepoAlreadyExists) { Dir.exist?(root_rel) }
|
99
100
|
check_nonempty_string(root_rel)
|
100
101
|
repo_root = Dir.pwd/root_rel
|
101
|
-
check_error(BlogRepoAlreadyExists) { Dir.exist?(repo_root) }
|
102
102
|
|
103
103
|
create_dirs(repo_root)
|
104
104
|
Dir.chdir(repo_root) do
|
@@ -110,7 +110,6 @@ class RuneBlog
|
|
110
110
|
unless File.exist?(repo_root/"data/VIEW")
|
111
111
|
copy_data(repo_root/:data)
|
112
112
|
end
|
113
|
-
# copy_data(:extra, repo_root/:config)
|
114
113
|
write_repo_config(root: repo_root)
|
115
114
|
# Weird. Like a singleton - dumbass circular dependency?
|
116
115
|
self.blog = blog = self.new
|
@@ -128,32 +127,58 @@ class RuneBlog
|
|
128
127
|
_tmp_error(err)
|
129
128
|
end
|
130
129
|
|
131
|
-
|
132
|
-
log!(enter: "initialize", args: [root_rel])
|
133
|
-
# Weird. Like a singleton - dumbass circular dependency?
|
134
|
-
self.class.blog = self
|
130
|
+
################
|
135
131
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
read_features # top level
|
140
|
-
@views = retrieve_views
|
141
|
-
self.view = File.read(@root/"data/VIEW").chomp
|
142
|
-
md = Dir.pwd.match(%r[.*/views/(.*?)/])
|
143
|
-
if md
|
144
|
-
@view_name = md[1]
|
145
|
-
@view = str2view(@view_name)
|
146
|
-
end
|
147
|
-
@sequence = get_sequence
|
148
|
-
@post_views = []
|
149
|
-
@post_tags = []
|
132
|
+
def self.read(root_rel = ".blogs") # always assumes existing blog
|
133
|
+
log!(enter: "RuneBlog.read", args: [root_rel])
|
134
|
+
RuneBlog.new(root_rel)
|
150
135
|
rescue => err
|
151
|
-
puts "
|
152
|
-
|
153
|
-
|
136
|
+
puts "ERROR - #{err.inspect}"
|
137
|
+
# puts "Error - see stderr.out"
|
138
|
+
puts err.inspect + "\n" + err&.backtrace
|
154
139
|
sleep 3
|
155
140
|
end
|
156
141
|
|
142
|
+
# def self.read(root_rel = ".blogs") # always assumes existing blog
|
143
|
+
# log!(enter: "RuneBlog.read", args: [root_rel])
|
144
|
+
# instance = RuneBlog.allocate
|
145
|
+
# instance.instance_eval do
|
146
|
+
# # @blog = instance # Duhhh
|
147
|
+
# @root = Dir.pwd/root_rel
|
148
|
+
# # _init_get_view ##########??????
|
149
|
+
# # self.class.blog = self # Weird, like singleton. Dumbass circular dependency?
|
150
|
+
# RuneBlog.blog = instance
|
151
|
+
# dirs = subdirs("#@root/views/").sort
|
152
|
+
# @views = dirs.map {|name| RuneBlog::View.new(name) }
|
153
|
+
# @curr = str2view(File.read(@root/"data/VIEW").chomp)
|
154
|
+
# @view = @curr
|
155
|
+
# # ...was init_get_view
|
156
|
+
# @sequence, @post_views, @post_tags = get_sequence, [], []
|
157
|
+
# end
|
158
|
+
# return instance
|
159
|
+
# rescue => err
|
160
|
+
# puts "ERROR - #{err.inspect}"
|
161
|
+
# # puts "Error - see stderr.out"
|
162
|
+
# puts err.inspect + "\n" + err&.backtrace
|
163
|
+
# sleep 3
|
164
|
+
# end
|
165
|
+
|
166
|
+
def initialize(root_rel) ##### FIXME ??
|
167
|
+
# @blog = instance # Duhhh
|
168
|
+
@root = Dir.pwd/root_rel
|
169
|
+
# _init_get_view ##########??????
|
170
|
+
# self.class.blog = self # Weird, like singleton. Dumbass circular dependency?
|
171
|
+
RuneBlog.blog = self
|
172
|
+
dirs = subdirs("#@root/views/").sort
|
173
|
+
@views = dirs.map {|name| RuneBlog::View.new(name) }
|
174
|
+
@curr = str2view(File.read(@root/"data/VIEW").chomp)
|
175
|
+
@view = @curr
|
176
|
+
# ...was init_get_view
|
177
|
+
@sequence, @post_views, @post_tags = get_sequence, [], []
|
178
|
+
get_repo_config
|
179
|
+
read_features
|
180
|
+
end
|
181
|
+
|
157
182
|
def complete_file(name, vars, hash)
|
158
183
|
debugging = vars.nil?
|
159
184
|
return if hash.empty?
|
@@ -270,14 +295,6 @@ class RuneBlog
|
|
270
295
|
views.any? {|x| x.name == name }
|
271
296
|
end
|
272
297
|
|
273
|
-
# def view(name = nil)
|
274
|
-
# log!(enter: __method__, args: [name], level: 3)
|
275
|
-
# return @view if name.nil?
|
276
|
-
#
|
277
|
-
# check_nonempty_string(name)
|
278
|
-
# return str2view(name)
|
279
|
-
# end
|
280
|
-
|
281
298
|
def str2view(str)
|
282
299
|
log!(enter: __method__, args: [str], level: 3)
|
283
300
|
check_nonempty_string(str) # redundant?
|
@@ -297,15 +314,12 @@ class RuneBlog
|
|
297
314
|
@view = nil
|
298
315
|
return
|
299
316
|
end
|
300
|
-
# STDERR.puts "view= #{arg.inspect}"
|
301
|
-
|
302
317
|
case arg
|
303
318
|
when RuneBlog::View
|
304
319
|
@view = arg
|
305
320
|
@view.get_globals(true)
|
306
321
|
when String
|
307
322
|
new_view = str2view(arg)
|
308
|
-
# STDERR.puts "view= new view #{new_view.inspect}"
|
309
323
|
check_error(NoSuchView, arg) { new_view.nil? }
|
310
324
|
@view = new_view
|
311
325
|
else
|
@@ -541,11 +555,10 @@ class RuneBlog
|
|
541
555
|
next unless Dir.exist?(postdir)
|
542
556
|
meta = nil
|
543
557
|
Dir.chdir(postdir) { meta = read_metadata }
|
544
|
-
# puts [draft, meta.views].inspect
|
545
558
|
list << draft if meta.views.include?(self.view.to_s)
|
546
559
|
end
|
547
|
-
#
|
548
|
-
|
560
|
+
# curr_drafts
|
561
|
+
list.sort
|
549
562
|
end
|
550
563
|
|
551
564
|
def all_drafts
|
@@ -739,8 +752,7 @@ args = {cwd: pdraft, src: draft, debug: true, dst: "guts.html",
|
|
739
752
|
|
740
753
|
def remove_post(num)
|
741
754
|
log!(enter: __method__, args: [num], level: 1)
|
742
|
-
check_integer(num)
|
743
|
-
# FIXME update original draft .views
|
755
|
+
check_integer(num) # FIXME update original draft .views
|
744
756
|
tag = prefix(num)
|
745
757
|
files = Find.find(self.view.dir).to_a
|
746
758
|
list = files.select {|x| File.directory?(x) and x =~ /#{tag}/ }
|
data/lib/runeblog_version.rb
CHANGED
data/runeblog.gemspec
CHANGED
@@ -21,7 +21,7 @@ spec = Gem::Specification.new do |s|
|
|
21
21
|
s.authors = ["Hal Fulton"]
|
22
22
|
s.email = 'rubyhacker@gmail.com'
|
23
23
|
s.executables << "blog"
|
24
|
-
s.add_runtime_dependency 'livetext', '~> 0.9', '>= 0.9.
|
24
|
+
s.add_runtime_dependency 'livetext', '~> 0.9', '>= 0.9.33'
|
25
25
|
s.add_runtime_dependency 'rubytext', '~> 0.1', '>= 0.1.23'
|
26
26
|
s.add_runtime_dependency 'rouge', '~> 3.25', '>= 3.25.0'
|
27
27
|
|
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.3.
|
4
|
+
version: 0.3.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: livetext
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '0.9'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.9.
|
22
|
+
version: 0.9.33
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '0.9'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.9.
|
32
|
+
version: 0.9.33
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: rubytext
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- "./README.md"
|
102
102
|
- "./runeblog.gemspec"
|
103
103
|
- bin/blog
|
104
|
+
- bin/blog.rb
|
104
105
|
- bin/mkwidget
|
105
106
|
- data/EDITOR
|
106
107
|
- data/ROOT
|
@@ -256,7 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
256
257
|
- !ruby/object:Gem::Version
|
257
258
|
version: '0'
|
258
259
|
requirements: []
|
259
|
-
rubygems_version: 3.
|
260
|
+
rubygems_version: 3.2.3
|
260
261
|
signing_key:
|
261
262
|
specification_version: 4
|
262
263
|
summary: A command-line blogging system
|