Skip to content

Commit ea09cb1

Browse files
committed
Merge remote-tracking branch 'tjgrathwell/index-routes'
2 parents b451e88 + fce5c2d commit ea09cb1

File tree

2 files changed

+80
-49
lines changed

2 files changed

+80
-49
lines changed

app.rb

100644100755
Lines changed: 70 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,49 @@ def doc_path
8989
end
9090
end
9191

92+
def title_for_page page_name
93+
page_name.split('_').map do |w|
94+
w == "osx" ? "OS X" : w.capitalize
95+
end.join(' ')
96+
end
97+
98+
def render_page
99+
begin
100+
options = {
101+
site_name: params[:site],
102+
doc_title: title_for_page(params[:name]),
103+
doc_path: doc_path,
104+
back: params[:back],
105+
src: src,
106+
}
107+
108+
case ext
109+
110+
when "md"
111+
if doc_path =~ /\.deck\.md$/ # todo: refactor
112+
# todo: render with page nav elements too
113+
slides = Deck::Slide.split(src)
114+
Deck::SlideDeck.new(:slides => slides).to_pretty
115+
else
116+
MarkdownPage.new(options).to_html
117+
end
118+
119+
when "mw"
120+
MediaWikiPage.new(options).to_html
121+
122+
when "step"
123+
StepPage.new(options).to_html
124+
125+
else
126+
raise "unknown file type #{doc_path}"
127+
end
128+
129+
rescue Errno::ENOENT => e
130+
p e
131+
halt 404
132+
end
133+
end
134+
92135
before do
93136
expires 3600, :public
94137
end
@@ -98,16 +141,7 @@ def doc_path
98141
end
99142

100143
get "/" do
101-
redirect "/#{default_site}"
102-
end
103-
104-
get "/:site" do
105-
site_name = params[:site]
106-
if sites.include? site_name
107-
redirect "/#{site_name}/#{site_name}"
108-
else
109-
forward # send it on to the downstream file server
110-
end
144+
redirect "/#{default_site}/"
111145
end
112146

113147
get "/:site/:name/src" do
@@ -141,45 +175,36 @@ def doc_path
141175
end
142176
end
143177

144-
get "/:site/:name" do
145-
begin
146-
doc_title = params[:name].split('_').map do |w|
147-
w == "osx" ? "OS X" : w.capitalize
148-
end.join(' ')
149-
150-
options = {
151-
site_name: params[:site],
152-
doc_title: doc_title,
153-
doc_path: doc_path,
154-
back: params[:back],
155-
src: src,
156-
}
157-
158-
case ext
159-
160-
when "md"
161-
if doc_path =~ /\.deck\.md$/ # todo: refactor
162-
# todo: render with page nav elements too
163-
slides = Deck::Slide.split(src)
164-
Deck::SlideDeck.new(:slides => slides).to_pretty
165-
else
166-
MarkdownPage.new(options).to_html
167-
end
178+
get "/:site/:name/" do
179+
# remove any extraneous slash from otherwise well-formed page URLs
180+
redirect "#{params[:site]}/#{params[:name]}"
181+
end
168182

169-
when "mw"
170-
MediaWikiPage.new(options).to_html
183+
get "/:site/:name" do
184+
render_page
185+
end
171186

172-
when "step"
173-
StepPage.new(options).to_html
187+
get "/:file.:ext" do
188+
# treat root URLs with dots in them like static assets and serve them
189+
# from the downstream file server (coderay.css, jquery-1.6.1.js)
190+
forward
191+
end
174192

175-
else
176-
raise "unknown file type #{doc_path}"
177-
end
193+
get "/:site" do
194+
# add a slash to any URLs that contain only a site
195+
# (otherwise paths in that site's pages would resolve
196+
# relative to the root)
197+
redirect "#{params[:site]}/"
198+
end
178199

179-
rescue Errno::ENOENT => e
180-
p e
181-
halt 404
200+
get "/:site/" do
201+
site_name = params[:site]
202+
if sites.include? site_name
203+
# render the site's index page
204+
params[:name] = site_name
205+
render_page
206+
else
207+
forward # send it on to the downstream file server
182208
end
183209
end
184210
end
185-

spec/app_spec.rb

100644100755
Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,19 @@ def get! *args
3838
get "/"
3939
assert { last_response.redirect? }
4040
follow_redirect! while last_response.redirect?
41-
assert { last_request.path == "/installfest/installfest" }
41+
assert { last_request.path == "/installfest/" }
4242
end
4343

44-
it "redirects /site to /site/site" do
44+
it "redirects /site to /site/" do
4545
get "/installfest"
4646
follow_redirect! while last_response.redirect?
47-
assert { last_request.path == "/installfest/installfest" }
47+
assert { last_request.path == "/installfest/" }
48+
end
49+
50+
it "redirects /site/page/ to /site/page" do
51+
get "/installfest/foo/"
52+
follow_redirect! while last_response.redirect?
53+
assert { last_request.path == "/installfest/foo" }
4854
end
4955

5056
it "has a default site" do
@@ -77,7 +83,7 @@ def get! *args
7783
get "/", {}, {"HTTP_HOST" => "curriculum.example.com"}
7884
assert { last_response.redirect? }
7985
follow_redirect! while last_response.redirect?
80-
assert { last_request.path == "/curriculum/curriculum" }
86+
assert { last_request.path == "/curriculum/" }
8187
end
8288

8389
describe "an app with slides" do

0 commit comments

Comments
 (0)