runeblog 0.2.90 → 0.2.95

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