runeblog 0.2.99 → 0.3.05

Sign up to get free protection for your applications and to get access to all the features.
@@ -40,7 +40,7 @@ class RuneBlog
40
40
  end
41
41
 
42
42
  attr_reader :views, :sequence
43
- attr_accessor :root, :editor
43
+ attr_accessor :root, :editor, :features
44
44
  attr_accessor :view # overridden
45
45
 
46
46
  attr_accessor :post_views, :post_tags, :dirty_views
@@ -75,15 +75,6 @@ class RuneBlog
75
75
 
76
76
  end
77
77
 
78
- def _tmp_error(err) # FIXME move to helpers
79
- out = "/tmp/blog#{rand(100)}.txt"
80
- File.open(out, "w") do |f|
81
- f.puts err
82
- f.puts err.backtrace.join("\n")
83
- end
84
- puts "Error: See #{out}"
85
- end
86
-
87
78
  def self.create_new_blog_repo(root_rel = ".blogs")
88
79
  log!(enter: __method__, args: [root_rel])
89
80
  raise ArgumentError unless root_rel.is_a?(String) && ! root_rel.empty?
@@ -120,8 +111,9 @@ class RuneBlog
120
111
  self.class.blog = self # Weird. Like a singleton - dumbass circular dependency?
121
112
 
122
113
  @root = Dir.pwd/root_rel
123
- write_repo_config(root: @root)
114
+ write_repo_config(root: @root) # ?? FIXME
124
115
  get_repo_config
116
+ read_features # top level
125
117
  @views = retrieve_views
126
118
  self.view = File.read(@root/"data/VIEW").chomp
127
119
  md = Dir.pwd.match(%r[.*/views/(.*?)/])
@@ -134,16 +126,67 @@ class RuneBlog
134
126
  @post_tags = []
135
127
  end
136
128
 
129
+ def complete_file(name, vars, hash)
130
+ debugging = vars.nil?
131
+ return if hash.empty?
132
+ text = File.read(name)
133
+ if vars.nil? # FIXME dumbest hack ever?
134
+ vars = {}
135
+ hash.values.each {|val| vars[val] = val }
136
+ end
137
+
138
+ hash.each_pair {|key, var| text.gsub!(key, vars[var]) }
139
+ File.write(name, text)
140
+ end
141
+
142
+ def _generate_settings(view = nil)
143
+ vars = read_vars("#@root/data/universal.lt3")
144
+ hash = {/AUTHOR/ => "view.author",
145
+ /SITE/ => "view.site",
146
+ /FONT/ => "font.family",
147
+ /CHARSET/ => :charset,
148
+ /LOCALE/ => :locale}
149
+
150
+ # rubytext.txt - LATER
151
+ # complete_file(settings/"rubytext.txt", {}
152
+
153
+ if view
154
+ settings = @root/view/"settings"
155
+ ### ??? Where to get hash of view-specific vars?
156
+
157
+ # features.txt - handle specially
158
+ fname = settings/"features.txt"
159
+
160
+ # view.txt
161
+ complete_file(settings/"view.txt",
162
+ /AUTHOR/ => "view.author",
163
+ /TITLE/ => "view.title",
164
+ /SUBTITLE/ => "view.subtitle",
165
+ /SITE/ => "view.site")
166
+
167
+ # publish.txt
168
+ complete_file(settings/"publish.txt",
169
+ /USER/ => "publish.user",
170
+ /SERVER/ => "publish.server",
171
+ /DOCROOT/ => "publish.docroot",
172
+ /PATH/ => "publish.path",
173
+ /PROTO/ => "publish.proto")
174
+
175
+ # recent.txt - SKIP THIS?
176
+ complete_file(settings/"recent.txt", {})
177
+ end
178
+ end
179
+
137
180
  def _generate_global
138
181
  vars = read_vars("#@root/data/universal.lt3")
139
182
  gfile = "#@root/data/global.lt3"
140
- global = File.read(gfile)
141
- global.gsub!(/AUTHOR/, vars["author"])
142
- global.gsub!(/SITE/, vars["site"])
143
- global.gsub!(/FONT/, vars["font.family"])
144
- global.gsub!(/CHARSET/, vars["charset"])
145
- global.gsub!(/LOCALE/, vars["locale"])
146
- File.write(gfile, global)
183
+ hash = {/AUTHOR/ => "univ.author",
184
+ /SITE/ => "univ.site",
185
+ /FONT/ => "font.family",
186
+ /CHARSET/ => :charset,
187
+ /LOCALE/ => :locale}
188
+ complete_file(gfile, vars, hash)
189
+ _generate_settings
147
190
  end
148
191
 
