runeblog 0.3.02 → 0.3.07

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af242702c47c1cad260040a42b4fe58f5fb84e83934bfa80e0f12fd3e7083c9c
4
- data.tar.gz: 90b1d17454ce166e5c89b1c8ed6cc43f129a708a14200b94a1bb5c2a5a721a7b
3
+ metadata.gz: c9c40711649cc90ed5892d256311a01c9841655a1945cc2dcfcc9bd8dd0e77e5
4
+ data.tar.gz: ff3b53cdf4d0f6d7136e31cef2aca74a4843d836d45518909baa082f134ec089
5
5
  SHA512:
6
- metadata.gz: a70f36f01ebdfc94db5b6794b8975b876b0255b154d8393d87e7728f19010c478daaa93462cbb21aa0bee539c4d4a922640d8c92f7f3707538974d5cbe60f65d
7
- data.tar.gz: 50d5b646a4fa6e050f0aedb2789371c61fd5115ce35d03051b3ce690f113b47182782951ac8a6e7742bbf1316e7791fcccfd653d2d67911bf75b4bf3e62ae4a6
6
+ metadata.gz: 667ae25acb4c5230f9674fc067bbfca36b18562f8bf9f740f066e39621ae3eff9a952309eb28b3ed754c8f4c4acc0cc7a25054db1f7999844c8f49ac6621cb9c
7
+ data.tar.gz: cda360ef27a9733285d4aa0c50f402cd00c385f30f49f40d0fd1d61fc1046aec84dc2b0d8f6bb9e4db018c8f4266eb7381c1e9171ff5096166a7054fda98e8ea
data/bin/blog CHANGED
@@ -25,14 +25,13 @@ end
25
25
  def get_universal
26
26
  univ = "#{@blog.root}/data/universal.lt3"
27
27
  if yesno("Faster initial setup? (no: edit universal.lt3)")
28
- author = ask!(" Author name: ")
29
- site = ask!(" Site/domain: ")
28
+ author = ask!(" Author name: ")
29
+ site = ask!(" Site/domain: ")
30
30
  # Now stash it...
31
31
  str = File.read(univ)
32
32
  str = str.gsub(/AUTHOR/, author)
33
33
  str = str.gsub(/SITE_DOMAIN/, site)
34
34
  File.write(univ, str)
35
- # STDERR.puts "------ universal ------\n#{`cat #{univ}`}\n------------------------"
36
35
  else
37
36
  vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(AUTHOR.*\|SITE.*\)"'
38
37
  edit_file(univ, vim: vim_params)
@@ -41,11 +40,11 @@ end
41
40
 
42
41
  def get_global
43
42
  if yesno("Faster view setup? (no: edit global.lt3)")
44
- view_name = ask!("\n Filename: ")
43
+ view_name = ask!(" Filename: ")
45
44
  @blog.create_view(view_name) # call change_view??
46
- title = ask!(" View title: ")
47
- subtitle = ask!(" Subtitle : ")
48
- domain = ask!(" Domain : ")
45
+ title = ask!(" View title: ")
46
+ subtitle = ask!(" Subtitle : ")
47
+ domain = ask!(" Domain : ")
49
48
 
50
49
  vfile = "#{@blog.root}/views/#{view_name}/settings/view.txt"
51
50
  hash = {/VIEW_NAME/ => view_name,
@@ -54,7 +53,7 @@ def get_global
54
53
  /VIEW_DOMAIN/ => domain}
55
54
  @blog.complete_file(vfile, nil, hash)
56
55
  else
57
- view_name = ask!("\n Filename: ")
56
+ view_name = ask!(" Filename: ")
58
57
  @blog.create_view(view_name) # call change_view??
59
58
  vim_params = '-c ":set hlsearch" -c ":hi Search ctermfg=2 ctermbg=6" +/"\(VIEW_.*\|SITE.*\)"'
60
59
  edit_file(@blog.view.dir/"themes/standard/global.lt3", vim: vim_params)
@@ -66,6 +65,8 @@ def get_started
66
65
  puts " First choose your editor."
67
66
  @blog.editor = pick_editor
68
67
  File.write("#{@blog.root}/data/EDITOR", @blog.editor)
68
+ print " Default editor is "
69
+ puts fx(@blog.editor, :bold)
69
70
 
70
71
  get_universal
71
72
  # Now create a custom global.lt3
@@ -73,11 +74,10 @@ def get_started
73
74
  puts fx("\n Quick setup complete!", :bold)
74
75
  if yesno("Create your first view now?")
