lib/runeblog.rb in runeblog-0.0.65 vs lib/runeblog.rb in runeblog-0.0.66

- old
+ new

@@ -18,12 +18,16 @@ puts str puts err.backtrace # [0] end class RuneBlog - VERSION = "0.0.65" + VERSION = "0.0.66" + class << self + attr_accessor :blog + end + Path = File.expand_path(File.join(File.dirname(__FILE__))) DefaultData = Path + "/../data/views/_default" BlogHeaderPath = DefaultData + "/custom/blog_header.html" BlogTrailerPath = DefaultData + "/custom/blog_trailer.html" @@ -32,11 +36,11 @@ BlogHeader = File.read(BlogHeaderPath) rescue "not found" BlogTrailer = File.read(BlogTrailerPath) rescue "not found" PostTemplate = File.read(PostTemplatePath) rescue "not found" attr_reader :root, :views, :sequence - attr_accessor :view # FIXME + attr_accessor :view # overridden def self.create_new_blog #-- what if data already exists? result = system("cp -r #{RuneBlog::DefaultData} .") raise "Error copying default data" unless result @@ -46,26 +50,55 @@ f.puts "no_default" end File.open("data/VERSION", "a") {|f| f.puts "\nBlog created: " + Time.now.to_s } end + def get_config(file) + lines = File.readlines(file).map(&:chomp) + root, view_name = *lines + end + def initialize(cfg_file = ".blog") # assumes existing blog - # What views are there? Deployment, etc. - # Crude - FIXME later + # Crude - FIXME later - What views are there? Deployment, etc. + self.class.blog = self # Weird. Like a singleton - dumbass circular dependency? + @root, view_name = get_config(cfg_file) + @views = subdirs("#@root/views/").sort.map {|name| RuneBlog::View.new(name) } + @view = str2view(view_name) + @sequence = get_sequence + end - lines = File.readlines(cfg_file).map {|x| x.chomp } - @root = lines[0] - @view = lines[1] - dirs = subdirs("#@root/views/") - @root = root - @views = dirs - @sequence = File.read(root + "/sequence").to_i + def view?(name) + views.any? {|x| x.name == name } end + def view + @view + end + + def str2view(str) + @views.find {|x| x.name == str } + end + + def view=(arg) + case arg + when RuneBlog::View + @view = arg + when String + new_view = str2view(arg) + raise "Can't find view #{arg}" if new_view.nil? + @view = new_view + else + raise "#{arg.inspect} was not a View or a String" + end + end + + def get_sequence + File.read(root + "/sequence").to_i + end + def next_sequence - @sequence += 1 - File.open("#@root/sequence", "w") {|f| f.puts @sequence } + File.write("#@root/sequence", @sequence += 1) @sequence end def viewdir(v) @root + "/views/#{v}/" @@ -74,28 +107,29 @@ def self.exist? File.exist?(".blog") end def create_view(arg) - raise "view #{arg} already exists" if self.views.include?(arg) + names = self.views.map(&:to_s) + raise "view #{arg} already exists" if names.include?(arg) dir = @root + "/views/" + arg + "/" create_dir(dir + 'custom') create_dir(dir + 'assets') File.open(dir + "deploy", "w") { } # FIXME File.write(dir + "custom/blog_header.html", RuneBlog::BlogHeader) File.write(dir + "custom/blog_trailer.html", RuneBlog::BlogTrailer) File.write(dir + "custom/post_template.html", RuneBlog::PostTemplate) File.write(dir + "last_deployed", "Initial creation") - self.views << arg + @views << RuneBlog::View.new(arg) end def delete_view(name, force = false) if force system("rm -rf #@root/views/#{name}") - @views -= [name] + @views -= [str2view(name)] end end def deployment_url return nil unless @deploy[@view] @@ -107,10 +141,11 @@ def view_files vdir = @blog.viewdir(@view) # meh files = ["#{vdir}/index.html"] files += Dir.entries(vdir).grep(/^\d\d\d\d/).map {|x| "#{vdir}/#{x}" } + # Huh? files.reject! {|f| File.mtime(f) < File.mtime("#{vdir}/last_deployed") } end def files_by_id(id) files = Find.find(self.root).to_a @@ -118,11 +153,11 @@ result = files.grep(/#{tag}-/) result end def create_new_post(title, testing = false) - post = RuneBlog::Post.new(title, @view) + post = RuneBlog::Post.new(title, @view.to_s) post.edit unless testing post.publish post.num rescue => err puts err # error(err) @@ -135,21 +170,22 @@ rescue => err error(err) end def posts - dir = self.viewdir(@view) + dir = self.view.dir posts = Dir.entries(dir).grep(/^0.*/) + posts end def drafts dir = "#@root/src" drafts = Dir.entries(dir).grep(/^0.*.lt3/) end def change_view(view) - @view = view # error checking? + self.view = view # error checking? end def process_post(file) path = @root + "/src/#{file}" livetext = Livetext.new(STDOUT) # (nil) @@ -200,22 +236,22 @@ # Output view posts.map! {|post| YAML.load(File.read("#{vdir}/#{post}/metadata.yaml")) } File.open("#{vdir}/index.html", "w") do |f| f.puts @bloghead - posts.each {|post| f.puts posting(view, post) } + posts.each {|post| f.puts index_entry(view, post) } f.puts @blogtail end rescue => err error(err) end def relink self.views.each {|view| generate_index(view) } end - def posting(view, meta) + def index_entry(view, meta) # FIXME clean up and generalize ref = "#{view}/#{meta.slug}/index.html" <<-HTML <br> <font size=+1>#{meta.pubdate}&nbsp;&nbsp;</font> @@ -224,12 +260,10 @@ #{meta.teaser} <a href=../#{ref} style="text-decoration: none">Read more...</a> <br><br> <hr> HTML - text = File.read(self.viewdir(view) + "custom/post_template.html") - interpolate(text) end def rebuild_post(file) @meta = process_post(file) publish_post(@meta) # FIXME ?? @@ -271,38 +305,115 @@ end ####### -class RuneBlog::Post +class RuneBlog::Deployment + attr_reader :user, :server, :root, :path - class << self - attr_accessor :blog + def initialize(user, server, root, path, protocol = "http") + @blog = RuneBlog.blog + @user, @server, @root, @path = + user, server, root, path end + def url + url = "#{protocol}://#{@server}/#{@path}" + end + + def deploy(files) + reset_output + dir = "#@root/#@path" + result = system("ssh -c #@user@#@server mkdir #{dir}") + list = files.join(' ') + cmd = "scp -r #{list} root@#{server}:#{dir} >/dev/null 2>&1" + output! "Deploying #{files.size} files...\n" + result = system(cmd) + raise "Problem occurred in deployment" unless result + + File.write("#{@blog.view.dir}/last_deployed", files) + output! "...finished.\n" + @out + end +end + +####### + +class RuneBlog::View + attr_reader :name, :state + attr_accessor :deploy + + def initialize(name) + raise "RuneBlog.blog is not set!" if RuneBlog.blog.nil? + @blog = RuneBlog.blog + @name = name + # How read deployment info?? + end + + def dir + @blog.root + "/views/#@name/" + end + + def index + dir + "index.html" + end + + def to_s + @name + end + + def files(recent = false) + vdir = dir() + files = [index()] + others = Dir.entries(vdir).grep(/^\d\d\d\d/) + files += others.map {|x| "#{vdir}/#{x}" } + files.reject! {|f| recent?(f) } if recent + files + end + + def deploy + # ?? @blog.view.deployment.deploy + # output "Files:" + # files.each {|f| output " #{f}\n" } + output_newline + list = files(true) + @deployer.deploy(list) + rescue => err + error(err) + end + + def recent?(file) + File.mtime(file) < File.mtime("#{dir()}/last_deployed") + end +end + +####### + + +class RuneBlog::Post + attr_reader :id, :title, :date, :views, :num, :slug def self.files(num, root) files = Find.find(root).to_a result = files.grep(/#{tag(num)}-/) result end - def initialize(title, view) - raise "Post.blog is not set!" if RuneBlog::Post.blog.nil? - @blog = RuneBlog::Post.blog + def initialize(title, view_name) + raise "RuneBlog.blog is not set!" if RuneBlog.blog.nil? + @blog = RuneBlog.blog @title = title - @view = view + @view = @blog.str2view(view_name) @num, @slug = make_slug -## date = Time.now.strftime("%Y-%m-%d") template = <<-EOS.gsub(/^ */, "") .mixin liveblog .title #{title} .pubdate #{date} - .views #{view} + .views #@view .teaser Teaser goes here. .end Remainder of post goes here. @@ -323,11 +434,12 @@ def publish livetext = Livetext.new(STDOUT) @meta = livetext.process_file(@draft, binding) raise "process_file returned nil" if @meta.nil? - @meta.views.each do |view| # Create dir using slug (index.html, metadata?) - vdir = @blog.viewdir(view) + @meta.views.each do |view_name| # Create dir using slug (index.html, metadata?) + view = @blog.str2view(view_name) + vdir = view.dir dir = vdir + @slug + "/" Dir.mkdir(dir) Dir.chdir(dir) do create_post_subtree(vdir) @blog.generate_index(view)