149
192
  def _deploy_local(dir)
@@ -151,10 +194,7 @@ class RuneBlog
151
194
  Dir.chdir(dir) do
152
195
  views = _retrieve_metadata(:views)
153
196
  views.each do |v|
154
- unless self.view?(v)
155
- puts "#{fx("Warning:", :red)} #{fx(v, :bold)} is not a view"
156
- next
157
- end
197
+ next unless _check_view?(v)
158
198
  system!("cp *html #@root/views/#{v}/remote", show: true)
159
199
  end
160
200
  end
@@ -162,6 +202,8 @@ class RuneBlog
162
202
  _tmp_error(err)
163
203
  end
164
204
 
205
+ # FIXME reconcile with _get_draft data
206
+
165
207
  def _retrieve_metadata(key)
166
208
  key = key.to_s
167
209
  lines = File.readlines("metadata.txt")
@@ -244,11 +286,15 @@ class RuneBlog
244
286
  @view = nil
245
287
  when RuneBlog::View
246
288
  @view = arg
289
+ read_features(@view)
290
+ @view.get_globals
247
291
  _set_publisher
248
292
  when String
249
293
  new_view = str2view(arg)
250
294
  raise NoSuchView(arg) if new_view.nil?
251
295
  @view = new_view
296
+ read_features(@view)
297
+ @view.get_globals
252
298
  _set_publisher
253
299
  else
254
300
  raise CantAssignView(arg.class.to_s)
@@ -324,6 +370,7 @@ class RuneBlog
324
370
  add_view(view_name)
325
371
  mark_last_published("Initial creation")
326
372
  system("cp #@root/data/global.lt3 #@root/views/#{view_name}/themes/standard/global.lt3")
373
+ @view.get_globals
327
374
  rescue => err
328
375
  _tmp_error(err)
329
376
  end
@@ -404,16 +451,18 @@ class RuneBlog
404
451
  return posts[0..19] # return 20 at most
405
452
  end
406
453
 
407
- def collect_recent_posts(file)
454
+ def collect_recent_posts(file = "recent.html")
408
455
  log!(enter: __method__, args: [file], level: 3)
456
+ vars = self.view.globals
409
457
  text = <<-HTML
410
458
  <html>
411
459
  <head><link rel="stylesheet" href="etc/blog.css"></head>
412
- <body>
460
+ <body style="background-color: #{vars["recent.bgcolor"]}">
413
461
  HTML
414
462
  posts = _sorted_posts
415
463
  if posts.size > 0
416
- wanted = [8, posts.size].min # estimate how many we want?
464
+ # estimate how many we want
465
+ wanted = [vars["recent.count"].to_i, posts.size].min
417
466
  enum = posts.each
418
467
  entries = []
419
468
  wanted.times do
@@ -485,7 +534,7 @@ class RuneBlog
485
534
  log!(enter: __method__, args: [view], pwd: true, dir: true)
486
535
  raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
487
536
  @vdir = @root/:views/view
488
- num = collect_recent_posts("recent.html")
537
+ num = collect_recent_posts
489
538
  return num
490
539
  rescue => err
491
540
  _tmp_error(err)
@@ -506,7 +555,7 @@ class RuneBlog
506
555
  call: ".nopara"
507
556
  copy!("#{vdir}/themes/standard/banner/*", "#{vdir}/remote/banner/") # includes navbar/
508
557
  copy("#{vdir}/assets/*", "#{vdir}/remote/assets/")
509
- # rebuild widgets
558
+ # rebuild widgets?
510
559
  copy_widget_html(view)
511
560
  rescue => err
512
561
  STDERR.puts err
@@ -514,6 +563,27 @@ class RuneBlog
514
563
  # _tmp_error(err)
515
564
  end
516
565
 
566
+ def _get_draft_data(num, sym)
567
+ tag = prefix(num)
568
+ front = @blog.root/:drafts/tag
569
+ files = Dir[front + "*"]
570
+ raise "No draft #{num} found" if files.empty?
571
+ raise "Too many files found for #{num}!" if files.size > 1
572
+ file = files.first
573
+ lines = File.readlines(file)
574
+ case sym
575
+ when :views
576
+ view_line = lines.grep(/^.views /)
577
+ raise "More than one .views call in #{draft}" if view_line.size > 1
578
+ raise "No .views call in #{draft}" if view_line.size < 1
579
+ view_line = view_line.first
580
+ views = view_line[7..-1].split
581
+ return views.uniq
582
+ else
583
+ raise "Unknown symbol #{sym.inspect}"
584
+ end
585
+ end
586
+
517
587
  def _get_views(draft)
518
588
  log!(enter: __method__, args: [draft], level: 2)
