runeblog 0.2.7 → 0.2.12

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: bdab9850e7d3b37635a64ae5467b5e228f6cce4c60f26e6a74453ac9b14a861e
4
- data.tar.gz: d858b5a90eb834d2cb9d057c5aaaf920d75867f869b2de0b632fb3c98e2e6e7b
3
+ metadata.gz: '08da4eebd5d24bcb8586ed0c4a977d79651fde7953df71fd94e7e6e74a09484f'
4
+ data.tar.gz: ec0907dc80d37026393c70327f81a572c418a5a3553a4eb2d256cecb2deae035
5
5
  SHA512:
6
- metadata.gz: a4bd722b8643c614047ccbdaa4d2e1ba63a4a5c9c6f4169f50e311fa340601b8c1c0f937f21a3caa6afa251aa8fc1c3b8b3d456e63adadb336177941bd0ea42a
7
- data.tar.gz: c69da06c60cf1da59dedd4fb94cfc99ae159a9c259b52b87785693d606f6d4e7b2e7dfaddcaf12b4fdbaad9e2ea258654b5dee3c57c01e6eb3bb568014b55c33
6
+ metadata.gz: 1645347a827726674875a324cd16ad9c21993c741a9b5d79f83c04459cc23b0d0a17bf1ad6c9b91d64ae57f71d180dd7bbfea850d28e1e46dc66e825cb641b53
7
+ data.tar.gz: 6bd64ef0e17ed76612b5d914de41fbcd4e916865a418acc6ae44755ad2d83fa852cce555c18a2d4c2c4b0a7569395ad4b84beca7ad070b5def25aa0209af8518
Binary file
@@ -3,6 +3,8 @@ require 'fileutils'
3
3
 
4
4
  # Home = Dir.pwd # unless Home
5
5
 
6
+ LEXT = ".lt3"
7
+
6
8
  module RuneBlog::Helpers
7
9
 
8
10
  def copy(src, dst)
@@ -31,23 +33,57 @@ exit unless rc
31
33
  # end
32
34
  end
33
35
 
34
- def stale?(src, dst)
36
+ def stale?(src, dst, force = false)
35
37
  log!(enter: __method__, args: [src, dst])
38
+ raise "Source #{src} not found in #{Dir.pwd}" unless File.exist?(src)
39
+ return true if force
36
40
  return true unless File.exist?(dst)
37
41
  return true if File.mtime(src) > File.mtime(dst)
38
42
  return false
39
43
  end
40
44
 
41
- def livetext(src, dst=nil)
42
- log!(enter: __method__, args: [src, dst])
43
- src << ".lt3" unless src.end_with?(".lt3")
44
- if dst
45
- dst << ".html" unless dst.end_with?(".html")
46
- else
47
- dst = src.sub(/.lt3$/, "")
45
+ # def livetext(src, dst=nil, dir=".")
46
+ # log!(enter: __method__, args: [src, dst])
47
+ # src << ".lt3" unless src.end_with?(".lt3")
48
+ # if dst
49
+ # dst << ".html" unless dst.end_with?(".html")
50
+ # else
51
+ # dst = src.sub(/.lt3$/, "")
52
+ # end
53
+ ## return unless stale?(src, dst)
54
+ # Dir.chdir(dir) { system("livetext #{src} >#{dst}") }
55
+ # end
56
+ #
57
+ # def livetext!(src, dst=nil, dir=".")
58
+ # log!(enter: __method__, args: [src, dst])
59
+ # src << ".lt3" unless src.end_with?(".lt3")
60
+ # if dst
61
+ # dst << ".html" unless dst.end_with?(".html")
62
+ # else
63
+ # dst = src.sub(/.lt3$/, "")
64
+ # end
65
+ ## return unless stale?(src, dst)
66
+ #STDERR.puts "-- livetext #{src} >#{dst} \n in: #{Dir.pwd}\n from: #{caller[0]}"
67
+ # Dir.chdir(dir) { system("livetext #{src} >#{dst}") }
68
+ #STDERR.puts "... completed"
69
+ # end
70
+
71
+ def xlate(cwd: Dir.pwd, src:,
72
+ dst: (strip = true; src.sub(/.lt3$/,"")),
73
+ copy: nil, debug: false, force: false)
74
+ src += LEXT unless src.end_with?(LEXT)
75
+ dst += ".html" unless dst.end_with?(".html") || strip
76
+ Dir.chdir(cwd) do
77
+ return unless stale?(src, dst, force)
78
+ if debug
79
+ STDERR.puts "-- xlate #{src} >#{dst}"
80
+ STDERR.puts " in: #{Dir.pwd}"
81
+ STDERR.puts " from: #{caller[0]}"
82
+ STDERR.puts " copy: #{copy}" if copy
83
+ end
84
+ rc = system("livetext #{src} >#{dst}")
48
85
  end
