runeblog 0.2.90 → 0.2.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/bin/blog +10 -7
  3. data/{lib → empty_view/config}/exper/2svg.lt3 +0 -0
  4. data/{lib → empty_view/config}/exper/gen_svg.rb +0 -0
  5. data/empty_view/config/exper/meta.html +10 -0
  6. data/{lib → empty_view/config}/exper/s2.html +0 -0
  7. data/{lib → empty_view/config}/exper/varmint.rb +0 -0
  8. data/empty_view/config/facebook/facebook.rb +37 -0
  9. data/empty_view/config/facebook/fb.html +10 -0
  10. data/empty_view/config/facebook/fb.js +13 -0
  11. data/empty_view/config/reddit/config.txt +6 -0
  12. data/empty_view/config/reddit/notes.txt +4 -0
  13. data/empty_view/config/reddit/reddit_post_url.py +34 -0
  14. data/empty_view/config/reddit/redpost.rb +43 -0
  15. data/empty_view/config/reddit/the-graffiti-wall.html +91 -0
  16. data/empty_view/config/twitter/tw.html +12 -0
  17. data/empty_view/config/twitter/tw.js +5 -0
  18. data/{lib/exper/fbtw.rb → empty_view/config/twitter/twitter.rb} +1 -23
  19. data/empty_view/themes/standard/{blog → banner}/banner.lt3 +0 -0
  20. data/empty_view/themes/standard/banner/{about.lt3 → navbar/about.lt3} +0 -0
  21. data/empty_view/themes/standard/banner/{contact.lt3 → navbar/contact.lt3} +0 -0
  22. data/empty_view/themes/standard/banner/navbar/faq.lt3 +1 -0
  23. data/empty_view/themes/standard/banner/{list.data → navbar/list.data} +0 -0
  24. data/empty_view/themes/standard/blog/generate.lt3 +1 -1
  25. data/empty_view/themes/standard/global.lt3 +1 -1
  26. data/empty_view/themes/standard/post/generate.lt3 +1 -1
  27. data/empty_view/themes/standard/post/index.lt3 +8 -8
  28. data/empty_view/themes/standard/widgets/links/links.rb +1 -1
  29. data/empty_view/themes/standard/widgets/news/news.rb +1 -1
  30. data/empty_view/themes/standard/widgets/pages/pages.rb +2 -2
  31. data/empty_view/themes/standard/widgets/pinned/pinned.rb +1 -1
  32. data/lib/helpers-blog.rb +30 -63
  33. data/lib/helpers-repl.rb +3 -13
  34. data/lib/liveblog.rb +56 -42
  35. data/lib/lowlevel.rb +73 -0
  36. data/lib/publish.rb +6 -22
  37. data/lib/repl.rb +25 -16
  38. data/lib/runeblog.rb +46 -15
  39. data/lib/runeblog_version.rb +1 -17
  40. metadata +24 -16
  41. data/empty_view/remote/banner/austin-pano.jpg +0 -0
  42. data/empty_view/themes/standard/banner/faq.lt3 +0 -1
  43. data/lib/default.rb +0 -31
  44. data/lib/exper/callout.js +0 -10
  45. data/lib/exper/fbtw-js +0 -48
@@ -37,31 +37,15 @@ class RuneBlog::Publishing
37
37
  url = "#@proto://#@server/#@path" # /#{vname}"
38
38
  end
39
39
 
40
- def system!(str)
41
- log!(enter: __method__, args: [str], level: 1)
42
- rc = system(str)
43
- rc
44
- end
45
-
46
- def publish(files, assets=[])
47
- log!(enter: __method__, args: [files, assets], level: 1)
40
+ def publish
41
+ log!(enter: __method__, level: 1)
48
42
  dir = @docroot/@path
49
43
  view_name = @blog.view.name
50
44
  viewpath = dir # /view_name
