#!/usr/bin/env ruby #!/usr/bin/ruby -rcgi class GitWiki attr_accessor :wiki_dir, :main_page, :base_url def initialize(wiki_dir="/home/sbecker/drunkenruby.com/public/wiki/",base_url="drunken.cgi?page=%s",main_page = "DrunkenRuby") @wiki_dir = wiki_dir @main_page = main_page @base_url = base_url end def not_found_message(*args) "Page not found!" end def save_wiki_page(page,data,message = "No Message") `echo "#{data.gsub('"','\"')}" > wiki/#{page} ` e = $?.exitstatus if e == 0 `cd wiki &&git add . && git commit -m "#{message}" ` true else false end end def get_wiki_revision_numbers(page,limit = 5 ) revisions = Array.new sys_rev = `cd wiki && git log --pretty=oneline #{page}` revisions = sys_rev.split("\n").map{|r| r.split[0]} if $?.exitstatus == 0 revisions[1..5] end def get_page(name, revision=nil) t = nil if revision.to_s == "" t = `cat wiki/#{name}` else t = `cd wiki &&git show #{revision}:#{name}` t = "
No rev:#{revision} found

"+ `cat wiki/#{name}` if $?.exitstatus != 0 end t end end begin wiki = GitWiki.new c = CGI.new('html4') n,d = c['page']!=''?c['page']:wiki.main_page,c['data'] e = nil if d != '' if wiki.save_wiki_page(n,d,c["message"]) print c.header({'Status' => '302 Moved', 'location' => wiki.base_url%"#{n}&save_status=#{e}"}) end e = "There was an error saving." #the save failed else t = wiki.get_page(n,c["rev"]) || wiki.not_found_message revisions = wiki.get_wiki_revision_numbers(n) c.instance_eval{ out{ html(){ "DrunkenRuby wiki"+ body{ h1{n}+e.to_s+ div{a(wiki.base_url%wiki.main_page){wiki.main_page}if n != wiki.main_page}+br+br+ div{ t.gsub(/([A-Z]\w+){2}/){a(wiki.base_url%$&){$&}} }+br+ a("id" => "edit_ref", "href" => "#","onclick" => "document.getElementById(\"form_block\").style.display=\"block\";document.getElementById(\"edit_ref\").style.display=\"none\""){}+ div("id"=>"form_block","style"=>"display : none;"){ form("get"){ textarea('data'){ t.strip }+br+"Change message:"+ text_field("message", "", 40, 200)+ hidden('page',n)+ submit } }+br+br+"Revisions:"+ revisions.to_a.map{|r| a(wiki.base_url%"#{n}&rev=#{r}"){r[0..5]}}.join(",") } } } } end rescue Exception =>e File.open("cow","w+"){|f| f.puts( e.message);f.puts(e.backtrace.join("\n"))} end