Minimal working frontend.

This commit is contained in:
Tom Preston-Werner
2010-07-07 00:29:51 -07:00
parent b770089da2
commit 2e49f2c9e7
37 changed files with 325 additions and 20 deletions
+3
View File
@@ -24,7 +24,10 @@ Gem::Specification.new do |s|
s.extra_rdoc_files = %w[README.md LICENSE]
s.add_dependency('grit', [">= 2.0.0", "< 3.0.0"])
s.add_dependency('github-markup', [">= 0.4.0", "< 1.0.0"])
s.add_dependency('albino', "~> 1.0.0")
s.add_dependency('sinatra', "~> 1.0.0")
s.add_dependency('mustache', [">= 0.11.2", "< 1.0.0"])
s.add_development_dependency('shoulda')
s.add_development_dependency('mocha')
+62
View File
@@ -0,0 +1,62 @@
require 'rubygems'
require 'sinatra'
require 'gollum'
require 'mustache/sinatra'
require 'gollum/frontend/views/layout'
$path = "~/dev/mojombo/gollum/test/examples/lotr.git"
module Precious
class App < Sinatra::Base
register Mustache::Sinatra
dir = File.dirname(File.expand_path(__FILE__))
# We want to serve public assets for now
set :public, "#{dir}/public"
set :static, true
set :mustache, {
# Tell mustache where the Views constant lives
:namespace => Precious,
# Mustache templates live here
:templates => "#{dir}/templates",
# Tell mustache where the views are
:views => "#{dir}/views"
}
# Sinatra error handling
configure :development, :staging do
set :raise_errors, false
set :show_exceptions, true
set :dump_errors, true
set :clean_trace, false
end
get '/' do
show_page_or_file('Home')
end
get '/*' do
show_page_or_file(params[:splat].first)
end
def show_page_or_file(name)
wiki = Gollum::Wiki.new($path)
if page = wiki.page(name)
@content = page.formatted_data
mustache :page
elsif file = wiki.file(name)
file.raw_data
else
halt 404
end
end
end
end
Precious::App.run!
+93
View File
@@ -0,0 +1,93 @@
h1, h2, h3, h4, h5, h6 {
color: #f90;
font-weight: bold;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
h1 {
font-size: 36pt;
}
h2 {
font-size: 32pt;
}
h3 {
font-size: 28pt;
}
h4 {
font-size: 24pt;
}
h5 {
font-size: 20pt;
}
h6 {
font-size: 16pt;
}
p {
font-family: Georgia, serif;
font-size: 14pt;
line-height: 22pt;
}
#content {
width: 60em;
margin: 0 auto;
color: #666;
}
/***********************/
.frame {
margin: 1em 0;
display: inline-block;
}
.frame img {
display: block;
}
.frame > span {
display: block;
border: 1px solid #aaa;
padding: 4px;
}
.frame span span {
display: block;
font-size: 10pt;
margin: 0;
padding: 4px 0 2px 0;
text-align: center;
line-height: 10pt;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
.float-left {
float: left;
padding: .5em 1em .25em 0;
}
.float-right {
float: right;
padding: .5em 0 .25em 1em;
}
.align-left {
display: block;
text-align: left;
}
.align-center {
display: block;
text-align: center;
}
.align-right {
display: block;
text-align: right;
}
@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Gollum - {{title}}</title>
<link rel="stylesheet" href="/css/global.css" type="text/css" charset="utf-8" />
</head>
<body>
<div id="content">
{{{yield}}}
</div>
</body>
</html>
@@ -0,0 +1 @@
{{{content}}}
+12
View File
@@ -0,0 +1,12 @@
module Precious
module Views
class Layout < Mustache
include Rack::Utils
alias_method :h, :escape_html
def title
"Home"
end
end
end
end
+11
View File
@@ -0,0 +1,11 @@
module Precious
module Views
class Page < Layout
attr_reader :content
def title
"A Page"
end
end
end
end
+6 -6
View File
@@ -100,7 +100,7 @@ module Gollum
containered = true
align ||= 'left'
if %w{left right}.include?(align)
classes << "float-#{align};"
classes << "float-#{align}"
end
elsif %w{top texttop middle absmiddle bottom absbottom baseline}.include?(align)
attrs << %{align="#{align}"}
@@ -136,12 +136,12 @@ module Gollum
if opts['frame'] || containered
classes << 'frame' if opts['frame']
%{<div class="#{classes.join(' ')}">} +
%{<div>} +
%{<span class="#{classes.join(' ')}">} +
%{<span>} +
%{<img src="/#{file.path}"#{style_string} #{attr_string}/>} +
(alt ? %{<p>#{alt}</p>} : '') +
%{</div>} +
%{</div>}
(alt ? %{<span>#{alt}</span>} : '') +
%{</span>} +
%{</span>}
else
%{<img src="/#{file.path}"#{style_string} #{attr_string}/>}
end
+92
View File
@@ -0,0 +1,92 @@
<style>
div.frame {
margin: 1em 0;
}
div.frame div {
display: inline-block;
border: 1px solid #aaa;
padding: 4px;
}
div div p {
font-size: 9px;
margin: 0;
padding: 4px 0 0 0;
text-align: center;
}
.float-left {
float: left;
padding-right: 1em;
}
.float-right {
float: right;
padding-left: 1em;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
</style>
<p>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. <img src="http://www.google.com/images/nav_logo8.png" style="max-width: 16px;" /> 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.
<div class="frame float-left">
<div>
<img src="http://www.google.com/images/nav_logo8.png" style="max-width: 100px;" />
<p>Google</p>
</div>
</div>
Fusce ullamcorper orci enim. Duis lectus elit, convallis ac convallis sit amet, euismod imperdiet dolor. Nunc egestas nisi quis magna feugiat vitae fringilla elit fermentum.
<div class="frame float-right">
<div>
<img src="http://www.google.com/images/nav_logo8.png" style="max-width: 100px;" />
<p>Google</p>
</div>
</div>
Vivamus sollicitudin dolor sit amet elit mollis ultricies. 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.<p>
<div class="frame align-left">
<div>
<img src="http://www.google.com/images/nav_logo8.png" />
<p>Google</p>
</div>
</div>
<p>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.</p>
<div class="frame align-center">
<div>
<img src="http://www.google.com/images/nav_logo8.png" />
<p>Google</p>
</div>
</div>
<p>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.</p>
<p>
<div class="frame align-right">
<div>
<img src="http://www.google.com/images/nav_logo8.png" />
</div>
</div>
</p>
<p>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. <div class="frame align-right">
<div>
<img src="http://www.google.com/images/nav_logo8.png" />
</div>
</div> 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.</p>
@@ -0,0 +1,3 @@
xŽK
1}‘ɯ{"Á…à:ŸŽi‰ñþÎʸy‹¢
^–ÖÖÆúÃè̬vI‡ì‘Ù‰”CÉ–BXB´¦úìÐR¯Øy ™4F«i‰„•m`¦´,uÎÕ”ì¢sä+ªøép“×Îï!Ûtç¾q‡Óviò”–䘥AZ9‹¦™æYít9vù¿^Õµ3üF}ɆJü
@@ -0,0 +1 @@
x’AΣ@ …9Ο―°΄‡‚ΤMO Δ± 8P8TrObe2<“ϊορd[΅έR.φΌ<Ο3uή½}κφj=vΗδά³8Aξ &•DNΔΓΡZ¥®9Ζ0$J€ΰiq8M„±±ΗUώM΄·Η.m!/rλbΖ …p?DYbiN_+8”Ο% Lρ|ή$π ,ΚΉΨT«{ΚΆ—d0ΟjkBR@R–Π‚W
@@ -0,0 +1,2 @@
xM
Β0F]ηsJ:™ζD< Αυ¤ B:%Ζ…··gpω=ήƒoΦZΠΡ΅7Η)η’Dk‰Ω³υ(qN#ν[Z27Y;d%eοCIΘ'XM.Δ9ΰbψΣΪমMή]Χα.m•§®υRυ¥5λqΦz†C¤0Z?Α`ƒµf§ϋΛΎΛυ†—δ+°=΄«ωo#J
@@ -0,0 +1,2 @@
x]’AÓ@ …9ϯ°Ä¡ uSqÙÇ" 8PŠ8Tr'±2Gw£þ{<ÙVˆ•r±çåù{ž©£ÔðøîñÕkØs¬öØ÷œrÿ•Àl ˜U {Iœ
¤ƒ£·>K]³¦0f GÊ€ÐÑN«ü›h[~-nN}Þ‚-rïLâÆ Åø0&YRiŸN_+8”/%ŽLé|Þdè0æ+,ÊVlªÕ=›èõYGhuÍ-¡G) AÉ$¶Ð©LŽÛrבR2˜IóLñèúaÀÙH×?.ôþ£R-ê’ð+uì+¨…#FÊU_<í3­³&TÅÕ¯ßÛ¶/7ƒ£ÄuÄ=GÿÎméÁWg.P
@@ -0,0 +1,2 @@
xKjΓ0@»Φ)ζ)#{$ ”΅‹@ΧϊhΪΘdωώρΆθφρΌΆ½ί&,k|™C¨„€iuK³ΒƒΝ±q‰#ΚΝEDnΙ<mBΖj‘Χ…ΙE!j­Q
ΎT³ΕZΛJ©΅l1ΏuΐU;|Ω§n—/ x›Ϊ?ΊώhΟϊZ΄Ώƒ]“χΑYΈ`@4'=/η)§ηθώzsΏmΏp<`Χ.°Ο£5σΓ,L
@@ -0,0 +1 @@
xKjУ0@Лж)ц)#i,KPJаE k}fhкШdљўёЂшіёМЊНп&8^ц`ь)9&AOњт#)5-таGМM(и,Fя"-ЇE"By
@@ -0,0 +1,3 @@
+1 -1
View File
@@ -1 +1 @@
f01428b3138994aab19d5f880b6f37336ddf1f24
4fde706c7c8d3b30b6caec8c82ff4c01261350f2
+5 -5
View File
@@ -81,34 +81,34 @@ context "Markup" do
test "image with horizontal align" do
%w{left center right}.each do |align|
content = "a [[alpha.jpg|align=#{align}]] b"
output = "<p>a <div class=\"align-#{align}\"><div><img src=\"/greek/alpha.jpg\" /></div></div> b</p>\n"
output = "<p>a <span class=\"align-#{align}\"><span><img src=\"/greek/alpha.jpg\" /></span></span> b</p>\n"
relative_image(content, output)
end
end
test "image with float" do
content = "a\n\n[[alpha.jpg|float]]\n\nb"
output = "<p>a</p>\n\n<p><div class=\"float-left;\"><div><img src=\"/greek/alpha.jpg\" /></div></div></p>\n\n<p>b</p>\n"
output = "<p>a</p>\n\n<p><span class=\"float-left\"><span><img src=\"/greek/alpha.jpg\" /></span></span></p>\n\n<p>b</p>\n"
relative_image(content, output)
end
test "image with float and align" do
%w{left right}.each do |align|
content = "a\n\n[[alpha.jpg|float|align=#{align}]]\n\nb"
output = "<p>a</p>\n\n<p><div class=\"float-#{align};\"><div><img src=\"/greek/alpha.jpg\" /></div></div></p>\n\n<p>b</p>\n"
output = "<p>a</p>\n\n<p><span class=\"float-#{align}\"><span><img src=\"/greek/alpha.jpg\" /></span></span></p>\n\n<p>b</p>\n"
relative_image(content, output)
end
end
test "image with frame" do
content = "a\n\n[[alpha.jpg|frame]]\n\nb"
output = "<p>a</p>\n\n<p><div class=\"frame\"><div><img src=\"/greek/alpha.jpg\" /></div></div></p>\n\n<p>b</p>\n"
output = "<p>a</p>\n\n<p><span class=\"frame\"><span><img src=\"/greek/alpha.jpg\" /></span></span></p>\n\n<p>b</p>\n"
relative_image(content, output)
end
test "image with frame and alt" do
content = "a\n\n[[alpha.jpg|frame|alt=Alpha]]\n\nb"
output = "<p>a</p>\n\n<p><div class=\"frame\"><div><img src=\"/greek/alpha.jpg\" alt=\"Alpha\" /><p>Alpha</p></div></div></p>\n\n<p>b</p>\n"
output = "<p>a</p>\n\n<p><span class=\"frame\"><span><img src=\"/greek/alpha.jpg\" alt=\"Alpha\" /><span>Alpha</span></span></span></p>\n\n<p>b</p>\n"
relative_image(content, output)
end
+1 -1
View File
@@ -28,7 +28,7 @@ context "Page" do
test "page versions" do
page = @wiki.page('Bilbo Baggins')
assert_equal ['5bc1aaec6149e854078f1d0f8b71933bbc6c2e43'],
assert_equal ["f25eccd98e9b667f9e22946f3e2f945378b8a72d", "5bc1aaec6149e854078f1d0f8b71933bbc6c2e43"],
page.versions.map { |v| v.id }
end
+9 -7
View File
@@ -17,25 +17,27 @@ context "Wiki" do
test "shows paginated log with no page" do
Gollum::Wiki.per_page = 3
assert_equal %w(
f01428b3138994aab19d5f880b6f37336ddf1f24
fbabba862dfa7ac35b39042dd4ad780c9f67b8cb
df26e61e707116f81ebc6b935ec6d1676b7e96c4),
4fde706c7c8d3b30b6caec8c82ff4c01261350f2
1e716a3178a76fe39ee7b88f0cf2dc4a447566f6
afe2034d400ba21e13361f38f74900c51dbc7fde),
@wiki.log.map { |c| c.id }
end
test "shows paginated log with 1st page" do
Gollum::Wiki.per_page = 3
assert_equal %w(
f01428b3138994aab19d5f880b6f37336ddf1f24
fbabba862dfa7ac35b39042dd4ad780c9f67b8cb
df26e61e707116f81ebc6b935ec6d1676b7e96c4),
4fde706c7c8d3b30b6caec8c82ff4c01261350f2
1e716a3178a76fe39ee7b88f0cf2dc4a447566f6
afe2034d400ba21e13361f38f74900c51dbc7fde),
@wiki.log(:page => 1).map { |c| c.id }
end
test "shows paginated log with next page" do
Gollum::Wiki.per_page = 3
assert_equal %w(
5bc1aaec6149e854078f1d0f8b71933bbc6c2e43),
f25eccd98e9b667f9e22946f3e2f945378b8a72d
b0d108328459e44fff4a76cd19b10ddc34adce4b
f01428b3138994aab19d5f880b6f37336ddf1f24),
@wiki.log(:page => 2).map { |c| c.id }
end
end