519
589
  # FIXME dumb code
@@ -603,6 +673,8 @@ class RuneBlog
603
673
  log!(enter: __method__, args: [draft, view_name], level: 2)
604
674
  # break into separate methods?
605
675
 
676
+ return unless _check_view?(view_name)
677
+
606
678
  fname = File.basename(draft) # 0001-this-is-a-post.lt3
607
679
  nslug = fname.sub(/.lt3$/, "") # 0001-this-is-a-post
608
680
  aslug = nslug.sub(/\d\d\d\d-/, "") # this-is-a-post
@@ -632,30 +704,16 @@ class RuneBlog
632
704
  _tmp_error(err)
633
705
  end
634
706
 
707
+ def _check_view?(view)
708
+ flag = self.view?(view)
709
+ puts " Warning: '#{view}' is not a view" unless flag
710
+ flag
711
+ end
712
+
635
713
  def generate_post(draft, force = false)
636
714
  log!(enter: __method__, args: [draft], level: 1)
637
715
  views = _get_views(draft)
638
- views.each do |view|
639
- unless self.view?(view)
640
- puts "Warning: '#{view}' is not a view"
641
- next
642
- end
643
- _handle_post(draft, view)
644
- end
645
- rescue => err
646
- _tmp_error(err)
647
- end
648
-
649
- def rebuild_post(file)
650
- log!(enter: __method__, args: [file])
651
- raise "Doesn't currently work"
652
- debug "Called rebuild_post(#{file.inspect})"
653
- raise ArgumentError unless file.is_a?(String)
654
- meta = process_post(file)
655
- @views_dirty ||= []
656
- @views_dirty << meta.views
657
- @views_dirty.flatten!
658
- @views_dirty.uniq!
716
+ views.each {|view| _handle_post(draft, view) }
659
717
  rescue => err
660
718
  _tmp_error(err)
661
719
  end
@@ -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.99"
6
+ VERSION = "0.3.05"
7
7
 
8
8
  path = Gem.find_files("runeblog").grep(/runeblog-/).first
9
9
  Path = File.dirname(path)
@@ -14,7 +14,13 @@ class RuneBlog::View
14
14
  @publisher = RuneBlog::Publishing.new(name)
15
15
  @can_publish = true # FIXME
16
16
  @blog.view = self
17
+ get_globals
18
+ end
19
+
20
+ def get_globals
17
21
  gfile = @blog.root/"views/#{name}/themes/standard/global.lt3"
22
+ return unless File.exist?(gfile) # Hackish!! how is View.new called from create_view??
23
+
18
24
  live = Livetext.customize(call: ".nopara")
19
25
  live.xform_file(gfile)
20
26
  @globals = live.vars
@@ -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.99'
23
+ s.add_runtime_dependency 'livetext', '~> 0.9', '>= 0.9.01'
24
24
  s.add_runtime_dependency 'rubytext', '~> 0.1', '>= 0.1.20'
25
25
 
26
26
  s.add_development_dependency 'minitest', '~> 5.10', '>= 5.10.0'
@@ -31,7 +31,7 @@ end
31
31
  @fake_date = Date.today - 20
32
32
 
33
33
  def make_post(x, title, teaser, body, views=[])
34
- debug " make_post #{bold(title)}"
34
+ debug " make_post #{bold(title)}"
35
35
  pubdate = @fake_date.strftime("%Y-%m-%d")
36
36
  @fake_date += (rand(2) + 1)
