olelo 0.9.9 → 0.9.10

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.
Files changed (55) hide show
  1. data/Rakefile +41 -5
  2. data/config.ru +5 -3
  3. data/lib/olelo.rb +1 -0
  4. data/lib/olelo/application.rb +7 -6
  5. data/lib/olelo/helper.rb +9 -9
  6. data/lib/olelo/initializer.rb +3 -2
  7. data/lib/olelo/locale.rb +1 -3
  8. data/lib/olelo/locale.yml +5 -61
  9. data/lib/olelo/menu.rb +13 -13
  10. data/lib/olelo/middleware/static_cache.rb +20 -0
  11. data/lib/olelo/page.rb +1 -1
  12. data/lib/olelo/plugin.rb +28 -24
  13. data/lib/olelo/version.rb +1 -1
  14. data/lib/olelo/views/layout.slim +0 -1
  15. data/olelo.gemspec +7 -6
  16. data/plugins/aspects/documentbrowser.rb +3 -3
  17. data/plugins/aspects/download.rb +3 -3
  18. data/plugins/aspects/feed.rb +100 -0
  19. data/plugins/aspects/gallery/main.rb +1 -1
  20. data/plugins/aspects/highlight.rb +1 -1
  21. data/plugins/aspects/image.rb +4 -4
  22. data/plugins/aspects/imageinfo.rb +9 -3
  23. data/plugins/aspects/locale.yml +20 -0
  24. data/plugins/aspects/main.rb +25 -13
  25. data/plugins/aspects/pageinfo.rb +9 -3
  26. data/plugins/aspects/source.rb +1 -1
  27. data/plugins/aspects/subpages.rb +10 -6
  28. data/plugins/aspects/text.rb +1 -1
  29. data/plugins/authentication/locale.yml +16 -0
  30. data/plugins/blog/locale.yml +1 -1
  31. data/plugins/blog/main.rb +1 -1
  32. data/plugins/editor/preview.rb +1 -1
  33. data/plugins/editor/recaptcha.rb +1 -1
  34. data/plugins/filters/editsection.rb +1 -1
  35. data/plugins/filters/locale.yml +1 -1
  36. data/plugins/filters/toc.rb +1 -1
  37. data/plugins/history/locale.yml +1 -1
  38. data/plugins/history/main.rb +18 -14
  39. data/plugins/login/persistent.rb +8 -6
  40. data/plugins/misc/variables.rb +16 -5
  41. data/plugins/misc/webdav.rb +21 -19
  42. data/plugins/repositories/git_grep.rb +3 -2
  43. data/plugins/security/acl.rb +1 -1
  44. data/plugins/security/private_wiki.rb +3 -2
  45. data/plugins/utils/assets.rb +13 -18
  46. data/plugins/utils/cache.rb +18 -16
  47. data/static/script.js +1 -1
  48. data/static/script/14-olelo.tabwidget.js +2 -0
  49. data/static/themes/atlantis/menu.scss +3 -0
  50. data/static/themes/atlantis/style.css +1 -1
  51. data/test/request_test.rb +0 -1
  52. metadata +65 -53
  53. data/lib/rack/static_cache.rb +0 -93
  54. data/plugins/aspects/changelog.rb +0 -46
  55. data/plugins/misc/fragment_cache.rb +0 -31
data/lib/olelo/menu.rb CHANGED
@@ -6,22 +6,21 @@ module Olelo
6
6
 
7
7
  def initialize(name)
8
8
  @name = name.to_sym
9
- @items = []
10
- @items_map = {}
9
+ @items = {}
11
10
  end
12
11
 
13
12
  def each(&block)
14
- @items.each(&block)
13
+ @items.each_value(&block)
15
14
  end
16
15
 
17
16
  def [](name)
18
17
  path = path.to_s
19
18
  i = path.index('/')
20
19
  if i
21
- item = @items_map[path[0...i]]
20
+ item = @items[path[0...i]]
22
21
  item[path[i+1..-1]] if item
23
22
  else
24
- @items_map[name.to_sym]
23
+ @items[name.to_sym]
25
24
  end
26
25
  end
27
26
 
@@ -29,12 +28,15 @@ module Olelo
29
28
  self << MenuItem.new(name, options)
