From 00740eb9e8b5d73468ce72fdc91f3ecbaab6ef1a Mon Sep 17 00:00:00 2001
From: bootstraponline Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit eros felis. Nunc non enim at dolor malesuada pellentesque a quis nibh. Aliquam sit amet pretium ante. Google Google
-
- Google Phasellus porta dignissim leo vel hendrerit. Nulla pellentesque nisi ac nunc malesuada aliquam. Nullam et cursus augue. Sed rhoncus pharetra odio, vel dictum diam facilisis et. Etiam molestie justo ut purus elementum rhoncus. Fusce nec augue lectus. Proin a nisl ac lectus facilisis tempus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent blandit tempus libero, in interdum odio dignissim quis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec quis arcu a metus tincidunt scelerisque eget sed mauris. Nullam pellentesque faucibus sodales. Integer ullamcorper enim id nibh tempor ultricies. Google Phasellus porta dignissim leo vel hendrerit. Nulla pellentesque nisi ac nunc malesuada aliquam. Nullam et cursus augue. Sed rhoncus pharetra odio, vel dictum diam facilisis et. Etiam molestie justo ut purus elementum rhoncus. Fusce nec augue lectus. Proin a nisl ac lectus facilisis tempus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent blandit tempus libero, in interdum odio dignissim quis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec quis arcu a metus tincidunt scelerisque eget sed mauris. Nullam pellentesque faucibus sodales. Integer ullamcorper enim id nibh tempor ultricies.
-
Date: Sat, 5 Apr 2014 12:28:30 -0400
Subject: [PATCH 1/8] Fix locale warning
---
test/helper.rb | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/test/helper.rb b/test/helper.rb
index 2cf30787..db5841ff 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -6,6 +6,10 @@ require 'mocha/setup'
require 'fileutils'
require 'minitest/reporters'
+# Silence locale validation warning
+require 'i18n'
+I18n.enforce_available_locales = false
+
MiniTest::Reporters.use!
dir = File.dirname(File.expand_path(__FILE__))
From a7a1c4f81e73bdecebd73efd71329e74ac36cdfa Mon Sep 17 00:00:00 2001
From: bootstraponline
Date: Sat, 5 Apr 2014 12:39:17 -0400
Subject: [PATCH 2/8] Fix utf8 test
---
gollum.gemspec | 7 ++++---
test/helper.rb | 1 +
test/test_app.rb | 11 +++++++++--
3 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/gollum.gemspec b/gollum.gemspec
index 170d9edb..f773abfe 100644
--- a/gollum.gemspec
+++ b/gollum.gemspec
@@ -10,10 +10,10 @@ Gem::Specification.new do |s|
s.rubyforge_project = 'gollum'
s.license = 'MIT'
- s.summary = "A simple, Git-powered wiki."
- s.description = "A simple, Git-powered wiki with a sweet API and local frontend."
+ s.summary = 'A simple, Git-powered wiki.'
+ s.description = 'A simple, Git-powered wiki with a sweet API and local frontend.'
- s.authors = ["Tom Preston-Werner", "Rick Olson"]
+ s.authors = ['Tom Preston-Werner', 'Rick Olson']
s.email = 'tom@github.com'
s.homepage = 'http://github.com/gollum/gollum'
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
s.add_development_dependency 'rack-test', '~> 0.6.2'
s.add_development_dependency 'shoulda', '~> 3.4.0'
s.add_development_dependency 'minitest-reporters', '~> 0.14.16'
+ s.add_development_dependency 'twitter_cldr', '~> 2.4.2'
# = MANIFEST =
s.files = %w[
diff --git a/test/helper.rb b/test/helper.rb
index db5841ff..65fc79aa 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -5,6 +5,7 @@ require 'shoulda'
require 'mocha/setup'
require 'fileutils'
require 'minitest/reporters'
+require 'twitter_cldr'
# Silence locale validation warning
require 'i18n'
diff --git a/test/test_app.rb b/test/test_app.rb
index 2e2de80c..bfbc0aa3 100644
--- a/test/test_app.rb
+++ b/test/test_app.rb
@@ -63,9 +63,13 @@ context "Frontend" do
assert_match /one\ntwo\nthree\nfour\n<\/code><\/pre>\n/m, last_response.body
end
+ def nfd utf8
+ TwitterCldr::Normalization::NFD.normalize utf8
+ end
+
test "UTF-8 headers href preserved" do
page = 'utfh1'
- text = '한글'
+ text = nfd('한글')
# don't use h1 or it will be promoted to replace file name
# which doesn't generate a normal header link
@@ -74,7 +78,10 @@ context "Frontend" do
get page
- assert_match /#{text}<\/a><\/h2>/, last_response.body
+ expected = "
#{text}
"
+ actual = nfd(last_response.body)
+
+ assert_match /#{expected}/, actual
end
test "retain edit information" do
From 452d825e669b18f3f72d7f63e08b281880e95319 Mon Sep 17 00:00:00 2001
From: bootstraponline
Date: Sat, 5 Apr 2014 12:46:41 -0400
Subject: [PATCH 3/8] Clean up tests. Remove templates
---
templates/formatting.html | 92 ---------------------------------------
templates/helper_wiki.rb | 10 -----
test/helper.rb | 24 +++++++---
test/test_app.rb | 78 ++++++++++++++++-----------------
test/test_page_view.rb | 2 +-
test/test_unicode.rb | 16 +++----
6 files changed, 66 insertions(+), 156 deletions(-)
delete mode 100644 templates/formatting.html
delete mode 100644 templates/helper_wiki.rb
diff --git a/templates/formatting.html b/templates/formatting.html
deleted file mode 100644
index dd0b3df5..00000000
--- a/templates/formatting.html
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit eros felis. Nunc non enim at dolor malesuada pellentesque a quis nibh. Aliquam sit amet pretium ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit eros felis. Nunc non enim at dolor malesuada pellentesque a quis nibh. Aliquam sit amet pretium ante. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit eros felis. Nunc non enim at dolor malesuada pellentesque a quis nibh. Aliquam sit amet pretium ante.
-
-
-
-
-
-
-
Phasellus porta dignissim leo vel hendrerit. Nulla pellentesque nisi ac nunc malesuada aliquam. Nullam et cursus augue. Sed rhoncus pharetra odio, vel dictum diam facilisis et. Etiam molestie justo ut purus elementum rhoncus. Fusce nec augue lectus. Proin a nisl ac lectus facilisis tempus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent blandit tempus libero, in interdum odio dignissim quis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec quis arcu a metus tincidunt scelerisque eget sed mauris. Nullam pellentesque faucibus sodales. Integer ullamcorper enim id nibh tempor ultricies.
-
Date: Sat, 5 Apr 2014 12:48:31 -0400
Subject: [PATCH 4/8] Format code
---
bin/gollum | 20 +--
lib/gollum.rb | 5 +-
lib/gollum/app.rb | 200 +++++++++++------------
lib/gollum/helpers.rb | 6 +-
lib/gollum/uri_encode_component.rb | 252 ++++++++++++++++-------------
lib/gollum/views/compare.rb | 30 ++--
lib/gollum/views/edit.rb | 8 +-
lib/gollum/views/editable.rb | 2 +-
lib/gollum/views/file_view.rb | 4 +-
lib/gollum/views/history.rb | 28 ++--
lib/gollum/views/page.rb | 18 +--
lib/gollum/views/pages.rb | 4 +-
12 files changed, 307 insertions(+), 270 deletions(-)
diff --git a/bin/gollum b/bin/gollum
index d300bcea..3a4908e2 100755
--- a/bin/gollum
+++ b/bin/gollum
@@ -17,10 +17,10 @@ require 'optparse'
require 'rubygems'
require 'gollum'
-exec = {}
-options = { 'port' => 4567, 'bind' => '0.0.0.0' }
+exec = {}
+options = { 'port' => 4567, 'bind' => '0.0.0.0' }
wiki_options = {
- :live_preview => false,
+ :live_preview => false,
:allow_uploads => false,
}
@@ -85,7 +85,7 @@ opts = OptionParser.new do |opts|
end
opts.on("--allow-uploads [MODE]", [:dir, :page], "Allows file uploads. Modes: dir (default, store all uploads in the same directory), page (store each upload at the same location as the page).") do |mode|
- wiki_options[:allow_uploads] = true
+ wiki_options[:allow_uploads] = true
wiki_options[:per_page_uploads] = true if mode == :page
end
@@ -120,8 +120,8 @@ end
# --gollum-path wins over ARGV[0]
gollum_path = wiki_options[:gollum_path] ?
- wiki_options[:gollum_path] :
- ARGV[0] || Dir.pwd
+ wiki_options[:gollum_path] :
+ ARGV[0] || Dir.pwd
if options['irb']
require 'irb'
@@ -151,7 +151,9 @@ if options['irb']
begin
require 'gollum-lib'
wiki = Gollum::Wiki.new(gollum_path, wiki_options)
- if !wiki.exist? then raise Gollum::InvalidGitRepositoryError end
+ if !wiki.exist? then
+ raise Gollum::InvalidGitRepositoryError
+ end
puts "Loaded Gollum wiki at #{File.expand_path(gollum_path).inspect}."
puts
puts %( page = wiki.page('page-name'))
@@ -193,7 +195,7 @@ else
def initialize base_path
@mg = Rack::Builder.new do
map '/' do
- run Proc.new { [ 302, {'Location'=> "/#{base_path}" }, [] ] }
+ run Proc.new { [302, { 'Location' => "/#{base_path}" }, []] }
end
map "/#{base_path}" do
@@ -209,4 +211,4 @@ else
# Rack::Handler does not work with Ctrl + C. Use Rack::Server instead.
Rack::Server.new(:app => MapGollum.new(base_path), :Port => options['port'], :Host => options['bind']).start
end
-end
+end
\ No newline at end of file
diff --git a/lib/gollum.rb b/lib/gollum.rb
index f87ebb53..70a2378a 100644
--- a/lib/gollum.rb
+++ b/lib/gollum.rb
@@ -13,7 +13,7 @@ require File.expand_path('../gollum/uri_encode_component', __FILE__)
# Set ruby to UTF-8 mode
# This is required for Ruby 1.8.7 which gollum still supports.
-$KCODE = 'U' if RUBY_VERSION[0,3] == '1.8'
+$KCODE = 'U' if RUBY_VERSION[0, 3] == '1.8'
module Gollum
VERSION = '3.0.0'
@@ -22,7 +22,8 @@ module Gollum
::File.expand_path('gollum/public', ::File.dirname(__FILE__))
end
- class Error < StandardError; end
+ class Error < StandardError;
+ end
class DuplicatePageError < Error
attr_accessor :dir
diff --git a/lib/gollum/app.rb b/lib/gollum/app.rb
index d75ae800..600ec654 100644
--- a/lib/gollum/app.rb
+++ b/lib/gollum/app.rb
@@ -43,7 +43,7 @@ module Precious
register Mustache::Sinatra
include Precious::Helpers
- dir = File.dirname(File.expand_path(__FILE__))
+ dir = File.dirname(File.expand_path(__FILE__))
# Detect unsupported browsers.
Browser = Struct.new(:browser, :version)
@@ -56,23 +56,23 @@ module Precious
def supported_useragent?(user_agent)
ua = UserAgent.parse(user_agent)
- @@min_ua.detect {|min| ua >= min }
+ @@min_ua.detect { |min| ua >= min }
end
# We want to serve public assets for now
set :public_folder, "#{dir}/public/gollum"
- set :static, true
+ set :static, true
set :default_markup, :markdown
set :mustache, {
- # Tell mustache where the Views constant lives
- :namespace => Precious,
+ # Tell mustache where the Views constant lives
+ :namespace => Precious,
- # Mustache templates live here
- :templates => "#{dir}/templates",
+ # Mustache templates live here
+ :templates => "#{dir}/templates",
- # Tell mustache where the views are
- :views => "#{dir}/views"
+ # Tell mustache where the views are
+ :views => "#{dir}/views"
}
# Sinatra error handling
@@ -90,7 +90,7 @@ module Precious
# above will detect base_path when it's used with map in a config.ru
settings.wiki_options.merge!({ :base_path => @base_url })
@css = settings.wiki_options[:css]
- @js = settings.wiki_options[:js]
+ @js = settings.wiki_options[:js]
end
get '/' do
@@ -139,9 +139,9 @@ module Precious
end
redirect to(live_preview_url)
else
- @page = page
+ @page = page
@page.version = wiki.repo.log(wiki.ref, @page.path).first
- @content = page.text_data
+ @content = page.text_data
mustache :edit
end
else
@@ -163,9 +163,9 @@ module Precious
tempfile = params[:file][:tempfile]
end
- dir = wiki.per_page_uploads ? params[:upload_dest] : 'uploads'
- ext = ::File.extname(fullname)
- format = ext.split('.').last || 'txt'
+ dir = wiki.per_page_uploads ? params[:upload_dest] : 'uploads'
+ ext = ::File.extname(fullname)
+ format = ext.split('.').last || 'txt'
filename = ::File.basename(fullname, ext)
contents = ::File.read(tempfile)
reponame = filename + '.' + format
@@ -173,10 +173,10 @@ module Precious
head = wiki.repo.head
options = {
- :message => "Uploaded file to #{dir}/#{reponame}",
- :parent => wiki.repo.head.commit,
+ :message => "Uploaded file to #{dir}/#{reponame}",
+ :parent => wiki.repo.head.commit,
}
- author = session['gollum.author']
+ author = session['gollum.author']
unless author.nil?
options.merge! author
end
@@ -197,37 +197,37 @@ module Precious
end
post '/rename/*' do
- wikip = wiki_page(params[:splat].first)
+ wikip = wiki_page(params[:splat].first)
halt 500 if wikip.nil?
- wiki = wikip.wiki
- page = wiki.paged(wikip.name, wikip.path, exact = true)
- rename = params[:rename]
+ wiki = wikip.wiki
+ page = wiki.paged(wikip.name, wikip.path, exact = true)
+ rename = params[:rename]
halt 500 if page.nil?
halt 500 if rename.nil? or rename.empty?
# Fixup the rename if it is a relative path
# In 1.8.7 rename[0] != rename[0..0]
if rename[0..0] != '/'
- source_dir = ::File.dirname(page.path)
- source_dir = '' if source_dir == '.'
+ source_dir = ::File.dirname(page.path)
+ source_dir = '' if source_dir == '.'
(target_dir, target_name) = ::File.split(rename)
- target_dir = target_dir == '' ? source_dir : "#{source_dir}/#{target_dir}"
- rename = "#{target_dir}/#{target_name}"
+ target_dir = target_dir == '' ? source_dir : "#{source_dir}/#{target_dir}"
+ rename = "#{target_dir}/#{target_name}"
end
committer = Gollum::Committer.new(wiki, commit_message)
- commit = {:committer => committer}
+ commit = { :committer => committer }
success = wiki.rename_page(page, rename, commit)
if !success
- # This occurs on NOOPs, for example renaming A => A
- redirect to("/#{page.escaped_url_path}")
- return
+ # This occurs on NOOPs, for example renaming A => A
+ redirect to("/#{page.escaped_url_path}")
+ return
end
committer.commit
wikip = wiki_page(rename)
- page = wiki.paged(wikip.name, wikip.path, exact = true)
+ page = wiki.paged(wikip.name, wikip.path, exact = true)
return if page.nil?
redirect to("/#{page.escaped_url_path}")
end
@@ -239,11 +239,11 @@ module Precious
page = wiki.paged(page_name, path, exact = true)
return if page.nil?
committer = Gollum::Committer.new(wiki, commit_message)
- commit = {:committer => committer}
+ commit = { :committer => committer }
update_wiki_page(wiki, page, params[:content], commit, page.name, params[:format])
- update_wiki_page(wiki, page.header, params[:header], commit) if params[:header]
- update_wiki_page(wiki, page.footer, params[:footer], commit) if params[:footer]
+ update_wiki_page(wiki, page.header, params[:header], commit) if params[:header]
+ update_wiki_page(wiki, page.footer, params[:footer], commit) if params[:footer]
update_wiki_page(wiki, page.sidebar, params[:sidebar], commit) if params[:sidebar]
committer.commit
@@ -252,9 +252,9 @@ module Precious
get '/delete/*' do
wikip = wiki_page(params[:splat].first)
- name = wikip.name
- wiki = wikip.wiki
- page = wikip.page
+ name = wikip.name
+ wiki = wikip.wiki
+ page = wikip.page
unless page.nil?
wiki.delete_page(page, { :message => "Destroyed #{name} (#{page.format})" })
end
@@ -286,10 +286,10 @@ module Precious
end
post '/create' do
- name = params[:page].to_url
- path = sanitize_empty_params(params[:path]) || ''
- format = params[:format].intern
- wiki = wiki_new
+ name = params[:page].to_url
+ path = sanitize_empty_params(params[:path]) || ''
+ format = params[:format].intern
+ wiki = wiki_new
path.gsub!(/^\//, '')
@@ -305,15 +305,15 @@ module Precious
end
post '/revert/*/:sha1/:sha2' do
- wikip = wiki_page(params[:splat].first)
- @path = wikip.path
- @name = wikip.name
- wiki = wikip.wiki
- @page = wiki.paged(@name,@path)
- sha1 = params[:sha1]
- sha2 = params[:sha2]
+ wikip = wiki_page(params[:splat].first)
+ @path = wikip.path
+ @name = wikip.name
+ wiki = wikip.wiki
+ @page = wiki.paged(@name, @path)
+ sha1 = params[:sha1]
+ sha2 = params[:sha2]
- commit = commit_message
+ commit = commit_message
commit[:message] = "Revert commit #{sha1.chars.take(7).join}"
if wiki.revert_page(@page, sha1, sha2, commit)
redirect to("/#{@page.escaped_url_path}")
@@ -328,23 +328,23 @@ module Precious
end
post '/preview' do
- wiki = wiki_new
- @name = params[:page] || "Preview"
- @page = wiki.preview_page(@name, params[:content], params[:format])
- @content = @page.formatted_data
- @toc_content = wiki.universal_toc ? @page.toc_data : nil
- @mathjax = wiki.mathjax
- @h1_title = wiki.h1_title
- @editable = false
+ wiki = wiki_new
+ @name = params[:page] || "Preview"
+ @page = wiki.preview_page(@name, params[:content], params[:format])
+ @content = @page.formatted_data
+ @toc_content = wiki.universal_toc ? @page.toc_data : nil
+ @mathjax = wiki.mathjax
+ @h1_title = wiki.h1_title
+ @editable = false
@allow_uploads = wiki.allow_uploads
mustache :page
end
get '/history/*' do
- @page = wiki_page(params[:splat].first).page
- @page_num = [params[:page].to_i, 1].max
+ @page = wiki_page(params[:splat].first).page
+ @page_num = [params[:page].to_i, 1].max
unless @page.nil?
- @versions = @page.versions :page => @page_num
+ @versions = @page.versions :page => @page_num
mustache :history
else
redirect to("/")
@@ -358,10 +358,10 @@ module Precious
redirect to("/history/#{@file}")
else
redirect to("/compare/%s/%s...%s" % [
- @file,
- @versions.last,
- @versions.first]
- )
+ @file,
+ @versions.last,
+ @versions.first]
+ )
end
end
@@ -373,14 +373,14 @@ module Precious
\.{2,3} # match .. or ...
(.+) # match the second SHA1
}x do |path, start_version, end_version|
- wikip = wiki_page(path)
- @path = wikip.path
- @name = wikip.name
- @versions = [start_version, end_version]
- wiki = wikip.wiki
- @page = wikip.page
- diffs = wiki.repo.diff(@versions.first, @versions.last, @page.path)
- @diff = diffs.first
+ wikip = wiki_page(path)
+ @path = wikip.path
+ @name = wikip.name
+ @versions = [start_version, end_version]
+ wiki = wikip.wiki
+ @page = wikip.page
+ diffs = wiki.repo.diff(@versions.first, @versions.last, @page.path)
+ @diff = diffs.first
mustache :compare
end
@@ -391,8 +391,8 @@ module Precious
name = wikip.name
path = wikip.path
if page = wikip.page
- @page = page
- @name = name
+ @page = page
+ @name = name
@content = page.formatted_data
@version = version
mustache :page
@@ -402,11 +402,11 @@ module Precious
end
get '/search' do
- @query = params[:q]
- wiki = wiki_new
+ @query = params[:q]
+ wiki = wiki_new
# Sort wiki search results by count (desc) and then by name (asc)
- @results = wiki.search(@query).sort{ |a, b| (a[:count] <=> b[:count]).nonzero? || b[:name] <=> a[:name] }.reverse
- @name = @query
+ @results = wiki.search(@query).sort { |a, b| (a[:count] <=> b[:count]).nonzero? || b[:name] <=> a[:name] }.reverse
+ @name = @query
mustache :search
end
@@ -426,16 +426,16 @@ module Precious
end
get '/fileview' do
- wiki = wiki_new
- options = settings.wiki_options
- content = wiki.pages
+ wiki = wiki_new
+ options = settings.wiki_options
+ content = wiki.pages
# if showing all files include wiki.files
- content += wiki.files if options[:show_all]
+ content += wiki.files if options[:show_all]
# must pass wiki_options to FileView
# --show-all and --collapse-tree can be set.
@results = Gollum::FileView.new(content, options).render_files
- @ref = wiki.ref
+ @ref = wiki.ref
mustache :file_view, { :layout => false }
end
@@ -450,21 +450,21 @@ module Precious
path = extract_path(fullpath) || '/'
if page = wiki.paged(name, path, exact = true)
- @page = page
- @name = name
- @content = page.formatted_data
- @upload_dest = settings.wiki_options[:allow_uploads] ?
- (settings.wiki_options[:per_page_uploads] ?
- "#{path}/#{@name}".sub(/^\/\//, '') : 'uploads'
- ) : ''
+ @page = page
+ @name = name
+ @content = page.formatted_data
+ @upload_dest = settings.wiki_options[:allow_uploads] ?
+ (settings.wiki_options[:per_page_uploads] ?
+ "#{path}/#{@name}".sub(/^\/\//, '') : 'uploads'
+ ) : ''
# Extensions and layout data
- @editable = true
- @page_exists = !page.versions.empty?
- @toc_content = wiki.universal_toc ? @page.toc_data : nil
- @mathjax = wiki.mathjax
- @h1_title = wiki.h1_title
- @bar_side = wiki.bar_side
+ @editable = true
+ @page_exists = !page.versions.empty?
+ @toc_content = wiki.universal_toc ? @page.toc_data : nil
+ @mathjax = wiki.mathjax
+ @h1_title = wiki.h1_title
+ @bar_side = wiki.bar_side
@allow_uploads = wiki.allow_uploads
mustache :page
@@ -483,9 +483,9 @@ module Precious
def update_wiki_page(wiki, page, content, commit, name = nil, format = nil)
return if !page ||
- ((!content || page.raw_data == content) && page.format == format)
+ ((!content || page.raw_data == content) && page.format == format)
name ||= page.name
- format = (format || page.format).to_sym
+ format = (format || page.format).to_sym
content ||= page.raw_data
wiki.update_page(page, name, format, content.to_s, commit)
end
@@ -499,8 +499,8 @@ module Precious
# message is sourced from the incoming request parameters
# author details are sourced from the session, to be populated by rack middleware ahead of us
def commit_message
- msg = (params[:message].nil? or params[:message].empty?) ? "[no message]" : params[:message]
- commit_message = { :message => msg }
+ msg = (params[:message].nil? or params[:message].empty?) ? "[no message]" : params[:message]
+ commit_message = { :message => msg }
author_parameters = session['gollum.author']
commit_message.merge! author_parameters unless author_parameters.nil?
commit_message
diff --git a/lib/gollum/helpers.rb b/lib/gollum/helpers.rb
index 1354f862..4fba20bf 100644
--- a/lib/gollum/helpers.rb
+++ b/lib/gollum/helpers.rb
@@ -22,13 +22,13 @@ module Precious
end
def sanitize_empty_params(param)
- [nil,''].include?(param) ? nil : CGI.unescape(param)
+ [nil, ''].include?(param) ? nil : CGI.unescape(param)
end
# Ensure path begins with a single leading slash
def clean_path(path)
if path
- (path[0] != '/' ? path.insert(0, '/') : path).gsub(/\/{2,}/,'/')
+ (path[0] != '/' ? path.insert(0, '/') : path).gsub(/\/{2,}/, '/')
end
end
@@ -36,7 +36,7 @@ module Precious
# Remove all double slashes
def clean_url url
return url if url.nil?
- url.gsub('%2F','/').gsub(/^\/+/,'').gsub('//','/')
+ url.gsub('%2F', '/').gsub(/^\/+/, '').gsub('//', '/')
end
end
diff --git a/lib/gollum/uri_encode_component.rb b/lib/gollum/uri_encode_component.rb
index 74bccd55..2a5f7404 100644
--- a/lib/gollum/uri_encode_component.rb
+++ b/lib/gollum/uri_encode_component.rb
@@ -49,132 +49,164 @@ class String
end
end
-module URI; class << self
+module URI
+ ;
+ class << self
# Does the char code correspond to an alpha-numeric char.
# isAlphaNumeric('a'.ord) => true
# isAlphaNumeric(''.ord) => false
-def isAlphaNumeric(cc)
- # a - z
- if (97 <= cc && cc <= 122); return true end
- # A - Z
- if (65 <= cc && cc <= 90); return true end
- # 0 - 9
- if (48 <= cc && cc <= 57); return true end
+ def isAlphaNumeric(cc)
+ # a - z
+ if (97 <= cc && cc <= 122);
+ return true
+ end
+ # A - Z
+ if (65 <= cc && cc <= 90);
+ return true
+ end
+ # 0 - 9
+ if (48 <= cc && cc <= 57);
+ return true
+ end
- return false
-end
+ return false
+ end
-def unescapePredicate(cc)
- if (isAlphaNumeric(cc)); return true end
- # !
- if (cc == 33); return true end
- # '()*
- if (39 <= cc && cc <= 42); return true end
- # -.
- if (45 <= cc && cc <= 46); return true end
- # _
- if (cc == 95); return true end
- # ~
- if (cc == 126); return true end
+ def unescapePredicate(cc)
+ if (isAlphaNumeric(cc));
+ return true
+ end
+ # !
+ if (cc == 33);
+ return true
+ end
+ # '()*
+ if (39 <= cc && cc <= 42);
+ return true
+ end
+ # -.
+ if (45 <= cc && cc <= 46);
+ return true
+ end
+ # _
+ if (cc == 95);
+ return true
+ end
+ # ~
+ if (cc == 126);
+ return true
+ end
- return false
-end
+ return false
+ end
-def URIEncodeSingle(cc, result, index)
- x = (cc >> 12) & 0xF;
- y = (cc >> 6) & 63;
- z = cc & 63;
- octets = Array.new(3);
- if (cc <= 0x007F)
- octets[0] = cc;
- elsif (cc <= 0x07FF)
- octets[0] = y + 192;
- octets[1] = z + 128;
- else
- octets[0] = x + 224;
- octets[1] = y + 128;
- octets[2] = z + 128;
- end
- return URIEncodeOctets(octets, result, index);
-end
+ def URIEncodeSingle(cc, result, index)
+ x = (cc >> 12) & 0xF;
+ y = (cc >> 6) & 63;
+ z = cc & 63;
+ octets = Array.new(3);
+ if (cc <= 0x007F)
+ octets[0] = cc;
+ elsif (cc <= 0x07FF)
+ octets[0] = y + 192;
+ octets[1] = z + 128;
+ else
+ octets[0] = x + 224;
+ octets[1] = y + 128;
+ octets[2] = z + 128;
+ end
+ return URIEncodeOctets(octets, result, index);
+ end
# Lazily initialized.
-@@hexCharCodeArray = 0;
+ @@hexCharCodeArray = 0;
-def URIAddEncodedOctetToBuffer(octet, result, index)
- result[index] = 37; # Char code of '%'.
- index += 1
- result[index] = @@hexCharCodeArray[octet >> 4];
- index += 1
- result[index] = @@hexCharCodeArray[octet & 0x0F];
- index += 1
- return index;
-end
+ def URIAddEncodedOctetToBuffer(octet, result, index)
+ result[index] = 37; # Char code of '%'.
+ index += 1
+ result[index] = @@hexCharCodeArray[octet >> 4];
+ index += 1
+ result[index] = @@hexCharCodeArray[octet & 0x0F];
+ index += 1
+ return index;
+ end
-def URIEncodeOctets(octets, result, index)
- if (@@hexCharCodeArray == 0)
- @@hexCharCodeArray = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
- 65, 66, 67, 68, 69, 70];
- end
- index = URIAddEncodedOctetToBuffer(octets[0], result, index);
- if (octets[1]); index = URIAddEncodedOctetToBuffer(octets[1], result, index) end
- if (octets[2]); index = URIAddEncodedOctetToBuffer(octets[2], result, index) end
- if (octets[3]); index = URIAddEncodedOctetToBuffer(octets[3], result, index) end
- return index;
-end
+ def URIEncodeOctets(octets, result, index)
+ if (@@hexCharCodeArray == 0)
+ @@hexCharCodeArray = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
+ 65, 66, 67, 68, 69, 70];
+ end
+ index = URIAddEncodedOctetToBuffer(octets[0], result, index);
+ if (octets[1]);
+ index = URIAddEncodedOctetToBuffer(octets[1], result, index)
+ end
+ if (octets[2]);
+ index = URIAddEncodedOctetToBuffer(octets[2], result, index)
+ end
+ if (octets[3]);
+ index = URIAddEncodedOctetToBuffer(octets[3], result, index)
+ end
+ return index;
+ end
-def URIEncodePair(cc1 , cc2, result, index)
- u = ((cc1 >> 6) & 0xF) + 1;
- w = (cc1 >> 2) & 0xF;
- x = cc1 & 3;
- y = (cc2 >> 6) & 0xF;
- z = cc2 & 63;
- octets = Array.new(4);
- octets[0] = (u >> 2) + 240;
- octets[1] = (((u & 3) << 4) | w) + 128;
- octets[2] = ((x << 4) | y) + 128;
- octets[3] = z + 128;
- return URIEncodeOctets(octets, result, index);
-end
+ def URIEncodePair(cc1, cc2, result, index)
+ u = ((cc1 >> 6) & 0xF) + 1;
+ w = (cc1 >> 2) & 0xF;
+ x = cc1 & 3;
+ y = (cc2 >> 6) & 0xF;
+ z = cc2 & 63;
+ octets = Array.new(4);
+ octets[0] = (u >> 2) + 240;
+ octets[1] = (((u & 3) << 4) | w) + 128;
+ octets[2] = ((x << 4) | y) + 128;
+ octets[3] = z + 128;
+ return URIEncodeOctets(octets, result, index);
+ end
# component must be String
-def URIEncodeComponent(componentString)
- Encode(componentString, :unescapePredicate);
-end
+ def URIEncodeComponent(componentString)
+ Encode(componentString, :unescapePredicate);
+ end
# ECMA-262, section 15.1.3
-def Encode(uri, unescape)
- uriLength = uri.length;
- # We are going to pass result to %StringFromCharCodeArray
- # which does not expect any getters/setters installed
- # on the incoming array.
- result = Array.new(uriLength);
- index = 0;
- k = -1;
- while ((k+=1) < uriLength) do
- cc1 = uri.charCodeAt(k);
- next if cc1.nil?
- if (self.send(unescape, cc1))
- result[index] = cc1;
- index += 1
- else
- if (cc1 >= 0xDC00 && cc1 <= 0xDFFF); throw("URI malformed") end
- if (cc1 < 0xD800 || cc1 > 0xDBFF)
- index = URIEncodeSingle(cc1, result, index);
- else
- k+=1;
- if (k == uriLength); throw("URI malformed") end
- cc2 = uri.charCodeAt(k);
- if (cc2 < 0xDC00 || cc2 > 0xDFFF); throw("URI malformed") end
- index = URIEncodePair(cc1, cc2, result, index);
+ def Encode(uri, unescape)
+ uriLength = uri.length;
+ # We are going to pass result to %StringFromCharCodeArray
+ # which does not expect any getters/setters installed
+ # on the incoming array.
+ result = Array.new(uriLength);
+ index = 0;
+ k = -1;
+ while ((k+=1) < uriLength) do
+ cc1 = uri.charCodeAt(k);
+ next if cc1.nil?
+ if (self.send(unescape, cc1))
+ result[index] = cc1;
+ index += 1
+ else
+ if (cc1 >= 0xDC00 && cc1 <= 0xDFFF);
+ throw("URI malformed")
+ end
+ if (cc1 < 0xD800 || cc1 > 0xDBFF)
+ index = URIEncodeSingle(cc1, result, index);
+ else
+ k+=1;
+ if (k == uriLength);
+ throw("URI malformed")
+ end
+ cc2 = uri.charCodeAt(k);
+ if (cc2 < 0xDC00 || cc2 > 0xDFFF);
+ throw("URI malformed")
+ end
+ index = URIEncodePair(cc1, cc2, result, index);
+ end
+ end
end
+ # use .compact to get rid of nils from charCodeAt
+ # return %StringFromCharCodeArray(result);
+ # 'c' = 8 bit signed char
+ # http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-pack
+ return result.compact.pack 'c*'
end
- end
- # use .compact to get rid of nils from charCodeAt
- # return %StringFromCharCodeArray(result);
- # 'c' = 8 bit signed char
- # http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-pack
- return result.compact.pack 'c*'
-end
-end # class << self
+ end # class << self
end # module
diff --git a/lib/gollum/views/compare.rb b/lib/gollum/views/compare.rb
index 3cf825fa..df2e3a3a 100644
--- a/lib/gollum/views/compare.rb
+++ b/lib/gollum/views/compare.rb
@@ -47,43 +47,45 @@ module Precious
end
@left_diff_line_number = nil
+
def left_diff_line_number(id, line)
if line =~ /^@@/
- m, li = *line.match(/\-(\d+)/)
+ m, li = *line.match(/\-(\d+)/)
@left_diff_line_number = li.to_i
- @current_line_number = @left_diff_line_number
- ret = '...'
+ @current_line_number = @left_diff_line_number
+ ret = '...'
elsif line[0] == ?-
- ret = @left_diff_line_number.to_s
+ ret = @left_diff_line_number.to_s
@left_diff_line_number += 1
- @current_line_number = @left_diff_line_number - 1
+ @current_line_number = @left_diff_line_number - 1
elsif line[0] == ?+
ret = ' '
else
- ret = @left_diff_line_number.to_s
+ ret = @left_diff_line_number.to_s
@left_diff_line_number += 1
- @current_line_number = @left_diff_line_number - 1
+ @current_line_number = @left_diff_line_number - 1
end
ret
end
@right_diff_line_number = nil
+
def right_diff_line_number(id, line)
if line =~ /^@@/
- m, ri = *line.match(/\+(\d+)/)
+ m, ri = *line.match(/\+(\d+)/)
@right_diff_line_number = ri.to_i
- @current_line_number = @right_diff_line_number
- ret = '...'
+ @current_line_number = @right_diff_line_number
+ ret = '...'
elsif line[0] == ?-
ret = ' '
elsif line[0] == ?+
- ret = @right_diff_line_number.to_s
+ ret = @right_diff_line_number.to_s
@right_diff_line_number += 1
- @current_line_number = @right_diff_line_number - 1
+ @current_line_number = @right_diff_line_number - 1
else
- ret = @right_diff_line_number.to_s
+ ret = @right_diff_line_number.to_s
@right_diff_line_number += 1
- @current_line_number = @right_diff_line_number - 1
+ @current_line_number = @right_diff_line_number - 1
end
ret
end
diff --git a/lib/gollum/views/edit.rb b/lib/gollum/views/edit.rb
index 583a5ca1..0909e5af 100755
--- a/lib/gollum/views/edit.rb
+++ b/lib/gollum/views/edit.rb
@@ -6,10 +6,10 @@ module Precious
attr_reader :page, :content
- # return path set in app.rb not @page.path
- def path
- @path
- end
+ # return path set in app.rb not @page.path
+ def path
+ @path
+ end
def title
"#{@page.title}"
diff --git a/lib/gollum/views/editable.rb b/lib/gollum/views/editable.rb
index 365573ad..472b22a4 100644
--- a/lib/gollum/views/editable.rb
+++ b/lib/gollum/views/editable.rb
@@ -4,7 +4,7 @@ module Precious
Gollum::Markup.formats.map do |key, val|
{ :name => val[:name],
:id => key.to_s,
- :selected => selected == key}
+ :selected => selected == key }
end.sort do |a, b|
a[:name].downcase <=> b[:name].downcase
end
diff --git a/lib/gollum/views/file_view.rb b/lib/gollum/views/file_view.rb
index c1a582ab..3aec9a0a 100644
--- a/lib/gollum/views/file_view.rb
+++ b/lib/gollum/views/file_view.rb
@@ -10,8 +10,8 @@ module Precious
def has_results
!@results.empty?
end
-
- def no_results
+
+ def no_results
@results.empty?
end
end
diff --git a/lib/gollum/views/history.rb b/lib/gollum/views/history.rb
index ff486564..ca51254c 100644
--- a/lib/gollum/views/history.rb
+++ b/lib/gollum/views/history.rb
@@ -13,16 +13,16 @@ module Precious
i = @versions.size + 1
@versions.map do |v|
i -= 1
- { :id => v.id,
- :id7 => v.id[0..6],
- :num => i,
- :selected => @page.version.id == v.id,
- :author => v.author.name.respond_to?(:force_encoding) ? v.author.name.force_encoding('UTF-8') : v.author.name,
- :message => v.message.respond_to?(:force_encoding) ? v.message.force_encoding('UTF-8') : v.message,
- :date => v.authored_date.strftime("%B %d, %Y"),
- :gravatar => Digest::MD5.hexdigest(v.author.email.strip.downcase),
+ { :id => v.id,
+ :id7 => v.id[0..6],
+ :num => i,
+ :selected => @page.version.id == v.id,
+ :author => v.author.name.respond_to?(:force_encoding) ? v.author.name.force_encoding('UTF-8') : v.author.name,
+ :message => v.message.respond_to?(:force_encoding) ? v.message.force_encoding('UTF-8') : v.message,
+ :date => v.authored_date.strftime("%B %d, %Y"),
+ :gravatar => Digest::MD5.hexdigest(v.author.email.strip.downcase),
:identicon => self._identicon_code(v.author.email),
- :date_full=> v.authored_date,
+ :date_full => v.authored_date,
}
end
end
@@ -36,16 +36,16 @@ module Precious
def string_to_code string
# sha bytes
- b = [Digest::SHA1.hexdigest(string)[0,20]].pack('H*').bytes.to_a
+ b = [Digest::SHA1.hexdigest(string)[0, 20]].pack('H*').bytes.to_a
# Thanks donpark's IdenticonUtil.java for this.
# Match the following Java code
# ((b[0] & 0xFF) << 24) | ((b[1] & 0xFF) << 16) |
# ((b[2] & 0xFF) << 8) | (b[3] & 0xFF)
return left_shift(b[0], 24) |
- left_shift(b[1], 16) |
- left_shift(b[2], 8) |
- b[3] & 0xFF
+ left_shift(b[1], 16) |
+ left_shift(b[2], 8) |
+ b[3] & 0xFF
end
def _identicon_code(blob)
@@ -53,7 +53,7 @@ module Precious
end
def use_identicon
- @page.wiki.user_icons == 'identicon'
+ @page.wiki.user_icons == 'identicon'
end
def partial(name)
diff --git a/lib/gollum/views/page.rb b/lib/gollum/views/page.rb
index 90d7a5a1..5c20d59a 100644
--- a/lib/gollum/views/page.rb
+++ b/lib/gollum/views/page.rb
@@ -4,9 +4,9 @@ module Precious
include HasPage
attr_reader :content, :page, :header, :footer
- DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
+ DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
DEFAULT_AUTHOR = 'you'
- @@to_xml = { :save_with => Nokogiri::XML::Node::SaveOptions::DEFAULT_XHTML ^ 1, :indent => 0, :encoding => 'UTF-8' }
+ @@to_xml = { :save_with => Nokogiri::XML::Node::SaveOptions::DEFAULT_XHTML ^ 1, :indent => 0, :encoding => 'UTF-8' }
def title
h1 = @h1_title ? page_header_from_content(@content) : false
@@ -23,14 +23,14 @@ module Precious
def author
page_versions = @page.versions
- first = page_versions ? page_versions.first : false
+ first = page_versions ? page_versions.first : false
return DEFAULT_AUTHOR unless first
first.author.name.respond_to?(:force_encoding) ? first.author.name.force_encoding('UTF-8') : first.author.name
end
def date
page_versions = @page.versions
- first = page_versions ? page_versions.first : false
+ first = page_versions ? page_versions.first : false
return Time.now.strftime(DATE_FORMAT) unless first
first.authored_date.strftime(DATE_FORMAT)
end
@@ -50,7 +50,7 @@ module Precious
def allow_uploads
@allow_uploads
end
-
+
def upload_dest
@upload_dest
end
@@ -80,7 +80,7 @@ module Precious
def footer_format
has_footer && @footer.format.to_s
end
-
+
def bar_side
@bar_side.to_s
end
@@ -153,7 +153,7 @@ module Precious
# Extracts title from page if present.
#
def page_header_from_content(content)
- doc = build_document(content)
+ doc = build_document(content)
title = find_header_node(doc).inner_text.strip
title = nil if title.empty?
title
@@ -162,11 +162,11 @@ module Precious
# Returns page content without title if it was extracted.
#
def content_without_page_header(content)
- doc = build_document(content)
+ doc = build_document(content)
title = find_header_node(doc)
title.remove unless title.empty?
# .inner_html will cause href escaping on UTF-8
- doc.css("div#gollum-root").children.to_xml( @@to_xml )
+ doc.css("div#gollum-root").children.to_xml(@@to_xml)
end
end
end
diff --git a/lib/gollum/views/pages.rb b/lib/gollum/views/pages.rb
index 6bf95721..d2a85f5e 100644
--- a/lib/gollum/views/pages.rb
+++ b/lib/gollum/views/pages.rb
@@ -11,7 +11,7 @@ module Precious
def breadcrumb
if @path
- path = Pathname.new(@path)
+ path = Pathname.new(@path)
breadcrumb = [%{Home}]
path.descend do |crumb|
title = crumb.basename
@@ -34,7 +34,7 @@ module Precious
folder_links = []
@results.map { |page|
- page_path = page.path.sub(/^#{@path}\//,'')
+ page_path = page.path.sub(/^#{@path}\//, '')
if page_path.include?('/')
folder = page_path.split('/').first
From 2c53e55533a9dcb08efc2a8501977ee78b769339 Mon Sep 17 00:00:00 2001
From: bootstraponline
Date: Sat, 5 Apr 2014 12:52:55 -0400
Subject: [PATCH 5/8] Update css
---
lib/gollum/public/gollum/css/template.css | 36 ++++++++++++++++++-----
1 file changed, 29 insertions(+), 7 deletions(-)
diff --git a/lib/gollum/public/gollum/css/template.css b/lib/gollum/public/gollum/css/template.css
index e75bc140..bd7e655e 100644
--- a/lib/gollum/public/gollum/css/template.css
+++ b/lib/gollum/public/gollum/css/template.css
@@ -2,6 +2,26 @@
Gollum v3 Template
*/
+@font-face {
+ /* replace */
+ font-family: 'fa';
+ src: url('fa.woff') format('woff');
+ font-weight: normal;
+ font-style: normal
+}
+
+.fa {
+ font: normal normal 16px fa;
+ line-height: 1;
+ display: inline-block;
+ text-decoration: none;
+ -webkit-font-smoothing: antialiased;
+}
+
+.fa-link:before {
+ content: "\f0c1";
+}
+
/* margin & padding reset*/
* {
margin: 0;
@@ -36,6 +56,7 @@ a.absent {
}
.markdown-body {
+ padding: 30px;
font-size: 15px;
line-height: 1.7;
}
@@ -95,28 +116,29 @@ a.absent {
font-size: inherit;
}
.markdown-body h1 {
- font-size: 28px;
+ font-size: 2.5em;
+ border-bottom: 1px solid #ddd;
color: #000;
margin-top: 20px;
margin-bottom: 10px;
}
.markdown-body h2 {
- font-size: 24px;
- border-bottom: 1px solid #ccc;
+ font-size: 2em;
+ border-bottom: 1px solid #eee;
color: #000;
}
.markdown-body h3 {
- font-size: 18px;
+ font-size: 1.5em;
}
.markdown-body h4 {
- font-size: 16px;
+ font-size: 1.2em;
}
.markdown-body h5 {
- font-size: 14px;
+ font-size: 1em;
}
.markdown-body h6 {
color: #777;
- font-size: 14px;
+ font-size: 1em;
}
.markdown-body p,
.markdown-body blockquote,
From 4f49859bf73aa29bce0c2da893af4919a57e2931 Mon Sep 17 00:00:00 2001
From: bootstraponline
Date: Sat, 5 Apr 2014 12:53:07 -0400
Subject: [PATCH 6/8] Format css
---
lib/gollum/public/gollum/css/template.css | 208 ++++++++++++++++++----
1 file changed, 172 insertions(+), 36 deletions(-)
diff --git a/lib/gollum/public/gollum/css/template.css b/lib/gollum/public/gollum/css/template.css
index bd7e655e..8bde7729 100644
--- a/lib/gollum/public/gollum/css/template.css
+++ b/lib/gollum/public/gollum/css/template.css
@@ -50,7 +50,7 @@ a.absent {
color: #c00;
}
-.markdown-body a[id].wiki-toc-anchor {
+.markdown-body a[id].wiki-toc-anchor {
color: inherit;
text-decoration: none;
}
@@ -60,15 +60,19 @@ a.absent {
font-size: 15px;
line-height: 1.7;
}
-.markdown-body>*:first-child {
- margin-top: 0!important;
+
+.markdown-body > *:first-child {
+ margin-top: 0 !important;
}
-.markdown-body>*:last-child {
- margin-bottom: 0!important;
+
+.markdown-body > *:last-child {
+ margin-bottom: 0 !important;
}
+
.markdown-body a.absent {
color: #c00;
}
+
.markdown-body a.anchor {
display: block;
padding-left: 30px;
@@ -79,6 +83,7 @@ a.absent {
left: 0;
bottom: 0;
}
+
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
@@ -92,6 +97,7 @@ a.absent {
cursor: text;
position: relative;
}
+
.markdown-body h1:hover a.anchor,
.markdown-body h2:hover a.anchor,
.markdown-body h3:hover a.anchor,
@@ -101,6 +107,7 @@ a.absent {
background: url(../images/pin-20.png) no-repeat left center;
text-decoration: none;
}
+
.markdown-body h1 tt,
.markdown-body h1 code,
.markdown-body h2 tt,
@@ -115,6 +122,7 @@ a.absent {
.markdown-body h6 code {
font-size: inherit;
}
+
.markdown-body h1 {
font-size: 2.5em;
border-bottom: 1px solid #ddd;
@@ -122,24 +130,30 @@ a.absent {
margin-top: 20px;
margin-bottom: 10px;
}
+
.markdown-body h2 {
font-size: 2em;
border-bottom: 1px solid #eee;
color: #000;
}
+
.markdown-body h3 {
font-size: 1.5em;
}
+
.markdown-body h4 {
font-size: 1.2em;
}
+
.markdown-body h5 {
font-size: 1em;
}
+
.markdown-body h6 {
color: #777;
font-size: 1em;
}
+
.markdown-body p,
.markdown-body blockquote,
.markdown-body ul,
@@ -150,9 +164,11 @@ a.absent {
.markdown-body hr {
margin: 15px 0;
}
+
.markdown-body li {
margin: 0px;
}
+
.markdown-body hr {
background: transparent url(../images/dirty-shade.png) repeat-x 0 0;
border: 0 none;
@@ -160,16 +176,19 @@ a.absent {
height: 4px;
padding: 0;
}
-.markdown-body>h1:first-child,
-.markdown-body>h2:first-child,
-.markdown-body>h3:first-child,
-.markdown-body>h4:first-child,
-.markdown-body>h5:first-child,
-.markdown-body>h6:first-child {
+
+.markdown-body > h1:first-child,
+.markdown-body > h2:first-child,
+.markdown-body > h3:first-child,
+.markdown-body > h4:first-child,
+.markdown-body > h5:first-child,
+.markdown-body > h6:first-child {
}
-.markdown-body h1+h2+h3{
+
+.markdown-body h1 + h2 + h3 {
margin-top: 30px;
}
+
.markdown-body a:first-child h1,
.markdown-body a:first-child h2,
.markdown-body a:first-child h3,
@@ -179,24 +198,29 @@ a.absent {
margin-top: 0;
padding-top: 0;
}
-.markdown-body h1+p,
-.markdown-body h2+p,
-.markdown-body h3+p,
-.markdown-body h4+p,
-.markdown-body h5+p,
-.markdown-body h6+p {
+
+.markdown-body h1 + p,
+.markdown-body h2 + p,
+.markdown-body h3 + p,
+.markdown-body h4 + p,
+.markdown-body h5 + p,
+.markdown-body h6 + p {
margin-top: 0;
}
+
.markdown-body li p.first {
display: inline-block;
}
+
.markdown-body ul,
.markdown-body ol {
padding-left: 30px;
}
+
.markdown-body dl {
padding: 0;
}
+
.markdown-body dl dt {
font-size: 14px;
font-weight: bold;
@@ -204,53 +228,67 @@ a.absent {
padding: 0;
margin: 15px 0 5px;
}
+
.markdown-body dl dt:first-child {
padding: 0;
}
-.markdown-body dl dt>:first-child {
+
+.markdown-body dl dt > :first-child {
margin-top: 0;
}
-.markdown-body dl dt>:last-child {
+
+.markdown-body dl dt > :last-child {
margin-bottom: 0;
}
+
.markdown-body dl dd {
margin: 0 0 15px;
padding: 0 15px;
}
-.markdown-body dl dd>:first-child {
+
+.markdown-body dl dd > :first-child {
margin-top: 0;
}
-.markdown-body dl dd>:last-child {
+
+.markdown-body dl dd > :last-child {
margin-bottom: 0;
}
+
.markdown-body blockquote {
border-left: 4px solid #DDD;
padding: 0 15px;
color: #777;
}
-.markdown-body blockquote>:first-child {
+
+.markdown-body blockquote > :first-child {
margin-top: 0;
}
-.markdown-body blockquote>:last-child {
+
+.markdown-body blockquote > :last-child {
margin-bottom: 0;
}
+
.markdown-body table {
padding: 0;
border-collapse: collapse;
border-spacing: 0;
}
+
.markdown-body table tr {
border-top: 1px solid #ccc;
background-color: #fff;
margin: 0;
padding: 0;
}
+
.markdown-body table tr:nth-child(2n) {
background-color: #f8f8f8;
}
+
.markdown-body table tr th {
font-weight: bold;
}
+
.markdown-body table tr th,
.markdown-body table tr td {
border: 1px solid #ccc;
@@ -258,22 +296,27 @@ a.absent {
margin: 0;
padding: 6px 13px;
}
-.markdown-body table tr th>:first-child,
-.markdown-body table tr td>:first-child {
+
+.markdown-body table tr th > :first-child,
+.markdown-body table tr td > :first-child {
margin-top: 0;
}
-.markdown-body table tr th>:last-child,
-.markdown-body table tr td>:last-child {
+
+.markdown-body table tr th > :last-child,
+.markdown-body table tr td > :last-child {
margin-bottom: 0;
}
+
.markdown-body img {
max-width: 100%;
}
+
.markdown-body span.frame {
display: block;
overflow: hidden;
}
-.markdown-body span.frame>span {
+
+.markdown-body span.frame > span {
border: 1px solid #ddd;
display: block;
float: left;
@@ -282,62 +325,74 @@ a.absent {
padding: 7px;
width: auto;
}
+
.markdown-body span.frame span img {
display: block;
float: left;
}
+
.markdown-body span.frame span span {
clear: both;
color: #333;
display: block;
padding: 5px 0 0;
}
+
.markdown-body span.align-center {
display: block;
overflow: hidden;
clear: both;
}
-.markdown-body span.align-center>span {
+
+.markdown-body span.align-center > span {
display: block;
overflow: hidden;
margin: 13px auto 0;
text-align: center;
}
+
.markdown-body span.align-center span img {
margin: 0 auto;
text-align: center;
}
+
.markdown-body span.align-right {
display: block;
overflow: hidden;
clear: both;
}
-.markdown-body span.align-right>span {
+
+.markdown-body span.align-right > span {
display: block;
overflow: hidden;
margin: 13px 0 0;
text-align: right;
}
+
.markdown-body span.align-right span img {
margin: 0;
text-align: right;
}
+
.markdown-body span.float-left {
display: block;
margin-right: 13px;
overflow: hidden;
float: left;
}
+
.markdown-body span.float-left span {
margin: 13px 0 0;
}
+
.markdown-body span.float-right {
display: block;
margin-left: 13px;
overflow: hidden;
float: right;
}
-.markdown-body span.float-right>span {
+
+.markdown-body span.float-right > span {
display: block;
overflow: hidden;
margin: 13px auto 0;
@@ -360,14 +415,16 @@ a.absent {
background-color: #f8f8f8;
border-radius: 3px;
}
-.markdown-body pre>tt,
-.markdown-body pre>code {
+
+.markdown-body pre > tt,
+.markdown-body pre > code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}
+
.markdown-body pre {
background-color: #f8f8f8;
border: 1px solid #ccc;
@@ -377,16 +434,19 @@ a.absent {
padding: 6px 10px;
border-radius: 3px;
}
+
.markdown-body pre pre,
.markdown-body pre code,
.markdown-body pre tt {
background-color: transparent;
border: none;
}
+
.markdown-body pre pre {
margin: 0;
padding: 0;
}
+
.toc {
background-color: #F7F7F7;
border: 1px solid #ddd;
@@ -394,6 +454,7 @@ a.absent {
margin: 0;
border-radius: 3px;
}
+
.toc-title {
color: #888;
font-size: 14px;
@@ -402,250 +463,325 @@ a.absent {
border-bottom: 1px solid #ddd;
margin-bottom: 3px;
}
+
.toc ul {
padding-left: 10px;
margin: 0;
}
-.toc>ul {
+
+.toc > ul {
margin-left: 10px;
font-size: 17px;
}
+
.toc ul ul {
font-size: 15px;
}
+
.toc ul ul ul {
font-size: 14px;
}
-.toc ul li{
+
+.toc ul li {
margin: 0;
}
+
#header-content .toc,
#footer-content .toc,
#sidebar-content .toc {
border: none;
}
+
.highlight {
background: #fff;
}
+
.highlight .c {
color: #998;
font-style: italic;
}
+
.highlight .err {
color: #a61717;
background-color: #e3d2d2;
}
+
.highlight .k {
font-weight: bold;
}
+
.highlight .o {
font-weight: bold;
}
+
.highlight .cm {
color: #998;
font-style: italic;
}
+
.highlight .cp {
color: #999;
font-weight: bold;
}
+
.highlight .c1 {
color: #998;
font-style: italic;
}
+
.highlight .cs {
color: #999;
font-weight: bold;
font-style: italic;
}
+
.highlight .gd {
color: #000;
background-color: #fdd;
}
+
.highlight .gd .x {
color: #000;
background-color: #faa;
}
+
.highlight .ge {
font-style: italic;
}
+
.highlight .gr {
color: #a00;
}
+
.highlight .gh {
color: #999;
}
+
.highlight .gi {
color: #000;
background-color: #dfd;
}
+
.highlight .gi .x {
color: #000;
background-color: #afa;
}
+
.highlight .go {
color: #888;
}
+
.highlight .gp {
color: #555;
}
+
.highlight .gs {
font-weight: bold;
}
+
.highlight .gu {
color: #800080;
font-weight: bold;
}
+
.highlight .gt {
color: #a00;
}
+
.highlight .kc {
font-weight: bold;
}
+
.highlight .kd {
font-weight: bold;
}
+
.highlight .kn {
font-weight: bold;
}
+
.highlight .kp {
font-weight: bold;
}
+
.highlight .kr {
font-weight: bold;
}
+
.highlight .kt {
color: #458;
font-weight: bold;
}
+
.highlight .m {
color: #099;
}
+
.highlight .s {
color: #d14;
}
+
.highlight .na {
color: #008080;
}
+
.highlight .nb {
color: #0086B3;
}
+
.highlight .nc {
color: #458;
font-weight: bold;
}
+
.highlight .no {
color: #008080;
}
+
.highlight .ni {
color: #800080;
}
+
.highlight .ne {
color: #900;
font-weight: bold;
}
+
.highlight .nf {
color: #900;
font-weight: bold;
}
+
.highlight .nn {
color: #555;
}
+
.highlight .nt {
color: #000080;
}
+
.highlight .nv {
color: #008080;
}
+
.highlight .ow {
font-weight: bold;
}
+
.highlight .w {
color: #bbb;
}
+
.highlight .mf {
color: #099;
}
+
.highlight .mh {
color: #099;
}
+
.highlight .mi {
color: #099;
}
+
.highlight .mo {
color: #099;
}
+
.highlight .sb {
color: #d14;
}
+
.highlight .sc {
color: #d14;
}
+
.highlight .sd {
color: #d14;
}
+
.highlight .s2 {
color: #d14;
}
+
.highlight .se {
color: #d14;
}
+
.highlight .sh {
color: #d14;
}
+
.highlight .si {
color: #d14;
}
+
.highlight .sx {
color: #d14;
}
+
.highlight .sr {
color: #009926;
}
+
.highlight .s1 {
color: #d14;
}
+
.highlight .ss {
color: #990073;
}
+
.highlight .bp {
color: #999;
}
+
.highlight .vc {
color: #008080;
}
+
.highlight .vg {
color: #008080;
}
+
.highlight .vi {
color: #008080;
}
+
.highlight .il {
color: #099;
}
+
.highlight .gc {
color: #999;
background-color: #EAF2F5;
}
+
.type-csharp .highlight .k {
color: #00F;
}
+
.type-csharp .highlight .kt {
color: #00F;
}
+
.type-csharp .highlight .nf {
color: #000;
font-weight: normal;
}
+
.type-csharp .highlight .nc {
color: #2B91AF;
}
+
.type-csharp .highlight .nn {
color: #000;
}
+
.type-csharp .highlight .s {
color: #A31515;
}
+
.type-csharp .highlight .sc {
color: #A31515;
}
From 87a95b85c5adb873400da711507508cd327ac7f2 Mon Sep 17 00:00:00 2001
From: bootstraponline
Date: Sat, 5 Apr 2014 13:01:34 -0400
Subject: [PATCH 7/8] Use FontAwesome 4.0.3 for anchor links
---
lib/gollum/public/gollum/css/template.css | 67 ++-
.../public/gollum/fonts/FontAwesome.otf | Bin 0 -> 62856 bytes
.../gollum/fonts/fontawesome-webfont.eot | Bin 0 -> 38205 bytes
.../gollum/fonts/fontawesome-webfont.svg | 414 ++++++++++++++++++
.../gollum/fonts/fontawesome-webfont.ttf | Bin 0 -> 80652 bytes
.../gollum/fonts/fontawesome-webfont.woff | Bin 0 -> 44432 bytes
6 files changed, 465 insertions(+), 16 deletions(-)
create mode 100644 lib/gollum/public/gollum/fonts/FontAwesome.otf
create mode 100755 lib/gollum/public/gollum/fonts/fontawesome-webfont.eot
create mode 100755 lib/gollum/public/gollum/fonts/fontawesome-webfont.svg
create mode 100755 lib/gollum/public/gollum/fonts/fontawesome-webfont.ttf
create mode 100755 lib/gollum/public/gollum/fonts/fontawesome-webfont.woff
diff --git a/lib/gollum/public/gollum/css/template.css b/lib/gollum/public/gollum/css/template.css
index 8bde7729..0cb72482 100644
--- a/lib/gollum/public/gollum/css/template.css
+++ b/lib/gollum/public/gollum/css/template.css
@@ -3,19 +3,20 @@
*/
@font-face {
- /* replace */
- font-family: 'fa';
- src: url('fa.woff') format('woff');
+ font-family: 'FontAwesome';
+ src: url('../fonts/fontawesome-webfont.eot?v=4.0.3');
+ src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');
font-weight: normal;
- font-style: normal
+ font-style: normal;
}
.fa {
- font: normal normal 16px fa;
- line-height: 1;
display: inline-block;
+ font: normal normal 16px FontAwesome;
+ line-height: 1;
text-decoration: none;
-webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
}
.fa-link:before {
@@ -28,13 +29,26 @@
padding: 0;
}
+div {
+ display: block;
+}
+
+html {
+ font-family: sans-serif;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+
html, body {
color: #333;
}
body {
- font: 13px Helvetica, arial, freesans, clean, sans-serif;
+ background-color: white;
+ font: 13.34px Helvetica, arial, freesans, clean, sans-serif;
+ font-size: small;
line-height: 1.4;
+ min-width: 980px;
}
img {
@@ -50,6 +64,18 @@ a.absent {
color: #c00;
}
+a:focus {
+ outline: thin dotted;
+}
+
+a:active, a:hover {
+ outline: 0;
+}
+
+.markdown-body a.anchor:focus {
+ outline: none;
+}
+
.markdown-body a[id].wiki-toc-anchor {
color: inherit;
text-decoration: none;
@@ -59,6 +85,8 @@ a.absent {
padding: 30px;
font-size: 15px;
line-height: 1.7;
+ overflow: hidden;
+ word-wrap: break-word;
}
.markdown-body > *:first-child {
@@ -90,22 +118,29 @@ a.absent {
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
- margin: 20px 0 10px;
+ margin: 1em 0 15px;
padding: 0;
font-weight: bold;
- -webkit-font-smoothing: antialiased;
+ line-height: 1.7;
cursor: text;
position: relative;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
}
-.markdown-body h1:hover a.anchor,
-.markdown-body h2:hover a.anchor,
-.markdown-body h3:hover a.anchor,
-.markdown-body h4:hover a.anchor,
-.markdown-body h5:hover a.anchor,
-.markdown-body h6:hover a.anchor {
- background: url(../images/pin-20.png) no-repeat left center;
+.markdown-body h1 .fa-link, .markdown-body h2 .fa-link, .markdown-body h3 .fa-link, .markdown-body h4 .fa-link, .markdown-body h5 .fa-link, .markdown-body h6 .fa-link {
+ display: none;
text-decoration: none;
+ color: #000;
+}
+
+.markdown-body h1:hover a.anchor, .markdown-body h2:hover a.anchor, .markdown-body h3:hover a.anchor, .markdown-body h4:hover a.anchor, .markdown-body h5:hover a.anchor, .markdown-body h6:hover a.anchor {
+ text-decoration: none;
+ line-height: 1;
+ padding-left: 8px;
+ margin-left: -30px;
+ top: 15%;
+ display: inline-block;
}
.markdown-body h1 tt,
diff --git a/lib/gollum/public/gollum/fonts/FontAwesome.otf b/lib/gollum/public/gollum/fonts/FontAwesome.otf
new file mode 100644
index 0000000000000000000000000000000000000000..8b0f54e47e1d356dcf1496942a50e228e0f1ee14
GIT binary patch
literal 62856
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