lib/runeblog.rb in runeblog-0.2.3 vs lib/runeblog.rb in runeblog-0.2.5
- old
+ new
@@ -1,7 +1,9 @@
require 'date'
+require 'logging'
+
require 'runeblog_version'
require 'global'
require 'helpers-blog'
require 'default'
require 'view'
@@ -24,11 +26,10 @@
make_exception(:CantCreateDir, "Can't create directory $1")
make_exception(:EditorProblem, "Could not edit $1")
make_exception(:NoSuchView, "No such view: $1")
make_exception(:NoBlogAccessor, "Runeblog.blog is not set")
-
class << self
attr_accessor :blog
include Helpers
end
@@ -38,44 +39,50 @@
attr_accessor :post_views, :post_tags, :dirty_views
include Helpers
def self.create_new_blog_repo(dir = ".blogs")
+ log!(enter: __method__, args: [dir])
raise ArgumentError unless dir.is_a?(String) && ! dir.empty?
root_dir = Dir.pwd + "/" + dir
self.create(dir)
rescue => err
puts "Can't create blog repo: '#{dir}' - #{err}"
puts err.backtrace.join("\n")
end
def self.create(root = ".blogs")
+ log!(enter: __method__, args: [root])
# Crude - FIXME later - # What views are there? Publishing, etc.
self.blog = self # Weird. Like a singleton - dumbass circular dependency?
$_blog = self # Dumber still?
root = Dir.pwd + "/" + root
raise BlogRepoAlreadyExists if Dir.exist?(root)
create_dirs(root)
Dir.chdir(root) do
+# puts " pwd = #{Dir.pwd} Trying: cp #{RuneBlog::Path}/../empty_view.tgz ."
+ system("cp #{RuneBlog::Path}/../empty_view.tgz .")
create_dirs(:drafts, :views)
new_sequence
end
put_config(root: root)
@blog = self.new(root)
@blog.create_view("test_view")
@blog
end
def self.open(root = ".blogs")
+ log!(enter: __method__, args: [root])
# Crude - FIXME later - # What views are there? Publishing, etc.
self.blog = self # Weird. Like a singleton - dumbass circular dependency?
$_blog = self # Dumber still?
root = Dir.pwd + "/" + root
blog = self.new(root)
end
def initialize(root_dir = ".blogs") # always assumes existing blog
+ log!(enter: "initialize", args: [root_dir])
# Crude - FIXME later - # What views are there? Publishing, etc.
self.class.blog = self # Weird. Like a singleton - dumbass circular dependency?
$_blog = self # Dumber still?
@root = root_dir
@@ -92,43 +99,49 @@
@post_views = []
@post_tags = []
end
def inspect
- str = "[["
+ log!(enter: __method__)
+ str = "blog: "
ivars = ["@root", "@sequence"] # self.instance_variables
ivars.each do |iv|
val = self.instance_variable_get(iv)
- str << "#{iv} = #{val} "
+ str << "#{iv}: #{val} "
end
- str << "]]"
+# str << "]]"
str
end
def view?(name)
+ log!(enter: __method__, args: [name])
raise ArgumentError unless name.is_a?(String) && ! name.empty?
views.any? {|x| x.name == name }
end
def view(name = nil)
+ log!(enter: __method__, args: [name])
raise ArgumentError unless name.nil? || (name.is_a?(String) && ! name.empty?)
name.nil? ? @view : str2view(name)
end
def str2view(str)
+ log!(enter: __method__, args: [str])
raise ArgumentError unless str.is_a?(String) && ! str.empty?
@views.find {|x| x.name == str }
end
def _set_publisher
+ log!(enter: __method__)
file = @view.dir + "/publish"
@view.publisher = nil
return unless File.exist?(file)
@view.publisher = RuneBlog::Publishing.new(read_config(file))
end
def view=(arg)
+ log!(enter: __method__, args: [arg])
case arg
when RuneBlog::View
@view = arg
_set_publisher
when String
@@ -140,82 +153,112 @@
raise CantAssignView(arg.class.to_s)
end
end
def get_sequence
+ log!(enter: __method__)
File.read(root + "/sequence").to_i
end
def next_sequence
+ log!(enter: __method__)
@sequence += 1
dump(@sequence, "#@root/sequence")
@sequence
end
def viewdir(v = nil) # delete?
+ log!(enter: __method__, args: [v])
v = str2view(v) if v.is_a?(String)
raise ArgumentError unless v.nil? || v.is_a?(RuneBlog::View)
v ||= @view
@root + "/views/#{v}/"
end
def self.exist?
+ log!(enter: __method__)
Dir.exist?(DotDir) && File.exist?(DotDir + "/" + ConfigFile)
end
+ def _copy_to_staging
+ copy!("themes/standard/", "staging/")
+ copy!("themes/standard/widgets/", "staging/")
+ end
+
+ def _copy_to_remote
+ copy!("themes/standard/etc", "remote/")
+ copy!("themes/standard/assets", "remote/")
+ copy!("themes/standard/widgets", "remote/")
+ end
+
def create_view(arg)
+ log!(enter: __method__, args: [arg])
raise ArgumentError unless arg.is_a?(String) && ! arg.empty?
names = self.views.map(&:to_s)
raise ViewAlreadyExists(arg) if names.include?(arg)
- vdir = "#@root/views/#{arg}/"
+ vdir = arg.dup
raise DirAlreadyExists(vdir) if Dir.exist?(vdir)
- create_dirs(vdir)
- up = Dir.pwd
- Dir.chdir(vdir) do
- x = RuneBlog::Default
- copy!("#{Themes}", "themes")
- create_dirs(:assets, :posts)
- create_dirs(:staging, "remote/permalink", "remote/navbar")
- livetext "themes/standard/etc/blog.css.lt3" # strip ext
- copy!("themes/standard/*", "staging/")
+# puts "cv: pwd = #{Dir.pwd} file = #{`ls`}"
+ Dir.chdir(@root) do
+# puts "---- (#{arg}) tar operation..."
- copy!("themes/standard/etc", "remote/")
- copy!("themes/standard/assets", "remote/")
- copy!("themes/standard/widgets", "remote/")
+# system("bash")
+ cmd1 = "tar zxvf empty_view.tgz >/dev/null 2>&1"
+ cmd2 = "cp -r empty_view views/#{arg}"
+ system(cmd1)
+# puts " pwd = #{Dir.pwd}"
+# puts " . => #{`echo *`}"
+# puts " ./views => #{`ls views`}"
+# puts " #{cmd1}\n #{cmd2}"
+ system(cmd2)
+ end
+# create_dirs(vdir)
+# puts "vdir = #{vdir} pwd = #{Dir.pwd}"
+ Dir.chdir("#@root/views/#{vdir}") do
+# system("bash")
+# x = RuneBlog::Default
+# copy!("#{Themes}", "themes")
+# create_dirs(:assets, :posts, :staging, "remote/permalink", "remote/navbar")
+# livetext "themes/standard/etc/blog.css.lt3" # strip ext
+# _copy_to_staging
+# _copy_to_remote
+ livetext "themes/standard/blog/generate", "remote/index"
pub = "user: xxx\nserver: xxx\ndocroot: xxx\npath: xxx\nproto: xxx\n"
dump(pub, "publish")
view = RuneBlog::View.new(arg)
self.view = view
- vdir = self.view.dir
dump("Initial creation", "last_published")
end
@views << view
@views
end
def delete_view(name, force = false)
+ log!(enter: __method__, args: [name, force])
raise ArgumentError unless name.is_a?(String) && ! name.empty?
if force
system("rm -rf #@root/views/#{name}")
@views -= [str2view(name)]
end
end
def view_files
+ log!(enter: __method__)
vdir = self.view.dir
files = ["#{vdir}/index.html"]
files += posts.map {|x| "#{vdir}/#{x}" }
# Huh?
files.reject! {|f| File.mtime(f) < File.mtime("#{vdir}/last_published") }
end
def post_lookup(postid) # side-effect?
+ log!(enter: __method__, args: [postid])
# .. = templates, ../.. = views/thisview
slug = title = date = teaser_text = nil
dir_posts = @vdir + "/posts"
posts = Dir.entries(dir_posts).grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
@@ -227,10 +270,11 @@
vp = RuneBlog::ViewPost.new(self.view, postdir)
vp
end
def teaser(slug)
+ log!(enter: __method__, args: [slug])
id = slug.to_i
text = nil
post_entry_name = @theme + "/blog/post_entry.lt3"
@_post_entry ||= File.read(post_entry_name)
vp = post_lookup(id)
@@ -244,11 +288,11 @@
text = interpolate(@_post_entry, binding)
text
end
def collect_recent_posts(file)
- @vdir = ".."
+ log!(enter: __method__, args: [file])
posts = nil
dir_posts = @vdir + "/posts"
entries = Dir.entries(dir_posts)
posts = entries.grep(/^\d\d\d\d/).map {|x| dir_posts + "/" + x }
posts.select! {|x| File.directory?(x) }
@@ -267,19 +311,21 @@
postid = File.basename(enum.next)
postid = postid.to_i
text << teaser(postid) # side effect! calls _out
end
text << "</body></html>"
- File.write(file, text) # FIXME ???
+ File.write("#@vdir/remote/"+file, text) # FIXME ???
iframe_text = <<-HTML
<iframe name="main" style="width: 100vw;height: 100vh;position: relative;"
src='recent.html' width=100% frameborder="0" allowfullscreen>
</iframe>
HTML
+ # FIXME ^ serves no purpose??
end
def create_new_post(title, testing = false, teaser: nil, body: nil, other_views: [])
+ log!(enter: __method__, args: [title, testing, teaser, body, other_views])
meta = nil
Dir.chdir(self.view.dir) do
post = Post.create(title: title, teaser: teaser, body: body, other_views: other_views)
post.edit unless testing
post.build
@@ -290,53 +336,59 @@
puts err
puts err.backtrace.join("\n")
end
def edit_initial_post(file, testing = false)
+ log!(enter: __method__, args: [file, testing])
debug "=== edit_initial_post #{file.inspect} => #{sourcefile}"
sourcefile = "#@root/drafts/#{file}"
result = system("#@editor #{sourcefile} +8") unless testing
raise EditorProblem(sourcefile) unless result
nil
rescue => err
error(err)
end
def posts
+ log!(enter: __method__)
dir = self.view.dir + "/posts"
posts = Dir.entries(dir).grep(/^\d{4}/)
posts
end
def drafts
+ log!(enter: __method__)
dir = "#@root/drafts"
drafts = Dir.entries(dir).grep(/^\d{4}.*/)
end
def change_view(view)
+ log!(enter: __method__, args: [view])
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
x = OpenStruct.new
x.root, x.current_view, x.editor = @root, view.to_s, @editor # dumb - FIXME later
write_config(x, ConfigFile)
self.view = view # error checking?
end
def generate_index(view) # FIXME delete?
- debug "=== generate_index view = #{view.to_s}"
+ log!(enter: __method__, args: [view], pwd: true, dir: true)
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
-
- vdir = self.view.dir
- dir0 = "#{vdir}/themes/standard/blog"
- rescue => err
- error(err)
- exit
+ @vdir = @root + "/views/#{view}"
+ collect_recent_posts("recent.html")
end
def generate_view(view) # huh?
+ log!(enter: __method__, args: [view])
+ generate_index(view)
+ Dir.chdir(@root + "/views/#{view}/themes/standard") do
+ livetext "blog/generate.lt3", "../../remote/index.html"
+ end
end
def _get_views(draft)
+ log!(enter: __method__, args: [draft])
# FIXME dumb code
view_line = File.readlines(draft).grep(/^.views /)
raise "More than one .views call!" if view_line.size > 1
raise "No .views call!" if view_line.size < 1
view_line = view_line.first
@@ -359,10 +411,11 @@
# Generate associated views:
# livetext ??/recent.lt3 >VIEW/working/recent.html
# livetext VIEW/blog/generate.lt3 ??
def _copy_get_dirs(draft, view)
+ log!(enter: __method__, args: [draft, view])
fname = File.basename(draft)
noext = fname.sub(/.lt3$/, "")
vdir = "#@root/views/#{view}"
dir = "#{vdir}/posts/#{noext}/"
Dir.mkdir(dir) unless Dir.exist?(dir)
@@ -371,49 +424,60 @@
theme = viewdir + "/themes/standard"
[noext, viewdir, slugdir, aslug, theme]
end
def generate_post(draft)
+ log!(enter: __method__, args: [draft])
views = _get_views(draft)
views.each do |view|
noext, viewdir, slugdir, aslug, @theme = _copy_get_dirs(draft, view)
- staging = viewdir + "/staging"
+# staging = viewdir + "/staging"
+ remote = viewdir + "/remote"
Dir.chdir(slugdir) do
copy(draft, ".")
lt3 = draft.split("/")[-1]
# Remember: Some posts may be in more than one view -- careful with links back
# system("livetext #{draft} >staging/#{name}/index.html") # permalink?
- copy!("#{@theme}/*", "#{staging}")
- copy(lt3, staging)
+# copy!("#{@theme}/*", "#{staging}")
+# copy(lt3, staging)
+ copy(lt3, remote)
html = noext[5..-1]
livetext draft, html # livetext "foobar.lt3", "foobar.html"
- copy(html, "../../staging/post/index.html")
+# copy(html, "../../staging/post/index.html")
+ copy(html, "../../remote/post/index.html")
title_line = File.readlines(draft).grep(/^.title /).first
title = title_line.split(" ", 2)[1]
excerpt = File.read("teaser.txt")
vars = %[.set title="#{title.chomp}"\n] +
%[.set teaser="#{excerpt.chomp}"]
- Dir.chdir(staging) do
- File.open("vars.lt3", "w") {|f| f.puts vars }
- livetext "post/generate.lt3", html
- copy html, "../remote"
- livetext "post/permalink.lt3", "../remote/permalink/#{html}"
- collect_recent_posts("recent.html")
- copy("recent.html", "../remote")
- copy!("navbar/*html", "../remote/navbar/")
- copy!("widgets", "../remote/") # really copies too much...
- livetext "blog/generate", "../remote/index"
+ theme = "../../theme/standard"
+ File.open("vars.lt3", "w") {|f| f.puts vars }
+ livetext "#{theme}/post/generate.lt3", "#{remote}/#{html}"
+ livetext "#{theme}/post/permalink.lt3", "#{remote}/permalink/#{html}"
+# puts <<-TEXT
+# File.open("vars.lt3", "w") {|f| f.puts vars }
+# livetext "../post/generate.lt3", "#{remote}/#{html}"
+# livetext "../post/permalink.lt3", "#{remote}/permalink/#{html}"
+# TEXT
+# system("bash")
+ log!(str: "About to enter remote/", pwd: true, dir: true)
+ Dir.chdir(remote) do
+ log!(str: "Now in remote/", pwd: true, dir: true)
+ system("cp -r ../themes/standard/widgets .")
+ log!(str: "finished with remote/", pwd: true, dir: true)
end
end
end
end
def relink
+ log!(enter: __method__)
self.views.each {|view| generate_index(view) }
end
def index_entry(view, meta)
+ log!(enter: __method__, args: [view, meta])
debug "=== index_entry #{view.to_s.inspect} #{meta.num} #{meta.title.inspect}"
check_meta(meta, "index_entry1")
raise ArgumentError unless view.is_a?(String) || view.is_a?(RuneBlog::View)
check_meta(meta, "index_entry2")
self.make_slug(meta)
@@ -430,10 +494,11 @@
<hr>
HTML
end
def rebuild_post(file)
+ log!(enter: __method__, args: [file])
raise "Doesn't currently work"
debug "Called rebuild_post(#{file.inspect})"
raise ArgumentError unless file.is_a?(String)
meta = process_post(file)
@views_dirty ||= []
@@ -444,10 +509,11 @@
error(err)
getch
end
def remove_post(num)
+ log!(enter: __method__, args: [num])
raise ArgumentError unless num.is_a?(Integer)
tag = prefix(num)
files = Find.find(self.view.dir).to_a
list = files.select {|x| File.directory?(x) and x =~ /#{tag}/ }
return nil if list.empty?
@@ -459,10 +525,11 @@
# FIXME - update index/etc
true
end
def undelete_post(num)
+ log!(enter: __method__, args: [num])
raise ArgumentError unless num.is_a?(Integer)
files = Find.find("#@root/views/").to_a
tag = prefix(num)
list = files.select {|x| File.directory?(x) and x =~ /_#{tag}/ }
return nil if list.empty?
@@ -474,15 +541,17 @@
# FIXME - update index/etc
true
end
def delete_draft(num)
+ log!(enter: __method__, args: [num])
raise ArgumentError unless num.is_a?(Integer)
tag = prefix(num)
system("rm -rf #@root/drafts/#{tag}-*")
end
def make_slug(meta)
+ log!(enter: __method__, args: [meta])
raise ArgumentError unless meta.title.is_a?(String)
label = '%04d' % meta.num # FIXME can do better
slug0 = meta.title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
str = "#{label}-#{slug0}"
meta.slug = str