Move gollum back end to gollum-lib #647

This commit is contained in:
Jamie Oliver
2013-03-19 22:11:09 +00:00
parent fe706c184e
commit 1f79126b27
520 changed files with 36 additions and 5663 deletions
+92
View File
@@ -0,0 +1,92 @@
module Precious
module Views
class Compare < Layout
include HasPage
attr_reader :page, :diff, :versions, :message
def title
"Comparison of #{@page.title}"
end
def before
@versions[0][0..6]
end
def after
@versions[1][0..6]
end
def lines
lines = []
@diff.diff.split("\n")[2..-1].each_with_index do |line, line_index|
lines << { :line => line,
:class => line_class(line),
:ldln => left_diff_line_number(0, line),
:rdln => right_diff_line_number(0, line) }
end if @diff
lines
end
def show_revert
!@message
end
# private
def line_class(line)
if line =~ /^@@/
'gc'
elsif line =~ /^\+/
'gi'
elsif line =~ /^\-/
'gd'
else
''
end
end
@left_diff_line_number = nil
def left_diff_line_number(id, line)
if line =~ /^@@/
m, li = *line.match(/\-(\d+)/)
@left_diff_line_number = li.to_i
@current_line_number = @left_diff_line_number
ret = '...'
elsif line[0] == ?-
ret = @left_diff_line_number.to_s
@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
@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+)/)
@right_diff_line_number = ri.to_i
@current_line_number = @right_diff_line_number
ret = '...'
elsif line[0] == ?-
ret = ' '
elsif line[0] == ?+
ret = @right_diff_line_number.to_s
@right_diff_line_number += 1
@current_line_number = @right_diff_line_number - 1
else
ret = @right_diff_line_number.to_s
@right_diff_line_number += 1
@current_line_number = @right_diff_line_number - 1
end
ret
end
end
end
end
+53
View File
@@ -0,0 +1,53 @@
module Precious
module Views
class Create < Layout
include Editable
attr_reader :page, :name
def title
"Create a new page"
end
def is_create_page
true
end
def is_edit_page
false
end
def format
@format = (@page.format || false) if @format.nil? && @page
@format.to_s.downcase
end
def has_footer
@footer = (@page.footer || false) if @footer.nil? && @page
!!@footer
end
def has_header
@header = (@page.header || false) if @header.nil? && @page
!!@header
end
def has_sidebar
@sidebar = (@page.sidebar || false) if @sidebar.nil? && @page
!!@sidebar
end
def page_name
@name.gsub('-', ' ')
end
def formats
super(:markdown)
end
def default_markup
Precious::App.settings.default_markup
end
end
end
end
+69
View File
@@ -0,0 +1,69 @@
module Precious
module Views
class Edit < Layout
include Editable
include HasPage
attr_reader :page, :content
# return path set in app.rb not @page.path
def path
@path
end
def title
"#{@page.title}"
end
def page_name
@name.gsub('-', ' ')
end
def header
if @header.nil?
if page = @page.header
@header = page.raw_data
else
@header = false
end
end
@header
end
def footer
if @footer.nil?
if page = @page.footer
@footer = page.raw_data
else
@footer = false
end
end
@footer
end
def sidebar
if @sidebar.nil?
if page = @page.sidebar
@sidebar = page.raw_data
else
@sidebar = false
end
end
@sidebar
end
def is_create_page
false
end
def is_edit_page
true
end
def format
@format = (@page.format || false) if @format.nil?
@format.to_s.downcase
end
end
end
end
+13
View File
@@ -0,0 +1,13 @@
module Precious
module Editable
def formats(selected = @page.format)
Gollum::Markup.formats.map do |key, val|
{ :name => val[:name],
:id => key.to_s,
:selected => selected == key}
end.sort do |a, b|
a[:name].downcase <=> b[:name].downcase
end
end
end
end
+7
View File
@@ -0,0 +1,7 @@
module Precious
module Views
class Error < Layout
attr_reader :message
end
end
end
+19
View File
@@ -0,0 +1,19 @@
module Precious
module Views
class FileView < Layout
attr_reader :results, :ref
def title
"File view of #{@ref}"
end
def has_results
!@results.empty?
end
def no_results
@results.empty?
end
end
end
end
+15
View File
@@ -0,0 +1,15 @@
module Precious
module HasPage
def path
@page.path
end
def escaped_url_path
@page.escaped_url_path
end
def format
@page.format.to_s
end
end
end
+87
View File
@@ -0,0 +1,87 @@
module Precious
module Views
class History < Layout
include HasPage
attr_reader :page, :page_num
def title
@page.title
end
def versions
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),
:identicon => self._identicon_code(v.author.email),
}
end
end
# http://stackoverflow.com/questions/9445760/bit-shifting-in-ruby
def left_shift int, shift
r = ((int & 0xFF) << (shift & 0x1F)) & 0xFFFFFFFF
# 1>>31, 2**32
(r & 2147483648) == 0 ? r : r - 4294967296
end
def string_to_code string
# sha bytes
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
end
def _identicon_code(blob)
string_to_code blob + @request.host
end
def use_identicon
@page.wiki.user_icons == 'identicon'
end
def partial(name)
if name == :author_template
self.class.partial("history_authors/#{@page.wiki.user_icons}")
else
super
end
end
def previous_link
label = "&laquo; Previous"
if @page_num == 1
%(<span class="disabled">#{label}</span>)
else
link = url("/history/#{@page.name}?page=#{@page_num-1}")
%(<a href="#{link}" hotkey="h">#{label}</a>)
end
end
def next_link
label = "Next &raquo;"
if @versions.size == Gollum::Page.per_page
link = "/history/#{@page.name}?page=#{@page_num+1}"
%(<a href="#{link}" hotkey="l">#{label}</a>)
else
%(<span class="disabled">#{label}</span>)
end
end
end
end
end
+33
View File
@@ -0,0 +1,33 @@
require 'cgi'
module Precious
module Views
class Layout < Mustache
include Rack::Utils
alias_method :h, :escape_html
attr_reader :name, :path
def escaped_name
CGI.escape(@name)
end
def title
"Home"
end
def has_path
!@path.nil?
end
def base_url
@base_url
end
def css # custom css
@css
end
end
end
end
+157
View File
@@ -0,0 +1,157 @@
module Precious
module Views
class Page < Layout
include HasPage
attr_reader :content, :page, :header, :footer
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' }
def title
h1 = @h1_title ? page_header_from_content(@content) : false
h1 || @page.url_path_title
end
def page_header
page_header_from_content(@content) || title
end
def content
content_without_page_header(@content)
end
def author
page_versions = @page.versions
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
return Time.now.strftime(DATE_FORMAT) unless first
first.authored_date.strftime(DATE_FORMAT)
end
def editable
@editable
end
def has_header
@header = (@page.header || false) if @header.nil?
!!@header
end
def header_content
has_header && @header.formatted_data
end
def header_format
has_header && @header.format.to_s
end
def has_footer
@footer = (@page.footer || false) if @footer.nil?
!!@footer
end
def footer_content
has_footer && @footer.formatted_data
end
def footer_format
has_footer && @footer.format.to_s
end
def bar_side
@bar_side.to_s
end
def has_sidebar
@sidebar = (@page.sidebar || false) if @sidebar.nil?
!!@sidebar
end
def sidebar_content
has_sidebar && @sidebar.formatted_data
end
def sidebar_format
has_sidebar && @sidebar.format.to_s
end
def has_toc
!@toc_content.nil?
end
def toc_content
@toc_content
end
def mathjax
@mathjax
end
def use_identicon
@page.wiki.user_icons == 'identicon'
end
# Access to embedded metadata.
#
# Examples
#
# {{#metadata}}{{name}}{{/metadata}}
#
# Returns Hash.
def metadata
@page.metadata
end
private
# Wraps page formatted data to Nokogiri::HTML document.
#
def build_document(content)
Nokogiri::HTML::fragment(%{<div id="gollum-root">} + content.to_s + %{</div>}, 'UTF-8')
end
# Finds header node inside Nokogiri::HTML document.
#
def find_header_node(doc)
case @page.format
when :asciidoc
doc.css("div#gollum-root > div#header > h1:first-child")
when :org
doc.css("div#gollum-root > p.title:first-child")
when :pod
doc.css("div#gollum-root > a.dummyTopAnchor:first-child + h1")
when :rest
doc.css("div#gollum-root > div > div > h1:first-child")
else
doc.css("div#gollum-root > h1:first-child")
end
end
# Extracts title from page if present.
#
def page_header_from_content(content)
doc = build_document(content)
title = find_header_node(doc).inner_text.strip
title = nil if title.empty?
title
end
# Returns page content without title if it was extracted.
#
def content_without_page_header(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 )
end
end
end
end
+67
View File
@@ -0,0 +1,67 @@
require "pathname"
module Precious
module Views
class Pages < Layout
attr_reader :results, :ref
def title
"All pages in #{@ref}"
end
def breadcrumb
if @path
path = Pathname.new(@path)
breadcrumb = [%{<a href="#{@base_url}/pages/">Home</a>}]
path.descend do |crumb|
title = crumb.basename
if title == path.basename
breadcrumb << title
else
breadcrumb << %{<a href="#{@base_url}/pages/#{crumb}/">#{title}</a>}
end
end
breadcrumb.join(" / ")
else
"Home"
end
end
def files_folders
if has_results
folder_links = []
@results.map { |page|
page_path = page.path.sub(/^#{@path}\//,'')
if page_path.include?('/')
folder = page_path.split('/').first
folder_path = @path ? "#{@path}/#{folder}" : folder
folder_link = %{<li><a href="#{@base_url}/pages/#{folder_path}/" class="folder">#{folder}</a></li>}
unless folder_links.include?(folder_link)
folder_links << folder_link
folder_link
end
elsif page_path != ".gitkeep"
%{<li><a href="#{@base_url}/#{page.escaped_url_path}" class="file">#{page.name}</a></li>}
end
}.compact.join("\n")
else
""
end
end
def has_results
!@results.empty?
end
def no_results
@results.empty?
end
end
end
end
+20
View File
@@ -0,0 +1,20 @@
module Precious
module Views
class Search < Layout
attr_reader :content, :page, :footer, :results, :query
def title
"Search results for " + @query
end
def has_results
!@results.empty?
end
def no_results
@results.empty?
end
end
end
end