Add support for RFC 1738 special characters in page names.

Escape all links and redirects to support this. Some changes to app.rb
necessary for correct routing by Sinatra.
This commit is contained in:
Paul Baumgart
2010-09-01 22:02:19 -07:00
parent 7c70174725
commit 5fcb5d971a
8 changed files with 29 additions and 21 deletions
+10 -9
View File
@@ -1,3 +1,4 @@
require 'cgi'
require 'sinatra'
require 'gollum'
require 'mustache/sinatra'
@@ -39,8 +40,8 @@ module Precious
show_page_or_file('Home')
end
get '/edit/:name' do
@name = params[:name]
get '/edit/*' do
@name = params[:splat].first
wiki = Gollum::Wiki.new(settings.gollum_path)
if page = wiki.page(@name)
@page = page
@@ -51,8 +52,8 @@ module Precious
end
end
post '/edit/:name' do
name = params[:name]
post '/edit/*' do
name = params[:splat].first
wiki = Gollum::Wiki.new(settings.gollum_path)
page = wiki.page(name)
format = params[:format].intern
@@ -60,10 +61,10 @@ module Precious
wiki.update_page(page, name, format, params[:content], commit_message)
redirect "/#{Gollum::Page.cname name}"
redirect "/#{CGI.escape(Gollum::Page.cname(name))}"
end
post '/create/:name' do
post '/create/*' do
name = params[:page]
wiki = Gollum::Wiki.new(settings.gollum_path)
@@ -71,7 +72,7 @@ module Precious
begin
wiki.write_page(name, format, params[:content], commit_message)
redirect "/#{name}"
redirect "/#{CGI.escape(name)}"
rescue Gollum::DuplicatePageError => e
@message = "Duplicate page: #{e.message}"
mustache :error
@@ -97,10 +98,10 @@ module Precious
post '/compare/:name' do
@versions = params[:versions] || []
if @versions.size < 2
redirect "/history/#{params[:name]}"
redirect "/history/#{CGI.escape(params[:name])}"
else
redirect "/compare/%s/%s...%s" % [
params[:name],
CGI.escape(params[:name]),
@versions.last,
@versions.first]
end
@@ -1,7 +1,7 @@
<div class="guide">
<div class="main">
<div class="actions">
<a href="/{{name}}">&laquo; Back</a>
<a href="/{{escaped_name}}">&laquo; Back</a>
</div>
<h1>{{title}}: {{before}} &rarr; {{after}}</h1>
<div id="files">
@@ -2,7 +2,7 @@
<a href="/">&laquo; Home</a>
<h1>{{title}}</h1>
<form class="new_wiki" method="post" action="/create/{{name}}">
<form class="new_wiki" method="post" action="/create/{{escaped_name}}">
<div>
<label>
Title<br />
+2 -2
View File
@@ -1,8 +1,8 @@
<div class="write">
<a href="/{{name}}">&laquo; Back</a>
<a href="/{{escaped_name}}">&laquo; Back</a>
<h1>{{title}}</h1>
<form class="edit_wiki" method="post" action="/edit/{{name}}">
<form class="edit_wiki" method="post" action="/edit/{{escaped_name}}">
<div>
<label>
Title<br />
@@ -1,10 +1,10 @@
<div class="guide">
<div class="main">
<div class="actions">
<a href="/{{name}}">&laquo; Back</a>
<a href="/{{escaped_name}}">&laquo; Back</a>
</div>
<h1>{{title}}</h1>
<form id="history" method="post" action="/compare/{{name}}">
<form id="history" method="post" action="/compare/{{escaped_name}}">
<table class="commits" cellpadding="0" cellspacing="0">
<tr>
<th colspan="5">
@@ -17,7 +17,7 @@
<input name="versions[]" type="checkbox" value="{{id}}" />
</td>
<td class="sha">
<a href="/{{name}}/{{id}}">{{id7}}</a>
<a href="/{{escaped_name}}/{{id}}">{{id7}}</a>
</td>
<td nowrap class="author">
<img src="http://www.gravatar.com/avatar/{{gravatar}}?s=16" alt="Gravatar" />
+3 -3
View File
@@ -1,7 +1,7 @@
<div class="guide">
<div class="main">
<div class="actions">
<a href="/">Home</a> | <a href="/edit/{{name}}">Edit</a>
<a href="/">Home</a> | <a href="/edit/{{escaped_name}}">Edit</a>
</div>
<h1>{{title}}</h1>
<div class="content wikistyle gollum {{format}}">
@@ -18,10 +18,10 @@
<div style="float: left;">
<small>Last edited by <b>{{author}}</b>, {{date}}</small>
<div class="actions">
<a href="/">Home</a> | <a href="/edit/{{name}}">Edit</a>
<a href="/">Home</a> | <a href="/edit/{{escaped_name}}">Edit</a>
</div>
</div>
<div style="float: right;">
<a href="/history/{{name}}">View Revision History</a>
<a href="/history/{{escaped_name}}">View Revision History</a>
</div>
</div>
+6
View File
@@ -1,3 +1,5 @@
require 'cgi'
module Precious
module Views
class Layout < Mustache
@@ -6,6 +8,10 @@ module Precious
attr_reader :name
def escaped_name
CGI.escape(@name)
end
def title
"Home"
end
+3 -2
View File
@@ -1,4 +1,5 @@
require 'digest/sha1'
require 'cgi'
module Gollum
class Markup
@@ -267,10 +268,10 @@ module Gollum
%{<a href="#{name}">#{name}</a>}
else
if page = @wiki.page(cname)
link = ::File.join(@wiki.base_path, Page.cname(page.name))
link = ::File.join(@wiki.base_path, CGI.escape(Page.cname(page.name)))
presence = "present"
else
link = ::File.join(@wiki.base_path, cname)
link = ::File.join(@wiki.base_path, CGI.escape(cname))
presence = "absent"
end
%{<a class="internal #{presence}" href="#{link}">#{name}</a>}