75
76
  get_global
76
- puts "\n View #{@blog.view} created!\n "
77
+ puts fx("\n View #{@blog.view} created!\n ", :bold)
77
78
  end
78
79
  end
79
80
 
80
- puts
81
81
  print fx(" For help", :bold)
82
82
  puts " type h or help."
83
83
  print fx(" Create a view", :bold)
@@ -90,11 +90,11 @@ def mainloop
90
90
  info = @blog.view || "no view"
91
91
  print fx("[#{info}] ", Red, :bold)
92
92
  cmd = STDSCR.gets(history: @cmdhist, tab: @tabcom)
93
- cmd_quit(nil) if cmd.nil? # ^D
93
+ cmd_quit if cmd.nil? # ^D
94
94
  cmd.chomp!
95
95
  return if cmd.empty? # CR does nothing
96
- meth, params = RuneBlog::REPL.choose_method(cmd)
97
- ret, str = send(meth, params)
96
+ invoking = RuneBlog::REPL.choose_method(cmd)
97
+ ret = send(*invoking)
98
98
  rescue => err
99
99
  puts err
100
100
  end
@@ -106,7 +106,7 @@ def cmdline_preview
106
106
  end
107
107
 
108
108
  def cmdline_publish
109
- abort "Nor implemented yet"
109
+ abort "Not implemented yet"
110
110
  _need_view
111
111
  end
112
112
 
@@ -152,7 +152,8 @@ major, minor = RUBY_VERSION.split(".").values_at(0,1)
152
152
  ver = major.to_i*10 + minor.to_i
153
153
  unless ver >= 24
154
154
  RubyText.stop
155
- abort "Need Ruby 2.4 or greater"
155
+ sleep 0.2
156
+ abort "Needs Ruby 2.4 or greater"
156
157
  end
157
158
 
158
159
  include RuneBlog::Helpers # for try_read_config
@@ -194,7 +195,7 @@ puts fx("\n RuneBlog", :bold), fx(" v #{RuneBlog::VERSION}\n", Red)
194
195
 
195
196
  loop { mainloop }
196
197
 
197
- system("tput clear")
198
+ # system("tput clear")
198
199
  sleep 0.2
199
200
  puts
200
201
 
@@ -2,7 +2,7 @@
2
2
  # 1 = enabled (implies installed)
3
3
  # x = excluded (not installed; does it even exist?)
4
4
 
5
- reddit 1 # autopost, embed thread after blog post
5
+ reddit 0 # autopost, embed thread after blog post
6
6
  facebook 0 # reader-like, reader post, autopost?
7
7
  twitter 0 # reader-tweet, reader-follow, autotweet?
8
8
 
@@ -2,7 +2,7 @@
2
2
  # 1 = enabled (implies installed)
3
3
  # x = excluded (not installed; does it even exist?)
4
4
 
5
- reddit 1 # autopost, embed thread after blog post
5
+ reddit 0 # autopost, embed thread after blog post
6
6
  facebook 0 # reader-like, reader post, autopost?
7
7
  twitter 0 # reader-tweet, reader-follow, autotweet?
8
8
 
@@ -1,6 +1,11 @@
1
1
  title.color #010101
2
2
  title.size 28px
3
+
3
4
  text.color #0101a1
4
5
  text.size 22px
6
+
5
7
  date.color #9a9a9a
6
8
  date.size 15px
9
+
10
+ bgcolor #ffffff # white
11
+ count 10 # max number of recent entries
@@ -14,16 +14,18 @@ module RuneBlog::Helpers
14
14
  exit
15
15
  end
16
16
 
17
- def read_features
17
+ def read_features(view = nil)
18
18
  hash = {}
19
- file = @root/self.view/"settings/features.txt"
20
- lines = File.readlines(file)
21
- lines.each do |line|
22
- char, line = line[0], line[1..-1].chomp
23
- name = line.strip
24
- hash[name] = (char != "-")
19
+ if view.nil? # toplevel default
20
+ dir = @root/"data"
21
+ else
22
+ dir = @root/:views/self.view/:settings
25
23
  end
26
- @features = hash
24
+ file = dir/"features.txt"
25
+ pairs = read_pairs(file)
26
+ enabled = {}
27
+ pairs.each {|k,v| enabled[k] = (v == "1") }
28
+ @features = enabled
27
29
  end
28
30
 
29
31
  def get_repo_config
@@ -39,15 +41,9 @@ module RuneBlog::Helpers
39
41
 