30
29
  end
31
30
 
31
+ def append(items)
32
+ items.each {|item| self << item }
33
+ end
34
+
32
35
  def <<(item)
33
36
  raise TypeError, "Only items allowed" unless MenuItem === item
34
- raise "Item #{item.name} exists already in #{path.join('/')}" if @items_map.include?(item.name)
37
+ raise "Item #{item.name} exists already in #{path.join('/')}" if @items.include?(item.name)
35
38
  item.parent = self
36
- @items << item
37
- @items_map[item.name] = item
39
+ @items[item.name] = item
38
40
  end
39
41
 
40
42
  def empty?
@@ -43,23 +45,21 @@ module Olelo
43
45
 
44
46
  def clear
45
47
  @items.clear
46
- @items_map.clear
47
48
  end
48
49
 
49
50
  def remove(name)
50
51
  path = name.to_s
51
52
  i = path.index('/')
52
53
  if i
53
- item = @items_map[path[0...i]]
54
+ item = @items[path[0...i]]
54
55
  item.remove(path[i+1..-1]) if item
55
56
  else
56
- item = @items_map.delete(name.to_sym)
57
- @items.delete(item) if item
57
+ @items.delete(name.to_sym)
58
58
  end
59
59
  end
60
60
 
61
61
  def build_menu