37
37
  x.create_new_post(title, true, teaser: teaser, body: body, views: views,
@@ -53,28 +53,26 @@ puts
53
53
  debug bold("Generating test blog...")
54
54
 
55
55
  system("rm -rf .blogs")
56
- RuneBlog.create_new_blog_repo(".blogs")
57
- x = RuneBlog.new(".blogs")
56
+ RuneBlog.create_new_blog_repo # (".blogs")
57
+ x = RuneBlog.new # (".blogs")
58
58
 
59
59
  debug("create_view: #{bold('around_austin')}")
60
60
  x.create_view("around_austin") # FIXME remember view title!
61
61
 
62
- #### FIXME later!!
63
- vars = <<-VARS
64
-
65
- .variables
66
- blog Around Austin
67
- blog.desc The view from downtown...
62
+ #### FIXME
68
63
 
69
- font.family verdana
70
- .end
64
+ vars = <<-VARS
65
+ author Hal Fulton
66
+ title Around Austin
67
+ subtitle The view from downtown...
68
+ domain foo.com
71
69
  VARS
72
- File.open(".blogs/views/around_austin/themes/standard/global.lt3", "a") do |f|
73
- f.puts vars
74
- end
70
+ vfile = ".blogs/views/around_austin/settings/view.txt"
71
+ File.open(vfile, "w") {|f| f.puts vars }
72
+
75
73
  ####
76
74
 
77
- debug("-- change_view: #{bold('around_austin')}")
75
+ debug("change_view: #{bold('around_austin')}")
78
76
  x.change_view("around_austin") # 1 2 7 8 9
79
77
 
80
78
  make_post(x, "What's at Stubbs...", <<-EXCERPT, <<-BODY)
@@ -144,11 +142,10 @@ But I first heard of them
144
142
  in 2005.
145
143
  BODY
146
144
 
147
- debug
148
- debug "** generate_index #{bold("around_austin")}"
145
+ debug "generate_index #{bold("around_austin")}"
149
146
  x.generate_index("around_austin")
150
147
 
151
- debug("** generate_view: #{bold('around_austin')}")
148
+ debug("generate_view: #{bold('around_austin')}")
152
149
  x.generate_view("around_austin")
153
150
 
154
151
  debug bold("...finished.\n")
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.99
4
+ version: 0.3.05
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-26 00:00:00.000000000 Z
11
+ date: 2020-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: livetext
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.8'
19
+ version: '0.9'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.8.99
22
+ version: 0.9.01
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '0.8'
29
+ version: '0.9'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.8.99
32
+ version: 0.9.01
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rubytext
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -85,6 +85,7 @@ files:
85
85
  - data/EDITOR
86
86
  - data/ROOT
87
87
  - data/VIEW
88
+ - data/features.txt
88
89
  - data/global.lt3
89
90
  - data/universal.lt3
90
91
  - empty_view/assets/austin-pano.jpg
@@ -109,6 +110,7 @@ files:
109
110
  - empty_view/config/twitter/twitter.rb
110
111
  - empty_view/posts/GIT_IS_DUMB
111
112
  - empty_view/remote/assets/GIT_IS_DUMB
113
+ - empty_view/remote/banner/navbar/GIT_IS_DUMB
112
114
  - empty_view/remote/etc/GIT_IS_DUMB
113
115
  - empty_view/remote/permalink/GIT_IS_DUMB
114
116
  - empty_view/remote/widgets/ad/GIT_IS_DUMB
@@ -116,6 +118,10 @@ files:
116
118
  - empty_view/remote/widgets/news/GIT_IS_DUMB
117
119
  - empty_view/remote/widgets/pages/GIT_IS_DUMB
118
120
  - empty_view/remote/widgets/pinned/GIT_IS_DUMB
121
+ - empty_view/settings/features.txt
122
+ - empty_view/settings/publish.txt
123
+ - empty_view/settings/recent.txt
124
+ - empty_view/settings/view.txt
119
125
  - empty_view/themes/standard/README
120
126
  - empty_view/themes/standard/banner/banner.lt3
121
127
  - empty_view/themes/standard/banner/navbar/about.lt3
@@ -131,12 +137,10 @@ files:
131
137
  - empty_view/themes/standard/etc/externals.lt3
132
138
  - empty_view/themes/standard/etc/favicon.ico
133
139
  - empty_view/themes/standard/etc/misc.js
134
- - empty_view/themes/standard/global.lt3
135
140
  - empty_view/themes/standard/post/generate.lt3
136
141
  - empty_view/themes/standard/post/head.lt3
137
142
  - empty_view/themes/standard/post/index.lt3
138
143
  - empty_view/themes/standard/post/permalink.lt3
139
- - empty_view/themes/standard/recent.txt
140
144
  - empty_view/themes/standard/widgets/README
141
145
  - empty_view/themes/standard/widgets/ad/ad.lt3
142
146
  - empty_view/themes/standard/widgets/ad/ad1.png
@@ -1,32 +0,0 @@
1
- . --------------------------------------------------
2
- . Global settings are stored here in the form
3
- . <variable> <value>
4
- . --------------------------------------------------
5
-
6
- .variables
7
- author Your name here
8
- blog Blog title goes here
9
- blog.desc Subtitle (if any) goes here
10
- site rubyhacker.com
11
-
12
- host localhost:4000//
13
- charset utf-8
14
- url localhost:4000//
15
- locale en_US
16
-
17
- font.family verdana
18
-
19
- recent.title.color #010101
20
- recent.title.size 28px
21
- recent.text.color #0101a1
22
- recent.text.size 22px
23
- recent.date.color #9a9a9a
24
- recent.date.size 15px
25
-
26
- publish.user root
27
- publish.server rubyhacker.com
28
- publish.docroot /var/www/
29
- publish.path stuff
30
- publish.proto http
31
- .end
32
-