olelo 0.9.6 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/olelo +1 -1
- data/config.ru +1 -0
- data/config/config.yml.default +1 -0
- data/lib/olelo/application.rb +6 -7
- data/lib/olelo/helper.rb +18 -24
- data/lib/olelo/middleware/ua_header.rb +1 -0
- data/lib/olelo/page.rb +14 -4
- data/lib/olelo/repository.rb +3 -7
- data/lib/olelo/routing.rb +1 -3
- data/lib/olelo/version.rb +1 -1
- data/plugins/aspects/main.rb +12 -14
- data/plugins/blog/main.rb +1 -1
- data/plugins/editor/ace/init.js +2 -0
- data/plugins/editor/markup/script.js +3 -3
- data/plugins/editor/markup/script/01-olelo.markupeditor.js +3 -1
- data/plugins/editor/markup/script/init.js +2 -0
- data/plugins/filters/markdown_nowiki.rb +26 -7
- data/plugins/misc/fancybox/script/init.js +2 -0
- data/plugins/misc/fragment_cache.rb +30 -0
- data/plugins/repositories/gitrb_repository.rb +7 -3
- data/plugins/repositories/rugged_repository.rb +27 -15
- data/plugins/treeview/script/00-jquery.treeview.js +2 -0
- data/plugins/treeview/script/init.js +2 -0
- data/static/script/09-olelo.storage.js +2 -0
- data/static/script/10-olelo.i18n.js +2 -0
- data/static/script/11-olelo.unsaved.js +2 -0
- data/static/script/12-olelo.historytable.js +2 -0
- data/static/script/13-olelo.pagination.js +2 -0
- data/static/script/14-olelo.tabwidget.js +2 -0
- data/static/script/15-olelo.timeago.js +2 -0
- data/static/script/16-olelo.underliner.js +2 -0
- data/static/script/17-olelo.ui.combobox.js +2 -0
- data/static/script/init.js +2 -0
- data/test/request_test.rb +3 -1
- data/views/show.slim +2 -2
- metadata +31 -94
data/bin/olelo
CHANGED
@@ -28,7 +28,7 @@ opts = OptionParser.new do |opts|
|
|
28
28
|
options[:host] = host
|
29
29
|
end
|
30
30
|
|
31
|
-
opts.on('-s', '--server SERVER', 'serve using SERVER (webrick/mongrel)') do |server|
|
31
|
+
opts.on('-s', '--server SERVER', 'serve using SERVER (webrick/mongrel/thin)') do |server|
|
32
32
|
options[:server] = server
|
33
33
|
end
|
34
34
|
|
data/config.ru
CHANGED
@@ -99,6 +99,7 @@ use Rack::MethodOverride
|
|
99
99
|
use Rack::CommonLogger, LoggerOutput.new(logger)
|
100
100
|
use Rack::RelativeRedirect
|
101
101
|
use Olelo::Middleware::ForceEncoding
|
102
|
+
use Rack::Head
|
102
103
|
run Olelo::Application.new
|
103
104
|
|
104
105
|
logger.info "Olelo started in #{Olelo::Config['production'] ? 'production' : 'development'} mode"
|
data/config/config.yml.default
CHANGED
data/lib/olelo/application.rb
CHANGED
@@ -13,7 +13,7 @@ module Olelo
|
|
13
13
|
|
14
14
|
has_around_hooks :request, :routing, :action, :title, :footer, :login_buttons,
|
15
15
|
:edit_buttons, :attributes_buttons, :upload_buttons
|
16
|
-
has_hooks :auto_login, :render, :menu, :head
|
16
|
+
has_hooks :auto_login, :render, :menu, :head
|
17
17
|
|
18
18
|
def self.reserved_path?(path)
|
19
19
|
path = '/' + path.cleanpath
|
@@ -32,7 +32,7 @@ module Olelo
|
|
32
32
|
# Executed before each request
|
33
33
|
before :routing do
|
34
34
|
User.current = User.find(session[:olelo_user])
|
35
|
-
|
35
|
+
unless User.current
|
36
36
|
invoke_hook(:auto_login)
|
37
37
|
User.current ||= User.anonymous(request)
|
38
38
|
end
|
@@ -148,7 +148,7 @@ module Olelo
|
|
148
148
|
raise NotFound
|
149
149
|
end
|
150
150
|
@version = @diff.to
|
151
|
-
cache_control
|
151
|
+
cache_control etag: @version.to_s
|
152
152
|
render :changes
|
153
153
|
end
|
154
154
|
|
@@ -158,8 +158,7 @@ module Olelo
|
|
158
158
|
@page_nr = [params[:page].to_i, 1].max
|
159
159
|
@history = page.history((@page_nr - 1) * per_page, per_page)
|
160
160
|
@page_count = @page_nr + @history.length / per_page
|
161
|
-
|
162
|
-
cache_control version: page.version
|
161
|
+
cache_control etag: page.etag
|
163
162
|
render :history
|
164
163
|
end
|
165
164
|
|
@@ -269,7 +268,7 @@ module Olelo
|
|
269
268
|
get '/(:path)', tail: true do
|
270
269
|
begin
|
271
270
|
@page = Page.find!(params[:path])
|
272
|
-
cache_control
|
271
|
+
cache_control etag: page.etag
|
273
272
|
show_page
|
274
273
|
rescue NotFound
|
275
274
|
redirect build_path(params[:path], action: :new)
|
@@ -278,7 +277,7 @@ module Olelo
|
|
278
277
|
|
279
278
|
get '/version/:version(/:path)' do
|
280
279
|
@page = Page.find!(params[:path], params[:version])
|
281
|
-
cache_control
|
280
|
+
cache_control etag: page.etag
|
282
281
|
show_page
|
283
282
|
end
|
284
283
|
|
data/lib/olelo/helper.rb
CHANGED
@@ -17,14 +17,6 @@ module Olelo
|
|
17
17
|
def render_block(name)
|
18
18
|
with_hooks(name) { yield }.join.html_safe
|
19
19
|
end
|
20
|
-
|
21
|
-
def include_or_define_block(name, content = nil, &block)
|
22
|
-
if block_given? || content
|
23
|
-
define_block(name, content, &block)
|
24
|
-
else
|
25
|
-
include_block(name)
|
26
|
-
end
|
27
|
-
end
|
28
20
|
end
|
29
21
|
|
30
22
|
module FlashHelper
|
@@ -242,11 +234,6 @@ module Olelo
|
|
242
234
|
last_modified = last_modified.try(:to_time) || last_modified
|
243
235
|
last_modified = last_modified.try(:httpdate) || last_modified
|
244
236
|
|
245
|
-
if options[:version]
|
246
|
-
options[:etag] = options[:version].cache_id
|
247
|
-
options[:last_modified] = options[:version].date
|
248
|
-
end
|
249
|
-
|
250
237
|
if User.logged_in?
|
251
238
|
# Always private mode if user is logged in
|
252
239
|
options[:private] = true
|
@@ -309,31 +296,38 @@ module Olelo
|
|
309
296
|
end
|
310
297
|
|
311
298
|
def footer(content = nil, &block)
|
312
|
-
|
299
|
+
if block_given? || content
|
300
|
+
define_block(:footer, content, &block)
|
301
|
+
else
|
302
|
+
include_block(:footer)
|
303
|
+
end
|
313
304
|
end
|
314
305
|
|
315
306
|
def title(content = nil, &block)
|
316
|
-
|
307
|
+
if block_given? || content
|
308
|
+
define_block(:title, content, &block)
|
309
|
+
else
|
310
|
+
include_block(:title)
|
311
|
+
end
|
317
312
|
end
|
318
313
|
|
319
314
|
def head
|
320
|
-
@@
|
315
|
+
@@js_css_links ||=
|
321
316
|
begin
|
322
317
|
file = File.join(Config['themes_path'], Config['theme'], 'style.css')
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
begin
|
328
|
-
path = build_path "static/script.js?#{File.mtime(File.join(Config['app_path'], 'static', 'script.js')).to_i}"
|
329
|
-
%{<script src="#{escape_html path}" type="text/javascript"></script>}
|
318
|
+
css_path = build_path "static/themes/#{Config['theme']}/style.css?#{File.mtime(file).to_i}"
|
319
|
+
js_path = build_path "static/script.js?#{File.mtime(File.join(Config['app_path'], 'static', 'script.js')).to_i}"
|
320
|
+
%{<link rel="stylesheet" href="#{escape_html css_path}" type="text/css"/>
|
321
|
+
<script src="#{escape_html js_path}" type="text/javascript"></script>}
|
330
322
|
end
|
323
|
+
# Add base path to root page to fix links in history browsing and for wikis with base_path
|
331
324
|
base_path = if page && page.root?
|
332
325
|
url = request.base_url
|
326
|
+
url << Config['base_path'] if Config['base_path'] != '/'
|
333
327
|
url << '/' << 'version'/page.tree_version if !page.head?
|
334
328
|
%{<base href="#{escape_html url}/"/>}.html_safe
|
335
329
|
end
|
336
|
-
[base_path, @@
|
330
|
+
[base_path, @@js_css_links, *invoke_hook(:head)].join.html_safe
|
337
331
|
end
|
338
332
|
|
339
333
|
def session
|
data/lib/olelo/page.rb
CHANGED
@@ -39,8 +39,8 @@ module Olelo
|
|
39
39
|
|
40
40
|
attr_reader :path, :tree_version
|
41
41
|
|
42
|
-
def initialize(path, tree_version = nil, parent = nil)
|
43
|
-
@path, @tree_version, @parent = path.to_s.cleanpath.freeze, tree_version, parent
|
42
|
+
def initialize(path, tree_version = nil, etag = nil, parent = nil)
|
43
|
+
@path, @etag, @tree_version, @parent = path.to_s.cleanpath.freeze, etag, tree_version, parent
|
44
44
|
Page.check_path(@path)
|
45
45
|
end
|
46
46
|
|
@@ -67,7 +67,10 @@ module Olelo
|
|
67
67
|
path = path.to_s.cleanpath
|
68
68
|
check_path(path)
|
69
69
|
tree_version = repository.get_version(tree_version) unless Version === tree_version
|
70
|
-
|
70
|
+
if tree_version
|
71
|
+
etag = repository.path_etag(path, tree_version)
|
72
|
+
Page.new(path, tree_version, etag) if etag
|
73
|
+
end
|
71
74
|
end
|
72
75
|
|
73
76
|
# Throws if not found
|
@@ -88,6 +91,13 @@ module Olelo
|
|
88
91
|
mime.text? || mime == EMPTY_MIME || mime == DIRECTORY_MIME
|
89
92
|
end
|
90
93
|
|
94
|
+
def etag
|
95
|
+
unless new?
|
96
|
+
@etag ||= repository.path_etag(path, tree_version)
|
97
|
+
"#{head? ? 1 : 0}-#{@etag}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
91
101
|
def next_version
|
92
102
|
init_versions
|
93
103
|
@next_version
|
@@ -208,7 +218,7 @@ module Olelo
|
|
208
218
|
[]
|
209
219
|
else
|
210
220
|
repository.get_children(path, tree_version).sort.map do |name|
|
211
|
-
Page.new(path/name, tree_version, self)
|
221
|
+
Page.new(path/name, tree_version, nil, self)
|
212
222
|
end
|
213
223
|
end
|
214
224
|
end
|
data/lib/olelo/repository.rb
CHANGED
@@ -41,10 +41,6 @@ module Olelo
|
|
41
41
|
def ==(other)
|
42
42
|
other.to_s == id
|
43
43
|
end
|
44
|
-
|
45
|
-
def cache_id
|
46
|
-
"#{@id}-#{@head}"
|
47
|
-
end
|
48
44
|
end
|
49
45
|
|
50
46
|
# Difference between versions
|
@@ -131,13 +127,13 @@ module Olelo
|
|
131
127
|
raise NotImplementedError
|
132
128
|
end
|
133
129
|
|
134
|
-
# Check if path exists
|
130
|
+
# Check if path exists and return etag
|
135
131
|
#
|
136
132
|
# @param [String] path
|
137
133
|
# @param [String, Version] version
|
138
|
-
# @return [
|
134
|
+
# @return [String]
|
139
135
|
# @api public
|
140
|
-
def
|
136
|
+
def path_etag(path, version)
|
141
137
|
raise NotImplementedError
|
142
138
|
end
|
143
139
|
|
data/lib/olelo/routing.rb
CHANGED
@@ -32,8 +32,7 @@ module Olelo
|
|
32
32
|
|
33
33
|
catch(:forward) do
|
34
34
|
with_hooks(:request) { perform! }
|
35
|
-
|
36
|
-
return [status, header, request.head? ? [] : body]
|
35
|
+
return response.finish
|
37
36
|
end
|
38
37
|
|
39
38
|
@app ? @app.call(env) : error!(NotFound.new(@request.path_info))
|
@@ -195,7 +194,6 @@ module Olelo
|
|
195
194
|
|
196
195
|
def get(path, patterns = {}, &block)
|
197
196
|
add_route('GET', path, patterns, &block)
|
198
|
-
add_route('HEAD', path, patterns, &block)
|
199
197
|
end
|
200
198
|
|
201
199
|
def put(path, patterns = {}, &block)
|
data/lib/olelo/version.rb
CHANGED
data/plugins/aspects/main.rb
CHANGED
@@ -146,7 +146,7 @@ end
|
|
146
146
|
# Plug-in the aspect subsystem
|
147
147
|
module ::Olelo::PageHelper
|
148
148
|
def render_page(page)
|
149
|
-
Cache.cache("include-#{page.path}-#{page.
|
149
|
+
Cache.cache("include-#{page.path}-#{page.etag}", update: no_cache?, defer: true) do |context|
|
150
150
|
begin
|
151
151
|
context = Context.new(page: page, params: {included: true})
|
152
152
|
Aspect.find!(page, layout: true).call(context, page)
|
@@ -162,7 +162,7 @@ class ::Olelo::Application
|
|
162
162
|
def show_page
|
163
163
|
params[:aspect] ||= 'subpages' if params[:path].to_s.ends_with? '/'
|
164
164
|
@selected_aspect, layout, header, content =
|
165
|
-
Cache.cache("aspect-#{page.path}-#{page.
|
165
|
+
Cache.cache("aspect-#{page.path}-#{page.etag}-#{build_query(params)}",
|
166
166
|
update: no_cache?, defer: true) do |cache|
|
167
167
|
aspect = Aspect.find!(page, name: params[:aspect])
|
168
168
|
cache.disable! if !aspect.cacheable?
|
@@ -172,6 +172,7 @@ class ::Olelo::Application
|
|
172
172
|
context.header['Content-Type'] ||= page.mime.to_s if !aspect.layout?
|
173
173
|
[aspect.name, aspect.layout?, context.header.to_hash, result]
|
174
174
|
end
|
175
|
+
|
175
176
|
self.response.header.merge!(header)
|
176
177
|
|
177
178
|
@menu_versions = true
|
@@ -186,18 +187,15 @@ class ::Olelo::Application
|
|
186
187
|
|
187
188
|
hook :menu do |menu|
|
188
189
|
if menu.name == :actions && view_menu = menu[:view]
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
MenuItem.new(a.name, label: label, href: build_path(page, aspect: a.name), class: 'download')
|
199
|
-
end
|
200
|
-
end.each {|item| view_menu << item }
|
190
|
+
aspects = Aspect.find_all(page).select {|a| !a.hidden? || a.name == @selected_aspect || a.name == page.attributes['aspect'] }.map do |a|
|
191
|
+
[Locale.translate("aspect_#{a.name}", fallback: titlecase(a.name)), a]
|
192
|
+
end.sort_by(&:first)
|
193
|
+
aspects.select {|label, a| a.layout? }.each do |label, a|
|
194
|
+
view_menu << MenuItem.new(a.name, label: label, href: build_path(page, aspect: a.name), class: a.name == @selected_aspect ? 'selected' : nil)
|
195
|
+
end
|
196
|
+
aspects.reject {|label, a| a.layout? }.each do |label, a|
|
197
|
+
view_menu << MenuItem.new(a.name, label: label, href: build_path(page, aspect: a.name), class: 'download')
|
198
|
+
end
|
201
199
|
end
|
202
200
|
end
|
203
201
|
end
|
data/plugins/blog/main.rb
CHANGED
@@ -10,7 +10,7 @@ end
|
|
10
10
|
Tags::Tag.define 'menu', optional: 'path', description: 'Show blog menu', dynamic: true do |context, attrs, content|
|
11
11
|
page = Page.find(attrs[:path]) rescue nil
|
12
12
|
if page
|
13
|
-
Cache.cache("blog-#{page.path}-#{page.
|
13
|
+
Cache.cache("blog-#{page.path}-#{page.etag}", update: no_cache?(context.request.env), defer: true) do
|
14
14
|
years = {}
|
15
15
|
page.children.each do |child|
|
16
16
|
(years[child.version.date.year] ||= [])[child.version.date.month] = true
|
data/plugins/editor/ace/init.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
(function(){var e=function(){var g=typeof document.selection!=="undefined"&&typeof document.selection.createRange!=="undefined";return{getSelectionRange:function(a){var b,c,d;a.focus();if(typeof a.selectionStart!=="undefined"){b=a.selectionStart;c=a.selectionEnd}else if(g){b=document.selection.createRange();c=b.text.length;if(b.parentElement()!==a)throw"Unable to get selection range.";if(a.type==="textarea"){d=b.duplicate();d.moveToElementText(a);d.setEndPoint("EndToEnd",b);b=d.text.length-c}else{a=
|
2
2
|
a.createTextRange();a.setEndPoint("EndToStart",b);b=a.text.length}c=b+c}else throw"Unable to get selection range.";return{start:b,end:c}},getSelectionStart:function(a){return this.getSelectionRange(a).start},getSelectionEnd:function(a){return this.getSelectionRange(a).end},setSelectionRange:function(a,b,c){var d;a.focus();if(typeof c==="undefined")c=b;if(typeof a.selectionStart!=="undefined")a.setSelectionRange(b,c);else if(g){d=a.value;a=a.createTextRange();c-=b+d.slice(b+1,c).split("\n").length-
|
3
|
-
1;b-=d.slice(0,b).split("\n").length-1;a.move("character",b);a.moveEnd("character",c);a.select()}else throw"Unable to set selection range.";},getSelectedText:function(a){var b=this.getSelectionRange(a);return a.value.substring(b.start,b.end)},insertText:function(a,b,c,d,h){d=d||c;var i=c+b.length,
|
3
|
+
1;b-=d.slice(0,b).split("\n").length-1;a.move("character",b);a.moveEnd("character",c);a.select()}else throw"Unable to set selection range.";},getSelectedText:function(a){var b=this.getSelectionRange(a);return a.value.substring(b.start,b.end)},insertText:function(a,b,c,d,h){d=d||c;var i=c+b.length,k=a.value.substring(0,c);d=a.value.substr(d);a.value=k+b+d;h===true?this.setSelectionRange(a,c,i):this.setSelectionRange(a,i)},replaceSelectedText:function(a,b,c){var d=this.getSelectionRange(a);this.insertText(a,
|
4
4
|
b,d.start,d.end,c)},wrapSelectedText:function(a,b,c,d){b=b+this.getSelectedText(a)+c;this.replaceSelectedText(a,b,d)}}}();window.Selection=e})();
|
5
5
|
(function(e){e.fn.extend({getSelectionRange:function(){return Selection.getSelectionRange(this[0])},getSelectionStart:function(){return Selection.getSelectionStart(this[0])},getSelectionEnd:function(){return Selection.getSelectionEnd(this[0])},getSelectedText:function(){return Selection.getSelectedText(this[0])},setSelectionRange:function(g,a){return this.each(function(){Selection.setSelectionRange(this,g,a)})},insertText:function(g,a,b,c){return this.each(function(){Selection.insertText(this,g,a,
|
6
6
|
b,c)})},replaceSelectedText:function(g,a){return this.each(function(){Selection.replaceSelectedText(this,g,a)})},wrapSelectedText:function(g,a,b){return this.each(function(){Selection.wrapSelectedText(this,g,a,b)})}})})(jQuery);(function(e){var g={creole:{link:["[[","link text","]]"],bold:["**","bold text","**"],italic:["//","italic text","//"],ul:["* ","list item","",true],ol:["# ","list item","",true],h1:["= ","headline","",true],h2:["== ","headline","",true],h3:["=== ","headline","",true],sub:["~~","subscript","~~"],sup:["^^","superscript","^^"],del:["--","deleted text","--"],ins:["++","inserted text","++"],image:["{{","image","}}"],preformatted:["{{{","preformatted","}}}"]},markdown:{link:function(a){return(a=prompt("link target:",
|
7
7
|
a))?["[","link text","]("+a+")"]:null},bold:["**","bold text","**"],italic:["*","italic text","*"],ul:["* ","list item","",true],ol:["1. ","list item","",true],h1:["","headline","\n========",true],h2:["","headline","\n--------",true],image:function(a){return(a=prompt("image path:",a))?["![","image alt text","]("+a+")"]:null},preformatted:[" ","preformatted","",true]},orgmode:{bold:["*","bold text","*"],italic:["/","italic text","/"],ul:["- ","list item",""],ol:["1. ","list item",""],h1:["* ","headline",
|
8
8
|
""],h2:["** ","headline",""],h3:["*** ","headline",""]},textile:{link:function(a){return(a=prompt("link target:",a))?['"',"link text",'":'+a]:null},bold:["*","bold text","*"],italic:["_","italic text","_"],ul:["* ","list item","",true],ol:["# ","list item","",true],h1:["h1. ","headline","",true],h2:["h2. ","headline","",true],h3:["h3. ","headline","",true],em:["_","emphasized text","_"],sub:["~","subscript","~"],sup:["^","superscript","^"],del:["-","deleted text","-"],ins:["+","inserted text","+"],
|
9
|
-
image:["!","image","!"]}};e.fn.markupEditor=function(a){if(a=g[a]){var b=e('<ul class="button-bar" id="markup-editor"/>'),c=[];for(
|
10
|
-
0&&h.getSelectedText()!="\n")j="\n"+j;h.setSelectionRange(f.end,f.end+1);if(h.getSelectedText()!="\n")
|
9
|
+
image:["!","image","!"]}};e.fn.markupEditor=function(a){if(a=g[a]){var b=e('<ul class="button-bar" id="markup-editor"/>'),c=[];for(var d in a)c.push(d);c.sort();for(d=0;d<c.length;++d)b.append('<li><a href="#" id="markup-editor-'+c[d]+'">'+c[d]+"</a></li>");this.before(b);var h=this;e("a",b).click(function(){var i=a[this.id.substr(14)],k=h.getSelectedText();if(typeof i=="function")i=i(k);if(i){var f=h.getSelectionRange(),j=i[0],m=i[1],l=i[2];if(i[3]){h.setSelectionRange(f.start-1,f.start);if(f.start!==
|
10
|
+
0&&h.getSelectedText()!="\n")j="\n"+j;h.setSelectionRange(f.end,f.end+1);if(h.getSelectedText()!="\n")l+="\n"}if(f.start==f.end){h.insertText(j+m+l,f.start,f.start,false);h.setSelectionRange(f.start+j.length,f.start+j.length+m.length)}else h.insertText(j+k+l,f.start,f.end,false)}return false})}}})(jQuery);$(function(){var e=Olelo.page_mime;if(e=="application/x-empty"||e=="inode/directory")e=Olelo.default_mime;(e=/text\/x-(\w+)/.exec(e))&&$("#edit-content").markupEditor(e[1])});
|
@@ -1,4 +1,6 @@
|
|
1
1
|
(function($) {
|
2
|
+
"use strict";
|
3
|
+
|
2
4
|
var markups = {
|
3
5
|
creole: {
|
4
6
|
link: ['[[', 'link text', ']]'],
|
@@ -97,7 +99,7 @@
|
|
97
99
|
var list = $('<ul class="button-bar" id="markup-editor"/>');
|
98
100
|
|
99
101
|
var buttons = [];
|
100
|
-
for (k in markup) {
|
102
|
+
for (var k in markup) {
|
101
103
|
buttons.push(k);
|
102
104
|
}
|
103
105
|
buttons.sort();
|
@@ -1,15 +1,34 @@
|
|
1
1
|
description 'Markdown nowiki filter'
|
2
2
|
|
3
|
+
# Embeds indented markdown text blocks in <notags> tags
|
4
|
+
# and adds <notags> around ``texts``
|
3
5
|
Filter.create :markdown_nowiki do |context, content|
|
4
6
|
output = ''
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
block, state = nil, nil
|
8
|
+
content.each_line do |line|
|
9
|
+
if block
|
10
|
+
if line =~ /\A( {4}|\t)/
|
11
|
+
block << line
|
12
|
+
state = :in
|
13
|
+
elsif line =~ /\A\s*\Z/
|
14
|
+
block << line
|
15
|
+
state = :after if state == :in
|
16
|
+
elsif state == :after
|
17
|
+
output << "<notags>#{block}</notags>"
|
18
|
+
block = nil
|
19
|
+
else
|
20
|
+
block << line
|
21
|
+
line = block
|
22
|
+
block = nil
|
23
|
+
end
|
24
|
+
elsif line =~ /\A\s*\Z/
|
25
|
+
block, state = line, :before
|
26
|
+
end
|
27
|
+
|
28
|
+
unless block
|
29
|
+
output << line.gsub(/``.*?``|`[^`]*`/, '<notags>\0</notags>')
|
11
30
|
end
|
12
|
-
content = $'
|
13
31
|
end
|
32
|
+
output << (state == :before ? block : "<notags>#{block}</notags>") if block
|
14
33
|
output
|
15
34
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
description 'Cache page fragments'
|
2
|
+
dependencies 'utils/cache'
|
3
|
+
|
4
|
+
class ::Olelo::Application
|
5
|
+
def cache_id
|
6
|
+
@cache_id ||= page ? "#{page.path}-#{page.etag}-#{build_query(params)}" : "#{request.path_info}-#{build_query(params)}"
|
7
|
+
end
|
8
|
+
|
9
|
+
redefine_method :menu do |name|
|
10
|
+
Cache.cache("menu-#{name}-#{cache_id}", update: no_cache?) do |cache|
|
11
|
+
super(name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
redefine_method :head do
|
16
|
+
Cache.cache("head-#{cache_id}", update: no_cache?) do |cache|
|
17
|
+
super()
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
redefine_method :footer do |content = nil, &block|
|
22
|
+
if block_given? || content
|
23
|
+
super(content, &block)
|
24
|
+
else
|
25
|
+
Cache.cache("footer-#{cache_id}", update: no_cache?) do |cache|
|
26
|
+
super()
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -24,9 +24,13 @@ class GitrbRepository < Repository
|
|
24
24
|
end
|
25
25
|
|
26
26
|
# @override
|
27
|
-
def
|
27
|
+
def path_etag(path, version)
|
28
28
|
check_path(path)
|
29
|
-
|
29
|
+
if id = get_object(path, version).id rescue nil
|
30
|
+
[id,
|
31
|
+
(get_object(path + CONTENT_EXT, version).id rescue nil),
|
32
|
+
(get_object(path + ATTRIBUTE_EXT, version).id rescue nil)].join('-')
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
# @override
|
@@ -73,7 +77,7 @@ class GitrbRepository < Repository
|
|
73
77
|
if object
|
74
78
|
content = object.data
|
75
79
|
# Try to force utf-8 encoding and revert to old encoding if this doesn't work
|
76
|
-
content.try_encoding(Encoding.
|
80
|
+
content.try_encoding(Encoding.default_external)
|
77
81
|
else
|
78
82
|
''
|
79
83
|
end
|
@@ -238,10 +238,14 @@ class RuggedRepository < Repository
|
|
238
238
|
commit_to_version(@git.last_commit)
|
239
239
|
end
|
240
240
|
|
241
|
-
def
|
241
|
+
def path_etag(path, version)
|
242
242
|
commit = @git.lookup(version.to_s)
|
243
243
|
raise 'Not a commit' unless Rugged::Commit === commit
|
244
|
-
|
244
|
+
if oid = oid_by_path(commit, path)
|
245
|
+
[oid,
|
246
|
+
oid_by_path(commit, path + CONTENT_EXT),
|
247
|
+
oid_by_path(commit, path + ATTRIBUTE_EXT)].join('-')
|
248
|
+
end
|
245
249
|
end
|
246
250
|
|
247
251
|
def get_version(version = nil)
|
@@ -311,15 +315,17 @@ class RuggedRepository < Repository
|
|
311
315
|
def get_children(path, version)
|
312
316
|
commit = @git.lookup(version.to_s)
|
313
317
|
raise 'Not a commit' unless Rugged::Commit === commit
|
314
|
-
object = object_by_path(commit
|
315
|
-
Rugged::Tree === object ? object.map
|
318
|
+
object = object_by_path(commit, path)
|
319
|
+
Rugged::Tree === object ? object.map do |e|
|
320
|
+
e[:name].force_encoding(Encoding.default_external)
|
321
|
+
end.reject {|name| reserved_name?(name) } : []
|
316
322
|
end
|
317
323
|
|
318
324
|
def get_content(path, version)
|
319
325
|
commit = @git.lookup(version.to_s)
|
320
326
|
raise 'Not a commit' unless Rugged::Commit === commit
|
321
|
-
object = object_by_path(commit
|
322
|
-
object = object_by_path(commit
|
327
|
+
object = object_by_path(commit, path)
|
328
|
+
object = object_by_path(commit, path + CONTENT_EXT) if Rugged::Tree === object
|
323
329
|
Rugged::Blob === object ? object.content.try_encoding(Encoding.default_external) : ''
|
324
330
|
end
|
325
331
|
|
@@ -327,7 +333,7 @@ class RuggedRepository < Repository
|
|
327
333
|
commit = @git.lookup(version.to_s)
|
328
334
|
raise 'Not a commit' unless Rugged::Commit === commit
|
329
335
|
path += ATTRIBUTE_EXT
|
330
|
-
object = object_by_path(commit
|
336
|
+
object = object_by_path(commit, path)
|
331
337
|
object ? YAML.load(object.content) : {}
|
332
338
|
end
|
333
339
|
|
@@ -393,17 +399,23 @@ class RuggedRepository < Repository
|
|
393
399
|
def path_changed?(c, path)
|
394
400
|
return true if path.blank?
|
395
401
|
ref1, ref2, ref3 = nil, nil, nil
|
396
|
-
(c.parents.empty? && (ref1 ||= c
|
397
|
-
(ref1 ||= c
|
398
|
-
(ref2 ||= c
|
399
|
-
(ref3 ||= c
|
402
|
+
(c.parents.empty? && (ref1 ||= oid_by_path(c, path))) || c.parents.any? do |parent|
|
403
|
+
(ref1 ||= oid_by_path(c, path)) != (oid_by_path(parent, path)) ||
|
404
|
+
(ref2 ||= oid_by_path(c, path + ATTRIBUTE_EXT)) != (oid_by_path(parent, path + ATTRIBUTE_EXT)) ||
|
405
|
+
(ref3 ||= oid_by_path(c, path + CONTENT_EXT)) != (oid_by_path(parent, path + CONTENT_EXT))
|
400
406
|
end
|
401
407
|
end
|
402
408
|
|
403
|
-
def
|
404
|
-
return
|
405
|
-
|
406
|
-
|
409
|
+
def oid_by_path(commit, path)
|
410
|
+
return commit.tree_oid if path.blank?
|
411
|
+
commit.tree.path(path)[:oid]
|
412
|
+
rescue Rugged::IndexerError
|
413
|
+
nil
|
414
|
+
end
|
415
|
+
|
416
|
+
def object_by_path(commit, path)
|
417
|
+
return commit.tree if path.blank?
|
418
|
+
@git.lookup(commit.tree.path(path)[:oid])
|
407
419
|
rescue Rugged::IndexerError
|
408
420
|
nil
|
409
421
|
end
|
data/static/script/init.js
CHANGED
data/test/request_test.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'helper'
|
2
2
|
require 'olelo/middleware/force_encoding'
|
3
3
|
require 'olelo/middleware/degrade_mime_type'
|
4
|
+
require 'olelo/middleware/ua_header'
|
4
5
|
require 'rack/relative_redirect'
|
5
|
-
require 'rack/session/pool'
|
6
6
|
|
7
7
|
class Bacon::Context
|
8
8
|
include Rack::Test::Methods
|
@@ -74,7 +74,9 @@ describe 'requests' do
|
|
74
74
|
use Rack::MethodOverride
|
75
75
|
use Olelo::Middleware::ForceEncoding
|
76
76
|
use Olelo::Middleware::DegradeMimeType
|
77
|
+
use Olelo::Middleware::UAHeader
|
77
78
|
#use Rack::RelativeRedirect
|
79
|
+
use Rack::Head
|
78
80
|
run Olelo::Application.new
|
79
81
|
end
|
80
82
|
end
|
data/views/show.slim
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
- title page.title
|
2
|
-
= define_block :version_link do
|
3
|
-
a.version href=build_path(page, version: page.version, force_version: true) title=page.version = page.version.short
|
4
2
|
= footer do
|
3
|
+
= define_block :version_link do
|
4
|
+
a.version href=build_path(page, version: page.version, force_version: true) title=page.version = page.version.short
|
5
5
|
== :version_by.t(version: blocks[:version_link], author: escape_html(page.version.author.name), date: date(page.version.date))
|
6
6
|
- if !page.attributes['no_title']
|
7
7
|
h1= title
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: olelo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &9838140 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.3.6
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 1.3.6
|
24
|
+
version_requirements: *9838140
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: slim
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &9836960 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ~>
|
@@ -37,15 +32,10 @@ dependencies:
|
|
37
32
|
version: 1.3.3
|
38
33
|
type: :runtime
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 1.3.3
|
35
|
+
version_requirements: *9836960
|
46
36
|
- !ruby/object:Gem::Dependency
|
47
37
|
name: creole
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirement: &9835660 !ruby/object:Gem::Requirement
|
49
39
|
none: false
|
50
40
|
requirements:
|
51
41
|
- - ~>
|
@@ -53,15 +43,10 @@ dependencies:
|
|
53
43
|
version: 0.5.0
|
54
44
|
type: :runtime
|
55
45
|
prerelease: false
|
56
|
-
version_requirements:
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.5.0
|
46
|
+
version_requirements: *9835660
|
62
47
|
- !ruby/object:Gem::Dependency
|
63
48
|
name: nokogiri
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirement: &9833880 !ruby/object:Gem::Requirement
|
65
50
|
none: false
|
66
51
|
requirements:
|
67
52
|
- - ~>
|
@@ -69,15 +54,10 @@ dependencies:
|
|
69
54
|
version: 1.5.5
|
70
55
|
type: :runtime
|
71
56
|
prerelease: false
|
72
|
-
version_requirements:
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 1.5.5
|
57
|
+
version_requirements: *9833880
|
78
58
|
- !ruby/object:Gem::Dependency
|
79
59
|
name: mimemagic
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirement: &9832440 !ruby/object:Gem::Requirement
|
81
61
|
none: false
|
82
62
|
requirements:
|
83
63
|
- - ~>
|
@@ -85,15 +65,10 @@ dependencies:
|
|
85
65
|
version: 0.2.0
|
86
66
|
type: :runtime
|
87
67
|
prerelease: false
|
88
|
-
version_requirements:
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ~>
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 0.2.0
|
68
|
+
version_requirements: *9832440
|
94
69
|
- !ruby/object:Gem::Dependency
|
95
70
|
name: rack
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirement: &9829740 !ruby/object:Gem::Requirement
|
97
72
|
none: false
|
98
73
|
requirements:
|
99
74
|
- - ~>
|
@@ -101,15 +76,10 @@ dependencies:
|
|
101
76
|
version: 1.4.1
|
102
77
|
type: :runtime
|
103
78
|
prerelease: false
|
104
|
-
version_requirements:
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ~>
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 1.4.1
|
79
|
+
version_requirements: *9829740
|
110
80
|
- !ruby/object:Gem::Dependency
|
111
81
|
name: redcarpet
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
82
|
+
requirement: &9829040 !ruby/object:Gem::Requirement
|
113
83
|
none: false
|
114
84
|
requirements:
|
115
85
|
- - ~>
|
@@ -117,15 +87,10 @@ dependencies:
|
|
117
87
|
version: 2.2.2
|
118
88
|
type: :runtime
|
119
89
|
prerelease: false
|
120
|
-
version_requirements:
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ~>
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: 2.2.2
|
90
|
+
version_requirements: *9829040
|
126
91
|
- !ruby/object:Gem::Dependency
|
127
92
|
name: rugged
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirement: &9828020 !ruby/object:Gem::Requirement
|
129
94
|
none: false
|
130
95
|
requirements:
|
131
96
|
- - ~>
|
@@ -133,15 +98,10 @@ dependencies:
|
|
133
98
|
version: 0.17.0.b7
|
134
99
|
type: :runtime
|
135
100
|
prerelease: false
|
136
|
-
version_requirements:
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ~>
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: 0.17.0.b7
|
101
|
+
version_requirements: *9828020
|
142
102
|
- !ruby/object:Gem::Dependency
|
143
103
|
name: evaluator
|
144
|
-
requirement: !ruby/object:Gem::Requirement
|
104
|
+
requirement: &9826260 !ruby/object:Gem::Requirement
|
145
105
|
none: false
|
146
106
|
requirements:
|
147
107
|
- - ~>
|
@@ -149,15 +109,10 @@ dependencies:
|
|
149
109
|
version: 0.1.6
|
150
110
|
type: :runtime
|
151
111
|
prerelease: false
|
152
|
-
version_requirements:
|
153
|
-
none: false
|
154
|
-
requirements:
|
155
|
-
- - ~>
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: 0.1.6
|
112
|
+
version_requirements: *9826260
|
158
113
|
- !ruby/object:Gem::Dependency
|
159
114
|
name: rake
|
160
|
-
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirement: &9824340 !ruby/object:Gem::Requirement
|
161
116
|
none: false
|
162
117
|
requirements:
|
163
118
|
- - ! '>='
|
@@ -165,15 +120,10 @@ dependencies:
|
|
165
120
|
version: 0.8.7
|
166
121
|
type: :development
|
167
122
|
prerelease: false
|
168
|
-
version_requirements:
|
169
|
-
none: false
|
170
|
-
requirements:
|
171
|
-
- - ! '>='
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: 0.8.7
|
123
|
+
version_requirements: *9824340
|
174
124
|
- !ruby/object:Gem::Dependency
|
175
125
|
name: sass
|
176
|
-
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirement: &9822920 !ruby/object:Gem::Requirement
|
177
127
|
none: false
|
178
128
|
requirements:
|
179
129
|
- - ! '>='
|
@@ -181,15 +131,10 @@ dependencies:
|
|
181
131
|
version: 3.1.0
|
182
132
|
type: :development
|
183
133
|
prerelease: false
|
184
|
-
version_requirements:
|
185
|
-
none: false
|
186
|
-
requirements:
|
187
|
-
- - ! '>='
|
188
|
-
- !ruby/object:Gem::Version
|
189
|
-
version: 3.1.0
|
134
|
+
version_requirements: *9822920
|
190
135
|
- !ruby/object:Gem::Dependency
|
191
136
|
name: bacon
|
192
|
-
requirement: !ruby/object:Gem::Requirement
|
137
|
+
requirement: &9822060 !ruby/object:Gem::Requirement
|
193
138
|
none: false
|
194
139
|
requirements:
|
195
140
|
- - ~>
|
@@ -197,15 +142,10 @@ dependencies:
|
|
197
142
|
version: 1.1.0
|
198
143
|
type: :development
|
199
144
|
prerelease: false
|
200
|
-
version_requirements:
|
201
|
-
none: false
|
202
|
-
requirements:
|
203
|
-
- - ~>
|
204
|
-
- !ruby/object:Gem::Version
|
205
|
-
version: 1.1.0
|
145
|
+
version_requirements: *9822060
|
206
146
|
- !ruby/object:Gem::Dependency
|
207
147
|
name: rack-test
|
208
|
-
requirement: !ruby/object:Gem::Requirement
|
148
|
+
requirement: &9812980 !ruby/object:Gem::Requirement
|
209
149
|
none: false
|
210
150
|
requirements:
|
211
151
|
- - ~>
|
@@ -213,12 +153,7 @@ dependencies:
|
|
213
153
|
version: 0.6.2
|
214
154
|
type: :development
|
215
155
|
prerelease: false
|
216
|
-
version_requirements:
|
217
|
-
none: false
|
218
|
-
requirements:
|
219
|
-
- - ~>
|
220
|
-
- !ruby/object:Gem::Version
|
221
|
-
version: 0.6.2
|
156
|
+
version_requirements: *9812980
|
222
157
|
description: Olelo is a git-based wiki which supports many markup languages, tags,
|
223
158
|
embedded TeX and much more. It can be extended through plugins.
|
224
159
|
email:
|
@@ -355,6 +290,7 @@ files:
|
|
355
290
|
- plugins/misc/fancybox/script/01-jquery.easing.js
|
356
291
|
- plugins/misc/fancybox/script/02-jquery.fancybox.js
|
357
292
|
- plugins/misc/fancybox/script/init.js
|
293
|
+
- plugins/misc/fragment_cache.rb
|
358
294
|
- plugins/misc/system.rb
|
359
295
|
- plugins/misc/variables.rb
|
360
296
|
- plugins/misc/webdav.rb
|
@@ -533,8 +469,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
533
469
|
version: '0'
|
534
470
|
requirements: []
|
535
471
|
rubyforge_project: olelo
|
536
|
-
rubygems_version: 1.8.
|
472
|
+
rubygems_version: 1.8.15
|
537
473
|
signing_key:
|
538
474
|
specification_version: 3
|
539
475
|
summary: Olelo is a git-based wiki.
|
540
476
|
test_files: []
|
477
|
+
has_rdoc:
|