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.
Files changed (57) hide show
  1. data/{doc/LICENSE → LICENSE} +0 -0
  2. data/README.creole +127 -0
  3. data/Rakefile +2 -2
  4. data/bin/olelo +55 -2
  5. data/config.ru +21 -4
  6. data/config/aspects.rb +9 -7
  7. data/config/config.yml.default +1 -0
  8. data/lib/olelo.rb +1 -0
  9. data/lib/olelo/application.rb +25 -14
  10. data/lib/olelo/config.rb +1 -1
  11. data/lib/olelo/extensions.rb +0 -12
  12. data/lib/olelo/helper.rb +0 -4
  13. data/lib/olelo/initializer.rb +4 -7
  14. data/lib/olelo/locale.yml +0 -3
  15. data/lib/olelo/page.rb +1 -1
  16. data/lib/olelo/plugin.rb +5 -4
  17. data/lib/olelo/routing.rb +15 -12
  18. data/lib/olelo/user.rb +10 -24
  19. data/lib/olelo/util.rb +4 -11
  20. data/lib/olelo/version.rb +1 -1
  21. data/lib/olelo/virtualfs.rb +11 -19
  22. data/olelo.gemspec +5 -2
  23. data/plugins/aspects/locale.yml +5 -0
  24. data/plugins/aspects/main.rb +8 -4
  25. data/plugins/authentication/yamlfile.rb +1 -1
  26. data/plugins/blog/main.rb +5 -5
  27. data/plugins/editor/ace/init.js +17 -0
  28. data/plugins/editor/ace/main.rb +7 -0
  29. data/plugins/editor/markup/main.rb +1 -1
  30. data/plugins/editor/markup/script.js +8 -8
  31. data/plugins/editor/markup/script/init.js +3 -3
  32. data/plugins/editor/recaptcha.rb +2 -2
  33. data/plugins/filters/interwiki.rb +0 -1
  34. data/plugins/gallery/main.rb +1 -1
  35. data/plugins/login/persistent.rb +2 -2
  36. data/plugins/misc/fancybox/script.js +1 -1
  37. data/plugins/misc/fancybox/script/init.js +2 -2
  38. data/plugins/misc/variables.rb +2 -2
  39. data/plugins/tags/math.rb +6 -7
  40. data/plugins/tags/scripting.rb +1 -1
  41. data/plugins/tags/tabs.rb +1 -1
  42. data/plugins/treeview/script.js +2 -2
  43. data/plugins/treeview/script/init.js +26 -24
  44. data/plugins/utils/assets.rb +20 -14
  45. data/static/themes/atlantis/images/bg/header.jpg +0 -0
  46. data/static/themes/atlantis/images/bg/header_gray.jpg +0 -0
  47. data/views/layout.slim +0 -1
  48. data/views/login.slim +3 -2
  49. metadata +127 -34
  50. data/README.markdown +0 -104
  51. data/doc/AUTHORS +0 -7
  52. data/lib/rack/olelo_patches.rb +0 -33
  53. data/lib/yard/addons.rb +0 -1
  54. data/lib/yard/addons/hook_handler.rb +0 -25
  55. data/lib/yard/addons/override_tag.rb +0 -14
  56. data/lib/yard/addons/route_handler.rb +0 -33
  57. data/lib/yard/addons/sanitize_anchor.rb +0 -16
@@ -0,0 +1,7 @@
1
+ description 'Use ace editor'
2
+ dependencies 'utils/assets'
3
+ export_scripts '*.js'
4
+
5
+ Application.hook :head do
6
+ %{<script src="http://d1n0x3qji82z53.cloudfront.net/src-min-noconflict/ace.js" type="text/javascript"/>}
7
+ end
@@ -1,3 +1,3 @@
1
- description 'Markup editor'
1
+ description 'Adds markup toolbar to the editor'
2
2
  dependencies 'misc/variables', 'utils/assets'
3
3
  export_scripts '*.js'
