OSDN Git Service

ActiveLdap 1.2.4
[redminele/redminele.git] / ruby / lib / ruby / gems / 1.8 / gems / mongrel-1.1.5-x86-mswin32-60 / examples / camping / tepee.rb
1 #!/usr/bin/ruby
2 $:.unshift File.dirname(__FILE__) + "/../../lib"
3 %w(rubygems redcloth camping acts_as_versioned).each { |lib| require lib }
4
5 Camping.goes :Tepee
6
7 module Tepee::Models
8   def self.schema(&block)
9     @@schema = block if block_given?
10     @@schema
11   end
12   
13   class Page < Base
14     PAGE_LINK = /\[\[([^\]|]*)[|]?([^\]]*)\]\]/
15     validates_uniqueness_of :title
16     before_save { |r| r.title = r.title.underscore }
17     acts_as_versioned
18   end
19 end
20
21 Tepee::Models.schema do 
22   create_table :tepee_pages, :force => true do |t|
23     t.column :title, :string, :limit => 255
24     t.column :body, :text
25   end
26   Tepee::Models::Page.create_versioned_table
27 end
28
29 module Tepee::Controllers
30   class Index < R '/'
31     def get
32       redirect Show, 'home_page'
33     end
34   end
35
36   class List < R '/list'
37     def get
38       @pages = Page.find :all, :order => 'title'
39       render :list
40     end
41   end
42
43   class Show < R '/s/(\w+)', '/s/(\w+)/(\d+)'
44     def get page_name, version = nil
45       redirect(Edit, page_name, 1) and return unless @page = Page.find_by_title(page_name)
46       @version = (version.nil? or version == @page.version.to_s) ? @page : @page.versions.find_by_version(version)
47       render :show
48     end
49   end
50
51   class Edit < R '/e/(\w+)/(\d+)', '/e/(\w+)'
52     def get page_name, version = nil
53       @page = Page.find_or_create_by_title(page_name)
54       @page = @page.versions.find_by_version(version) unless version.nil? or version == @page.version.to_s
55       render :edit
56     end
57     
58     def post page_name
59       Page.find_or_create_by_title(page_name).update_attributes :body => input.post_body and redirect Show, page_name
60     end
61   end
62 end
63
64 module Tepee::Views
65   def layout
66     html do
67       head do
68         title 'test'
69       end
70       body do
71         p do
72           small do
73             span "welcome to " ; a 'tepee', :href => "http://code.whytheluckystiff.net/svn/camping/trunk/examples/tepee/"
74             span '. go ' ;       a 'home',  :href => R(Show, 'home_page')
75             span '. list all ' ; a 'pages', :href => R(List)
76           end
77         end
78         div.content do
79           self << yield
80         end
81       end
82     end
83   end
84
85   def show
86     h1 @page.title
87     div { _markup @version.body }
88     p do 
89       a 'edit',    :href => R(Edit, @version.title, @version.version)
90       a 'back',    :href => R(Show, @version.title, @version.version-1) unless @version.version == 1
91       a 'next',    :href => R(Show, @version.title, @version.version+1) unless @version.version == @page.version
92       a 'current', :href => R(Show, @version.title)                     unless @version.version == @page.version
93     end
94   end
95
96   def edit
97     form :method => 'post', :action => R(Edit, @page.title) do
98       p do
99         label 'Body' ; br
100         textarea @page.body, :name => 'post_body', :rows => 50, :cols => 100
101       end
102       
103       p do
104         input :type => 'submit'
105         a 'cancel', :href => R(Show, @page.title, @page.version)
106       end
107     end
108   end
109
110   def list
111     h1 'all pages'
112     ul { @pages.each { |p| li { a p.title, :href => R(Show, p.title) } } }
113   end
114
115   def _markup body
116     return '' if body.blank?
117     body.gsub!(Tepee::Models::Page::PAGE_LINK) do
118       page = title = $1
119       title = $2 unless $2.empty?
120       page = page.gsub /\W/, '_'
121       if Tepee::Models::Page.find(:all, :select => 'title').collect { |p| p.title }.include?(page)
122         %Q{<a href="#{self/R(Show, page)}">#{title}</a>}
123       else
124         %Q{<span>#{title}<a href="#{self/R(Edit, page, 1)}">?</a></span>}
125       end
126     end
127     RedCloth.new(body, [ :hard_breaks ]).to_html
128   end
129 end
130
131 def Tepee.create
132   unless Tepee::Models::Page.table_exists?
133     ActiveRecord::Schema.define(&Tepee::Models.schema)
134     Tepee::Models::Page.reset_column_information
135   end
136 end
137
138 if __FILE__ == $0
139   require 'mongrel/camping'
140
141   Tepee::Models::Base.establish_connection :adapter => 'sqlite3', :database => 'tepee.db'
142   Tepee::Models::Base.logger = Logger.new('camping.log')
143   Tepee::Models::Base.threaded_connections=false
144   Tepee.create
145   
146   server = Mongrel::Camping::start("0.0.0.0",3000,"/tepee",Tepee)
147   puts "** Tepee example is running at http://localhost:3000/tepee"
148   server.acceptor.join
149 end