runeblog 0.3.02 → 0.3.07

Sign up to get free protection for your applications and to get access to all the features.
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