Define <base href=...
[coquelicot.git] / coquelicot.rb
1 require 'sinatra'
2 require 'haml'
3
4 enable :inline_templates
5
6 def uploaded_file(file)
7   "#{options.root}/files/#{file}"
8 end
9
10 get '/style.css' do
11   content_type 'text/css', :charset => 'utf-8'
12   sass :style
13 end
14
15 get '/' do
16   haml :index
17 end
18
19 get '/ready/:name' do |name|
20   path = uploaded_file(name)
21   unless File.exists? path then
22     return 404
23   end
24   base = request.url.gsub(/\/ready\/[^\/]*$/, '')
25   @url = "#{base}/#{name}"
26   haml :ready
27 end
28
29 get '/:name' do |name|
30   path = uploaded_file(name)
31   unless File.exists? path then
32     return 404
33   end
34   send_file path
35 end
36
37 post '/upload' do
38   if params[:file] then
39     tmpfile = params[:file][:tempfile]
40     name = params[:file][:filename]
41   end
42   if tmpfile.nil? || name.nil? then
43     @error = "No file selected"
44     return haml(:index)
45   end
46   FileUtils::cp(tmpfile.path, uploaded_file(name))
47   redirect "ready/#{name}"
48 end
49
50 helpers do
51   def base_href
52     url = request.scheme + "://"
53     url << request.host
54     if request.scheme == "https" && request.port != 443 ||
55         request.scheme == "http" && request.port != 80
56       url << ":#{request.port}"
57     end
58     url << request.script_name
59     "#{url}/"
60   end
61 end
62
63 __END__
64
65 @@ layout
66 %html
67   %head
68     %title coquelicot
69     %base{ :href => base_href }
70     %link{ :rel => 'stylesheet', :href => "style.css", :type => 'text/css',
71            :media => "screen, projection" }
72   %body
73     #container
74       = yield
75
76 @@ index
77 %h1 Upload!
78 - unless @error.nil?
79   .error= @error
80 %form#upload{ :enctype => 'multipart/form-data',
81               :action  => 'upload', :method => 'post' }
82   .field
83     %input{ :type => 'file', :name => 'file' }
84   .field
85     %input{ :type => 'submit', :value => 'Send file' }
86
87 @@ ready
88 %h1 Pass this on!
89 .url
90   %a{ :href => @url }= @url
91
92 @@ style
93 $green: #00ff26
94
95 body
96   background-color: $green
97   font-family: Georgia
98   color: darkgreen
99
100 a, a:visited
101   text-decoration: underline
102   color: white
103
104 .error
105   background-color: red
106   color: white
107   border: black solid 1px