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:
@@ -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}}">« Back</a>
|
||||
<a href="/{{escaped_name}}">« Back</a>
|
||||
</div>
|
||||
<h1>{{title}}: {{before}} → {{after}}</h1>
|
||||
<div id="files">
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<a href="/">« 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 />
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<div class="write">
|
||||
<a href="/{{name}}">« Back</a>
|
||||
<a href="/{{escaped_name}}">« 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}}">« Back</a>
|
||||
<a href="/{{escaped_name}}">« 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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>}
|
||||
|
||||
Reference in New Issue
Block a user