62
- empty? ? '' : %{<ul id="menu-#{html_id}">#{map {|item| item.build_menu }.join}</ul>}
62
+ empty? ? '' : %{<ul id="menu-#{html_id}">#{map(&:build_menu).join}</ul>}
63
63
  end
64
64
 
65
65
  def to_html
@@ -0,0 +1,20 @@
1
+ module Olelo
2
+ module Middleware
3
+ class StaticCache
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ # Add a cache-control header if asset is static with version string
10
+ if env['PATH_INFO'].sub!(%r{^/static-\w+/}, '/static/')
11
+ status, headers, body = @app.call(env)
12
+ headers['Cache-Control'] = 'public, max-age=31536000'
13
+ [status, headers, body]
14
+ else
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/olelo/page.rb CHANGED
@@ -94,7 +94,7 @@ module Olelo
94
94
  def etag
95
95
  unless new?
96
96
  @etag ||= repository.path_etag(path, tree_version)
97
- "#{head? ? 1 : 0}-#{@etag}"
97
+ "#{Olelo::VERSION}-#{head? ? 1 : 0}-#{@etag}"
98
98
  end
99
99
  end
100
100
 
data/lib/olelo/plugin.rb CHANGED
@@ -32,40 +32,44 @@ module Olelo
32
32
  @loaded[path] = plugin
33
33
  end
34
34
 
35
- # Load plugins by path
35
+ # Load plugin by path
36
36
  #
37
- # @param list List of plugin paths to load
37
+ # @param [String] path Plugin path to load
38
38
  # @return [Boolean] true if every plugin was loaded
39
- def load(*list)
40
- files = list.map {|path| [File.join(@dir, path, 'main.rb'), File.join(@dir, "#{path}.rb")] }.flatten.select {|file| File.file?(file) }
39
+ def load(path)
40
+ path = path.sub(%r{/main$}, '')
41
+ files = [File.join(@dir, path, 'main.rb'), File.join(@dir, "#{path}.rb")].select {|file| File.file?(file) }
42
+ if files.size == 2
43
+ Olelo.logger.error "Duplicate plugin #{files.join(', ')}"
44
+ return false
45
+ end
41
46
  return false if files.empty?
42
- files.inject(true) do |result,file|
43
- path = File.basename(file) == 'main.rb' ? file[(@dir.size+1)..-9] : file[(@dir.size+1)..-4]
44
- if @loaded.include?(path)
45
- result
46
- elsif @failed.include?(path) || !enabled?(path)
47
- false
48
- else
49
- begin
50
- new(path, file)
51
- rescue Exception => ex
52
- @failed << path
53
- if LoadError === ex
54
- Olelo.logger.warn "Plugin #{path} could not be loaded due to: #{ex.message} (Missing gem?)"
55
- else
56
- Olelo.logger.error "Plugin #{path} could not be loaded due to: #{ex.message}"
57
- Olelo.logger.debug ex
58
- end
59
- @loaded.delete(path)
60
- false
47
+
48
+ if @loaded.include?(path)
49
+ true
50
+ elsif @failed.include?(path) || !enabled?(path)
51
+ false
52
+ else
53
+ begin
54
+ new(path, files.first)
55
+ true
56
+ rescue Exception => ex
57
+ @failed << path
58
+ if LoadError === ex
59
+ Olelo.logger.warn "Plugin #{path} could not be loaded due to: #{ex.message} (Missing gem?)"
60
+ else
61
+ Olelo.logger.error "Plugin #{path} could not be loaded due to: #{ex.message}"
62
+ Olelo.logger.debug ex
61
63
  end
64
+ @loaded.delete(path)
65
+ false
62
66
  end
63
67
  end
64
68
  end
65
69
 
66
70
  # Load all plugins
67
71
  def load_all
68
- load(*Dir[File.join(@dir, '**', '*.rb')].map {|file| file[(@dir.size+1)..-4] })
72
+ Dir[File.join(@dir, '**', '*.rb')].inject(true) {|result,file| load(file[(@dir.size+1)..-4]) && result }
69
73
  end
70
74
 
71
75
  # Check if plugin is enabled
data/lib/olelo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Olelo
2
- VERSION = '0.9.9'
2
+ VERSION = '0.9.10'
3
3
  end
@@ -2,7 +2,6 @@ doctype 5
2
2
  html.no-js lang=Olelo::Config['locale'].sub('_', '-') class={page && !page.head? ? 'archive' : nil} xmlns='http://www.w3.org/1999/xhtml'
3
3
  head
4
4
  title= Olelo::Config['title'] + ' - ' + title
5
- link rel='shortcut icon' href=build_path('static/favicon.png?1') type='image/png'
6
5
  = head
7
6
  body
8
7
  #header
data/olelo.gemspec CHANGED
@@ -19,18 +19,19 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.required_ruby_version = '>= 1.9.2'
21
21
 
22
- s.add_runtime_dependency('multi_json', ['~> 1.3.7'])
23
- s.add_runtime_dependency('slim', ['~> 1.3.3'])
22
+ s.add_runtime_dependency('RedCloth', ['~> 4.2.9'])
24
23
  s.add_runtime_dependency('creole', ['~> 0.5.0'])
25
- s.add_runtime_dependency('nokogiri', ['~> 1.5.5'])
24
+ s.add_runtime_dependency('evaluator', ['~> 0.1.6'])
26
25
  s.add_runtime_dependency('mimemagic', ['~> 0.2.0'])
26
+ s.add_runtime_dependency('multi_json', ['~> 1.3.7'])
27
+ s.add_runtime_dependency('nokogiri', ['~> 1.5.5'])
27
28
  s.add_runtime_dependency('rack', ['~> 1.4.1'])
28
29
  s.add_runtime_dependency('redcarpet', ['~> 2.2.2'])
29
30
  s.add_runtime_dependency('rugged', ['~> 0.17.0.b7'])
30
- s.add_runtime_dependency('evaluator', ['~> 0.1.6'])
31
+ s.add_runtime_dependency('slim', ['~> 1.3.3'])
31
32
 
32
- s.add_development_dependency('rake', ['>= 0.8.7'])
33
- s.add_development_dependency('sass', ['~> 3.2.3'])
34
33
  s.add_development_dependency('bacon', ['~> 1.1.0'])
35
34
  s.add_development_dependency('rack-test', ['~> 0.6.2'])
35
+ s.add_development_dependency('rake', ['>= 0.8.7'])
36
+ s.add_development_dependency('sass', ['~> 3.2.3'])
36
37
  end
@@ -37,10 +37,10 @@ table
37
37
  td= :name.t
38
38
  td= @page.name
39
39
  tr
40
- td= :title.t
40
+ td= :attribute_title.t
41
41
  td= @page.title
42
42
  tr
43
- td= :description.t
43
+ td= :attribute_description.t
44
44
  td= @page.attributes['description']
45
45
  - if @page.version
46
46
  tr
@@ -57,7 +57,7 @@ table
57
57
  td
58
58
  a href=build_path(@page, aspect: 'download') = :download.t
59
59
  @@ locale.yml
60
- cs_CZ:
60
+ cs:
61
61
  aspect_documentbrowser: 'Document Browser'
62
62
  download: 'Stáhnout'
63
63
  information: 'Informace'
@@ -13,11 +13,11 @@ end
13
13
 
14
14
  __END__
15
15
  @@ locale.yml
16
- cs_CZ:
16
+ cs:
17
17
  aspect_download: 'Stažení (neupraveno)'
18
18
  de:
19
19
  aspect_download: 'Herunterladen'
20
20
  en:
21
- aspect_download: 'Raw Download'
21
+ aspect_download: 'Download'
22
22
  fr:
23
- aspect_download: "Téléchargement brut"
23
+ aspect_download: "Téléchargement"
@@ -0,0 +1,100 @@
1
+ # -*- coding: utf-8 -*-
2
+ description 'Newsfeed Aspect'
3
+ require 'time'
4
+
5
+ Aspect.create(:feed, cacheable: true, hidden: true) do
6
+ def call(context, page)
7
+ format = context.params[:format]
8
+
9
+ url = context.request.base_url
10
+ context.header['Content-Type'] = "application/#{format == 'atom' ? 'atom' : 'rss'}+xml; charset=utf-8"
11
+
12
+ per_page = 30
13
+ page_nr = [context.params[:page].to_i, 1].max
14
+ history = page.history((page_nr - 1) * per_page, per_page)
15
+
16
+ title = page.root? ? Config['Title'] : page.title
17
+ feed = {
18
+ self_link: url + build_path(page, {aspect: 'feed', format: format}.reject{ |k,v| v.blank? }),
19
+ generator: 'Ōlelo',
20
+ title: title,
21
+ description: :feed_description.t(title: title),
22
+ link: url + '/' + page.path,
23
+ date: Time.now,
24
+ author: Config['title'],
25
+ items: []
26
+ }
27
+ history.each do |version|
28
+ feed[:items] << {
29
+ title: version.comment,
30
+ link: "#{url}/changes/#{version}",
31
+ date: version.date,
32
+ author: version.author.name
33
+ }
34
+ end
35
+
36
+ render(format == 'atom' ? :feed_atom : :feed_rss, locals: {feed: feed})
37
+ end
38
+ end
39
+
40
+ Application.hook :head do
41
+ render_partial :feed_header
42
+ end
43
+
44
+ __END__
45
+ @@ feed_header.slim
46
+ link rel="alternate" type="application/atom+xml" title=:sitewide_atom_feed.t href=build_path('/', aspect: 'feed', format: 'atom')
47
+ link rel="alternate" type="application/rss+xml" title=:sitewide_rss_feed.t href=build_path('/', aspect: 'feed', format: 'rss')
48
+ - if page && !page.new? && !page.root?
49
+ link rel="alternate" type="application/atom+xml" title=:page_atom_feed.t(page: page.path) href=build_path(page.path, aspect: 'feed', format: 'atom')
50
+ link rel="alternate" type="application/rss+xml" title=:page_rss_feed.t(page: page.path) href=build_path(page.path, aspect: 'feed', format: 'rss')
51
+ @@ feed_atom.slim
52
+ doctype xml
53
+ feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"
54
+ author
55
+ name = feed[:title]
56
+ generator = feed[:generator]
57
+ id = feed[:link]
58
+ link href=feed[:link] /
59
+ link href=feed[:self_link] rel="self" type="application/atom+xml"/
60
+ subtitle = feed[:description]
61
+ title = feed[:title]
62
+ updated = feed[:date].iso8601()
63
+ - feed[:items].each do |item|
64
+ entry
65
+ id = item[:link]
66
+ link href=item[:link] /
67
+ title = item[:title]
68
+ updated = item[:date].iso8601()
69
+ dc:creator = item[:author]
70
+ dc:date = item[:date].iso8601()
71
+ @@ feed_rss.slim
72
+ doctype xml
73
+ rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"
74
+ channel
75
+ title = feed[:title]
76
+ link = feed[:link]
77
+ description = feed[:description]
78
+ pubDate = feed[:date].rfc822()
79
+ atom:link href=feed[:self_link] rel="self" type="application/rss+xml"/
80
+ - feed[:items].each do |item|
81
+ item
82
+ title = item[:title]
83
+ guid = item[:link]
84
+ link = item[:link]
85
+ pubDate = item[:date].rfc822()
86
+ dc:creator = item[:author]
87
+ @@ locale.yml
88
+ de:
89
+ feed_description: 'Newsfeed für %{title}'
90
+ sitewide_rss_feed: 'RSS-Newsfeed für die ganze Seite'
91
+ sitewide_atom_feed: 'Atom-Newsfeed für die ganze Seite'
92
+ sitewide_rss_feed: 'RSS-Newsfeed für die ganze Seite'
93
+ page_atom_feed: '%{page} Atom-Newsfeed'
94
+ page_rss_feed: '%{page} RSS-Newsfeed'
95
+ en:
96
+ feed_description: '%{title} Newsfeed'
97
+ sitewide_atom_feed: 'Sitewide Atom Feed'
98
+ sitewide_rss_feed: 'Sitewide RSS Feed'
99
+ page_atom_feed: '%{page} Atom Feed'
100
+ page_rss_feed: '%{page} RSS Feed'
@@ -33,7 +33,7 @@ table.gallery
33
33
  img src=thumb_path alt=''
34
34
  a.title href=info_path = description
35
35
  @@ locale.yml
36
- cs_CZ:
36
+ cs:
37
37
  aspect_gallery: 'Galerie'
38
38
  de:
39
39
  aspect_gallery: 'Bildergalerie'
@@ -9,7 +9,7 @@ end
9
9
 
10
10
  __END__
11
11
  @@ locale.yml
12
- cs_CZ:
12
+ cs:
13
13
  aspect_highlight: 'Zvýrazněný zdroj'
14
14
  de:
15
15
  aspect_highlight: 'Quellcode mit Syntaxhighlighting'
@@ -43,11 +43,11 @@ end
43
43
 
44
44
  __END__
45
45
  @@ locale.yml
46
- cs_CZ:
47
- aspect_image: 'Stažení obrázku'
46
+ cs:
47
+ aspect_image: 'Stažení'
48
48
  de:
49
49
  aspect_image: 'Bild'
50
50
  en:
51
- aspect_image: 'Raw Image'
51
+ aspect_image: 'Image'
52
52
  fr:
53
- aspect_image: "Image brute"
53
+ aspect_image: "Image"
@@ -25,10 +25,10 @@ table
25
25
  td= :name.t
26
26
  td= @page.name
27
27
  tr
28
- td= :title.t
28
+ td= :attribute_title.t
29
29
  td= @page.title
30
30
  tr
31
- td= :description.t
31
+ td= :attribute_description.t
32
32
  td= @page.attributes['description']
33
33
  tr
34
34
  td= :type.t
@@ -43,6 +43,12 @@ table
43
43
  tr
44
44
  td= :version.t
45
45
  td.version= @page.version
46
+ tr
47
+ td= :author.t
48
+ td= @page.version.author.name
49
+ tr
50
+ td= :comment.t
51
+ td= @page.version.comment
46
52
  - unless @exif.empty?
47
53
  h3= :exif.t
48
54
  table
@@ -56,7 +62,7 @@ table
56
62
  td= key
57
63
  td= value
58
64
  @@ locale.yml
59
- cs_CZ:
65
+ cs:
60
66
  aspect_imageinfo: 'Informace o obrázku'
61
67
  entry: 'Položka'
62
68
  exif: 'Informace EXIF'
@@ -0,0 +1,20 @@
1
+ cs:
2
+ author: 'Autor'
3
+ last_modified: 'Poslední modifikace'
4
+ name: 'Jméno'
5
+ version: 'Verze'
6
+ de:
7
+ author: 'Autor'
8
+ last_modified: 'Letzte Änderung'
9
+ name: 'Name'
10
+ version: 'Version'
11
+ en:
12
+ author: 'Author'
13
+ last_modified: 'Last modified'
14
+ name: 'Name'
15
+ version: 'Version'
16
+ fr:
17
+ author: "Auteur"
18
+ last_modified: "Dernière modification"
19
+ name: "Nom"
20
+ version: "Version"