49
- # return unless stale?(src, dst)
50
- system("livetext #{src} >#{dst}")
86
+ STDERR.puts "...completed (shell returned #{rc})" if debug
51
87
  end
52
88
 
53
89
  def get_root
@@ -96,50 +96,72 @@ def list!
96
96
  _optional_blank_line
97
97
  end
98
98
 
99
- def html_body(file)
99
+ def _html_body(file)
100
100
  file.puts "<html>\n <body>"
101
101
  yield
102
102
  file.puts " </body>\n</html>"
103
103
  end
104
104
 
105
- def make_news_links
106
- # FIXME remember strings may not be safe
107
- line = _data.chomp
108
- input, cardfile, mainfile, card_title = *line.split(" ", 4)
109
- pairs = File.readlines(input).map {|line| line.chomp.split(",", 2) }
110
- # HTML for main area (iframe)
111
- File.open("#{mainfile}.html", "w") do |f|
112
- html_body(f) do
113
- f.puts "<h1>#{card_title}</h1>"
114
- pairs.each do |file, title|
115
- f.puts %[<a style="text-decoration: none; font-size: 24px" href="#{file}">#{title}</a> <br>]
116
- end
117
- end
118
- end
105
+ def _write_card(cardfile, mainfile, pairs, card_title, tag, relative: true)
119
106
  # HTML for sidebar card
107
+ log!(str: "Creating #{cardfile}.html", pwd: true)
108
+ TTY.puts "Creating #{cardfile}.html - pwd = #{Dir.pwd}"
120
109
  File.open("#{cardfile}.html", "w") do |f|
121
110
  f.puts <<-EOS
122
111
  <div class="card mb-3">
123
112
  <div class="card-body">
124
113
  <h5 class="card-title">
125
114
  <a href="javascript: void(0)"
126
- onclick="javascript:open_main('widgets/news/#{mainfile}.html')"
115
+ onclick="javascript:open_main('widgets/#{tag}/#{mainfile}.html')"
127
116
  style="text-decoration: none; color: black">#{card_title}</a>
128
117
  </h5>
118
+ <!-- <ul class="list-group list-group-flush"> -->
129
119
  EOS
120
+ log!(str: "Writing data pairs to #{cardfile}.html", pwd: true)
121
+ top = relative ? "widgets/#{tag}/" : ""
130
122
  pairs.each do |file, title|
131
123
  f.puts <<-EOS
132
124
  <li class="list-group-item"> <a href="javascript: void(0)"
133
- onclick="javascript:open_main('#{file}')">#{title}</a> </li>
125
+ onclick="javascript:open_main('#{top}#{file}')">#{title}</a> </li>
134
126
  EOS
135
127
  end
136
128
  f.puts <<-EOS
129
+ <!-- </ul> -->
137
130
  </div>
138
131
  </div>
139
132
  EOS
140
133
  end
141
134
  end
142
135
 
136
+ def _write_main(mainfile, pairs, card_title)
137
+ # HTML for main area (iframe)
138
+ log!(str: "Creating #{mainfile}.html", pwd: true)
139
+ TTY.puts "Creating #{mainfile}.html - pwd = #{Dir.pwd}"
140
+ File.open("#{mainfile}.html", "w") do |f|
141
+ _html_body(f) do
142
+ f.puts "<h1>#{card_title}</h1>"
143
+ pairs.each do |file, title|
144
+ f.puts %[<a style="text-decoration: none; font-size: 24px" href="#{file}">#{title}</a> <br>]
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ def make_main_links
151
+ log!(enter: __method__)
152
+ # FIXME remember strings may not be safe
153
+ line = _data.chomp
154
+ tag, card_title = *line.split(" ", 2)
155
+ cardfile, mainfile = "card-#{tag}", "main-#{tag}"
156
+ input = "list.data"
157
+ log!(str: "Reading #{input}", pwd: true)
158
+ pairs = File.readlines(input).map {|line| line.chomp.split(",", 2) }
159
+ _write_main(mainfile, pairs, card_title)
160
+ widget_relative = false # (tag != "news") # FIXME kludge!!!
161
+ _write_card(cardfile, mainfile, pairs, card_title, tag, relative: widget_relative)
162
+ log!(str: "...returning from method", pwd: true)
163
+ end
164
+
143
165
  ### inset
144
166
 
145
167
  def inset
@@ -236,23 +258,20 @@ def pin
236
258
  _optional_blank_line
237
259
  end
238
260
 
239
- def write_post
240
- raise "'post' was not called" unless @meta
241
- save = Dir.pwd
242
- @postdir.gsub!(/\/\//, "/") # FIXME unneeded?
243
- Dir.mkdir(@postdir) unless Dir.exist?(@postdir) # FIXME remember assets!
244
- Dir.chdir(@postdir)
245
- @meta.views = @meta.views.join(" ") if @meta.views.is_a? Array
246
- @meta.tags = @meta.tags.join(" ") if @meta.tags.is_a? Array
261
+ def _write_metadata
247
262
  File.write("teaser.txt", @meta.teaser)
248
-
249
263
  fields = [:num, :title, :date, :pubdate, :views, :tags]
250
-
251
264
  fname2 = "metadata.txt"
252
265
  f2 = File.open(fname2, "w") do |f2|
253
266
  fields.each {|fld| f2.puts "#{fld}: #{@meta.send(fld)}" }
254
267
  end
255
- Dir.chdir(save)
268
+ end
269
+
270
+ def write_post
271
+ raise "'post' was not called" unless @meta
272
+ @meta.views = @meta.views.join(" ") if @meta.views.is_a? Array
273
+ @meta.tags = @meta.tags.join(" ") if @meta.tags.is_a? Array
274
+ _write_metadata
256
275
  rescue => err
257
276
  puts "err = #{err}"
258
277
  puts err.backtrace.join("\n")
@@ -267,19 +286,25 @@ def teaser
267
286
  end
268
287
 
269
288
  def finalize
289
+ STDERR.puts :cp1
270
290
  unless @meta
271
291
  puts @live.body
272
292
  return
273
293
  end
294
+ STDERR.puts :cp4
274
295
  if @blog.nil?
275
296
  return @meta
276
297
  end
277
298
 
299
+ STDERR.puts :cp6
278
300
  @slug = @blog.make_slug(@meta)
301
+ STDERR.puts :cp7
279
302
  slug_dir = @slug
280
303
  @postdir = @blog.view.dir + "/posts/#{slug_dir}"
281
304
  STDERR.puts "--- finalize: pwd = #{Dir.pwd} postdir = #@postdir"
305
+ STDERR.puts :cp8
282
306
  write_post
307
+ STDERR.puts :cp9
283
308
  @meta
284
309
  end
285
310
 
@@ -60,7 +60,7 @@ class RuneBlog
60
60
  create_dirs(root)
61
61
  Dir.chdir(root) do
62
62
  system("cp #{RuneBlog::Path}/../empty_view.tgz .")
63
- create_dirs(:drafts, :views)
63
+ create_dirs(:drafts, :views, :posts)
64
64
  new_sequence
65
65
  end
66
66
  put_config(root: root)
@@ -99,6 +99,23 @@ class RuneBlog
99
99
  @post_tags = []
100
100
  end
101
101
 
102
+ def _deploy_local(dir)
103
+ log!(enter: __method__, args: [dir])
104
+ Dir.chdir(dir) do
105
+ views = File.readlines("metadata.txt").grep(/^.views /).first[7..-1].split
106
+ views.each {|v| system("cp *html #@root/views/#{v}/remote") }
107
+ end
108
+ end
109
+
110
+ def process_post(sourcefile)
111
+ log!(enter: __method__, args: [dir])
112
+ nslug = sourcefile.sub(/.lt3/, "")
113
+ dir = @root + "/posts/#{nslug}"
114
+ create_dir(dir)
115
+ xlate cwd: dir, src: sourcefile, debug: true
116
+ _deploy_local(dir)
117
+ end
118
+
102
119
  def inspect
103
120
  log!(enter: __method__)
104
121
  str = "blog: "
@@ -177,45 +194,59 @@ class RuneBlog
177
194
  Dir.exist?(DotDir) && File.exist?(DotDir + "/" + ConfigFile)
178
195
  end
179
196
 
180
- def _copy_to_staging
181
- copy!("themes/standard/", "staging/")
182
- copy!("themes/standard/widgets/", "staging/")
197
+ def make_dummy_publish_file(view_name)
198
+ log!(enter: __method__, args: [view_name])
199
+ vdir = "#@root/views/#{view_name}"
200
+ pub = [:user, :server, :docroot, :path, :proto]
201
+ pub = pub.map {|x| x.to_s + ": undefined" }
202
+ pub = pub.join("\n") + "\n"
203
+ dump(pub, "#{vdir}/publish")
183
204
  end
184
205
 
185
- def _copy_to_remote
186
- copy!("themes/standard/etc", "remote/")
187
- copy!("themes/standard/assets", "remote/")
188
- copy!("themes/standard/widgets", "remote/")
206
+ def mark_last_published(str)
207
+ log!(enter: __method__, args: [str])
208
+ dump(str, "last_published")
189
209
  end
190
210
 
191
- def create_view(arg)
192
- log!(enter: __method__, args: [arg])
193
- raise ArgumentError unless arg.is_a?(String) && ! arg.empty?
194
-
195
- names = self.views.map(&:to_s)
196
- raise ViewAlreadyExists(arg) if names.include?(arg)
197
-
198
- vdir = arg.dup
199
- raise DirAlreadyExists(vdir) if Dir.exist?(vdir)
211
+ def add_view(view_name)
212
+ log!(enter: __method__, args: [view_name])
213
+ view = RuneBlog::View.new(view_name)
214
+ @view = view # current view
215
+ @views << view # all views
216
+ view
217
+ end
200
218
 
219
+ def make_empty_view_tree(view_name)
220
+ log!(enter: __method__, args: [view_name])
201
221
  Dir.chdir(@root) do
202
222
  cmd1 = "tar zxvf empty_view.tgz >/dev/null 2>&1"
203
- cmd2 = "cp -r empty_view views/#{arg}"
223
+ cmd2 = "cp -r empty_view views/#{view_name}"
204
224
  system(cmd1)
205
225
  system(cmd2)
206
226
  end
227
+ end
207
228
 
208
- Dir.chdir("#@root/views/#{vdir}") do
209
- livetext "themes/standard/blog/generate", "remote/index"
210
- pub = "user: xxx\nserver: xxx\ndocroot: xxx\npath: xxx\nproto: xxx\n"
211
- dump(pub, "publish")
229
+ def check_valid_new_view(view_name)
230
+ log!(enter: __method__, args: [view_name])
231
+ raise ArgumentError unless view_name.is_a?(String)
232
+ raise ArgumentError if view_name.empty?
233
+ names = self.views.map(&:to_s)
234
+ bad = names.include?(view_name)
235
+ raise ViewAlreadyExists(view_name) if bad
236
+ vdir = "@root/views/#{view_name}"
237
+ raise DirAlreadyExists(view_name) if Dir.exist?(vdir)
238
+ return true # hm?
239
+ end
212
240
 
213
- view = RuneBlog::View.new(arg)
214
- self.view = view
215
- dump("Initial creation", "last_published")
216
- end
217
- @views << view
218
- @views
241
+ def create_view(view_name)
242
+ log!(enter: __method__, args: [view_name])
243
+ check_valid_new_view(view_name)
244
+ make_empty_view_tree(view_name)
245
+ # xlate cwd: "#@root/views/#{view_name}/themes/standard/blog",
246
+ # src: "generate", dst: "../../../remote/index"
247
+ make_dummy_publish_file(view_name)
248
+ mark_last_published("Initial creation")
249
+ add_view(view_name)
219
250
  end
220
251
 
221
252
  def delete_view(name, force = false)
@@ -304,7 +335,7 @@ class RuneBlog
304
335
  def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
305
336
  log!(enter: __method__, args: [title, testing, teaser, body, other_views])
306
337
  meta = nil
307
- Dir.chdir(self.view.dir) do
338
+ Dir.chdir("#@root/posts/") do
308
339
  post = Post.create(title: title, teaser: teaser, body: body, other_views: other_views)
309
340
  post.edit unless testing
310
341
  post.build
@@ -322,6 +353,7 @@ class RuneBlog
322
353
  sourcefile = "#@root/drafts/#{file}"
323
354
  result = system("#@editor #{sourcefile} +8") unless testing
324
355
  raise EditorProblem(sourcefile) unless result
356
+ process_post(sourcefile)
325
357
  nil
326
358
  rescue => err
327
359
  error(err)
@@ -359,9 +391,9 @@ class RuneBlog
359
391
  def generate_view(view) # huh?
360
392
  log!(enter: __method__, args: [view])
361
393
  generate_index(view) # recent posts (recent.html)
362
- Dir.chdir(@root + "/views/#{view}/themes/standard") do
363
- livetext "blog/generate.lt3", "../../remote/index.html"
364
- end
394
+ vdir = "#@root/views/#{view}"
395
+ xlate cwd: "#{vdir}/themes/standard",
396
+ src: "blog/generate.lt3", dst: "#{vdir}/remote/index.html"
365
397
  end
366
398
 
367
399
  def _get_views(draft)
@@ -388,36 +420,65 @@ class RuneBlog
388
420
  [noext, viewdir, slugdir, aslug, theme]
389
421
  end
390
422
 
423
+ def _post_metadata(draft, pdraft)
424
+ log!(enter: __method__, args: [draft, pdraft])
425
+ title_line = File.readlines(draft).grep(/^.title /).first
426
+ title = title_line.split(" ", 2)[1]
427
+ # pdir = "
428
+ Dir.chdir(pdraft) do
429
+ excerpt = File.read("teaser.txt")
430
+ vars = %[.set title="#{title.chomp}"\n] +
431
+ %[.set teaser="#{excerpt.chomp}"]
432
+ File.open("#{pdraft}/vars.lt3", "w") {|f| f.puts vars }
433
+ end
434
+ end
435
+
436
+ def copy_widget_html # FIXME make better?
437
+ log!(enter: __method__)
438
+ wdir = "../themes/standard/widgets"
439
+ widgets = Dir["#{wdir}/*"].select {|w| File.directory?(w) }
440
+ widgets.each do |w|
441
+ dir = File.basename(w)
442
+ rem = "#{remote}/#{w}"
443
+ create_dirs(rem)
444
+ system("cp #{w}/*html #{rem}")
445
+ end
446
+ end
447
+
448
+ def _handle_post(draft, view)
449
+ log!(enter: __method__, args: [draft, view])
450
+
451
+ fname = File.basename(draft) # 0001-this-is-a-post.lt3
452
+ nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
453
+ aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
454
+ ahtml = aslug + ".html" # this-is-a-post.html
455
+ pdraft = "#@root/posts/#{nslug}"
456
+ remote = "#@root/views/#{view}/remote"
457
+ @theme = "#@root/views/#{view}/themes/standard"
458
+ # Step 1...
459
+ create_dirs(pdraft)
460
+ xlate cwd: pdraft, src: draft, dst: "guts.html"
461
+ _post_metadata(draft, pdraft)
462
+ # Step 2...
463
+ vposts = "#@root/views/#{view}/posts/"
464
+ copy!(pdraft, vposts) # ??
465
+ # Step 3..
466
+ copy(pdraft + "/guts.html", "#@theme/post")
467
+ copy(pdraft + "/vars.lt3", "#@theme/post")
468
+ # Step 4...
469
+ xlate cwd: "#{@theme}/post", src: "generate.lt3",
470
+ dst: "#{remote}/#{ahtml}", copy: "#{@theme}/post"
471
+ xlate cwd: "#{@theme}/post", src: "permalink.lt3",
472
+ dst: "#{remote}/permalink/#{ahtml}"
473
+ copy_widget_html
474
+ end
475
+
391
476
  def generate_post(draft)
392
477
  log!(enter: __method__, args: [draft])
393
478
  views = _get_views(draft)
394
- views.each do |view|
395
- noext, viewdir, slugdir, aslug, @theme = _copy_get_dirs(draft, view)
396
- remote = viewdir + "/remote"
397
- Dir.chdir(slugdir) do
398
- copy(draft, ".")
399
- lt3 = draft.split("/")[-1]
400
- # Remember: Some posts may be in more than one view -- careful with links back
401
- copy(lt3, remote)
402
- html = noext[5..-1]
403
- livetext draft, html # livetext "foobar.lt3", "foobar.html"
404
- copy(html, "../../remote/post/index.html")
405
- title_line = File.readlines(draft).grep(/^.title /).first
406
- title = title_line.split(" ", 2)[1]
407
- excerpt = File.read("teaser.txt")
408
- vars = %[.set title="#{title.chomp}"\n] +
409
- %[.set teaser="#{excerpt.chomp}"]
410
- theme = "../../theme/standard"
411
- File.open("vars.lt3", "w") {|f| f.puts vars }
412
- livetext "#{theme}/post/generate.lt3", "#{remote}/#{html}"
413
- livetext "#{theme}/post/permalink.lt3", "#{remote}/permalink/#{html}"
414
- log!(str: "About to enter remote/", pwd: true, dir: true)
415
- Dir.chdir(remote) do
416
- log!(str: "Now in remote/", pwd: true, dir: true)
417
- system("cp -r ../themes/standard/widgets .")
418
- log!(str: "finished with remote/", pwd: true, dir: true)
419
- end
420
- end
479
+ views.each do |view|
480
+ _handle_post(draft, view)
481
+ generate_view(view)
421
482
  end
422
483
  end
423
484
 
@@ -2,7 +2,7 @@
2
2
  if ! (Object.constants.include?(:RuneBlog) && RuneBlog.constants.include?(:Path))
3
3
 
4
4
  class RuneBlog
5
- VERSION = "0.2.7"
5
+ VERSION = "0.2.12"
6
6
 
7
7
  path = Gem.find_files("runeblog").grep(/runeblog-/).first
8
8
  Path = File.dirname(path)
@@ -20,7 +20,7 @@ spec = Gem::Specification.new do |s|
20
20
  s.authors = ["Hal Fulton"]
21
21
  s.email = 'rubyhacker@gmail.com'
22
22
  s.executables << "blog"
23
- s.add_runtime_dependency 'livetext', '~> 0.8', '>= 0.8.92'
23
+ s.add_runtime_dependency 'livetext', '~> 0.8', '>= 0.8.93'
24
24
  s.add_runtime_dependency 'rubytext', '~> 0.1', '>= 0.1.16'
25
25
 
26
26
  # Files...
@@ -30,7 +30,7 @@ spec = Gem::Specification.new do |s|
30
30
  test = Find.find("test").to_a
31
31
  misc = %w[./README.lt3 ./README.md ./runeblog.gemspec]
32
32
 
33
- system("tar zcvf empty_view.tgz empty_view")
33
+ # system("tar zcvf empty_view.tgz empty_view")
34
34
 
35
35
  s.files = main + misc + test + ["empty_view.tgz"]
36
36
  s.homepage = 'https://github.com/Hal9000/runeblog'
@@ -42,10 +42,6 @@ x = RuneBlog.new(".blogs")
42
42
 
43
43
  x.create_view("around_austin") # FIXME remember view title!
44
44
 
45
- # puts "=== about to call: x.generate_view('around_austin')"
46
- x.generate_view("around_austin")
47
- # puts "=== ...returned"
48
-
49
45
  # Hack:
50
46
  if File.exist?("publish")
51
47
  system("cp publish .blogs/views/around_austin/publish")
@@ -116,7 +112,7 @@ Blah blah Waller Creek blah blah...
116
112
  BODY
117
113
 
118
114
  make_post(x, "Life on Sabine Street", <<-EXCERPT, <<-BODY)
119
- It's like Pooh Corner, except not.
115
+ It's like Pooh Corner (except not).
120
116
  EXCERPT
121
117
  This is about Sabine St, blah blah lorem ipsum dolor...
122
118
  BODY
@@ -130,6 +126,8 @@ But I first heard of them
130
126
  in 2005.
131
127
  BODY
132
128
 
129
+ x.generate_view("around_austin")
130
+
133
131
  x.change_view("around_austin")
134
132
 
135
133
  puts
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.2.7
4
+ version: 0.2.12
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-09-26 00:00:00.000000000 Z
11
+ date: 2019-10-02 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.8'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.8.92
22
+ version: 0.8.93
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.8'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.8.92
32
+ version: 0.8.93
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rubytext
35
35
  requirement: !ruby/object:Gem::Requirement