Blob of examples/strokewiki/wiki.rb (raw blob data)

1 require File.dirname(__FILE__) + '/../../lib/strokedb'
2 require 'rubygems'
3 require 'ramaze'
4 require 'redcloth'
5
6 # strokewiki will run in port 7000 and uses WEBRick by default
7 # you can change it uncommenting these four lines below.
8 # Ramaze::Global.setup do |g|
9 # g.port = 80
10 # g.adapter = :mongrel
11 # end
12
13 StrokeDB.use_global_default_config!
14 StrokeDB::Config.build :default => true, :base_path => '.wiki.strokedb'
15 # This will be the default homepage name
16 HOME = 'Home'
17
18
19 Page = StrokeDB::Meta.new do
20
21 validates_uniqueness_of :name
22
23 on_new_document do |doc|
24 doc[:body] ||= "I'm a boring page, please edit me!"
25 end
26
27 before_save do |doc|
28 doc[:updated_at] = Time.now.ctime
29 end
30
31 def title
32 name.gsub(/_/, ' ')
33 end
34
35 # A derivation of body, which is actually displayed when showing a page.
36 # It has stuff like [[links]] resolved as HTML links or placeholders if the
37 # linked to page does not already exist
38 def display_body
39 # mostly taken from JunebugWiki, regexps this beautiful should be shared
40 content = self.body.gsub(/\[\[([\w0-9A-Za-z -]+)[|]?([^\]]*)\]\]/) do
41 page = title = $1.strip
42 title = $2 unless $2.empty?
43 page_url = page.gsub(/ /, '_')
44
45 if Page.find(:name => page_url).first
46 %Q{<a href="/show/#{page_url}">#{title}</a>}
47 else
48 %Q{<span>#{title}<a href="/new/#{page_url}">?</a></span>}
49 end
50 end
51 RedCloth.new(content, []).to_html
52 end
53
54 end
55
56 class MainController < Ramaze::Controller
57 def index
58 redirect("/show/#{HOME}")
59 end
60
61 def pages
62 @pages = Page.find.sort { |a,b| a.name.downcase <=> b.name.downcase }
63 end
64
65 def show name,version=nil
66 @page = Page.find(:name => name).first
67 @page = @page.versions[version] if version
68 redirect("/new?name=#{name}") unless @page
69 end
70
71 def versions name
72 @page = Page.find(:name => name).first
73 @versions = @page.versions.all
74 redirect("/new?name=#{name}") unless @page
75 end
76
77 def new
78 @page = Page.new(:name => request['name'])
79 end
80
81 def create name
82 @page = Page.new(:name => name, :body => request['body'])
83 @page.save!
84 redirect("/show/#{@page.name}")
85 end
86
87 def edit name
88 @page = Page.find(:name => name).first
89 end
90
91 def update name
92 @page = Page.find(:name => name).first
93 @page.body = request['body']
94 @page.save!
95 redirect("/show/#{@page.name}")
96 end
97
98 def delete name
99 @page = Page.find(:name => name).first
100 @page.delete!
101 redirect("/")
102 end
103
104 end
105
106 Ramaze.start