Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 134432d029 | |||
| 8d4d6e80b8 | |||
| 85e6ef3dca | |||
| 60f1467229 | |||
| 1757242382 | |||
| 55df7bb9c4 | |||
| 686b8acd38 | |||
| a5f9df6170 | |||
| 27f61a870a | |||
| a48e8d1c5c | |||
| b80f74bccd | |||
| 1e768734ef | |||
| 11c9cabeb3 | |||
| 3a14ab92f0 | |||
| 62d5f52398 | |||
| 2b4848566c | |||
| 7c825e877c | |||
| 8417c277e6 | |||
| 9cef423908 | |||
| e73c84490e | |||
| 6cfc807db0 | |||
| be366f8103 | |||
| 2d13bd796f | |||
| 523f8f80ca | |||
| b76fef9143 | |||
| e935af83d5 | |||
| d4e019ef42 | |||
| 2e738828c6 | |||
| fd7dc93778 | |||
| 3df407d9ee | |||
| 6fbba84725 | |||
| 37d20fa9cc | |||
| 410cd912ac | |||
| d234bbd861 | |||
| 3f68d96815 | |||
| 015cd895d2 | |||
| 5fa4b48d85 | |||
| 88a3783bbc | |||
| ea2254b9bd | |||
| 9a0c1f2605 | |||
| 008f26bb7d | |||
| 69e453ea0b | |||
| 88b0b608f4 | |||
| 19e3987ae3 | |||
| c72e91ddaf | |||
| c789dd5067 | |||
| 551949de29 | |||
| 80730ee87a | |||
| 71028adc9e | |||
| a2efebc06c | |||
| 43d2143506 |
@@ -520,8 +520,10 @@ your changes merged back into core is as follows:
|
|||||||
1. Send a pull request to the github/gollum project.
|
1. Send a pull request to the github/gollum project.
|
||||||
|
|
||||||
## RELEASING
|
## RELEASING
|
||||||
|
Update VERSION in lib/gollum.rb
|
||||||
$ rake gemspec
|
$ rake gemspec
|
||||||
|
$ git tag vX.Y.Z
|
||||||
|
$ git push origin vX.Y.Z
|
||||||
$ gem build gollum.gemspec
|
$ gem build gollum.gemspec
|
||||||
$ gem push gollum-X.Y.Z.gem
|
$ gem push gollum-X.Y.Z.gem
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -65,8 +65,8 @@ opts = OptionParser.new do |opts|
|
|||||||
wiki_options[:live_preview] = false
|
wiki_options[:live_preview] = false
|
||||||
end
|
end
|
||||||
|
|
||||||
opts.on("--no-mathjax", "Disables mathjax.") do
|
opts.on("--mathjax", "Enables mathjax.") do
|
||||||
options['mathjax'] = false
|
options['mathjax'] = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -5,8 +5,8 @@ Gem::Specification.new do |s|
|
|||||||
s.required_ruby_version = ">= 1.8.7"
|
s.required_ruby_version = ">= 1.8.7"
|
||||||
|
|
||||||
s.name = 'gollum'
|
s.name = 'gollum'
|
||||||
s.version = '2.1.0'
|
s.version = '2.1.6'
|
||||||
s.date = '2012-08-01'
|
s.date = '2012-08-23'
|
||||||
s.rubyforge_project = 'gollum'
|
s.rubyforge_project = 'gollum'
|
||||||
|
|
||||||
s.summary = "A simple, Git-powered wiki."
|
s.summary = "A simple, Git-powered wiki."
|
||||||
@@ -37,7 +37,7 @@ Gem::Specification.new do |s|
|
|||||||
|
|
||||||
s.add_development_dependency('RedCloth')
|
s.add_development_dependency('RedCloth')
|
||||||
s.add_development_dependency('mocha')
|
s.add_development_dependency('mocha')
|
||||||
s.add_development_dependency('org-ruby', '~>0.6.3')
|
s.add_development_dependency('org-ruby', '~> 0.7.0')
|
||||||
s.add_development_dependency('shoulda')
|
s.add_development_dependency('shoulda')
|
||||||
s.add_development_dependency('rack-test')
|
s.add_development_dependency('rack-test')
|
||||||
s.add_development_dependency('wikicloth', '~>0.8.0')
|
s.add_development_dependency('wikicloth', '~>0.8.0')
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@ require File.expand_path('../gollum/tex', __FILE__)
|
|||||||
require File.expand_path('../gollum/web_sequence_diagram', __FILE__)
|
require File.expand_path('../gollum/web_sequence_diagram', __FILE__)
|
||||||
|
|
||||||
module Gollum
|
module Gollum
|
||||||
VERSION = '2.1.0'
|
VERSION = '2.1.6'
|
||||||
|
|
||||||
def self.assets_path
|
def self.assets_path
|
||||||
::File.expand_path('gollum/frontend/public', ::File.dirname(__FILE__))
|
::File.expand_path('gollum/frontend/public', ::File.dirname(__FILE__))
|
||||||
|
|||||||
+17
-13
@@ -82,20 +82,24 @@ module Precious
|
|||||||
end
|
end
|
||||||
|
|
||||||
before do
|
before do
|
||||||
@base_url = settings.wiki_options.has_key?(:base_url) ? settings.wiki_options[:base_url] : url('/')
|
@base_url = url('/', false).chomp('/')
|
||||||
settings.wiki_options.merge!({ :base_path => @base_url }) unless settings.wiki_options.has_key? :base_path
|
settings.wiki_options.merge!({ :base_path => @base_url }) unless settings.wiki_options.has_key? :base_path
|
||||||
end
|
end
|
||||||
|
|
||||||
get '/' do
|
get '/' do
|
||||||
show_page_or_file('Home')
|
redirect File.join(settings.wiki_options[:base_path].to_s, 'Home')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# path is set to name if path is nil.
|
||||||
|
# if path is 'a/b' and a and b are dirs, then
|
||||||
|
# path must have a trailing slash 'a/b/' or
|
||||||
|
# extract_path will trim path to 'a'
|
||||||
# name, path, version
|
# name, path, version
|
||||||
def wiki_page( name, path = nil, version = nil)
|
def wiki_page( name, path = nil, version = nil)
|
||||||
path = name if path.nil?
|
path = name if path.nil?
|
||||||
|
|
||||||
name = extract_name(name)
|
name = extract_name(name)
|
||||||
path = extract_path(path)
|
path = extract_path(path)
|
||||||
|
|
||||||
wiki = wiki_new
|
wiki = wiki_new
|
||||||
|
|
||||||
OpenStruct.new(:wiki => wiki, :page => wiki.paged(name, path, version),
|
OpenStruct.new(:wiki => wiki, :page => wiki.paged(name, path, version),
|
||||||
@@ -132,12 +136,12 @@ module Precious
|
|||||||
mustache :edit
|
mustache :edit
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
redirect to("/create/#{CGI.escape(@name)}")
|
redirect to("/create/#{encodeURIComponent(@name)}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
post '/edit/*' do
|
post '/edit/*' do
|
||||||
wikip = wiki_page(CGI.unescape(params[:page]), sanitize_empty_params(params[:path]))
|
wikip = wiki_page(CGI.unescape(params[:page]), sanitize_empty_params(params[:path]))
|
||||||
path = wikip.path
|
path = wikip.path
|
||||||
wiki = wikip.wiki
|
wiki = wikip.wiki
|
||||||
page = wikip.page
|
page = wikip.page
|
||||||
@@ -168,9 +172,8 @@ module Precious
|
|||||||
end
|
end
|
||||||
|
|
||||||
get '/create/*' do
|
get '/create/*' do
|
||||||
splat = params[:splat].first
|
wikip = wiki_page(params[:splat].first.gsub('+', '-'))
|
||||||
wikip = wiki_page(extract_name(splat).to_url, splat)
|
@name = wikip.name.to_url
|
||||||
@name = wikip.name
|
|
||||||
@path = wikip.path
|
@path = wikip.path
|
||||||
|
|
||||||
page = wikip.page
|
page = wikip.page
|
||||||
@@ -193,7 +196,7 @@ module Precious
|
|||||||
begin
|
begin
|
||||||
wiki.write_page(name, format, params[:content], commit_message)
|
wiki.write_page(name, format, params[:content], commit_message)
|
||||||
page = wiki.page(name)
|
page = wiki.page(name)
|
||||||
redirect to("/#{page.escaped_url_path}")
|
redirect to("/#{page.escaped_url_path}") unless page.nil?
|
||||||
rescue Gollum::DuplicatePageError => e
|
rescue Gollum::DuplicatePageError => e
|
||||||
@message = "Duplicate page: #{e.message}"
|
@message = "Duplicate page: #{e.message}"
|
||||||
mustache :error
|
mustache :error
|
||||||
@@ -285,10 +288,11 @@ module Precious
|
|||||||
|
|
||||||
get %r{/(.+?)/([0-9a-f]{40})} do
|
get %r{/(.+?)/([0-9a-f]{40})} do
|
||||||
file_path = params[:captures][0]
|
file_path = params[:captures][0]
|
||||||
name = extract_name(file_path)
|
|
||||||
path = extract_path(file_path)
|
|
||||||
version = params[:captures][1]
|
version = params[:captures][1]
|
||||||
if page = wiki_page(name, path, version).page
|
wikip = wiki_page(file_path, file_path, version)
|
||||||
|
name = wikip.name
|
||||||
|
path = wikip.path
|
||||||
|
if page = wikip.page
|
||||||
@page = page
|
@page = page
|
||||||
@name = name
|
@name = name
|
||||||
@content = page.formatted_data
|
@content = page.formatted_data
|
||||||
@@ -350,7 +354,7 @@ module Precious
|
|||||||
file.raw_data
|
file.raw_data
|
||||||
else
|
else
|
||||||
page_path = [path, name].compact.join('/')
|
page_path = [path, name].compact.join('/')
|
||||||
redirect to("/create/#{CGI.escape(page_path).gsub('%2F','/')}")
|
redirect to("/create/#{encodeURIComponent(page_path).gsub('%2F','/')}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -167,7 +167,7 @@
|
|||||||
|
|
||||||
setActiveLanguage: function( name ) {
|
setActiveLanguage: function( name ) {
|
||||||
// On first load _ACTIVE_LANG.length is 0 and evtChangeFormat isn't called.
|
// On first load _ACTIVE_LANG.length is 0 and evtChangeFormat isn't called.
|
||||||
if ( LanguageDefinition._ACTIVE_LANG.length <= 0 ) {
|
if ( LanguageDefinition._ACTIVE_LANG != null && LanguageDefinition._ACTIVE_LANG.length <= 0 ) {
|
||||||
FormatSelector.updateCommitMessage( name );
|
FormatSelector.updateCommitMessage( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ $(document).ready(function() {
|
|||||||
var ok = confirm($(this).data('confirm'));
|
var ok = confirm($(this).data('confirm'));
|
||||||
if ( ok ) {
|
if ( ok ) {
|
||||||
var loc = window.location;
|
var loc = window.location;
|
||||||
loc = baseUrl + 'delete' + loc.pathname
|
loc = baseUrl + '/delete' + loc.pathname.replace(baseUrl,'');
|
||||||
window.location = loc;
|
window.location = loc;
|
||||||
}
|
}
|
||||||
// Don't navigate on cancel.
|
// Don't navigate on cancel.
|
||||||
@@ -138,10 +138,10 @@ $(document).ready(function() {
|
|||||||
var msg = 'Renamed ' + oldName + ' to ' + newName;
|
var msg = 'Renamed ' + oldName + ' to ' + newName;
|
||||||
jQuery.ajax( {
|
jQuery.ajax( {
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
url: baseUrl + 'edit/' + oldName,
|
url: baseUrl + '/edit/' + oldName,
|
||||||
data: { path: path, rename: newName, page: oldName, message: msg },
|
data: { path: path, rename: newName, page: oldName, message: msg },
|
||||||
success: function() {
|
success: function() {
|
||||||
window.location = baseUrl + encodeURIComponent(newName);
|
window.location = baseUrl + '/' + encodeURIComponent(newName);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -154,14 +154,6 @@ $(document).ready(function() {
|
|||||||
$('#minibutton-new-page').click(function(e) {
|
$('#minibutton-new-page').click(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
var path = location.pathname;
|
|
||||||
// ensure there's more than one slash in pathname.
|
|
||||||
if (path.split('/').length > 2) {
|
|
||||||
path = path.substr(path.lastIndexOf('/')+1) + '/';
|
|
||||||
} else {
|
|
||||||
path = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$.GollumDialog.init({
|
$.GollumDialog.init({
|
||||||
title: 'Create New Page',
|
title: 'Create New Page',
|
||||||
fields: [
|
fields: [
|
||||||
@@ -169,7 +161,7 @@ $(document).ready(function() {
|
|||||||
id: 'name',
|
id: 'name',
|
||||||
name: 'Page Name',
|
name: 'Page Name',
|
||||||
type: 'text',
|
type: 'text',
|
||||||
defaultValue: path || ''
|
defaultValue: ''
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
OK: function( res ) {
|
OK: function( res ) {
|
||||||
@@ -177,7 +169,7 @@ $(document).ready(function() {
|
|||||||
if ( res['name'] ) {
|
if ( res['name'] ) {
|
||||||
name = res['name'];
|
name = res['name'];
|
||||||
}
|
}
|
||||||
window.location = baseUrl + encodeURIComponent(name);
|
window.location = baseUrl + '/' + encodeURIComponent(name);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ body {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#editor .ace_sb {
|
||||||
|
overflow-y: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
#darkness {
|
#darkness {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -49,7 +53,7 @@ so editor doesn't display in the background. */
|
|||||||
#contentframe {
|
#contentframe {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
width: 80%;
|
width: 90%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewframe {
|
#previewframe {
|
||||||
@@ -63,14 +67,35 @@ so editor doesn't display in the background. */
|
|||||||
right: 0;
|
right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.editor_bg {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background: black;
|
||||||
|
width: 50%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolpanel_bg {
|
||||||
|
position: fixed;
|
||||||
|
background: #666;
|
||||||
|
top: 0;
|
||||||
|
height: 30px;
|
||||||
|
width: 100%;
|
||||||
|
padding: 5px 0;
|
||||||
|
margin: 0;
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* -- Start from notepag.es -- */
|
/* -- Start from notepag.es -- */
|
||||||
.toolpanel {
|
.toolpanel {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
background: #666;
|
background: #666;
|
||||||
top: 0;
|
top: 0;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
right: 20px;
|
width: 50%;
|
||||||
width: 80px;
|
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
padding: 5px 0;
|
padding: 5px 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|||||||
@@ -16,6 +16,9 @@
|
|||||||
<a id='toggle' class='edit' href='javascript:void(0)' onclick='jsm.toggleLeftRight();'><img src='images/lr_24.png' alt='Toggle left to right' title='Toggle left to right'></a>
|
<a id='toggle' class='edit' href='javascript:void(0)' onclick='jsm.toggleLeftRight();'><img src='images/lr_24.png' alt='Toggle left to right' title='Toggle left to right'></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class='editor_bg'></div>
|
||||||
|
<div class='toolpanel_bg'></div>
|
||||||
|
|
||||||
<div id='commenttoolpanel' class='toolpanel edit' style='width: 500px; right: 0px; '>
|
<div id='commenttoolpanel' class='toolpanel edit' style='width: 500px; right: 0px; '>
|
||||||
<a id='savecommentconfirm' class='edit'><img src='images/savecomment_24.png' alt='Confirm save with comment' title='Confirm save with comment'></a>
|
<a id='savecommentconfirm' class='edit'><img src='images/savecomment_24.png' alt='Confirm save with comment' title='Confirm save with comment'></a>
|
||||||
<a id='commentcancel' class='edit'><img src='images/cancel_24.png' alt='Cancel save with comment' title='Cancel save with comment'></a>
|
<a id='commentcancel' class='edit'><img src='images/cancel_24.png' alt='Cancel save with comment' title='Cancel save with comment'></a>
|
||||||
@@ -36,11 +39,11 @@ var require = {
|
|||||||
<script src='js/sundown.js'></script>
|
<script src='js/sundown.js'></script>
|
||||||
<script src='js/md_sundown.js'></script>
|
<script src='js/md_sundown.js'></script>
|
||||||
<script src='js/livepreview.js'></script>
|
<script src='js/livepreview.js'></script>
|
||||||
<script>(function(d,j){
|
<!--<script>(function(d,j){
|
||||||
j = d.createElement('script');
|
j = d.createElement('script');
|
||||||
j.src = 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
|
j.src = 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
|
||||||
(d.head || d.getElementsByTagName('head')[0]).appendChild(j);
|
(d.head || d.getElementsByTagName('head')[0]).appendChild(j);
|
||||||
}(document));
|
}(document));
|
||||||
</script>
|
</script>-->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -97,10 +97,12 @@ $.save = function( commitMessage ) {
|
|||||||
var markdown = 'markdown';
|
var markdown = 'markdown';
|
||||||
var txt = editorSession.getValue();
|
var txt = editorSession.getValue();
|
||||||
var msg = defaultCommitMessage();
|
var msg = defaultCommitMessage();
|
||||||
var newLocation = location.protocol + '//' + location.host + baseUrl;
|
var newLocation = baseUrl;
|
||||||
|
|
||||||
|
// 'a%2Fb' => a/b
|
||||||
if (pathName) {
|
if (pathName) {
|
||||||
newLocation += '/' + pathName;
|
newLocation += '/' + unescape(pathName);
|
||||||
|
pathName = pathName + '/'; // pathName must end with /
|
||||||
}
|
}
|
||||||
|
|
||||||
newLocation += '/' + pageName;
|
newLocation += '/' + pageName;
|
||||||
@@ -395,7 +397,8 @@ var applyTimeout = function () {
|
|||||||
var heightHalf = height / 2;
|
var heightHalf = height / 2;
|
||||||
|
|
||||||
// height minus 50 so the end of document text doesn't flow off the page.
|
// height minus 50 so the end of document text doesn't flow off the page.
|
||||||
var editorContainerStyle = 'width:' + widthHalf + 'px;' +
|
// + 15 for scroll bar
|
||||||
|
var editorContainerStyle = 'width:' + (widthHalf + 15) + 'px;' +
|
||||||
'height:' + (height - 50) + 'px;' +
|
'height:' + (height - 50) + 'px;' +
|
||||||
'left:' + (leftRight === false ? widthHalf + 'px;' : '0px;') +
|
'left:' + (leftRight === false ? widthHalf + 'px;' : '0px;') +
|
||||||
'top:' + '40px;'; // use 40px for tool menu
|
'top:' + '40px;'; // use 40px for tool menu
|
||||||
@@ -406,12 +409,12 @@ var applyTimeout = function () {
|
|||||||
var previewStyle = 'width:' + (widthHalf - 2 - 10) + 'px;' +
|
var previewStyle = 'width:' + (widthHalf - 2 - 10) + 'px;' +
|
||||||
'height:' + height + 'px;' +
|
'height:' + height + 'px;' +
|
||||||
'left:' + (leftRight === false ? '10px;' : widthHalf + 'px;') +
|
'left:' + (leftRight === false ? '10px;' : widthHalf + 'px;') +
|
||||||
'top:' + '0px;';
|
// preview panel top is equal to height of comment tool panel (40px) + 1
|
||||||
|
'top:41px;';
|
||||||
cssSet( preview, previewStyle );
|
cssSet( preview, previewStyle );
|
||||||
|
|
||||||
// Resize tool panel
|
// Resize tool panel
|
||||||
var toolPanelStyle = 'width:' + widthHalf + 'px;' +
|
var toolPanelStyle = 'width:50%;';
|
||||||
'left:' + (leftRight === false ? widthHalf + 'px;' : '0px;');
|
|
||||||
cssSet( toolPanel, toolPanelStyle );
|
cssSet( toolPanel, toolPanelStyle );
|
||||||
|
|
||||||
// Resize comment related elements.
|
// Resize comment related elements.
|
||||||
@@ -426,10 +429,12 @@ var applyTimeout = function () {
|
|||||||
cssSet( commentEditorContainer, commentEditorContainerStyle );
|
cssSet( commentEditorContainer, commentEditorContainerStyle );
|
||||||
commentEditor.resize();
|
commentEditor.resize();
|
||||||
|
|
||||||
|
var commentToolPanelHeight = height / 4 - 40;
|
||||||
|
|
||||||
// In top subtract height (40px) of comment tool panel.
|
// In top subtract height (40px) of comment tool panel.
|
||||||
var commentToolPanelStyle = 'width:' + widthHalf + 'px;' +
|
var commentToolPanelStyle = 'width:' + widthHalf + 'px;' +
|
||||||
'left:' + widthFourth + 'px;' +
|
'left:' + widthFourth + 'px;' +
|
||||||
'top:' + (height / 4 - 40) + 'px;' +
|
'top:' + commentToolPanelHeight + 'px;' +
|
||||||
commentHidden;
|
commentHidden;
|
||||||
cssSet( commentToolPanel, commentToolPanelStyle );
|
cssSet( commentToolPanel, commentToolPanelStyle );
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,11 @@
|
|||||||
<li class="minibutton">
|
<li class="minibutton">
|
||||||
{{>searchbar}}
|
{{>searchbar}}
|
||||||
</li>
|
</li>
|
||||||
<li class="minibutton"><a href="{{base_url}}{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/{{escaped_url_path}}"
|
||||||
class="action-view-page">View Page</a></li>
|
class="action-view-page">View Page</a></li>
|
||||||
<li class="minibutton"><a href="{{base_url}}edit/{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/edit/{{escaped_url_path}}"
|
||||||
class="action-edit-page">Edit Page</a></li>
|
class="action-edit-page">Edit Page</a></li>
|
||||||
<li class="minibutton"><a href="{{base_url}}history/{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/history/{{escaped_url_path}}"
|
||||||
class="action-page-history">Page History</a></li>
|
class="action-page-history">Page History</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -23,10 +23,10 @@
|
|||||||
|
|
||||||
{{#show_revert}}
|
{{#show_revert}}
|
||||||
<ul class="actions">
|
<ul class="actions">
|
||||||
<li class="minibutton"><a href="{{base_url}}history/{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/history/{{escaped_url_path}}"
|
||||||
class="action-page-history">Back to Page History</a></li>
|
class="action-page-history">Back to Page History</a></li>
|
||||||
<li class="minibutton">
|
<li class="minibutton">
|
||||||
<form name="gollum-revert" action="{{base_url}}revert/{{escaped_url_path}}/{{before}}/{{after}}" method="post" id="gollum-revert-form">
|
<form name="gollum-revert" action="{{base_url}}/revert/{{escaped_url_path}}/{{before}}/{{after}}" method="post" id="gollum-revert-form">
|
||||||
<a href="#" class="gollum-revert-button">Revert Changes</a>
|
<a href="#" class="gollum-revert-button">Revert Changes</a>
|
||||||
</form>
|
</form>
|
||||||
</li>
|
</li>
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<ul class="actions">
|
<ul class="actions">
|
||||||
<li class="minibutton"><a href="{{base_url}}history/{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/history/{{escaped_url_path}}"
|
||||||
class="action-page-history">Back to Page History</a></li>
|
class="action-page-history">Back to Page History</a></li>
|
||||||
{{#show_revert}}
|
{{#show_revert}}
|
||||||
<li class="minibutton">
|
<li class="minibutton">
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
<div id="head">
|
<div id="head">
|
||||||
<h1>Editing <strong>{{title}}</strong></h1>
|
<h1>Editing <strong>{{title}}</strong></h1>
|
||||||
<ul class="actions">
|
<ul class="actions">
|
||||||
<li class="minibutton"><a href="{{base_url}}{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/{{escaped_url_path}}"
|
||||||
class="action-view-page">View Page</a></li>
|
class="action-view-page">View Page</a></li>
|
||||||
<li class="minibutton"><a href="{{base_url}}history/{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/history/{{escaped_url_path}}"
|
||||||
class="action-page-history">Page History</a></li>
|
class="action-page-history">Page History</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<div id="gollum-editor" data-escaped-name="{{escaped_name}}" class="{{#is_create_page}}create{{/is_create_page}}{{#is_edit_page}}edit{{/is_edit_page}}">
|
<div id="gollum-editor" data-escaped-name="{{escaped_name}}" class="{{#is_create_page}}create{{/is_create_page}}{{#is_edit_page}}edit{{/is_edit_page}}">
|
||||||
{{#is_create_page}}
|
{{#is_create_page}}
|
||||||
<form name="gollum-editor" action="{{base_url}}create" method="post">
|
<form name="gollum-editor" action="{{base_url}}/create" method="post">
|
||||||
{{/is_create_page}}
|
{{/is_create_page}}
|
||||||
{{#is_edit_page}}
|
{{#is_edit_page}}
|
||||||
<form name="gollum-editor" action="{{base_url}}edit/{{escaped_name}}" method="post">
|
<form name="gollum-editor" action="{{base_url}}/edit/{{escaped_name}}" method="post">
|
||||||
{{/is_edit_page}}
|
{{/is_edit_page}}
|
||||||
<fieldset id="gollum-editor-fields">
|
<fieldset id="gollum-editor-fields">
|
||||||
{{#is_create_page}}
|
{{#is_create_page}}
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
|
|
||||||
<span class="jaws"><br></span>
|
<span class="jaws"><br></span>
|
||||||
<input type="submit" id="gollum-editor-submit" value="Save" title="Save current changes">
|
<input type="submit" id="gollum-editor-submit" value="Save" title="Save current changes">
|
||||||
<a href="{{base_url}}preview" id="gollum-editor-preview" class="minibutton" title="Preview this Page">Preview</a>
|
<a href="{{base_url}}/preview" id="gollum-editor-preview" class="minibutton" title="Preview this Page">Preview</a>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-type" content="text/html;charset=utf-8">
|
<meta http-equiv="Content-type" content="text/html;charset=utf-8">
|
||||||
<link rel="stylesheet" type="text/css" href="{{base_url}}css/gollum.css" media="all">
|
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/gollum.css" media="all">
|
||||||
<link rel="stylesheet" type="text/css" href="{{base_url}}css/template.css" media="all">
|
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/template.css" media="all">
|
||||||
<link rel="stylesheet" type="text/css" href="{{base_url}}css/_styles.css" media="all">
|
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/_styles.css" media="all">
|
||||||
<title>{{title}}</title>
|
<title>{{title}}</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
<div id="home_button">
|
<div id="home_button">
|
||||||
<ul class="actions">
|
<ul class="actions">
|
||||||
<li class="minibutton">
|
<li class="minibutton">
|
||||||
<a href="{{base_url}}" class="action-edit-page">Home</a>
|
<a href="{{base_url}}/" class="action-edit-page">Home</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
<li class="minibutton">
|
<li class="minibutton">
|
||||||
{{>searchbar}}
|
{{>searchbar}}
|
||||||
</li>
|
</li>
|
||||||
<li class="minibutton"><a href="{{base_url}}{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/{{escaped_url_path}}"
|
||||||
class="action-view-page">View Page</a></li>
|
class="action-view-page">View Page</a></li>
|
||||||
<li class="minibutton"><a href="{{base_url}}edit/{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/edit/{{escaped_url_path}}"
|
||||||
class="action-edit-page">Edit Page</a></li>
|
class="action-edit-page">Edit Page</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<form name="compare-versions" id="version-form" method="post"
|
<form name="compare-versions" id="version-form" method="post"
|
||||||
action="{{base_url}}compare/{{escaped_url_path}}">
|
action="{{base_url}}/compare/{{escaped_url_path}}">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<td class="commit-name">
|
<td class="commit-name">
|
||||||
<span class="time-elapsed">{{date}}:</span>
|
<span class="time-elapsed">{{date}}:</span>
|
||||||
{{message}}
|
{{message}}
|
||||||
[<a href="{{base_url}}{{escaped_url_path}}/{{id}}" title="View commit">{{id7}}</a>]
|
[<a href="{{base_url}}/{{escaped_url_path}}/{{id}}" title="View commit">{{id7}}</a>]
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/versions}}
|
{{/versions}}
|
||||||
|
|||||||
@@ -2,22 +2,22 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-type" content="text/html;charset=utf-8">
|
<meta http-equiv="Content-type" content="text/html;charset=utf-8">
|
||||||
<link rel="stylesheet" type="text/css" href="{{base_url}}css/gollum.css" media="all">
|
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/gollum.css" media="all">
|
||||||
<link rel="stylesheet" type="text/css" href="{{base_url}}css/editor.css" media="all">
|
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/editor.css" media="all">
|
||||||
<link rel="stylesheet" type="text/css" href="{{base_url}}css/dialog.css" media="all">
|
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/dialog.css" media="all">
|
||||||
<link rel="stylesheet" type="text/css" href="{{base_url}}css/template.css" media="all">
|
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/template.css" media="all">
|
||||||
|
|
||||||
<!--[if IE 7]>
|
<!--[if IE 7]>
|
||||||
<link rel="stylesheet" type="text/css" href="{{base_url}}css/ie7.css" media="all">
|
<link rel="stylesheet" type="text/css" href="{{base_url}}/css/ie7.css" media="all">
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
|
|
||||||
<script>var baseUrl = '{{base_url}}'</script>
|
<script>var baseUrl = '{{base_url}}'</script>
|
||||||
<script type="text/javascript" src="{{base_url}}javascript/jquery-1.7.2.min.js"></script>
|
<script type="text/javascript" src="{{base_url}}/javascript/jquery-1.7.2.min.js"></script>
|
||||||
<script type="text/javascript" src="{{base_url}}javascript/mousetrap.min.js"></script>
|
<script type="text/javascript" src="{{base_url}}/javascript/mousetrap.min.js"></script>
|
||||||
<script type="text/javascript" src="{{base_url}}javascript/gollum.js"></script>
|
<script type="text/javascript" src="{{base_url}}/javascript/gollum.js"></script>
|
||||||
<script type="text/javascript" src="{{base_url}}javascript/gollum.dialog.js"></script>
|
<script type="text/javascript" src="{{base_url}}/javascript/gollum.dialog.js"></script>
|
||||||
<script type="text/javascript" src="{{base_url}}javascript/gollum.placeholder.js"></script>
|
<script type="text/javascript" src="{{base_url}}/javascript/gollum.placeholder.js"></script>
|
||||||
<script type="text/javascript" src="{{base_url}}javascript/editor/gollum.editor.js"></script>
|
<script type="text/javascript" src="{{base_url}}/javascript/editor/gollum.editor.js"></script>
|
||||||
{{#mathjax}}<script>(function(d,j){
|
{{#mathjax}}<script>(function(d,j){
|
||||||
j = d.createElement('script');
|
j = d.createElement('script');
|
||||||
j.src = 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
|
j.src = 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
|
||||||
|
|||||||
@@ -5,21 +5,21 @@
|
|||||||
<li class="minibutton">
|
<li class="minibutton">
|
||||||
{{>searchbar}}
|
{{>searchbar}}
|
||||||
</li>
|
</li>
|
||||||
<li class="minibutton"><a href="{{base_url}}"
|
<li class="minibutton"><a href="{{base_url}}/"
|
||||||
class="action-edit-page">Home</a></li>
|
class="action-edit-page">Home</a></li>
|
||||||
<li class="minibutton"><a href="{{base_url}}pages"
|
<li class="minibutton"><a href="{{base_url}}/pages"
|
||||||
class="action-all-pages">All</a></li>
|
class="action-all-pages">All</a></li>
|
||||||
<li class="minibutton"><a href="{{base_url}}fileview"
|
<li class="minibutton"><a href="{{base_url}}/fileview"
|
||||||
class="action-all-pages">Files</a></li>
|
class="action-all-pages">Files</a></li>
|
||||||
<li class="minibutton" class="jaws">
|
<li class="minibutton" class="jaws">
|
||||||
<a href="#" id="minibutton-new-page">New</a></li>
|
<a href="#" id="minibutton-new-page">New</a></li>
|
||||||
<li class="minibutton" class="jaws">
|
<li class="minibutton" class="jaws">
|
||||||
<a href="#" id="minibutton-rename-page">Rename</a></li>
|
<a href="#" id="minibutton-rename-page">Rename</a></li>
|
||||||
{{#editable}}
|
{{#editable}}
|
||||||
<li class="minibutton"><a href="{{base_url}}edit/{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/edit/{{escaped_url_path}}"
|
||||||
class="action-edit-page">Edit</a></li>
|
class="action-edit-page">Edit</a></li>
|
||||||
{{/editable}}
|
{{/editable}}
|
||||||
<li class="minibutton"><a href="{{base_url}}history/{{escaped_url_path}}"
|
<li class="minibutton"><a href="{{base_url}}/history/{{escaped_url_path}}"
|
||||||
class="action-page-history">History</a></li>
|
class="action-page-history">History</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
<div id="footer">
|
<div id="footer">
|
||||||
<p id="last-edit">Last edited by <b>{{author}}</b>, {{date}}</p>
|
<p id="last-edit">Last edited by <b>{{author}}</b>, {{date}}</p>
|
||||||
<p>
|
<p>
|
||||||
<a id="delete-link" href="{{base_url}}{{escaped_url_path}}" data-confirm="Are you sure you want to delete this page?"><span>Delete this Page</span></a>
|
<a id="delete-link" href="{{base_url}}/{{escaped_url_path}}" data-confirm="Are you sure you want to delete this page?"><span>Delete this Page</span></a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<li class="minibutton">
|
<li class="minibutton">
|
||||||
{{>searchbar}}
|
{{>searchbar}}
|
||||||
</li>
|
</li>
|
||||||
<li class="minibutton"><a href="{{base_url}}"
|
<li class="minibutton"><a href="{{base_url}}/"
|
||||||
class="action-edit-page">Home</a></li>
|
class="action-edit-page">Home</a></li>
|
||||||
<li class="minibutton" class="jaws">
|
<li class="minibutton" class="jaws">
|
||||||
<a href="#" id="minibutton-new-page">New</a>
|
<a href="#" id="minibutton-new-page">New</a>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<li class="minibutton">
|
<li class="minibutton">
|
||||||
{{>searchbar}}
|
{{>searchbar}}
|
||||||
</li>
|
</li>
|
||||||
<li class="minibutton"><a href="{{base_url}}"
|
<li class="minibutton"><a href="{{base_url}}/"
|
||||||
class="action-edit-page">Home</a></li>
|
class="action-edit-page">Home</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
{{#results}}
|
{{#results}}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{base_url}}{{name}}">{{name}}</a>
|
<a href="{{base_url}}/{{name}}">{{name}}</a>
|
||||||
<span class="count">({{count}} matches)</span>
|
<span class="count">({{count}} matches)</span>
|
||||||
</li>
|
</li>
|
||||||
{{/results}}
|
{{/results}}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<div id="searchbar">
|
<div id="searchbar">
|
||||||
<form action="{{base_url}}search" method="get" id="search-form">
|
<form action="{{base_url}}/search" method="get" id="search-form">
|
||||||
<div id="searchbar-fauxtext">
|
<div id="searchbar-fauxtext">
|
||||||
<input type="text" name="q" id="search-query" value="Search…" autocomplete="off">
|
<input type="text" name="q" id="search-query" value="Search…" autocomplete="off">
|
||||||
<a href="#" id="search-submit" title="Search this wiki">
|
<a href="#" id="search-submit" title="Search this wiki">
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
# ~*~ encoding: utf-8 ~*~
|
||||||
=begin
|
=begin
|
||||||
Copyright 2006-2008 the V8 project authors. All rights reserved.
|
Copyright 2006-2008 the V8 project authors. All rights reserved.
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
@@ -39,7 +40,12 @@ end
|
|||||||
# define charCodeAt on String
|
# define charCodeAt on String
|
||||||
class String
|
class String
|
||||||
def charCodeAt(k)
|
def charCodeAt(k)
|
||||||
return self[k].ord
|
# use scan, nil check, and unpack instead of ord for 1.8
|
||||||
|
# 1.9 can simply use self[k].ord
|
||||||
|
# http://stackoverflow.com/questions/7793177/split-utf8-string-regardless-of-ruby-version
|
||||||
|
c = self.scan(/./mu)[k]
|
||||||
|
return nil if c.nil?
|
||||||
|
c.unpack('U')[0]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -147,6 +153,7 @@ def Encode(uri, unescape)
|
|||||||
k = -1;
|
k = -1;
|
||||||
while ((k+=1) < uriLength) do
|
while ((k+=1) < uriLength) do
|
||||||
cc1 = uri.charCodeAt(k);
|
cc1 = uri.charCodeAt(k);
|
||||||
|
next if cc1.nil?
|
||||||
if (self.send(unescape, cc1))
|
if (self.send(unescape, cc1))
|
||||||
result[index] = cc1;
|
result[index] = cc1;
|
||||||
index += 1
|
index += 1
|
||||||
@@ -163,10 +170,11 @@ def Encode(uri, unescape)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
# use .compact to get rid of nils from charCodeAt
|
||||||
# return %StringFromCharCodeArray(result);
|
# return %StringFromCharCodeArray(result);
|
||||||
# 'c' = 8 bit signed char
|
# 'c' = 8 bit signed char
|
||||||
# http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-pack
|
# http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-pack
|
||||||
return result.pack 'c*'
|
return result.compact.pack 'c*'
|
||||||
end
|
end
|
||||||
end # class << self
|
end # class << self
|
||||||
end # module
|
end # module
|
||||||
|
|||||||
@@ -79,6 +79,17 @@ module Precious
|
|||||||
def mathjax
|
def mathjax
|
||||||
@mathjax
|
@mathjax
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Access to embedded metadata.
|
||||||
|
#
|
||||||
|
# Examples
|
||||||
|
#
|
||||||
|
# {{#metadata}}{{name}}{{/metadata}}
|
||||||
|
#
|
||||||
|
# Returns Hash.
|
||||||
|
def metadata
|
||||||
|
@page.metadata
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ module Precious
|
|||||||
def breadcrumb
|
def breadcrumb
|
||||||
if @path
|
if @path
|
||||||
path = Pathname.new(@path)
|
path = Pathname.new(@path)
|
||||||
breadcrumb = [%{<a href="#{@base_url}pages/">Home</a>}]
|
breadcrumb = [%{<a href="#{@base_url}/pages/">Home</a>}]
|
||||||
path.descend do |crumb|
|
path.descend do |crumb|
|
||||||
title = crumb.basename
|
title = crumb.basename
|
||||||
|
|
||||||
if title == path.basename
|
if title == path.basename
|
||||||
breadcrumb << title
|
breadcrumb << title
|
||||||
else
|
else
|
||||||
breadcrumb << %{<a href="#{@base_url}pages/#{crumb}/">#{title}</a>}
|
breadcrumb << %{<a href="#{@base_url}/pages/#{crumb}/">#{title}</a>}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ module Precious
|
|||||||
if page_path.include?('/')
|
if page_path.include?('/')
|
||||||
folder = page_path.split('/').first
|
folder = page_path.split('/').first
|
||||||
folder_path = @path ? "#{@path}/#{folder}" : folder
|
folder_path = @path ? "#{@path}/#{folder}" : folder
|
||||||
folder_link = %{<li><a href="#{@base_url}pages/#{folder_path}/" class="folder">#{folder}</a></li>}
|
folder_link = %{<li><a href="#{@base_url}/pages/#{folder_path}/" class="folder">#{folder}</a></li>}
|
||||||
|
|
||||||
unless folder_links.include?(folder_link)
|
unless folder_links.include?(folder_link)
|
||||||
folder_links << folder_link
|
folder_links << folder_link
|
||||||
@@ -47,7 +47,7 @@ module Precious
|
|||||||
folder_link
|
folder_link
|
||||||
end
|
end
|
||||||
elsif page_path != ".gitkeep"
|
elsif page_path != ".gitkeep"
|
||||||
%{<li><a href="#{@base_url}#{page.escaped_url_path}" class="file">#{page.name}</a></li>}
|
%{<li><a href="#{@base_url}/#{page.escaped_url_path}" class="file">#{page.name}</a></li>}
|
||||||
end
|
end
|
||||||
}.compact.join("\n")
|
}.compact.join("\n")
|
||||||
else
|
else
|
||||||
|
|||||||
+36
-4
@@ -3,10 +3,15 @@ require 'cgi'
|
|||||||
require 'pygments'
|
require 'pygments'
|
||||||
require 'base64'
|
require 'base64'
|
||||||
|
|
||||||
|
# initialize Pygments
|
||||||
|
Pygments.start
|
||||||
|
|
||||||
module Gollum
|
module Gollum
|
||||||
|
|
||||||
class Markup
|
class Markup
|
||||||
attr_accessor :toc
|
attr_accessor :toc
|
||||||
|
attr_reader :metadata
|
||||||
|
|
||||||
# Initialize a new Markup object.
|
# Initialize a new Markup object.
|
||||||
#
|
#
|
||||||
# page - The Gollum::Page.
|
# page - The Gollum::Page.
|
||||||
@@ -27,6 +32,7 @@ module Gollum
|
|||||||
@wsdmap = {}
|
@wsdmap = {}
|
||||||
@premap = {}
|
@premap = {}
|
||||||
@toc = nil
|
@toc = nil
|
||||||
|
@metadata = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
# Render the content with Gollum wiki syntax on top of the file's own
|
# Render the content with Gollum wiki syntax on top of the file's own
|
||||||
@@ -43,6 +49,7 @@ module Gollum
|
|||||||
@wiki.sanitizer
|
@wiki.sanitizer
|
||||||
|
|
||||||
data = @data.dup
|
data = @data.dup
|
||||||
|
data = extract_metadata(data)
|
||||||
data = extract_code(data)
|
data = extract_code(data)
|
||||||
data = extract_tex(data)
|
data = extract_tex(data)
|
||||||
data = extract_wsd(data)
|
data = extract_wsd(data)
|
||||||
@@ -80,14 +87,15 @@ module Gollum
|
|||||||
def process_headers(doc)
|
def process_headers(doc)
|
||||||
toc = nil
|
toc = nil
|
||||||
doc.css('h1,h2,h3,h4,h5,h6').each do |h|
|
doc.css('h1,h2,h3,h4,h5,h6').each do |h|
|
||||||
id = CGI::escape(h.content.gsub(' ','-'))
|
id = encodeURIComponent(h.content.gsub(' ','-'))
|
||||||
level = h.name.gsub(/[hH]/,'').to_i
|
level = h.name.gsub(/[hH]/,'').to_i
|
||||||
|
|
||||||
# Add anchors
|
# Add anchors
|
||||||
anchor = Nokogiri::XML::Node.new('a', doc)
|
anchor = Nokogiri::XML::Node.new('a', doc)
|
||||||
anchor['class'] = 'anchor'
|
anchor['class'] = 'anchor'
|
||||||
anchor['id'] = id
|
anchor['id'] = id
|
||||||
anchor['href'] = '#' + id
|
# % -> %25 so anchors work on Firefox. See issue #475
|
||||||
|
anchor['href'] = '#' + id.gsub('%', '%25')
|
||||||
h.add_child(anchor)
|
h.add_child(anchor)
|
||||||
|
|
||||||
# Build TOC
|
# Build TOC
|
||||||
@@ -105,7 +113,8 @@ module Gollum
|
|||||||
tail_level -= 1
|
tail_level -= 1
|
||||||
end
|
end
|
||||||
node = Nokogiri::XML::Node.new('li', doc)
|
node = Nokogiri::XML::Node.new('li', doc)
|
||||||
node.add_child("<a href='##{id}'>#{h.content}</a>")
|
# % -> %25 so anchors work on Firefox. See issue #475
|
||||||
|
node.add_child("<a href='##{id.gsub('%', '%25')}'>#{h.content}</a>")
|
||||||
tail.add_child(node)
|
tail.add_child(node)
|
||||||
end
|
end
|
||||||
toc = toc.to_xhtml if toc != nil
|
toc = toc.to_xhtml if toc != nil
|
||||||
@@ -399,7 +408,7 @@ module Gollum
|
|||||||
link_name = @wiki.page_class.cname(page.name)
|
link_name = @wiki.page_class.cname(page.name)
|
||||||
presence = "present"
|
presence = "present"
|
||||||
end
|
end
|
||||||
link = ::File.join(@wiki.base_path, CGI.escape(link_name))
|
link = ::File.join(@wiki.base_path, page ? page.escaped_url_path : CGI.escape(link_name))
|
||||||
%{<a class="internal #{presence}" href="#{link}#{extra}">#{name}</a>}
|
%{<a class="internal #{presence}" href="#{link}#{extra}">#{name}</a>}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -565,6 +574,29 @@ module Gollum
|
|||||||
data
|
data
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
#
|
||||||
|
# Metadata
|
||||||
|
#
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
# Extract metadata for data and build metadata table. Metadata
|
||||||
|
# is content found between `<!-- ---` and `-->` markers, and must
|
||||||
|
# be a valid YAML mapping.
|
||||||
|
#
|
||||||
|
# Returns the String of formatted data with metadata removed.
|
||||||
|
def extract_metadata(data)
|
||||||
|
@metadata ||= {}
|
||||||
|
data.gsub(/\<\!--+\s+---(.*?)--+\>/m) do
|
||||||
|
yaml = @wiki.sanitizer.clean($1)
|
||||||
|
hash = YAML.load(yaml)
|
||||||
|
if Hash === hash
|
||||||
|
@metadata.update(hash)
|
||||||
|
end
|
||||||
|
''
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Hook for getting the formatted value of extracted tag data.
|
# Hook for getting the formatted value of extracted tag data.
|
||||||
#
|
#
|
||||||
# type - Symbol value identifying what type of data is being extracted.
|
# type - Symbol value identifying what type of data is being extracted.
|
||||||
|
|||||||
@@ -217,6 +217,14 @@ module Gollum
|
|||||||
markup_class.toc
|
markup_class.toc
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Public: Embedded metadata.
|
||||||
|
#
|
||||||
|
# Returns Hash of metadata.
|
||||||
|
def meta_data()
|
||||||
|
formatted_data if markup_class.metadata == nil
|
||||||
|
markup_class.metadata
|
||||||
|
end
|
||||||
|
|
||||||
# Public: The format of the page.
|
# Public: The format of the page.
|
||||||
#
|
#
|
||||||
# Returns the Symbol format of the page. One of:
|
# Returns the Symbol format of the page. One of:
|
||||||
|
|||||||
+1
-1
@@ -179,7 +179,7 @@ module Gollum
|
|||||||
self.class.history_sanitization
|
self.class.history_sanitization
|
||||||
@live_preview = options.fetch(:live_preview, true)
|
@live_preview = options.fetch(:live_preview, true)
|
||||||
@universal_toc = options.fetch(:universal_toc, false)
|
@universal_toc = options.fetch(:universal_toc, false)
|
||||||
@mathjax = options[:mathjax] || true
|
@mathjax = options[:mathjax] || false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: check whether the wiki's git repo exists on the filesystem.
|
# Public: check whether the wiki's git repo exists on the filesystem.
|
||||||
|
|||||||
@@ -142,6 +142,36 @@ context "Frontend" do
|
|||||||
assert last_response.ok?
|
assert last_response.ok?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "page create and edit with dash & page rev" do
|
||||||
|
page = 'c-d-e'
|
||||||
|
path = 'a/b/' # path must end with /
|
||||||
|
|
||||||
|
post '/create', :content => 'create_msg', :page => page,
|
||||||
|
:path => path, :format => 'markdown', :message => ''
|
||||||
|
page_c = @wiki.paged(page, path)
|
||||||
|
assert_equal 'create_msg', page_c.raw_data
|
||||||
|
|
||||||
|
# must clear or create_msg will be returned
|
||||||
|
@wiki.clear_cache
|
||||||
|
|
||||||
|
# post '/edit' fails. post '/edit/' works.
|
||||||
|
post '/edit/', :content => 'edit_msg',
|
||||||
|
:page => page, :path => path, :message => ''
|
||||||
|
page_e = @wiki.paged(page, path)
|
||||||
|
assert_equal 'edit_msg', page_e.raw_data
|
||||||
|
|
||||||
|
@wiki.clear_cache
|
||||||
|
|
||||||
|
# test `get %r{/(.+?)/([0-9a-f]{40})} do` in app.rb
|
||||||
|
get '/' + page_c.escaped_url_path + '/' + page_c.version.to_s
|
||||||
|
assert last_response.ok?
|
||||||
|
assert_match /create_msg/, last_response.body
|
||||||
|
|
||||||
|
get '/' + page_e.escaped_url_path + '/' + page_e.version.to_s
|
||||||
|
assert last_response.ok?
|
||||||
|
assert_match /edit_msg/, last_response.body
|
||||||
|
end
|
||||||
|
|
||||||
test "guards against creation of existing page" do
|
test "guards against creation of existing page" do
|
||||||
name = "A"
|
name = "A"
|
||||||
post "/create", :content => 'abc', :page => name,
|
post "/create", :content => 'abc', :page => name,
|
||||||
@@ -182,6 +212,8 @@ context "Frontend" do
|
|||||||
assert last_response.ok?
|
assert last_response.ok?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
# Grit is broken.
|
||||||
test "reverts single commit" do
|
test "reverts single commit" do
|
||||||
page1 = @wiki.page('B')
|
page1 = @wiki.page('B')
|
||||||
|
|
||||||
@@ -207,6 +239,7 @@ context "Frontend" do
|
|||||||
assert_not_equal page1.version.sha, page2.version.sha
|
assert_not_equal page1.version.sha, page2.version.sha
|
||||||
assert_equal "INITIAL", page2.raw_data.strip
|
assert_equal "INITIAL", page2.raw_data.strip
|
||||||
end
|
end
|
||||||
|
=end
|
||||||
|
|
||||||
test "cannot revert conflicting commit" do
|
test "cannot revert conflicting commit" do
|
||||||
page1 = @wiki.page('A')
|
page1 = @wiki.page('A')
|
||||||
@@ -219,6 +252,20 @@ context "Frontend" do
|
|||||||
assert_equal page1.version.sha, page2.version.sha
|
assert_equal page1.version.sha, page2.version.sha
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "redirects from 'base_path' or 'base_path/' to 'base_path/Home'" do
|
||||||
|
Precious::App.set(:wiki_options, {})
|
||||||
|
get "/"
|
||||||
|
assert_match "http://example.org/Home", last_response.headers['Location']
|
||||||
|
|
||||||
|
Precious::App.set(:wiki_options, { :base_path => '/wiki' })
|
||||||
|
get "/"
|
||||||
|
assert_match "http://example.org/wiki/Home", last_response.headers['Location']
|
||||||
|
|
||||||
|
Precious::App.set(:wiki_options, { :base_path => '/wiki/' })
|
||||||
|
get "/"
|
||||||
|
assert_match "http://example.org/wiki/Home", last_response.headers['Location']
|
||||||
|
end
|
||||||
|
|
||||||
def app
|
def app
|
||||||
Precious::App
|
Precious::App
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -517,6 +517,57 @@ np.array([[2,2],[1,3]],np.float)
|
|||||||
assert_not_nil rendered.match(output)
|
assert_not_nil rendered.match(output)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#########################################################################
|
||||||
|
#
|
||||||
|
# Metadata Blocks
|
||||||
|
#
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
test "metadata blocks" do
|
||||||
|
content = "a\n\n<!-- ---\ntags: [foo, bar]\n-->\n\nb"
|
||||||
|
output = "<p>a</p>\n\n<p>b</p>"
|
||||||
|
result = {'tags'=>['foo','bar']}
|
||||||
|
|
||||||
|
index = @wiki.repo.index
|
||||||
|
index.add("Bilbo-Baggins.md", content)
|
||||||
|
index.commit("Add metadata")
|
||||||
|
|
||||||
|
page = @wiki.page("Bilbo Baggins")
|
||||||
|
rendered = Gollum::Markup.new(page).render
|
||||||
|
assert_equal output, rendered
|
||||||
|
assert_equal result, page.meta_data
|
||||||
|
end
|
||||||
|
|
||||||
|
test "metadata blocks with newline" do
|
||||||
|
content = "a\n\n<!--\n---\ntags: [foo, bar]\n-->\n\nb"
|
||||||
|
output = "<p>a</p>\n\n<p>b</p>"
|
||||||
|
result = {'tags'=>['foo','bar']}
|
||||||
|
|
||||||
|
index = @wiki.repo.index
|
||||||
|
index.add("Bilbo-Baggins.md", content)
|
||||||
|
index.commit("Add metadata")
|
||||||
|
|
||||||
|
page = @wiki.page("Bilbo Baggins")
|
||||||
|
rendered = Gollum::Markup.new(page).render
|
||||||
|
assert_equal output, rendered
|
||||||
|
assert_equal result, page.meta_data
|
||||||
|
end
|
||||||
|
|
||||||
|
test "metadata sanitation" do
|
||||||
|
content = "a\n\n<!-- ---\nfoo: <script>alert('');</script>\n-->\n\nb"
|
||||||
|
output = "<p>a</p>\n\n<p>b</p>"
|
||||||
|
result = {'foo'=>nil}
|
||||||
|
|
||||||
|
index = @wiki.repo.index
|
||||||
|
index.add("Bilbo-Baggins.md", content)
|
||||||
|
index.commit("Add metadata")
|
||||||
|
|
||||||
|
page = @wiki.page("Bilbo Baggins")
|
||||||
|
rendered = Gollum::Markup.new(page).render
|
||||||
|
assert_equal output, rendered
|
||||||
|
assert_equal result, page.meta_data
|
||||||
|
end
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
#
|
#
|
||||||
# Various
|
# Various
|
||||||
|
|||||||
+11
-2
@@ -19,7 +19,7 @@ context "Precious::Views::Pages" do
|
|||||||
|
|
||||||
test "breadcrumb" do
|
test "breadcrumb" do
|
||||||
@page.instance_variable_set("@path", "Mordor/Eye-Of-Sauron/Saruman")
|
@page.instance_variable_set("@path", "Mordor/Eye-Of-Sauron/Saruman")
|
||||||
@page.instance_variable_set("@base_url", "/")
|
@page.instance_variable_set("@base_url", "")
|
||||||
assert_equal '<a href="/pages/">Home</a> / <a href="/pages/Mordor/">Mordor</a> / <a href="/pages/Mordor/Eye-Of-Sauron/">Eye-Of-Sauron</a> / Saruman', @page.breadcrumb
|
assert_equal '<a href="/pages/">Home</a> / <a href="/pages/Mordor/">Mordor</a> / <a href="/pages/Mordor/Eye-Of-Sauron/">Eye-Of-Sauron</a> / Saruman', @page.breadcrumb
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -29,9 +29,18 @@ context "Precious::Views::Pages" do
|
|||||||
|
|
||||||
test "files_folders" do
|
test "files_folders" do
|
||||||
@page.instance_variable_set("@path", "Mordor")
|
@page.instance_variable_set("@path", "Mordor")
|
||||||
@page.instance_variable_set("@base_url", "/")
|
@page.instance_variable_set("@base_url", "")
|
||||||
results = [FakeResult.new("Mordor/Eye-Of-Sauron.md"), FakeResult.new("Mordor/Orc/Saruman.md"), FakeResult.new("Mordor/.gitkeep")]
|
results = [FakeResult.new("Mordor/Eye-Of-Sauron.md"), FakeResult.new("Mordor/Orc/Saruman.md"), FakeResult.new("Mordor/.gitkeep")]
|
||||||
@page.instance_variable_set("@results", results)
|
@page.instance_variable_set("@results", results)
|
||||||
assert_equal %{<li><a href="/Mordor/Eye-Of-Sauron" class="file">Eye Of Sauron</a></li>\n<li><a href="/pages/Mordor/Orc/" class="folder">Orc</a></li>}, @page.files_folders
|
assert_equal %{<li><a href="/Mordor/Eye-Of-Sauron" class="file">Eye Of Sauron</a></li>\n<li><a href="/pages/Mordor/Orc/" class="folder">Orc</a></li>}, @page.files_folders
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "base url" do
|
||||||
|
# based on test "files_folders"
|
||||||
|
@page.instance_variable_set("@path", "Mordor")
|
||||||
|
@page.instance_variable_set("@base_url", "/wiki")
|
||||||
|
results = [FakeResult.new("Mordor/Eye-Of-Sauron.md"), FakeResult.new("Mordor/Orc/Saruman.md"), FakeResult.new("Mordor/.gitkeep")]
|
||||||
|
@page.instance_variable_set("@results", results)
|
||||||
|
assert_equal %{<li><a href="/wiki/Mordor/Eye-Of-Sauron" class="file">Eye Of Sauron</a></li>\n<li><a href="/wiki/pages/Mordor/Orc/" class="folder">Orc</a></li>}, @page.files_folders
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+22
-1
@@ -15,12 +15,33 @@ context "Unicode Support" do
|
|||||||
FileUtils.rm_rf(@path)
|
FileUtils.rm_rf(@path)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "create and read non-latin page" do
|
test "uri encode" do
|
||||||
|
c = '한글'
|
||||||
|
assert_equal '%ED%95%9C%EA%B8%80', encodeURIComponent(c)
|
||||||
|
assert_equal '%ED%95%9C%EA%B8%80', CGI::escape(c)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "create and read non-latin page with anchor" do
|
||||||
@wiki.write_page("test", :markdown, "# 한글")
|
@wiki.write_page("test", :markdown, "# 한글")
|
||||||
|
|
||||||
page = @wiki.page("test")
|
page = @wiki.page("test")
|
||||||
assert_equal Gollum::Page, page.class
|
assert_equal Gollum::Page, page.class
|
||||||
assert_equal "# 한글", utf8(page.raw_data)
|
assert_equal "# 한글", utf8(page.raw_data)
|
||||||
|
|
||||||
|
# markup.rb
|
||||||
|
# #简介
|
||||||
|
# href.gsub('%', '%25') so the anchor works in Firefox.
|
||||||
|
# <a href="#%25ED%2595%259C%25EA%25B8%2580" id="%ED%95%9C%EA%B8%80" class="anchor"></a>
|
||||||
|
doc = Nokogiri::HTML page.formatted_data
|
||||||
|
h1s = doc / :h1
|
||||||
|
h1 = h1s.first
|
||||||
|
anchors = h1 / :a
|
||||||
|
assert_equal 1, h1s.size
|
||||||
|
assert_equal 1, anchors.size
|
||||||
|
assert_equal '#%25ED%2595%259C%25EA%25B8%2580', anchors[0]['href']
|
||||||
|
assert_equal '%ED%95%9C%EA%B8%80', anchors[0]['id']
|
||||||
|
assert_equal 'anchor', anchors[0]['class']
|
||||||
|
assert_equal '', anchors[0].text
|
||||||
end
|
end
|
||||||
|
|
||||||
test "unicode with existing format rules" do
|
test "unicode with existing format rules" do
|
||||||
|
|||||||
Reference in New Issue
Block a user