@@ -1,10 +1,10 @@
1
- (function(){var i=function(){var f=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(f){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
- 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(f){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,g){d=d||c;var h=c+b.length,l=a.value.substring(0,c);d=a.value.substr(d);a.value=l+b+d;g===true?this.setSelectionRange(a,c,h):this.setSelectionRange(a,h)},replaceSelectedText:function(a,b,c){var d=this.getSelectionRange(a);this.insertText(a,
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=i})();
5
- (function(i){i.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(f,a){return this.each(function(){Selection.setSelectionRange(this,f,a)})},insertText:function(f,a,b,c){return this.each(function(){Selection.insertText(this,f,a,
6
- b,c)})},replaceSelectedText:function(f,a){return this.each(function(){Selection.replaceSelectedText(this,f,a)})},wrapSelectedText:function(f,a,b){return this.each(function(){Selection.wrapSelectedText(this,f,a,b)})}})})(jQuery);(function(i){var f={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:",
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
+ 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,l=a.value.substring(0,c);d=a.value.substr(d);a.value=l+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
+ 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
+ (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
+ 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","!"]}};i.fn.markupEditor=function(a){if(a=f[a]){var b=i('<ul class="button-bar" id="markup-editor"/>'),c=[];for(k in a)c.push(k);c.sort();for(var d=0;d<c.length;++d)b.append('<li><a href="#" id="markup-editor-'+c[d]+'">'+c[d]+"</a></li>");this.before(b);var g=this;i("a",b).click(function(){var h=a[this.id.substr(14)],l=g.getSelectedText();if(typeof h=="function")h=h(l);if(h){var e=g.getSelectionRange(),j=h[0],n=h[1],m=h[2];if(h[3]){g.setSelectionRange(e.start-1,e.start);if(e.start!==
10
- 0&&g.getSelectedText()!="\n")j="\n"+j;g.setSelectionRange(e.end,e.end+1);if(g.getSelectedText()!="\n")m+="\n"}if(e.start==e.end){g.insertText(j+n+m,e.start,e.start,false);g.setSelectionRange(e.start+j.length,e.start+j.length+n.length)}else g.insertText(j+l+m,e.start,e.end,false)}return false})}}})(jQuery);if(window.Olelo){var mime=Olelo.page_mime;if(mime=="application/x-empty"||mime=="inode/directory")mime=Olelo.default_mime;var match=/text\/x-(\w+)/.exec(mime);match&&$("#edit-content").markupEditor(match[1])};
9
+ image:["!","image","!"]}};e.fn.markupEditor=function(a){if(a=g[a]){var b=e('<ul class="button-bar" id="markup-editor"/>'),c=[];for(k in a)c.push(k);c.sort();for(var 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)],l=h.getSelectedText();if(typeof i=="function")i=i(l);if(i){var f=h.getSelectionRange(),j=i[0],n=i[1],m=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")m+="\n"}if(f.start==f.end){h.insertText(j+n+m,f.start,f.start,false);h.setSelectionRange(f.start+j.length,f.start+j.length+n.length)}else h.insertText(j+l+m,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,10 +1,10 @@
1
- if (window.Olelo) {
1
+ $(function() {
2
2
  var mime = Olelo.page_mime;
3
3
  if (mime == 'application/x-empty' || mime == 'inode/directory') {
4
- mime = Olelo.default_mime;
4
+ mime = Olelo.default_mime;
5
5
  }
6
6
  var match = /text\/x-(\w+)/.exec(mime);
7
7
  if (match) {
8
8
  $('#edit-content').markupEditor(match[1]);
9
9
  }
10
- }
10
+ });
@@ -1,11 +1,11 @@
1
- description 'reCAPTCHA support to avoid spamming'
1
+ description 'Adds a reCAPTCHA to the editor to avoid spamming'
2
2
  require 'net/http'
3
3
 
4
4
  RECAPTCHA_PUBLIC = Config['recaptcha.public']
5
5
  RECAPTCHA_PRIVATE = Config['recaptcha.private']
6
6
 
7
7
  class ::Olelo::Application
8
- hook :script do
8
+ hook :head do
9
9
  %{<script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"/>
10
10
  <script type="text/javascript">
11
11
  $(function() {
@@ -9,7 +9,6 @@ class Interwiki < Filter
9
9
 
10
10
  def filter(context, content)
11
11
  content.gsub!(@regexp) do
12
- wiki, page = $1, $2
13
12
  %{href="#{escape_html @map[$1]}#{$2}"}
14
13
  end
15
14
  content
@@ -9,7 +9,7 @@ Aspects::Aspect.create(:gallery, :priority => 3, :layout => true, :hidden => tru
9
9
  per_page = @per_row * 4
10
10
  @page_nr = [context.params[:page].to_i, 1].max
11
11
  @page = page
12
- @images = @page.children.select {|page| page.mime.image? }
12
+ @images = @page.children.select {|p| p.mime.image? }
13
13
  @page_count = @images.size / per_page + 1
14
14
  @images = @images[((@page_nr - 1) * per_page) ... (@page_nr * per_page)].to_a
15
15
  render :gallery
@@ -8,7 +8,7 @@ class ::Olelo::Application
8
8
  if !User.current
9
9
  token = request.cookies[TOKEN_NAME]
10
10
  if token
11
- user, hash = token.split('-', 2)
11
+ hash, user = token.split('-', 2)
12
12
  User.current = User.find(user) if sha256(user + Config['rack.session_secret']) == hash
13
13
  end
14
14
  end
@@ -22,7 +22,7 @@ class ::Olelo::Application
22
22
  after :action do |method, path|
23
23
  if path == '/login'
24
24
  if User.logged_in? && params[:persistent]
25
- token = "#{User.current.name}-#{sha256(User.current.name + Config['rack.session_secret'])}"
25
+ token = "#{sha256(User.current.name + Config['rack.session_secret'])}-#{User.current.name}"
26
26
  response.set_cookie(TOKEN_NAME, :value => token, :expires => Time.now + TOKEN_LIFETIME)
27
27
  end
28
28
  elsif path == '/logout'
@@ -34,4 +34,4 @@ if(h.opacity)n.opacity=1;o.empty().hide();D.prop=1;a(D).animate({prop:0},{durati
34
34
  j.append(k=a('<div id="fancybox-content"></div>'),w=a('<a id="fancybox-close"></a>'),o=a('<div id="fancybox-title"></div>'),x=a('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),C=a('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>'));w.click(a.fancybox.close);f.click(a.fancybox.cancel);x.click(function(c){c.preventDefault();a.fancybox.prev()});C.click(function(c){c.preventDefault();a.fancybox.next()});
35
35
  a.fn.mousewheel&&d.bind("mousewheel.fb",function(c,g){if(m)c.preventDefault();else if(a(c.target).get(0).clientHeight==0||a(c.target).get(0).scrollHeight===a(c.target).get(0).clientHeight){c.preventDefault();a.fancybox[g>0?"prev":"next"]()}});a.support.opacity||d.addClass("fancybox-ie");if(M){f.addClass("fancybox-ie6");d.addClass("fancybox-ie6");a('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(j)}}};
36
36
  a.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",
37
- easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};a(document).ready(function(){a.fancybox.init()})})(jQuery);(function(){function a(){$("a.fancybox").each(function(){var b=this.href.replace(/aspect=\w+/g,"");this.href=b+(b.indexOf("?")<0?"?":"&")+"aspect=image&geometry=800x800>"});$("a.fancybox").fancybox({transitionIn:"none",transitionOut:"none",titlePosition:"over",titleFormat:function(b,f,e){return'<span id="fancybox-title-over">'+(e+1)+" / "+f.length+" "+(b?b:"")+"</span>"}})}$("#content").bind("pageLoaded",a);a()})();
37
+ easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};a(document).ready(function(){a.fancybox.init()})})(jQuery);$(function(){function a(){$("a.fancybox").each(function(){var b=this.href.replace(/aspect=\w+/g,"");this.href=b+(b.indexOf("?")<0?"?":"&")+"aspect=image&geometry=800x800>"});$("a.fancybox").fancybox({transitionIn:"none",transitionOut:"none",titlePosition:"over",titleFormat:function(b,f,e){return'<span id="fancybox-title-over">'+(e+1)+" / "+f.length+" "+(b?b:"")+"</span>"}})}$("#content").bind("pageLoaded",a);a()});
@@ -1,4 +1,4 @@
1
- (function() {
1
+ $(function() {
2
2
  function initFancybox() {
3
3
  $('a.fancybox').each(function() {
4
4
  var href = this.href.replace(/aspect=\w+/g, '');
@@ -15,4 +15,4 @@
15
15
 
16
16
  $('#content').bind('pageLoaded', initFancybox);
17
17
  initFancybox();
18
- })();
18
+ });
@@ -2,7 +2,7 @@ description 'Export variables to context and javascript'
2
2
  dependencies 'aspects'
3
3
 
4
4
  def self.exported_variables(page)
5
- vars = {
5
+ {
6
6
  'base_path' => Config['base_path'],
7
7
  'page_name' => page.name,
8
8
  'page_new' => page.new?,
@@ -23,7 +23,7 @@ Aspects::Context.hook(:initialized) do
23
23
  end
24
24
 
25
25
  # Export variables to javascript for client extensions
26
- Application.hook :head do
26
+ Application.hook :head, 1 do
27
27
  vars = page ? params.merge(PLUGIN.exported_variables(page)) : params
28
28
  vars = vars.merge('user_logged_in' => !User.logged_in?, 'user_name' => User.current.name)
29
29
  %{<script type="text/javascript">Olelo = #{escape_javascript(vars.to_json)};</script>}
data/plugins/tags/math.rb CHANGED
@@ -1,4 +1,4 @@
1
- description 'Math tag for LaTeX rendering'
1
+ description 'Wiki tags for TeX math rendering'
2
2
  dependencies 'utils/image_magick'
3
3
 
4
4
  class MathRenderer
@@ -98,18 +98,17 @@ Tag.define :math, :optional => 'display' do |context, attrs, code|
98
98
  end
99
99
 
100
100
  class ::Olelo::Application
101
- hook :script do
101
+ hook :head do
102
102
  if page && Config['math_renderer'] == 'mathjax'
103
103
  %{<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"/>}
104
104
  end
105
105
  end
106
106
 
107
- get '/_/blahtex/:name', :name => /[\w\.]+/ do
107
+ get '/_/blahtex/:name', :name => /\w+\.\w+/ do
108
108
  begin
109
- response['Content-Type'] = 'image/png'
110
- file = File.join(Config['blahtex_directory'], params[:name])
111
- response['Content-Length'] ||= File.stat(file).size.to_s
112
- halt BlockFile.open(file, 'rb')
109
+ file = Rack::File.new(nil)
110
+ file.path = File.join(Config['blahtex_directory'], params[:name])
111
+ file.serving(env)
113
112
  rescue => ex
114
113
  ImageMagick.label(ex.message)
115
114
  end
@@ -1,4 +1,4 @@
1
- description 'Scripting tags'
1
+ description 'Wiki syntax tags for scripting'
2
2
  require 'evaluator'
3
3
 
4
4
  Tag.define :value, :requires => 'of', :immediate => true, :description => 'Print value' do |context, attrs|
data/plugins/tags/tabs.rb CHANGED
@@ -1,4 +1,4 @@
1
- description 'Tabs'
1
+ description 'Wiki syntax tag for tabs'
2
2
 
3
3
  Tag.define :tabs do |context, attrs, content|
4
4
  tabs = context[:tabs] = []
@@ -1,5 +1,5 @@
1
1
  (function(c){c.fn.treeView=function(a){function l(b,e){if(a.stateStore){var d=jStorage.get(a.stateStore,[]);if(e)c.inArray(b,d)<0&&d.push(b);else d=c.grep(d,function(f){return f!=b});jStorage.set(a.stateStore,d)}}function m(b){var e=b[2],d=c('<li><div class="'+(b[0]?"hitarea collapsed":"placeholder")+'"><div class="arrow"/><div class="'+b[1]+'"/></div><a href="'+e+'">'+b[3]+"</a></li>"),f=d.children(".hitarea");d.data("name",b[3]);f.click(function(){if(f.hasClass("collapsed")){n(d,e);f.removeClass("collapsed").addClass("expanded")}else{d.children("ul").hide();
2
2
  f.removeClass("expanded").addClass("collapsed")}l(e,f.hasClass("expanded"));return false});if(a.stateStore&&c.inArray(e,jStorage.get(a.stateStore,[]))>=0){n(d,e);f.removeClass("collapsed").addClass("expanded")}return d}function n(b,e){function d(i){var j=c("<ul/>");c.each(i,function(o,k){j.append(m(k))});e==a.root&&b.empty();b.children("ul").remove();b.append(j)}function f(i){g&&jStorage.set(g,i);var j={},o=[];c.each(i,function(k,h){j[h[3]]=h});c("> ul > li",b).each(function(){var k=c(this),h=k.data("name");
3
3
  if(j[h])delete j[h];else k.remove();o.push(c(this))});c.each(j,function(k,h){var p=false;c.each(o,function(t,q){if(k<q.data("name")){p=true;q.before(m(h));return false}});p||b.children("ul").append(m(h))})}function r(){setTimeout(function(){a.ajax(e,f,function(){g&&jStorage.remove(g)})},a.delay)}var g=a.cacheStore?a.cacheStore+":"+e:null;if(b.children("ul").length!==0){b.children("ul").show();r()}else{var s=g?jStorage.get(g):null;if(s){d(s);r()}else{b.addClass("wait");a.ajax(e,function(i){b.removeClass("wait");
4
- d(i);g&&jStorage.set(g,i)},function(){b.removeClass("wait")})}}}a||(a={});if(!a.root)a.root="/";if(!a.url)a.url="/treeview.json";if(!a.delay)a.delay=2E3;if(!a.ajax)a.ajax=function(b,e,d){c.ajax({url:a.url,data:{dir:b},success:e,error:d,dataType:"json"})};this.each(function(){n(c(this),a.root)})}})(jQuery);$.translations({en:{menu:"Menu",tree:"Tree"},de:{menu:"Men\u00fc",tree:"Baumansicht"},cs:{menu:"Menu",tree:"Strom"}});$("#sidebar").wrapInner('<div id="sidebar-menu"/>').prepend('<div id="sidebar-tree" style="display: none"><h1>'+$.t("tree")+'</h1><div id="treeview"/></div>');$("#menu").prepend('<ul><li class="selected" id="sidebar-tab-menu"><a href="#sidebar-menu">'+$.t("menu")+'</a></li><li id="sidebar-tab-tree"><a href="#sidebar-tree">'+$.t("tree")+"</a></li></ul>");$("#sidebar-tab-menu, #sidebar-tab-tree").tabWidget({store:"sidebar-tab"});
5
- $("#treeview").treeView({stateStore:"treeview-state",cacheStore:"treeview-cache",root:Olelo.base_path,ajax:function(c,a,l){$.ajax({url:c,data:{aspect:"treeview.json"},success:a,error:l,dataType:"json"})}});
4
+ d(i);g&&jStorage.set(g,i)},function(){b.removeClass("wait")})}}}a||(a={});if(!a.root)a.root="/";if(!a.url)a.url="/treeview.json";if(!a.delay)a.delay=2E3;if(!a.ajax)a.ajax=function(b,e,d){c.ajax({url:a.url,data:{dir:b},success:e,error:d,dataType:"json"})};this.each(function(){n(c(this),a.root)})}})(jQuery);$(function(){$.translations({en:{menu:"Menu",tree:"Tree"},de:{menu:"Men\u00fc",tree:"Baumansicht"},cs:{menu:"Menu",tree:"Strom"}});$("#sidebar").wrapInner('<div id="sidebar-menu"/>').prepend('<div id="sidebar-tree" style="display: none"><h1>'+$.t("tree")+'</h1><div id="treeview"/></div>');$("#menu").prepend('<ul><li class="selected" id="sidebar-tab-menu"><a href="#sidebar-menu">'+$.t("menu")+'</a></li><li id="sidebar-tab-tree"><a href="#sidebar-tree">'+$.t("tree")+"</a></li></ul>");$("#sidebar-tab-menu, #sidebar-tab-tree").tabWidget({store:"sidebar-tab"});
5
+ $("#treeview").treeView({stateStore:"treeview-state",cacheStore:"treeview-cache",root:Olelo.base_path,ajax:function(c,a,l){$.ajax({url:c,data:{aspect:"treeview.json"},success:a,error:l,dataType:"json"})}})});
@@ -1,25 +1,27 @@
1
- // Add treeview translations
2
- $.translations({
3
- en: {
4
- menu: 'Menu',
5
- tree: 'Tree'
6
- },
7
- de: {
8
- menu: 'Menü',
9
- tree: 'Baumansicht'
10
- },
11
- cs: {
12
- menu: 'Menu',
13
- tree: 'Strom'
14
- }
15
- });
1
+ $(function() {
2
+ // Add treeview translations
3
+ $.translations({
4
+ en: {
5
+ menu: 'Menu',
6
+ tree: 'Tree'
7
+ },
8
+ de: {
9
+ menu: 'Menü',
10
+ tree: 'Baumansicht'
11
+ },
12
+ cs: {
13
+ menu: 'Menu',
14
+ tree: 'Strom'
15
+ }
16
+ });
16
17
 
17
- // Start tree view
18
- $('#sidebar').wrapInner('<div id="sidebar-menu"/>').prepend('<div id="sidebar-tree" style="display: none"><h1>' + $.t('tree') +
19
- '</h1><div id="treeview"/></div>');
20
- $('#menu').prepend('<ul><li class="selected" id="sidebar-tab-menu"><a href="#sidebar-menu">' + $.t('menu') +
21
- '</a></li><li id="sidebar-tab-tree"><a href="#sidebar-tree">' + $.t('tree') + '</a></li></ul>');
22
- $('#sidebar-tab-menu, #sidebar-tab-tree').tabWidget({store: 'sidebar-tab'});
23
- $('#treeview').treeView({stateStore: 'treeview-state', cacheStore: 'treeview-cache', root: Olelo.base_path, ajax: function(path, success, error) {
24
- $.ajax({url: path, data: { aspect: 'treeview.json' }, success: success, error: error, dataType: 'json'});
25
- }});
18
+ // Start tree view
19
+ $('#sidebar').wrapInner('<div id="sidebar-menu"/>').prepend('<div id="sidebar-tree" style="display: none"><h1>' + $.t('tree') +
20
+ '</h1><div id="treeview"/></div>');
21
+ $('#menu').prepend('<ul><li class="selected" id="sidebar-tab-menu"><a href="#sidebar-menu">' + $.t('menu') +
22
+ '</a></li><li id="sidebar-tab-tree"><a href="#sidebar-tree">' + $.t('tree') + '</a></li></ul>');
23
+ $('#sidebar-tab-menu, #sidebar-tab-tree').tabWidget({store: 'sidebar-tab'});
24
+ $('#treeview').treeView({stateStore: 'treeview-state', cacheStore: 'treeview-cache', root: Olelo.base_path, ajax: function(path, success, error) {
25
+ $.ajax({url: path, data: { aspect: 'treeview.json' }, success: success, error: error, dataType: 'json'});
26
+ }});
27
+ });
@@ -10,20 +10,20 @@ class ::Olelo::Application
10
10
 
11
11
  attr_reader? :disable_assets
12
12
 
13
- hook :script, 1 do
13
+ hook :head, 2 do
14
+ return if disable_assets?
14
15
  js = Application.scripts['js']
15
- if js && !disable_assets?
16
- path = build_path "_/assets/assets.js?#{js.first.to_i}"
17
- %{<script src="#{escape_html path}" type="text/javascript"/>}
18
- end
19
- end
20
-
21
- hook :head, 1 do
22
16
  css = Application.scripts['css']
23
- if css && !disable_assets?
17
+ result = ''
18
+ if css
24
19
  path = build_path "_/assets/assets.css?#{css.first.to_i}"
25
- %{<link rel="stylesheet" href="#{escape_html path}" type="text/css"/>}
20
+ result << %{<link rel="stylesheet" href="#{escape_html path}" type="text/css"/>}
21
+ end
22
+ if js
23
+ path = build_path "_/assets/assets.js?#{js.first.to_i}"
24
+ result << %{<script src="#{escape_html path}" type="text/javascript"/>}
26
25
  end
26
+ result
27
27
  end
28
28
 
29
29
  get "/_/assets/assets.:type", :type => 'js|css' do
@@ -39,10 +39,16 @@ class ::Olelo::Application
39
39
 
40
40
  get "/_/assets/:name", :name => '.*' do
41
41
  if asset = Application.assets[params[:name]]
42
- cache_control :last_modified => asset.mtime, :max_age => :static
43
- response['Content-Type'] = asset.mime.to_s
44
- response['Content-Length'] = asset.size.to_s
45
- halt asset.open
42
+ if path = asset.real_path
43
+ file = Rack::File.new(nil)
44
+ file.path = path
45
+ file.serving(env)
46
+ else
47
+ cache_control :last_modified => asset.mtime, :max_age => :static
48
+ response['Content-Type'] = (MimeMagic.by_path(asset.name) || 'application/octet-stream').to_s
49
+ response['Content-Length'] = asset.size.to_s
50
+ asset.read
51
+ end
46
52
  else
47
53
  :not_found
48
54
  end
data/views/layout.slim CHANGED
@@ -33,4 +33,3 @@ html.no-js lang=Olelo::Config['locale'].sub('_', '-') class={page && !page.head?
33
33
  .noprint.powered_by
34
34
  ' Powered by
35
35
  a href='http://github.com/minad/olelo' &#332;lelo
36
- = script
data/views/login.slim CHANGED
@@ -1,6 +1,7 @@
1
1
  - title :login.t
2
+ - signup_enabled = Olelo::Config['authentication.enable_signup'] && Olelo::User.supports?(:signup)
2
3
  p
3
- = Olelo::Config['authentication.enable_signup'] ? tabs(:login, :signup) : tabs(:login)
4
+ = signup_enabled ? tabs(:login, :signup) : tabs(:login)
4
5
  form action=build_path(:login) method='post'
5
6
  #tab-login.tab.fieldset
6
7
  h2 Login
@@ -15,7 +16,7 @@ p
15
16
  = render_block :login_buttons do
16
17
  button&submit= :login.t
17
18
  br
18
- - if Olelo::Config['authentication.enable_signup']
19
+ - if signup_enabled
19
20
  form action=build_path(:signup) method='post'
20
21
  #tab-signup.tab.fieldset
21
22
  h2= :signup.t
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.2
4
+ version: 0.9.3
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-10-18 00:00:00.000000000 Z
12
+ date: 2012-10-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: tilt
16
- requirement: &9036000 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: 1.3.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *9036000
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.3.3
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: slim
27
- requirement: &9035100 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 1.3.3
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *9035100
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.3.3
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: creole
38
- requirement: &9034140 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 0.4.2
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *9034140
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.4.2
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: nokogiri
49
- requirement: &9114880 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ~>
@@ -54,21 +69,31 @@ dependencies:
54
69
  version: 1.5.5
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *9114880
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.5.5
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: mimemagic
60
- requirement: &9114140 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ~>
64
84
  - !ruby/object:Gem::Version
65
- version: 0.1.9
85
+ version: 0.2.0
66
86
  type: :runtime
67
87
  prerelease: false
68
- version_requirements: *9114140
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.2.0
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: rack
71
- requirement: &9113600 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ~>
@@ -76,21 +101,31 @@ dependencies:
76
101
  version: 1.4.1
77
102
  type: :runtime
78
103
  prerelease: false
79
- version_requirements: *9113600
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.4.1
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: redcarpet
82
- requirement: &9112980 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ~>
86
116
  - !ruby/object:Gem::Version
87
- version: 2.1.1
117
+ version: 2.2.1
88
118
  type: :runtime
89
119
  prerelease: false
90
- version_requirements: *9112980
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 2.2.1
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: rugged
93
- requirement: &9111460 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ~>
@@ -98,10 +133,31 @@ dependencies:
98
133
  version: 0.17.0b6
99
134
  type: :runtime
100
135
  prerelease: false
101
- version_requirements: *9111460
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 0.17.0b6
142
+ - !ruby/object:Gem::Dependency
143
+ name: evaluator
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: 0.1.6
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 0.1.6
102
158
  - !ruby/object:Gem::Dependency
103
159
  name: rake
104
- requirement: &9110780 !ruby/object:Gem::Requirement
160
+ requirement: !ruby/object:Gem::Requirement
105
161
  none: false
106
162
  requirements:
107
163
  - - ! '>='
@@ -109,18 +165,60 @@ dependencies:
109
165
  version: 0.8.7
110
166
  type: :development
111
167
  prerelease: false
112
- version_requirements: *9110780
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.8.7
113
174
  - !ruby/object:Gem::Dependency
114
175
  name: sass
115
- requirement: &9110120 !ruby/object:Gem::Requirement
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: 3.1.0
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
116
185
  none: false
117
186
  requirements:
118
187
  - - ! '>='
119
188
  - !ruby/object:Gem::Version
120
189
  version: 3.1.0
190
+ - !ruby/object:Gem::Dependency
191
+ name: bacon
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ~>
196
+ - !ruby/object:Gem::Version
197
+ version: 1.1.0
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ~>
204
+ - !ruby/object:Gem::Version
205
+ version: 1.1.0
206
+ - !ruby/object:Gem::Dependency
207
+ name: rack-test
208
+ requirement: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ~>
212
+ - !ruby/object:Gem::Version
213
+ version: 0.6.2
121
214
  type: :development
122
215
  prerelease: false
123
- version_requirements: *9110120
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ~>
220
+ - !ruby/object:Gem::Version
221
+ version: 0.6.2
124
222
  description: Olelo is a git-based wiki which supports many markup languages, tags,
125
223
  embedded TeX and much more. It can be extended through plugins.
126
224
  email:
@@ -133,7 +231,8 @@ files:
133
231
  - .gitignore
134
232
  - .gitmodules
135
233
  - Gemfile
136
- - README.markdown
234
+ - LICENSE
235
+ - README.creole
137
236
  - Rakefile
138
237
  - bin/olelo
139
238
  - config.ru
@@ -142,8 +241,6 @@ files:
142
241
  - config/initializers/00-mime_types.rb
143
242
  - config/initializers/01-slim.rb
144
243
  - config/interwiki.yml
145
- - doc/AUTHORS
146
- - doc/LICENSE
147
244
  - lib/olelo.rb
148
245
  - lib/olelo/application.rb
149
246
  - lib/olelo/attributes.rb
@@ -169,14 +266,8 @@ files:
169
266
  - lib/olelo/util.rb
170
267
  - lib/olelo/version.rb
171
268
  - lib/olelo/virtualfs.rb
172
- - lib/rack/olelo_patches.rb
173
269
  - lib/rack/relative_redirect.rb
174
270
  - lib/rack/static_cache.rb
175
- - lib/yard/addons.rb
176
- - lib/yard/addons/hook_handler.rb
177
- - lib/yard/addons/override_tag.rb
178
- - lib/yard/addons/route_handler.rb
179
- - lib/yard/addons/sanitize_anchor.rb
180
271
  - olelo.gemspec
181
272
  - plugins/aspects/changelog.rb
182
273
  - plugins/aspects/documentbrowser.rb
@@ -197,6 +288,8 @@ files:
197
288
  - plugins/blog/blog.scss
198
289
  - plugins/blog/locale.yml
199
290
  - plugins/blog/main.rb
291
+ - plugins/editor/ace/init.js
292
+ - plugins/editor/ace/main.rb
200
293
  - plugins/editor/locale.yml
201
294
  - plugins/editor/markup/main.rb
202
295
  - plugins/editor/markup/script.js
@@ -432,7 +525,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
432
525
  version: '0'
433
526
  requirements: []
434
527
  rubyforge_project: olelo
435
- rubygems_version: 1.8.15
528
+ rubygems_version: 1.8.24
436
529
  signing_key:
437
530
  specification_version: 3
438
531
  summary: Olelo is a git-based wiki.