olelo 0.9.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{doc/LICENSE → LICENSE} +0 -0
- data/README.creole +127 -0
- data/Rakefile +2 -2
- data/bin/olelo +55 -2
- data/config.ru +21 -4
- data/config/aspects.rb +9 -7
- data/config/config.yml.default +1 -0
- data/lib/olelo.rb +1 -0
- data/lib/olelo/application.rb +25 -14
- data/lib/olelo/config.rb +1 -1
- data/lib/olelo/extensions.rb +0 -12
- data/lib/olelo/helper.rb +0 -4
- data/lib/olelo/initializer.rb +4 -7
- data/lib/olelo/locale.yml +0 -3
- data/lib/olelo/page.rb +1 -1
- data/lib/olelo/plugin.rb +5 -4
- data/lib/olelo/routing.rb +15 -12
- data/lib/olelo/user.rb +10 -24
- data/lib/olelo/util.rb +4 -11
- data/lib/olelo/version.rb +1 -1
- data/lib/olelo/virtualfs.rb +11 -19
- data/olelo.gemspec +5 -2
- data/plugins/aspects/locale.yml +5 -0
- data/plugins/aspects/main.rb +8 -4
- data/plugins/authentication/yamlfile.rb +1 -1
- data/plugins/blog/main.rb +5 -5
- data/plugins/editor/ace/init.js +17 -0
- data/plugins/editor/ace/main.rb +7 -0
- data/plugins/editor/markup/main.rb +1 -1
- data/plugins/editor/markup/script.js +8 -8
- data/plugins/editor/markup/script/init.js +3 -3
- data/plugins/editor/recaptcha.rb +2 -2
- data/plugins/filters/interwiki.rb +0 -1
- data/plugins/gallery/main.rb +1 -1
- data/plugins/login/persistent.rb +2 -2
- data/plugins/misc/fancybox/script.js +1 -1
- data/plugins/misc/fancybox/script/init.js +2 -2
- data/plugins/misc/variables.rb +2 -2
- data/plugins/tags/math.rb +6 -7
- data/plugins/tags/scripting.rb +1 -1
- data/plugins/tags/tabs.rb +1 -1
- data/plugins/treeview/script.js +2 -2
- data/plugins/treeview/script/init.js +26 -24
- data/plugins/utils/assets.rb +20 -14
- data/static/themes/atlantis/images/bg/header.jpg +0 -0
- data/static/themes/atlantis/images/bg/header_gray.jpg +0 -0
- data/views/layout.slim +0 -1
- data/views/login.slim +3 -2
- metadata +127 -34
- data/README.markdown +0 -104
- data/doc/AUTHORS +0 -7
- data/lib/rack/olelo_patches.rb +0 -33
- data/lib/yard/addons.rb +0 -1
- data/lib/yard/addons/hook_handler.rb +0 -25
- data/lib/yard/addons/override_tag.rb +0 -14
- data/lib/yard/addons/route_handler.rb +0 -33
- data/lib/yard/addons/sanitize_anchor.rb +0 -16
data/lib/olelo/locale.yml
CHANGED
@@ -7,7 +7,6 @@ en:
|
|
7
7
|
attribute_title: 'Title'
|
8
8
|
attributes: 'Attributes'
|
9
9
|
attributes_edited: 'Attributes of #{page} edited'
|
10
|
-
auth_unsupported: 'Authentication service does not support #{name}'
|
11
10
|
author: 'Author'
|
12
11
|
binary_file: 'Binary file'
|
13
12
|
by: 'by'
|
@@ -96,7 +95,6 @@ de:
|
|
96
95
|
attribute_title: 'Titel'
|
97
96
|
attributes: 'Attribute'
|
98
97
|
attributes_edited: 'Attribute von #{page} bearbeitet'
|
99
|
-
auth_unsupported: 'Authentifikationsservice unterstützt #{name} nicht'
|
100
98
|
author: 'Autor'
|
101
99
|
binary_file: 'Binärdatei'
|
102
100
|
by: 'von'
|
@@ -191,7 +189,6 @@ cs_CZ:
|
|
191
189
|
attribute_title: 'Titulek'
|
192
190
|
attributes: 'Atributy'
|
193
191
|
attributes_edited: 'Atributy stránky #{page} editovány'
|
194
|
-
auth_unsupported: 'Autentizační služba nepodporuje #{name}'
|
195
192
|
author: 'Autor'
|
196
193
|
binary_file: 'Binární soubor'
|
197
194
|
by: 'od'
|
data/lib/olelo/page.rb
CHANGED
data/lib/olelo/plugin.rb
CHANGED
@@ -98,8 +98,8 @@ module Olelo
|
|
98
98
|
if Module === obj
|
99
99
|
names = obj.name.split('::')
|
100
100
|
mod = Object
|
101
|
-
names.map {|name| mod = mod.const_get(name) }.reverse.each do |
|
102
|
-
return
|
101
|
+
names.map {|name| mod = mod.const_get(name) }.reverse.each do |m|
|
102
|
+
return m if Plugin === m
|
103
103
|
end
|
104
104
|
elsif Proc === obj
|
105
105
|
return obj.binding.eval('PLUGIN')
|
@@ -114,6 +114,7 @@ module Olelo
|
|
114
114
|
attr_reader? :started
|
115
115
|
|
116
116
|
def initialize(path, file)
|
117
|
+
@setup = nil
|
117
118
|
@path, @file = path, file
|
118
119
|
@started = false
|
119
120
|
@dependencies = Set.new
|
@@ -129,11 +130,11 @@ module Olelo
|
|
129
130
|
|
130
131
|
(0...names.length).inject(Plugin) do |mod, i|
|
131
132
|
elem = names[i].split('_').map(&:capitalize).join
|
132
|
-
if mod.
|
133
|
+
if mod.const_defined?(elem, false)
|
133
134
|
mod.const_get(elem)
|
134
135
|
else
|
135
136
|
child = i == names.length - 1 ? self : Module.new
|
136
|
-
child.module_eval { include mod } if mod != Plugin
|
137
|
+
child.module_eval { include mod } if mod != Plugin # Include parent module
|
137
138
|
mod.const_set(elem, child)
|
138
139
|
end
|
139
140
|
end
|
data/lib/olelo/routing.rb
CHANGED
@@ -94,23 +94,26 @@ module Olelo
|
|
94
94
|
nil
|
95
95
|
end
|
96
96
|
|
97
|
-
|
98
|
-
|
97
|
+
case result
|
98
|
+
when nil, false
|
99
|
+
when String
|
99
100
|
response.body = [result]
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
response.
|
101
|
+
when Fixnum, Symbol
|
102
|
+
response.status = Rack::Utils.status_code(result)
|
103
|
+
when Array
|
104
|
+
if Symbol === result.first || Fixnum === result.first
|
105
|
+
response.status = Rack::Utils.status_code(result.shift)
|
106
|
+
response.body = result.pop
|
107
|
+
response.headers.merge!(result.first) if result.first
|
105
108
|
else
|
106
109
|
response.body = result
|
107
110
|
end
|
108
|
-
elsif result.respond_to?(:each)
|
109
|
-
response.body = result
|
110
|
-
elsif Symbol === result
|
111
|
-
response.status = Rack::Utils.status_code(result)
|
112
111
|
else
|
113
|
-
|
112
|
+
if result.respond_to?(:each)
|
113
|
+
response.body = result
|
114
|
+
else
|
115
|
+
raise TypeError, "#{result.inspect} not supported"
|
116
|
+
end
|
114
117
|
end
|
115
118
|
end
|
116
119
|
|
data/lib/olelo/user.rb
CHANGED
@@ -29,7 +29,7 @@ module Olelo
|
|
29
29
|
User.service.change_password(self, oldpassword, password)
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
32
|
+
def update(&block)
|
33
33
|
copy = dup
|
34
34
|
block.call(copy)
|
35
35
|
validate
|
@@ -42,7 +42,7 @@ module Olelo
|
|
42
42
|
def validate
|
43
43
|
check do |errors|
|
44
44
|
errors << :invalid_email.t if email !~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
|
45
|
-
errors << :invalid_name.t if name !~ /[\w\.\-\+
|
45
|
+
errors << :invalid_name.t if name !~ /[\w\.\-\+]+/
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -50,12 +50,6 @@ module Olelo
|
|
50
50
|
include Util
|
51
51
|
extend Factory
|
52
52
|
|
53
|
-
class NotSupportedError < AuthenticationError
|
54
|
-
def initialize(name)
|
55
|
-
super(:auth_unsupported.t(:name => name))
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
53
|
def find(name)
|
60
54
|
raise NotImplementedError
|
61
55
|
end
|
@@ -63,18 +57,6 @@ module Olelo
|
|
63
57
|
def authenticate(name, password)
|
64
58
|
raise NotImplementedError
|
65
59
|
end
|
66
|
-
|
67
|
-
def create(user, password)
|
68
|
-
raise NotSupportedError('create')
|
69
|
-
end
|
70
|
-
|
71
|
-
def update(user)
|
72
|
-
raise NotSupportedError('update')
|
73
|
-
end
|
74
|
-
|
75
|
-
def change_password(user, oldpassword, password)
|
76
|
-
raise NotSupportedError('change_password')
|
77
|
-
end
|
78
60
|
end
|
79
61
|
|
80
62
|
class<< self
|
@@ -103,8 +85,8 @@ module Olelo
|
|
103
85
|
|
104
86
|
def anonymous(request)
|
105
87
|
ip = request.ip || 'unknown-ip'
|
106
|
-
|
107
|
-
new(
|
88
|
+
host = request.ip && Socket.gethostbyaddr(request.ip.split('.').map(&:to_i).pack('C*')).first rescue nil
|
89
|
+
new(host ? "#{host} (#{ip})" : ip, "anonymous@#{ip}")
|
108
90
|
end
|
109
91
|
|
110
92
|
def find!(name)
|
@@ -119,11 +101,15 @@ module Olelo
|
|
119
101
|
service.authenticate(name, password).tap {|user| user.groups << 'user' }
|
120
102
|
end
|
121
103
|
|
122
|
-
def
|
104
|
+
def supports?(method)
|
105
|
+
service.respond_to?(method)
|
106
|
+
end
|
107
|
+
|
108
|
+
def signup(name, password, confirm, email)
|
123
109
|
validate_password(password, confirm)
|
124
110
|
user = new(name, email, %w(user))
|
125
111
|
user.validate
|
126
|
-
service.
|
112
|
+
service.signup(user, password)
|
127
113
|
user
|
128
114
|
end
|
129
115
|
end
|
data/lib/olelo/util.rb
CHANGED
@@ -33,17 +33,6 @@ module Olelo
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
class BlockFile < ::File
|
37
|
-
alias to_path path
|
38
|
-
|
39
|
-
def each
|
40
|
-
rewind
|
41
|
-
while part = read(8192)
|
42
|
-
yield part
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
36
|
module Util
|
48
37
|
def self.included(base)
|
49
38
|
base.extend(Util)
|
@@ -51,6 +40,10 @@ module Olelo
|
|
51
40
|
|
52
41
|
extend self
|
53
42
|
|
43
|
+
def no_cache?(env = @env)
|
44
|
+
env['HTTP_PRAGMA'] == 'no-cache' || env['HTTP_CACHE_CONTROL'].to_s.include?('no-cache')
|
45
|
+
end
|
46
|
+
|
54
47
|
def check
|
55
48
|
errors = []
|
56
49
|
yield(errors)
|
data/lib/olelo/version.rb
CHANGED
data/lib/olelo/virtualfs.rb
CHANGED
@@ -12,18 +12,14 @@ module Olelo
|
|
12
12
|
raise NotImplementedError
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
|
15
|
+
def real_path(name)
|
16
|
+
nil
|
17
17
|
end
|
18
18
|
|
19
19
|
def size(name)
|
20
20
|
read(name).bytesize
|
21
21
|
end
|
22
22
|
|
23
|
-
def mime(name)
|
24
|
-
MimeMagic.by_path(name) || MimeMagic.new('application/octet-stream')
|
25
|
-
end
|
26
|
-
|
27
23
|
class VirtualFile
|
28
24
|
attr_reader :fs, :name
|
29
25
|
|
@@ -35,8 +31,8 @@ module Olelo
|
|
35
31
|
fs.read(name)
|
36
32
|
end
|
37
33
|
|
38
|
-
def
|
39
|
-
fs.
|
34
|
+
def real_path
|
35
|
+
fs.real_path(name)
|
40
36
|
end
|
41
37
|
|
42
38
|
def mtime
|
@@ -46,10 +42,6 @@ module Olelo
|
|
46
42
|
def size
|
47
43
|
@size ||= fs.size(name)
|
48
44
|
end
|
49
|
-
|
50
|
-
def mime
|
51
|
-
@fs.mime(name)
|
52
|
-
end
|
53
45
|
end
|
54
46
|
|
55
47
|
class Native < VirtualFS
|
@@ -59,31 +51,31 @@ module Olelo
|
|
59
51
|
|
60
52
|
# @override
|
61
53
|
def read(name)
|
62
|
-
File.read(
|
54
|
+
File.read(real_path(name))
|
63
55
|
end
|
64
56
|
|
65
57
|
# @override
|
66
58
|
def glob(*names)
|
67
59
|
names.map do |name|
|
68
|
-
Dir[
|
60
|
+
Dir[real_path(name)].select {|f| File.file?(f) }
|
69
61
|
end.flatten.each do |f|
|
70
62
|
yield(VirtualFile.new(self, f[@dir.length+1..-1]))
|
71
63
|
end
|
72
64
|
end
|
73
65
|
|
74
66
|
# @override
|
75
|
-
def
|
76
|
-
|
67
|
+
def real_path(name)
|
68
|
+
File.join(@dir, name)
|
77
69
|
end
|
78
70
|
|
79
71
|
# @override
|
80
72
|
def mtime(name)
|
81
|
-
File.mtime(
|
73
|
+
File.mtime(real_path(name))
|
82
74
|
end
|
83
75
|
|
84
76
|
# @override
|
85
77
|
def size(name)
|
86
|
-
File.stat(
|
78
|
+
File.stat(real_path(name)).size
|
87
79
|
end
|
88
80
|
end
|
89
81
|
|
@@ -140,7 +132,7 @@ module Olelo
|
|
140
132
|
@fs.each {|fs| fs.glob(*names, &block) }
|
141
133
|
end
|
142
134
|
|
143
|
-
%w(read mtime
|
135
|
+
%w(read mtime real_path size).each do |method|
|
144
136
|
class_eval %{
|
145
137
|
def #{method}(*args)
|
146
138
|
result = nil
|
data/olelo.gemspec
CHANGED
@@ -21,11 +21,14 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_runtime_dependency('slim', ['~> 1.3.3'])
|
22
22
|
s.add_runtime_dependency('creole', ['~> 0.4.2'])
|
23
23
|
s.add_runtime_dependency('nokogiri', ['~> 1.5.5'])
|
24
|
-
s.add_runtime_dependency('mimemagic', ['~> 0.
|
24
|
+
s.add_runtime_dependency('mimemagic', ['~> 0.2.0'])
|
25
25
|
s.add_runtime_dependency('rack', ['~> 1.4.1'])
|
26
|
-
s.add_runtime_dependency('redcarpet', ['~> 2.
|
26
|
+
s.add_runtime_dependency('redcarpet', ['~> 2.2.1'])
|
27
27
|
s.add_runtime_dependency('rugged', ['~> 0.17.0b6'])
|
28
|
+
s.add_runtime_dependency('evaluator', ['~> 0.1.6'])
|
28
29
|
|
29
30
|
s.add_development_dependency('rake', ['>= 0.8.7'])
|
30
31
|
s.add_development_dependency('sass', ['>= 3.1.0'])
|
32
|
+
s.add_development_dependency('bacon', ['~> 1.1.0'])
|
33
|
+
s.add_development_dependency('rack-test', ['~> 0.6.2'])
|
31
34
|
end
|
data/plugins/aspects/locale.yml
CHANGED
@@ -11,6 +11,8 @@ en:
|
|
11
11
|
aspect_subpages: 'Subpages'
|
12
12
|
aspect_text: 'Text Download'
|
13
13
|
aspect_gallery: 'Image Gallery'
|
14
|
+
aspect_s5: 'S5 Presentation'
|
15
|
+
aspect_latex: 'LaTeX'
|
14
16
|
aspect_not_available: 'Aspect #{aspect} is not available for page #{page} with type #{type}.'
|
15
17
|
entry: 'Entry'
|
16
18
|
exif: 'EXIF Information'
|
@@ -31,6 +33,8 @@ de:
|
|
31
33
|
aspect_subpages: 'Unterseiten'
|
32
34
|
aspect_text: 'Quellcode herunterladen'
|
33
35
|
aspect_gallery: 'Bildergalerie'
|
36
|
+
aspect_s5: 'S5 Präsentation'
|
37
|
+
aspect_latex: 'LaTeX'
|
34
38
|
aspect_not_available: 'Aspekt #{aspect} für die Seite #{page} mit dem Typ #{type} ist nicht verfügbar.'
|
35
39
|
entry: 'Eintrag'
|
36
40
|
exif: 'EXIF-Information'
|
@@ -51,6 +55,7 @@ cs_CZ:
|
|
51
55
|
aspect_subpages: 'Podstránky'
|
52
56
|
aspect_text: 'Stažení textu'
|
53
57
|
aspect_gallery: 'Galerie'
|
58
|
+
aspect_latex: 'LaTeX'
|
54
59
|
aspect_not_available: 'Vzhled #{aspect} není k dispozici pro stránku #{page} s typem #{type}.'
|
55
60
|
entry: 'Položka'
|
56
61
|
exif: 'Informace EXIF'
|
data/plugins/aspects/main.rb
CHANGED
@@ -60,6 +60,10 @@ class Aspect
|
|
60
60
|
super(:aspect_not_available.t(:aspect => name, :page => page.path,
|
61
61
|
:type => "#{page.mime.comment} (#{page.mime})"))
|
62
62
|
end
|
63
|
+
|
64
|
+
def status
|
65
|
+
:bad_request
|
66
|
+
end
|
63
67
|
end
|
64
68
|
|
65
69
|
# Constructor for aspect
|
@@ -142,7 +146,7 @@ end
|
|
142
146
|
# Plug-in the aspect subsystem
|
143
147
|
module ::Olelo::PageHelper
|
144
148
|
def render_page(page)
|
145
|
-
Cache.cache("include-#{page.path}-#{page.version.cache_id}", :update =>
|
149
|
+
Cache.cache("include-#{page.path}-#{page.version.cache_id}", :update => no_cache?, :defer => true) do |context|
|
146
150
|
begin
|
147
151
|
context = Context.new(:page => page, :params => {:included => true})
|
148
152
|
Aspect.find!(page, :layout => true).call(context, page)
|
@@ -159,7 +163,7 @@ class ::Olelo::Application
|
|
159
163
|
params[:aspect] ||= 'subpages' if params[:path].to_s.ends_with? '/'
|
160
164
|
@selected_aspect, layout, header, content =
|
161
165
|
Cache.cache("aspect-#{page.path}-#{page.version.cache_id}-#{build_query(params)}",
|
162
|
-
:update =>
|
166
|
+
:update => no_cache?, :defer => true) do |cache|
|
163
167
|
aspect = Aspect.find!(page, :name => params[:aspect])
|
164
168
|
cache.disable! if !aspect.cacheable?
|
165
169
|
context = Context.new(:page => page, :params => params, :request => request)
|
@@ -171,7 +175,7 @@ class ::Olelo::Application
|
|
171
175
|
self.response.header.merge!(header)
|
172
176
|
|
173
177
|
@menu_versions = true
|
174
|
-
|
178
|
+
layout ? render(:show, :locals => {:content => content}) : content
|
175
179
|
rescue Aspect::NotAvailable => ex
|
176
180
|
cache_control :no_cache => true
|
177
181
|
redirect build_path(page.path) if params[:path].to_s.ends_with? '/'
|
@@ -183,7 +187,7 @@ class ::Olelo::Application
|
|
183
187
|
hook :menu do |menu|
|
184
188
|
if menu.name == :actions && view_menu = menu[:view]
|
185
189
|
Cache.cache("aspect-menu-#{page.path}-#{page.version.cache_id}-#{@selected_aspect}",
|
186
|
-
:update =>
|
190
|
+
:update => no_cache?, :defer => true) do
|
187
191
|
aspects = Aspect.find_all(page).select {|a| !a.hidden? || a.name == @selected_aspect || a.name == page.attributes['aspect'] }.map do |a|
|
188
192
|
[Locale.translate("aspect_#{a.name}", :fallback => titlecase(a.name)), a]
|
189
193
|
end.sort_by(&:first)
|
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.version.cache_id}", :update => context.request.
|
13
|
+
Cache.cache("blog-#{page.path}-#{page.version.cache_id}", :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
|
@@ -36,10 +36,10 @@ Aspects::Aspect.create(:blog, :priority => 3, :layout => true, :cacheable => tru
|
|
36
36
|
@page_count = articles.size / per_page + 1
|
37
37
|
articles = articles[((@page_nr - 1) * per_page) ... (@page_nr * per_page)].to_a
|
38
38
|
|
39
|
-
@articles = articles.map do |
|
39
|
+
@articles = articles.map do |article|
|
40
40
|
begin
|
41
|
-
subctx = context.subcontext(:page =>
|
42
|
-
content = Aspects::Aspect.find!(
|
41
|
+
subctx = context.subcontext(:page => article, :params => {:included => true})
|
42
|
+
content = Aspects::Aspect.find!(article, :layout => true).call(subctx, article)
|
43
43
|
if !context.params[:full]
|
44
44
|
paragraphs = XML::Fragment(content).xpath('p')
|
45
45
|
content = ''
|
@@ -51,7 +51,7 @@ Aspects::Aspect.create(:blog, :priority => 3, :layout => true, :cacheable => tru
|
|
51
51
|
rescue Aspects::Aspect::NotAvailable => ex
|
52
52
|
%{<span class="error">#{escape_html ex.message}</span>}
|
53
53
|
end
|
54
|
-
[
|
54
|
+
[article, content]
|
55
55
|
end
|
56
56
|
render :blog, :locals => {:full => context.params[:full]}
|
57
57
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
$(function() {
|
2
|
+
var textarea = $('#edit-content');
|
3
|
+
if (textarea.length == 1) {
|
4
|
+
textarea.hide().before('<div id="ace-editor" style="position:relative; width:100%; height: 40em"/>');
|
5
|
+
var editor = ace.edit('ace-editor');
|
6
|
+
var modes = {
|
7
|
+
'text/x-markdown': 'markdown',
|
8
|
+
'text/x-textile': 'textile'
|
9
|
+
};
|
10
|
+
if (window.Olelo && modes[Olelo.page_mime])
|
11
|
+
editor.getSession().setMode('ace/mode/' + modes[Olelo.page_mime]);
|
12
|
+
editor.getSession().setValue(textarea.val());
|
13
|
+
$('form').submit(function() {
|
14
|
+
textarea.val(editor.getSession().getValue());
|
15
|
+
});
|
16
|
+
}
|
17
|
+
});
|