40
42
  def copy_data(tag, dest)
41
43
  data = RuneBlog::Path + "/../data" # files kept inside gem
42
- extra = RuneBlog::Path + "/../config" # files kept inside gem
43
- # FIXME names are confusing
44
- case tag
45
- when :config
46
- files = %w[ROOT VIEW EDITOR universal.lt3 global.lt3]
47
- files.each {|file| copy(data + "/" + file, dest) }
48
- when :extra # FIXME remove later
49
- # copy!(extra, dest)
50
- end
44
+ # FIXME tag no longer used
45
+ files = %w[ROOT VIEW EDITOR universal.lt3 global.lt3 features.txt]
46
+ files.each {|file| copy(data + "/" + file, dest) unless File.exist?(dest/file) }
51
47
  end
52
48
 
53
49
  def read_vars(file)
@@ -70,47 +66,6 @@ module RuneBlog::Helpers
70
66
  stop_RubyText rescue nil
71
67
  end
72
68
 
73
- def read_config(file, *syms)
74
- log!(enter: __method__, args: [file, *syms], level: 3)
75
- lines = File.readlines(file).map(&:chomp)
76
- obj = ::OpenStruct.new
77
- skip = ["\n", "#", "."]
78
- lines.each do |line|
79
- next if skip.include?(line[0])
80
- key, val = line.split(/: +/, 2)
81
- obj.send(key+"=", val)
82
- end
83
- return obj if syms.empty?
84
-
85
- vals = []
86
- if syms.empty?
87
- vals = obj.to_hash.values
88
- else
89
- syms.each {|sym| vals << obj.send(sym) }
90
- end
91
- return vals
92
- rescue => err
93
- puts "Can't read config file '#{file}': #{err}"
94
- puts err.backtrace.join("\n")
95
- puts "dir = #{Dir.pwd}"
96
- stop_RubyText
97
- end
98
-
99
- def try_read_config(file, hash)
100
- log!(enter: __method__, args: [file, hash], level: 3)
101
- return hash.values unless File.exist?(file)
102
- vals = read_config(file, *hash.keys)
103
- vals
104
- end
105
-
106
- def write_config(obj, file)
107
- log!(enter: __method__, args: [obj, file], level: 2)
108
- hash = obj.to_h
109
- File.open(file, "w") do |out|
110
- hash.each_pair {|key, val| out.puts "#{key}: #{val}" }
111
- end
112
- end
113
-
114
69
  def retrieve_views # read from filesystem
115
70
  log!(enter: __method__, level: 3)
116
71
  dirs = subdirs("#@root/views/").sort
@@ -109,7 +109,9 @@ module RuneBlog::REPL
109
109
  end
110
110
  meth = found || :cmd_INVALID
111
111
  params = cmd if meth == :cmd_INVALID
112
- [meth, params]
112
+ result = [meth]
113
+ result << params unless params.nil?
114
+ result
113
115
  end
114
116
 
115
117
  def ask(prompt, meth = :to_s)
@@ -121,42 +123,6 @@ module RuneBlog::REPL
121
123
  ask(fx(prompt, :bold), meth)
122
124
  end
123
125
 
124
- def reset_output(initial = "")
125
- @out ||= ""
126
- @out.replace initial
127
- end
128
-
129
- def flush_output(initial = "")
130
- CantOpen
131
- @out ||= ""
132
- puts @out
133
- reset_output
134
- end
135
-
136
- def output(str) # \n and indent
137
- @out ||= ""
138
- @out << " " + str.to_s
139
- end
140
-
141
- def outstr(str) # indent
142
- @out ||= ""
143
- @out << str
144
- end
145
-
146
- def output!(str) # \n and indent
147
- @out ||= ""
148
- @out << " " + str
149
- end
150
-
151
- def output_newline(n = 1)
152
- @out ||= ""
153
- n.times { @out << "\n" }
154
- end
155
-
156
- def check_empty(arg)
157
- raise InternalError(caller[0], arg.inspect) unless arg.nil?
158
- end
159
-
160
126
  def get_integer(arg)
161
127
  Integer(arg)
162
128
  rescue
@@ -176,10 +142,6 @@ module RuneBlog::REPL
176
142
  end
177
143
  end
178
144
 
179
- def colored_slug(slug)
180
- slug[0..3] + slug[4..-1]
181
- end
182
-
183
145
  def tags_for_view(vname = @blog.view)
184
146
  Dir.chdir(vname) do
185
147
  fname = "tagpool"
