Move gollum back end to gollum-lib #647
This commit is contained in:
@@ -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
|
||||
Executable
+53
@@ -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
|
||||
Executable
+69
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,7 @@
|
||||
module Precious
|
||||
module Views
|
||||
class Error < Layout
|
||||
attr_reader :message
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 = "« 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 »"
|
||||
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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user