51
- result = system!("ssh #@user@#@server -x mkdir -p #{viewpath}/assets")
52
- files.each do |file|
53
- dest = "#@user@#@server:" + dir # /view_name
54
- file.gsub!(/\/\//, "/") # weird... :-/
55
- cmd = "scp -r #{file} #{dest} >/dev/null 2>/tmp/wtf"
56
- debug "cmd = #{cmd.inspect} - see /tmp/wtf"
57
- result = system!(cmd) || puts("\n Could not copy #{file} to #{dest}")
58
- end
59
- unless assets.empty?
60
- cmd = "scp #{assets.join(' ')} #@user@#@server:#{viewpath}/assets >/dev/null 2>/tmp/wtf2"
61
- result = system!(cmd)
62
- raise PublishError if !result
63
- end
64
- dump(files, "#{@blog.view.dir}/last_published")
45
+ # FIXME rsync doesn't work
46
+ cmd = "rsync -r -z #{@blog.root}/views/#{@blog.view}/remote/ #@user@#@server:#{viewpath}/"
47
+ system!(cmd)
48
+ dump("#{@blog.view} at #{Time.now}", "#{@blog.view.dir}/last_published")
65
49
  true
66
50
  end
67
51
 
@@ -39,6 +39,7 @@ module RuneBlog::REPL
39
39
 
40
40
  def cmd_config(arg, testing = false)
41
41
  hash = {"global.lt3 Global configuration" => "global.lt3",
42
+ "banner/top.lt3 Text portion of banner" => "banner/top.lt3",
42
43
  "blog/generate.lt3 Generator for view (usu not edited)" => "blog/generate.lt3",
43
44
  ".... head.lt3 HEAD info for view" => "blog/head.lt3",
44
45
  ".... banner.lt3 banner description" => "blog/banner.lt3",
@@ -75,10 +76,10 @@ module RuneBlog::REPL
75
76
  end
76
77
 
77
78
  def _manage_navbar(arg, testing = false) # cloned from manage_pages
78
- dir = @blog.view.dir/"themes/standard/navbar"
79
+ dir = @blog.view.dir/"themes/standard/banner/navbar"
79
80
  files = Dir.entries(dir) - %w[. .. navbar.lt3]
80
- new_item = " [New item] "
81
81
  main_file = "[ navbar.lt3 ]"
82
+ new_item = " [New item] "
82
83
  files = [main_file] + files + [new_item]
83
84
  num, fname = STDSCR.menu(title: "Edit navbar:", items: files)
84
85
  return if fname.nil?
@@ -113,7 +114,7 @@ module RuneBlog::REPL
113
114
  dir = @blog.view.dir/"themes/standard/widgets/pages"
114
115
  # Assume child files already generated (and list.data??)
115
116
  data = dir/"list.data"
116
- lines = File.readlines(data)
117
+ lines = _get_data?(data)
117
118
  hash = {}
118
119
  lines.each do |line|
119
120
  url, name = line.chomp.split(",")
@@ -192,19 +193,8 @@ module RuneBlog::REPL
192
193
  return @out
193
194
  end
194
195
 
195
- # Need to check dirty/clean status first
196
- dirty, all, assets = @blog.view.publishable_files
197
- files = dirty
198
- if dirty.empty?
199
- puts fx("\n No files are out of date." + " "*20, :bold)
200
- print " Publish anyway? "
201
- yn = RubyText.gets.chomp
202
- files = all if yn == "y"
203
- end
204
- return @out if files.empty?
205
-
206
196
  ret = RubyText.spinner(label: " Publishing... ") do
207
- @blog.view.publisher.publish(files, assets) # FIXME weird?
197
+ @blog.view.publisher.publish
208
198
  end
209
199
  return @out unless ret
210
200
 
@@ -224,12 +214,31 @@ module RuneBlog::REPL
224
214
  puts "Error: See #{out}"
225
215
  end
226
216
 
217
+ def fresh?(src, dst)
218
+ return false unless File.exist?(dst)
219
+ File.mtime(src) <= File.mtime(dst)
220
+ end
221
+
222
+ def regen_posts
223
+ drafts = @blog.drafts # current view
224
+ drafts.each do |draft|
225
+ orig = @blog.root/:drafts/draft
226
+ html = @blog.root/:posts/draft
227
+ html.sub!(/.lt3$/, "/guts.html")
228
+ next if fresh?(orig, html)
229
+ puts " Regenerating #{draft}"
230
+ @blog.generate_post(orig) # rebuild post
231
+ end
232
+ puts
233
+ end
234
+
227
235
  def cmd_rebuild(arg, testing = false)
228
236
  debug "Starting cmd_rebuild..."
229
237
  reset_output
230
238
  puts unless testing
231
239
  @blog.generate_view(@blog.view)
232
240
  @blog.generate_index(@blog.view)
241
+ regen_posts
233
242
  @out
234
243
  rescue => err
235
244
  out = "/tmp/blog#{rand(100)}.txt"
@@ -267,7 +276,7 @@ module RuneBlog::REPL
267
276
  def cmd_new_view(arg, testing = false)
268
277
  reset_output
269
278
  if arg.nil?
270
- arg = ask("\nFilename: ")
279
+ arg = ask(fx("\nFilename: ", :bold))
271
280
  puts
272
281
  end
273
282
  @blog.create_view(arg)
@@ -10,7 +10,6 @@ require 'logging'
10
10
 
11
11
  require 'runeblog_version'
12
12
  require 'helpers-blog'
13
- require 'default'
14
13
  require 'view'
15
14
  require 'publish'
16
15
  require 'post'
@@ -48,6 +47,34 @@ class RuneBlog
48
47
 
49
48
  include Helpers
50
49
 
50
+ class Default
51
+
52
+ # This will all become much more generic later.
53
+
54
+ def RuneBlog.post_template(num: 0, title: "No title", date: nil, view: "test_view",
55
+ teaser: "No teaser", body: "No body", tags: ["untagged"],
56
+ views: [], back: "javascript:history.go(-1)", home: "no url")
57
+ log!(enter: __method__, args: [num, title, date, view, teaser, body, tags, views, back, home], level: 3)
58
+ viewlist = (views + [view.to_s]).join(" ")
59
+ taglist = ".tags " + tags.join(" ")
60
+
61
+ <<~TEXT
62
+ .post #{num}
63
+
64
+ .title #{title}
65
+ .pubdate #{date}
66
+ .views #{viewlist}
67
+ #{taglist}
68
+
69
+ .teaser
70
+ #{teaser}
71
+ .end
72
+ #{body}
73
+ TEXT
74
+ end
75
+
76
+ end
77
+
51
78
  def _tmp_error(err) # FIXME move to helpers
52
79
  out = "/tmp/blog#{rand(100)}.txt"
53
80
  File.open(out, "w") do |f|
@@ -65,10 +92,13 @@ class RuneBlog
65
92
  raise BlogRepoAlreadyExists if Dir.exist?(repo_root)
66
93
  create_dirs(repo_root)
67
94
  Dir.chdir(repo_root) do
68
- create_dirs(:data, :drafts, :views, :posts)
95
+ create_dirs(:data, :config, :drafts, :views, :posts)
69
96
  new_sequence
70
97
  end
71
- copy_data(:config, repo_root/:data)
98
+ unless File.exist?(repo_root/"data/VIEW")
99
+ copy_data(:config, repo_root/:data)
100
+ end
101
+ copy_data(:extra, repo_root/:config)
72
102
  write_repo_config(root: repo_root)
73
103
  @blog = self.new
74
104
  @blog
@@ -90,10 +120,10 @@ class RuneBlog
90
120
  self.class.blog = self # Weird. Like a singleton - dumbass circular dependency?
91
121
 
92
122
  @root = Dir.pwd/root_rel
93
- copy_data(:config, @root/:data)
94
123
  write_repo_config(root: @root)
95
124
  get_repo_config
96
- @views = get_views
125
+ @views = retrieve_views
126
+ self.view = File.read(@root/"data/VIEW").chomp
97
127
  md = Dir.pwd.match(%r[.*/views/(.*?)/])
98
128
  if md
99
129
  @view_name = md[1]
@@ -163,7 +193,7 @@ class RuneBlog
163
193
  dir = @root/:posts/nslug
164
194
  create_dirs(dir)
165
195
  # FIXME dependencies?
166
- preprocess cwd: dir, src: @root/:drafts/sourcefile,
196
+ preprocess cwd: dir, src: @root/:drafts/sourcefile, dst: @root/:posts/sourcefile.sub(/.lt3/, ",html"), # ZZZ
167
197
  mix: "liveblog" # , debug: true
168
198
  _deploy_local(dir)
169
199
  rescue => err
@@ -209,6 +239,9 @@ class RuneBlog
209
239
  def view=(arg)
210
240
  log!(enter: __method__, args: [arg], level: 2)
211
241
  case arg
242
+ when "[no view]"
243
+ # puts "Warning: No current view set"
244
+ @view = nil
212
245
  when RuneBlog::View
213
246
  @view = arg
214
247
  _set_publisher
@@ -226,13 +259,13 @@ class RuneBlog
226
259
 
227
260
  def get_sequence
228
261
  log!(enter: __method__, level: 3)
229
- File.read(@root/:sequence).to_i
262
+ File.read(@root/"data/sequence").to_i
230
263
  end
231
264
 
232
265
  def next_sequence
233
266
  log!(enter: __method__, level: 3)
234
267
  @sequence += 1
235
- dump(@sequence, @root/:sequence)
268
+ dump(@sequence, @root/"data/sequence")
236
269
  @sequence
237
270
  end
238
271
 
@@ -472,7 +505,9 @@ class RuneBlog
472
505
  preprocess cwd: vdir/"themes/standard", deps: depend, force: true,
473
506
  src: "blog/generate.lt3", dst: vdir/:remote/"index.html",
474
507
  call: ".nopara"
508
+ copy!("#{vdir}/themes/standard/banner/*", "#{vdir}/remote/banner/") # includes navbar/
475
509
  copy("#{vdir}/assets/*", "#{vdir}/remote/assets/")
510
+ # rebuild widgets
476
511
  copy_widget_html(view)
477
512
  rescue => err
478
513
  STDERR.puts err
@@ -484,8 +519,8 @@ class RuneBlog
484
519
  log!(enter: __method__, args: [draft], level: 2)
485
520
  # FIXME dumb code
486
521
  view_line = File.readlines(draft).grep(/^.views /)
487
- raise "More than one .views call!" if view_line.size > 1
488
- raise "No .views call!" if view_line.size < 1
522
+ raise "More than one .views call in #{draft}" if view_line.size > 1
523
+ raise "No .views call in #{draft}" if view_line.size < 1
489
524
  view_line = view_line.first
490
525
  views = view_line[7..-1].split
491
526
  views.uniq
@@ -593,16 +628,12 @@ class RuneBlog
593
628
  preprocess cwd: @theme/:post, src: "generate.lt3", force: true,
594
629
  dst: remote/ahtml, copy: @theme/:post,
595
630
  call: ".nopara" # , debug: true
596
- # FIXME dependencies?
597
- preprocess cwd: @theme/:post, src: "permalink.lt3",
598
- dst: remote/:permalink/ahtml,
599
- mix: "liveblog" # , debug: true
600
631
  copy_widget_html(view_name)
601
632
  rescue => err
602
633
  _tmp_error(err)
603
634
  end
604
635
 
605
- def generate_post(draft)
636
+ def generate_post(draft, force = false)
606
637
  log!(enter: __method__, args: [draft], level: 1)
607
638
  views = _get_views(draft)
608
639
  views.each do |view|
@@ -3,7 +3,7 @@ if !defined?(RuneBlog::Path)
3
3
  # if ! (Object.constants.include?(:RuneBlog) && RuneBlog.constants.include?(:Path))
4
4
 
5
5
  class RuneBlog
6
- VERSION = "0.2.90"
6
+ VERSION = "0.2.95"
7
7
 
8
8
  path = Gem.find_files("runeblog").grep(/runeblog-/).first
9
9
  Path = File.dirname(path)
@@ -41,22 +41,6 @@ def make_exception(sym, str)
41
41
  end
42
42
  end
43
43
 
44
- def system!(str, show: false)
45
- log!(enter: __method__, args: [str], level: 2)
46
- STDERR.puts str if show
47
- rc = system(str)
48
- if rc
49
- return rc
50
- else
51
- STDERR.puts "FAILED: #{str.inspect}"
52
- STDERR.puts "\ncaller = \n#{caller.join("\n ")}\n"
53
- sleep 6; RubyText.stop
54
- exit
55
- return rc
56
- end
57
- rc
58
- end
59
-
60
44
  def prefix(num)
61
45
  log!(enter: __method__, args: [num], level: 3)
62
46
  "#{'%04d' % num.to_i}"
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.90
4
+ version: 0.2.95
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-12-18 00:00:00.000000000 Z
11
+ date: 2019-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: livetext
@@ -89,9 +89,24 @@ files:
89
89
  - data/universal.lt3
90
90
  - empty_view/assets/austin-pano.jpg
91
91
  - empty_view/assets/sky2.jpg
92
+ - empty_view/config/exper/2svg.lt3
93
+ - empty_view/config/exper/gen_svg.rb
94
+ - empty_view/config/exper/meta.html
95
+ - empty_view/config/exper/s2.html
96
+ - empty_view/config/exper/varmint.rb
97
+ - empty_view/config/facebook/facebook.rb
98
+ - empty_view/config/facebook/fb.html
99
+ - empty_view/config/facebook/fb.js
100
+ - empty_view/config/reddit/config.txt
101
+ - empty_view/config/reddit/notes.txt
102
+ - empty_view/config/reddit/reddit_post_url.py
103
+ - empty_view/config/reddit/redpost.rb
104
+ - empty_view/config/reddit/the-graffiti-wall.html
105
+ - empty_view/config/twitter/tw.html
106
+ - empty_view/config/twitter/tw.js
107
+ - empty_view/config/twitter/twitter.rb
92
108
  - empty_view/posts/GIT_IS_DUMB
93
109
  - empty_view/remote/assets/GIT_IS_DUMB
94
- - empty_view/remote/banner/austin-pano.jpg
95
110
  - empty_view/remote/etc/GIT_IS_DUMB
96
111
  - empty_view/remote/permalink/GIT_IS_DUMB
97
112
  - empty_view/remote/widgets/ad/GIT_IS_DUMB
@@ -100,12 +115,12 @@ files:
100
115
  - empty_view/remote/widgets/pages/GIT_IS_DUMB
101
116
  - empty_view/remote/widgets/pinned/GIT_IS_DUMB
102
117
  - empty_view/themes/standard/README
103
- - empty_view/themes/standard/banner/about.lt3
104
- - empty_view/themes/standard/banner/contact.lt3
105
- - empty_view/themes/standard/banner/faq.lt3
106
- - empty_view/themes/standard/banner/list.data
118
+ - empty_view/themes/standard/banner/banner.lt3
119
+ - empty_view/themes/standard/banner/navbar/about.lt3
120
+ - empty_view/themes/standard/banner/navbar/contact.lt3
121
+ - empty_view/themes/standard/banner/navbar/faq.lt3
122
+ - empty_view/themes/standard/banner/navbar/list.data
107
123
  - empty_view/themes/standard/banner/top.lt3
108
- - empty_view/themes/standard/blog/banner.lt3
109
124
  - empty_view/themes/standard/blog/generate.lt3
110
125
  - empty_view/themes/standard/blog/head.lt3
111
126
  - empty_view/themes/standard/blog/index.lt3
@@ -176,18 +191,11 @@ files:
176
191
  - empty_view/themes/standard/widgets/tag-cloud/tag-cloud.lt3
177
192
  - empty_view/themes/standard/widgets/tag-cloud/tag-cloud.rb
178
193
  - lib/Javascript.stuff
179
- - lib/default.rb
180
- - lib/exper/2svg.lt3
181
- - lib/exper/callout.js
182
- - lib/exper/fbtw-js
183
- - lib/exper/fbtw.rb
184
- - lib/exper/gen_svg.rb
185
- - lib/exper/s2.html
186
- - lib/exper/varmint.rb
187
194
  - lib/helpers-blog.rb
188
195
  - lib/helpers-repl.rb
189
196
  - lib/liveblog.rb
190
197
  - lib/logging.rb
198
+ - lib/lowlevel.rb
191
199
  - lib/pathmagic.rb
192
200
  - lib/post.rb
193
201
  - lib/processing.rb
@@ -1 +0,0 @@
1
- .include ../widgets/pages/faq.lt3
@@ -1,31 +0,0 @@
1
- class RuneBlog::Default
2
-
3
- # This will all become much more generic later.
4
-
5
- def RuneBlog.post_template(num: 0, title: "No title", date: nil, view: "test_view",
6
- teaser: "No teaser", body: "No body", tags: ["untagged"],
7
- views: [], back: "javascript:history.go(-1)", home: "no url")
8
- log!(enter: __method__, args: [num, title, date, view, teaser, body, tags, views, back, home], level: 3)
9
- viewlist = (views + [view.to_s]).join(" ")
10
- taglist = ".tags " + tags.join(" ")
11
-
12
- # .mixin liveblog
13
- # . ^ get rid of this later
14
-
15
- <<-TEXT
16
- .post #{num}
17
-
18
- .title #{title}
19
- .pubdate #{date}
20
- .views #{viewlist}
21
- #{taglist}
22
-
23
- .teaser
24
- #{teaser}
25
- .end
26
- #{body}
27
- TEXT
28
-
29
- end
30
-
31
- end
@@ -1,10 +0,0 @@
1
- function callout(d, id, src) {
2
- var js, fjs = d.getElementsByTagName('script')[0];
3
- p=/^http:/.test(d.location)?'http':'https';
4
- if (d.getElementById(id)) {return;}
5
- js = d.createElement('script');
6
- js.id = id;
7
- js.src = p + src;
8
- fjs.parentNode.insertBefore(js, fjs);
9
- }
10
-
@@ -1,48 +0,0 @@
1
-
2
- <!-- scripts: FB, twitter -->
3
-
4
- <script>
5
- window.fbAsyncInit = function() {
6
- FB.init({
7
- appId : '1176481582378716',
8
- xfbml : true,
9
- version : 'v2.4'
10
- });
11
- };
12
-
13
- callout(document, 'facebook-jssdk',
14
- '//connect.facebook.net/en_US/sdk.js');
15
-
16
- callout(document, 'script', 'twitter-wjs',
17
- '//platform.twitter.com/widgets.js';
18
- </script>
19
-
20
- <!-- meta tags -->
21
-
22
- <!-- meta property='fb:admins' content='767352779' /> -->
23
- <meta property='og:url' content='http://rubyhacker.com/blog2/#{slug}.html'/>
24
- <meta property='og:type' content='article'/>
25
- <meta property='og:title' content='#{title}'/>
26
- <meta property='og:image' content='http://rubyhacker.com/blog2/blog3b.gif'/>
27
- <meta property='og:description' content='#{teaser}'/>
28
-
29
- <!-- facebook -->
30
-
31
- <div
32
- class='fb-like'
33
- data-share='true'
34
- data-width='450'
35
- data-show-faces='true'>
36
- </div>
37
-
38
- <!-- Twitter: share, follow -->
39
-
40
- <a href='https://twitter.com/share'
41
- class='twitter-share-button'
42
- data-text='#{title}'
43
- data-url='#{'url'}'
44
- data-via='hal_fulton'
45
- data-related='hal_fulton'>Tweet</a>
46
-
47
- <a href='https://twitter.com/hal_fulton' class='twitter-follow-button' data-show-count='false'>Follow @hal_fulton</a>
48
-