@@ -72,7 +72,7 @@ def post_trailer
72
72
  tags = _var("post.tags")
73
73
  taglist = tags.empty? ? "" : "Tags: #{tags}"
74
74
 
75
- reddit_enabled = @blog.features["reddit"] rescue nil
75
+ reddit_enabled = @blog.features["reddit"]
76
76
  reddit_txt = ""
77
77
  if reddit_enabled
78
78
  vdir = @blog.root/:views/@blog.view
@@ -110,7 +110,7 @@ def faq
110
110
  _out %[&nbsp;<a data-toggle="collapse" href="##{id}" role="button" aria-expanded="false" aria-controls="collapseExample"><font size=+3>&#8964;</font></a>]
111
111
  _out %[&nbsp;<b>#{ques}</b>]
112
112
  _out %[<div class="collapse" id="#{id}"><br><font size=+1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#{ans}</font></div>\n]
113
- _out "<br>" unless @faq_count == 1
113
+ _out "<br>" # unless @faq_count == 1
114
114
  _optional_blank_line
115
115
  end
116
116
 
@@ -775,9 +775,9 @@ end
775
775
  def _write_metadata
776
776
  File.write("teaser.txt", @meta.teaser)
777
777
  fields = [:num, :title, :date, :pubdate, :views, :tags, :pinned]
778
- fname2 = "metadata.txt"
779
- f2 = File.open(fname2, "w") do |f2|
780
- fields.each {|fld| f2.puts "#{fld}: #{@meta.send(fld)}" }
778
+ fname = "metadata.txt"
779
+ File.open(fname, "w") do |f|
780
+ fields.each {|fld| f.puts "#{'%8s' % fld} #{@meta.send(fld)}" }
781
781
  end
782
782
  end
783
783
 
@@ -789,9 +789,8 @@ def _post_lookup(postid) # side-effect
789
789
  posts = Dir.entries(dir_posts).grep(/^\d\d\d\d/).map {|x| dir_posts/x }
790
790
  posts.select! {|x| File.directory?(x) }
791
791
 
792
- post = posts.select {|x| File.basename(x).to_i == postid }
793
- raise "Error: More than one post #{postid}" if post.size > 1
794
- postdir = post.first
792
+ posts = posts.select {|x| File.basename(x).to_i == postid }
793
+ postdir = exactly_one(posts)
795
794
  vp = RuneBlog::ViewPost.new(@blog.view, postdir)
796
795
  vp
797
796
  end
@@ -1,4 +1,13 @@
1
1
 
2
+ def _tmp_error(err)
3
+ out = "/tmp/blog#{rand(100)}.txt"
4
+ File.open(out, "w") do |f|
5
+ f.puts err.to_s + "\n--------"
6
+ f.puts err.backtrace.join("\n")
7
+ end
8
+ puts "Error: See #{out}"
9
+ end
10
+
2
11
  def dump(obj, name)
3
12
  File.write(name, obj)
4
13
  end
@@ -19,22 +28,41 @@
19
28
  end
20
29
 
21
30
  def _get_data?(file) # File need not exist
22
- if File.exist?(file)
23
- _get_data(file)
24
- else
25
- []
26
- end
31
+ File.exist?(file) ? _get_data(file) : []
27
32
  end
28
33
 
29
34
  def _get_data(file)
30
35
  lines = File.readlines(file)
31
- lines.reject! {|line| line[0] == "-" } # allow rejection of lines
32
36
  lines = lines.map do |line|
33
- line.sub(/ *# .*$/, "") # allow trailing comments
37
+ line = line.chomp.strip
38
+ line.sub(/ *# .*$/, "") # allow leading/trailing comments
34
39
  end
40
+ lines.reject! {|x| x.empty? }
35
41
  lines
36
42
  end
37
43
 
44
+ def read_pairs(file) # returns a hash
45
+ lines = _get_data(file)
46
+ hash = {}
47
+ lines.each do |line|
48
+ key, val = line.split(" ", 2)
49
+ val ||= ""
50
+ hash[key] = val
51
+ end
52
+ hash
53
+ end
54
+
55
+ def read_pairs!(file) # returns an openstruct
56
+ lines = _get_data(file)
57
+ obj = OpenStruct.new
58
+ lines.each do |line|
59
+ key, val = line.split(" ", 2)
60
+ val ||= ""
61
+ obj.send("#{key}=", val)
62
+ end
63
+ obj
64
+ end
65
+
38
66
  def copy(src, dst)
39
67
  log!(enter: __method__, args: [src, dst], level: 2)
40
68
  cmd = "cp #{src} #{dst} 2>/dev/null"
@@ -65,9 +93,15 @@
65
93
  end
66
94
 
67
95
  def error(err)
68
- log!(str: err, enter: __method__, args: [err], level: 2)
96
+ # log!(str: err, enter: __method__, args: [err], level: 2)
69
97
  str = "\n Error: #{err}"
70
98
  puts str
71
99
  puts err.backtrace.join("\n")
72
100
  end
73
101
 
102
+ def exactly_one(list)
103
+ raise "List: Zero instances" if list.empty?
104
+ raise "List: More than one instance" if list.size > 1
105
+ list.first
106
+ end
107
+
@@ -13,41 +13,20 @@ class RuneBlog::Post
13
13
  log!(enter: __method__, args: [post], level: 3)
14
14
  raise "Doesn't work right now"
15
15
  raise NoBlogAccessor if RuneBlog.blog.nil?
16
- # "post" is a slug
16
+ # "post" is a slug?
17
17
  pdir = RuneBlog.blog.root/:drafts/post
18
18
  meta = nil
19
19
  Dir.chdir(pdir) do
20
- meta = read_config("metadata.txt")
21
- meta.date = Date.parse(meta.date)
22
- meta.views = meta.views.split
23
- meta.tags = meta.tags.split
24
- meta.teaser = File.read("teaser.txt")
20
+ # meta = read_config("metadata.txt")
21
+ # meta.date = Date.parse(meta.date)
22
+ # meta.views = meta.views.split
23
+ # meta.tags = meta.tags.split
24
+ # meta.teaser = File.read("teaser.txt")
25
25
  # meta.body = File.read("body.txt")
26
26
  end
27
27
  meta
28
28
  end
29
29
 
30
- def write_metadata(meta) # FIXME ???
31
- log!(enter: __method__, args: [meta], level: 3)
32
- debug "=== write_metadata:"
33
- debug "-----\n#{meta.inspect}\n-----"
34
- fname2 = "metadata.txt"
35
- hash = meta.to_h
36
-
37
- File.write("teaser.txt", hash[:teaser])
38
- hash.delete(:teaser)
39
- hash.delete(:body)
40
-
41
- hash[:views] = hash[:views].join(" ")
42
- hash[:tags] = hash[:tags].join(" ")
43
-
44
- fields = [:num, :title, :date, :pubdate, :views, :tags]
45
-
46
- f2 = File.new(fname2, "w")
47
- fields.each {|fld| f2.puts "#{fld}: #{hash[fld]}" }
48
- f2.close
49
- end
50
-
51
30
  def initialize
52
31
  log!(enter: __method__, level: 3)
53
32
  @blog = RuneBlog.blog || raise(NoBlogAccessor)
@@ -87,10 +66,9 @@ class RuneBlog::Post
87
66
  end
88
67
 
89
68
  def edit
90
- log!(enter: __method__)
91
- result = system!("vi #@draft +8") # TODO improve this
92
- raise EditorProblem(draft) unless result
93
- nil
69
+ # log!(enter: __method__)
70
+ edit_file(@draft, vim: "+8")
71
+ build
94
72
  rescue => err
95
73
  error(err)
96
74
  end
@@ -99,8 +77,8 @@ class RuneBlog::Post
99
77
  log!(enter: __method__)
100
78
  post = self
101
79
  views = post.meta.views
102
- text = File.read(@draft)
103
80
  @blog.generate_post(@draft)
81
+ @blog.generate_index(@blog.view)
104
82
  end
105
83
  end
106
84
 
@@ -184,12 +162,12 @@ class RuneBlog::ViewPost
184
162
  @aslug = @nslug[5..-1]
185
163
  fname = "#{postdir}/teaser.txt" # ???
186
164
  @teaser_text = File.read(fname).chomp
187
- # FIXME dumb hacks...
188
- mdfile = postdir/"metadata.txt"
189
- lines = File.readlines(mdfile)
190
- @title = lines.grep(/title:/).first[7..-1].chomp
191
- @date = lines.grep(/pubdate:/).first[9..-1].chomp
192
- # print "-- date = #{@date.inspect} "; gets
165
+
166
+ Dir.chdir(postdir) do
167
+ meta = @blog.read_metadata
168
+ @title = meta.title
169
+ @date = meta.pubdate
170
+ end
193
171
  rescue => err
194
172
  STDERR.puts "--- #{err}\n #{err.backtrace.join("\n ")}"
195
173
  end