olelo 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/.travis.yml +4 -0
  2. data/Rakefile +6 -12
  3. data/bin/olelo +13 -8
  4. data/config.ru +21 -15
  5. data/config/aspects.rb +45 -32
  6. data/config/config.yml.default +1 -0
  7. data/config/initializers/00-mime_types.rb +22 -17
  8. data/config/initializers/01-slim.rb +2 -2
  9. data/lib/olelo.rb +1 -8
  10. data/lib/olelo/application.rb +33 -34
  11. data/lib/olelo/attributes.rb +4 -4
  12. data/lib/olelo/extensions.rb +0 -7
  13. data/lib/olelo/helper.rb +13 -25
  14. data/lib/olelo/html_safe.rb +0 -4
  15. data/lib/olelo/locale.yml +6 -3
  16. data/lib/olelo/menu.rb +1 -1
  17. data/lib/olelo/page.rb +21 -18
  18. data/lib/olelo/version.rb +1 -1
  19. data/olelo.gemspec +5 -3
  20. data/plugins/aspects/changelog.rb +5 -5
  21. data/plugins/aspects/documentbrowser.rb +5 -5
  22. data/plugins/{gallery → aspects/gallery}/gallery.css +0 -0
  23. data/plugins/{gallery → aspects/gallery}/gallery.scss +0 -0
  24. data/plugins/{gallery → aspects/gallery}/main.rb +3 -3
  25. data/plugins/aspects/highlight.rb +1 -1
  26. data/plugins/aspects/image.rb +1 -1
  27. data/plugins/aspects/imageinfo.rb +3 -3
  28. data/plugins/aspects/main.rb +21 -21
  29. data/plugins/aspects/pageinfo.rb +2 -2
  30. data/plugins/aspects/source.rb +1 -1
  31. data/plugins/aspects/subpages.rb +7 -7
  32. data/plugins/aspects/text.rb +1 -1
  33. data/plugins/authentication/portal.rb +2 -2
  34. data/plugins/authentication/yamlfile.rb +1 -1
  35. data/plugins/blog/main.rb +10 -10
  36. data/plugins/editor/preview.rb +3 -3
  37. data/plugins/filters/creole.rb +1 -1
  38. data/plugins/filters/editsection.rb +2 -2
  39. data/plugins/filters/html2xml.rb +6 -0
  40. data/plugins/filters/main.rb +1 -1
  41. data/plugins/filters/remind/main.rb +15 -0
  42. data/plugins/filters/remind/rem2html +562 -0
  43. data/plugins/filters/s5/main.rb +1 -1
  44. data/plugins/login/persistent.rb +1 -1
  45. data/plugins/misc/system.rb +4 -0
  46. data/plugins/misc/variables.rb +1 -1
  47. data/plugins/misc/webdav.rb +10 -10
  48. data/plugins/repositories/git_grep.rb +2 -2
  49. data/plugins/repositories/gitrb_repository.rb +10 -10
  50. data/plugins/repositories/rugged_repository.rb +7 -7
  51. data/plugins/tags/code.rb +1 -1
  52. data/plugins/tags/footnotes.rb +4 -3
  53. data/plugins/tags/gist.rb +2 -2
  54. data/plugins/tags/html.rb +11 -11
  55. data/plugins/tags/include.rb +6 -6
  56. data/plugins/tags/main.rb +10 -10
  57. data/plugins/tags/math.rb +2 -2
  58. data/plugins/tags/redirect.rb +3 -3
  59. data/plugins/tags/scripting.rb +12 -12
  60. data/plugins/tags/sort.rb +1 -1
  61. data/plugins/tags/tabs.rb +1 -1
  62. data/plugins/treeview/main.rb +3 -3
  63. data/plugins/treeview/script.js +5 -5
  64. data/plugins/treeview/script/00-jquery.treeview.js +6 -6
  65. data/plugins/treeview/script/init.js +1 -1
  66. data/plugins/utils/assets.rb +4 -4
  67. data/plugins/utils/cache.rb +10 -6
  68. data/plugins/utils/store.rb +4 -4
  69. data/static/script.js +124 -126
  70. data/static/script/{02-jquery.js → 01-jquery.js} +0 -0
  71. data/static/script/02-olelo.storage.js +54 -0
  72. data/static/script/10-olelo.historytable.js +2 -2
  73. data/static/script/13-olelo.tabwidget.js +2 -2
  74. data/test/helper.rb +5 -4
  75. data/test/page_test.rb +1 -1
  76. data/test/request_test.rb +42 -38
  77. data/test/string_extensions_test.rb +0 -6
  78. data/test/templates_test.rb +1 -1
  79. data/test/util_test.rb +1 -1
  80. data/views/changes.slim +2 -2
  81. data/views/compare.slim +4 -4
  82. data/views/delete.slim +2 -2
  83. data/views/deleted.slim +1 -1
  84. data/views/edit.slim +31 -26
  85. data/views/history.slim +5 -5
  86. data/views/layout.slim +1 -1
  87. data/views/login.slim +30 -32
  88. data/views/move.slim +3 -3
  89. data/views/profile.slim +2 -2
  90. data/views/show.slim +1 -1
  91. metadata +43 -104
  92. data/static/script/01-jstorage.js +0 -217
@@ -0,0 +1,54 @@
1
+ // Simple storage plugin
2
+ // Written by Daniel Mendler
3
+ (function($) {
4
+ var storage = {}, data = {};
5
+ try {
6
+ if (window.localStorage) {
7
+ storage = window.localStorage;
8
+ }
9
+ if (storage.oleloStorage) {
10
+ data = JSON.parse(storage.oleloStorage);
11
+ }
12
+ } catch (e) {
13
+ // Firefox fails when touching localStorage/globalStorage and cookies are disabled
14
+ }
15
+
16
+ function checkKey(key) {
17
+ if (typeof(key) != 'string' && typeof(key) != 'number') {
18
+ throw new TypeError('Key name must be string or numeric');
19
+ }
20
+ }
21
+
22
+ function save() {
23
+ try {
24
+ storage.oleloStorage = JSON.stringify(data);
25
+ } catch (e) {
26
+ // probably cache is full, nothing is saved this way
27
+ }
28
+ }
29
+
30
+ $.storage = {
31
+ set: function(key, value){
32
+ checkKey(key);
33
+ data[key] = value;
34
+ save();
35
+ return value;
36
+ },
37
+ get: function(key, def){
38
+ checkKey(key);
39
+ if (key in data) {
40
+ return data[key];
41
+ }
42
+ return typeof(def) == 'undefined' ? null : def;
43
+ },
44
+ remove: function(key){
45
+ checkKey(key);
46
+ if (key in data){
47
+ delete data[key];
48
+ save();
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ };
54
+ })(jQuery);
@@ -5,7 +5,7 @@
5
5
  var version = $(this).attr('id').substr(8);
6
6
  $(this).prepend('<td class="compare"><input type="checkbox" name="' + version + '"/></td>');
7
7
  });
8
- var versions = jStorage.get('historyTable');
8
+ var versions = $.storage.get('historyTable');
9
9
  if (versions) {
10
10
  for (var i = 0; i < versions.length; ++i)
11
11
  $('input[name=' + versions[i] + ']').attr('checked', 'checked');
@@ -25,7 +25,7 @@
25
25
  var button = $('th button', this);
26
26
  button.click(function() {
27
27
  var versions = getSelectedVersions();
28
- jStorage.set('historyTable', versions);
28
+ $.storage.set('historyTable', versions);
29
29
  location.href = location.pathname.replace('/history', '/compare/' + versions[versions.length-1] + '...' + versions[0]);
30
30
  });
31
31
 
@@ -19,14 +19,14 @@
19
19
  selected.data('tab').show();
20
20
  selected.parent().addClass('selected');
21
21
  if (store) {
22
- jStorage.set(store, selected.data('tab').attr('id'));
22
+ $.storage.set(store, selected.data('tab').attr('id'));
23
23
  }
24
24
  return false;
25
25
  });
26
26
 
27
27
  // Get selected tab from store
28
28
  if (store) {
29
- var name = jStorage.get(store);
29
+ var name = $.storage.get(store);
30
30
  if (name) {
31
31
  selected = $("> a[href='#" + name + "']", this);
32
32
  }
@@ -1,4 +1,3 @@
1
- require 'rack/olelo_patches'
2
1
  require 'olelo'
3
2
  require 'bacon'
4
3
  require 'rack/test'
@@ -11,16 +10,18 @@ module TestHelper
11
10
  end
12
11
 
13
12
  def create_repository
14
- Olelo::Repository.instance = nil
13
+ Thread.current[:olelo_repository] = nil
14
+ Olelo::User.current = Olelo::User.new('anonymous', 'anonymous@localhost')
15
+ load_plugin('repositories/rugged_repository')
15
16
  Olelo::Config.instance['repository.type'] = 'git'
16
17
  Olelo::Config.instance['repository.git.path'] = File.expand_path(File.join(File.dirname(__FILE__), '.test'))
17
18
  Olelo::Config.instance['repository.git.bare'] = true
18
- load_plugin('repositories/git')
19
19
  end
20
20
 
21
21
  def destroy_repository
22
- Olelo::Repository.instance = nil
23
22
  FileUtils.rm_rf(Olelo::Config['repository.git.path'])
23
+ Thread.current[:olelo_repository] = nil
24
+ Olelo::User.current = nil
24
25
  end
25
26
 
26
27
  def create_page(name, content = 'content')
@@ -122,7 +122,7 @@ describe 'Olelo::Page' do
122
122
  tree.previous_version.should.equal old_tree.tree_version
123
123
  old_tree.tree_version.should.equal old_tree.children[0].tree_version
124
124
  old_tree.tree_version.should.equal old_tree.children[1].tree_version
125
- old_tree.tree_version.should.equal old_tree.children[2].tree_version
125
+ old_tree.children[2].should.equal nil
126
126
  old_tree.children[0].tree_version.should.not.be.head
127
127
  end
128
128
 
@@ -1,10 +1,10 @@
1
1
  require 'helper'
2
2
  require 'olelo/middleware/flash'
3
3
  require 'olelo/middleware/force_encoding'
4
+ require 'olelo/middleware/degrade_mime_type'
5
+ require 'rack/relative_redirect'
4
6
  require 'rack/session/pool'
5
7
 
6
- Rack::MockRequest::DEFAULT_ENV['REMOTE_ADDR'] = 'localhorst'
7
-
8
8
  class Bacon::Context
9
9
  include Rack::Test::Methods
10
10
  include Olelo::Util
@@ -18,61 +18,65 @@ describe 'requests' do
18
18
  @app_path = File.expand_path(File.join(File.dirname(__FILE__), '..'))
19
19
 
20
20
  default_config = {
21
- :title => 'Olelo',
22
- :app_path => @app_path,
23
- :plugins_path => File.join(@app_path, 'plugins'),
24
- :config_path => File.join(@app_path, 'config'),
25
- :initializers_path => File.join(@app_path, 'config', 'initializers'),
26
- :views_path => File.join(@app_path, 'views'),
27
- :themes_path => File.join(@app_path, 'static', 'themes'),
28
- :theme => 'atlantis',
29
- :cache_store => {
30
- :type => 'file',
31
- :file => {
32
- :root => File.join(@test_path, 'cache')
21
+ title: 'Olelo',
22
+ app_path: @app_path,
23
+ plugins_path: File.join(@app_path, 'plugins'),
24
+ config_path: File.join(@app_path, 'config'),
25
+ initializers_path: File.join(@app_path, 'config', 'initializers'),
26
+ views_path: File.join(@app_path, 'views'),
27
+ themes_path: File.join(@app_path, 'static', 'themes'),
28
+ theme: 'atlantis',
29
+ cache_store: {
30
+ type: 'file',
31
+ file: {
32
+ root: File.join(@test_path, 'cache')
33
33
  }
34
34
  },
35
- :base_path => '/',
36
- :production => true,
37
- :locale => 'en_US',
38
- :sidebar_page => 'Sidebar',
39
- :authentication => {
40
- :service => :yamlfile,
41
- :enable_signup => true,
42
- :yamlfile => {
43
- :store => File.join(@test_path, 'users.yml'),
35
+ base_path: '/',
36
+ production: true,
37
+ locale: 'en_US',
38
+ sidebar_page: 'Sidebar',
39
+ authentication: {
40
+ service: :yamlfile,
41
+ enable_signup: true,
42
+ yamlfile: {
43
+ store: File.join(@test_path, 'users.yml'),
44
44
  },
45
45
  },
46
- :mime => [
46
+ mime: [
47
47
  'extension',
48
48
  'content',
49
49
  'text/x-creole',
50
50
  ],
51
- :mime_suggestions => [],
52
- :disabled_plugins => [
51
+ math_renderer: 'mathjax',
52
+ mime_suggestions: [],
53
+ disabled_plugins: [
53
54
  'security/readonly_wiki',
54
55
  'security/private_wiki',
55
- 'editor/antispam',
56
+ 'editor/recaptcha',
56
57
  ],
57
- :repository => {
58
- :type => 'git',
59
- :git => {
60
- :path => File.join(@test_path, 'repository'),
61
- :bare => true,
58
+ repository: {
59
+ type: 'git',
60
+ git: {
61
+ path: File.join(@test_path, 'repository'),
62
+ bare: true,
62
63
  },
63
64
  }
64
65
  }
65
66
 
66
67
  Olelo::Config.instance.update(default_config)
67
- Olelo::Repository.instance = nil
68
+ Thread.current[:olelo_repository] = nil
68
69
 
69
70
  logger = Logger.new(File.join(@app_path, 'test.log'))
71
+ Olelo::Initializer.initialize(logger)
70
72
 
71
73
  @app = Rack::Builder.new do
72
- use Olelo::Middleware::ForceEncoding
73
74
  use Rack::Session::Pool
74
- use Olelo::Middleware::Flash, :set_accessors => %w(error warn info)
75
- Olelo::Initializer.initialize(logger)
75
+ use Rack::MethodOverride
76
+ use Olelo::Middleware::ForceEncoding
77
+ use Olelo::Middleware::DegradeMimeType
78
+ use Olelo::Middleware::Flash, set_accessors: %w(error warn info)
79
+ #use Rack::RelativeRedirect
76
80
  run Olelo::Application.new
77
81
  end
78
82
  end
@@ -90,8 +94,8 @@ describe 'requests' do
90
94
  it 'should show login page' do
91
95
  get '/login'
92
96
  last_response.should.be.ok
93
- last_response.body.should.include '<form action="&#47;signup" method="post">'
94
- last_response.body.should.include '<form action="&#47;login" method="post">'
97
+ last_response.body.should.include '<form action="/signup" method="post">'
98
+ last_response.body.should.include '<form action="/login" method="post">'
95
99
  end
96
100
 
97
101
  it 'should show to /new' do
@@ -1,12 +1,6 @@
1
1
  require 'olelo/extensions'
2
2
 
3
3
  describe 'String extensions' do
4
- it 'should have unindent' do
5
- %{a
6
- b
7
- c}.unindent.should.equal "a\nb\nc"
8
- end
9
-
10
4
  it 'should have #starts_with?' do
11
5
  '123456789'.starts_with?('12').should.equal true
12
6
  '123456789'.starts_with?('23').should.not.equal true
@@ -27,7 +27,7 @@ describe 'Olelo::Templates' do
27
27
  end
28
28
 
29
29
  it 'should have #render' do
30
- render(:test, :locals => {:text => 'Hello, World!'}).should.equal "<h1>Hello, World!</h1>"
30
+ render(:test, locals: {text: 'Hello, World!'}).should.equal "<h1>Hello, World!</h1>"
31
31
  Olelo::Templates.cache.size.should.equal 1
32
32
  end
33
33
  end
@@ -48,7 +48,7 @@ describe 'Olelo::Util' do
48
48
  end
49
49
 
50
50
  it 'should have #build_query' do
51
- Olelo::Util.build_query(:a => 1, :b => [1, 2, 3]).should.equal 'a=1&b=1&b=2&b=3'
51
+ Olelo::Util.build_query(a: 1, b: [1, 2, 3]).should.equal 'a=1&b=1&b=2&b=3'
52
52
  end
53
53
 
54
54
  it 'should have #truncate' do
@@ -1,4 +1,4 @@
1
- - title :changes_of.t(:page => page.title)
1
+ - title :changes_of.t(page: page.title)
2
2
  h1= title
3
3
  table
4
4
  tbody
@@ -18,5 +18,5 @@ table
18
18
  td= :parents.t
19
19
  td.version
20
20
  - @version.parents.each do |parent|
21
- a href=build_path(parent, :action => :changes) = Olelo::Version.short(parent)
21
+ a href=build_path(parent, action: :changes) = Olelo::Version.short(parent)
22
22
  = format_diff(@diff)
@@ -1,8 +1,8 @@
1
- - title "#{:compare.t(:name => page.title)}: #{@diff.from.short} -> #{@diff.to.short}"
1
+ - title "#{:compare.t(name: page.title)}: #{@diff.from.short} -> #{@diff.to.short}"
2
2
  h1
3
- = :compare.t(:name => page.title)
3
+ = :compare.t(name: page.title)
4
4
  | :
5
- a.version href=build_path(page, :version => @diff.from) = @diff.from.short
5
+ a.version href=build_path(page, version: @diff.from) = @diff.from.short
6
6
  | &#8594;
7
- a.version href=build_path(page, :version => @diff.to) = @diff.to.short
7
+ a.version href=build_path(page, version: @diff.to) = @diff.to.short
8
8
  = format_diff(@diff)
@@ -1,8 +1,8 @@
1
- - title :delete_page.t(:page => page.title)
1
+ - title :delete_page.t(page: page.title)
2
2
  h1= title
3
+ = flash_messages
3
4
  form action=build_path(page.path) method='post'
4
5
  .box
5
- = flash_messages
6
6
  &hidden name='_method' value='delete'
7
7
  label for='submit' = :really_delete.t
8
8
  button&submit#submit name='submit' accesskey='d' = :delete.t
@@ -1,2 +1,2 @@
1
- - title :page_deleted.t(:page => page.title)
1
+ - title :page_deleted.t(page: page.title)
2
2
  h1= title
@@ -1,33 +1,40 @@
1
1
  - if page.new?
2
2
  - title params[:path].blank? ? :new_page.t : "#{:new_page.t}: #{params[:path]}"
3
3
  - else
4
- - title params[:pos] ? :edit_page_section.t(:page => page.title) : :edit_page.t(:page => page.title)
4
+ - title params[:pos] ? :edit_page_section.t(page: page.title) : :edit_page.t(page: page.title)
5
5
  h1= title
6
- = tabs :edit, :upload, :attributes
6
+ = flash_messages
7
+ = page.mime.text? ? tabs(:edit, :upload, :attributes) : tabs(:upload, :attributes)
7
8
  form action=build_path(page.new? ? nil : page.path) method='post'
8
- #tab-edit.tab
9
- h2= :edit.t
10
- = flash_messages if action?(:edit) || page.new?
11
- - content = edit_content(page)
12
- - if page.new?
13
- label for='edit-path' = :path.t
14
- &text#edit-path name='path' value=params[:path]
15
- br
16
- hr
17
- - else
18
- &hidden name='version' value=page.version
19
- - if params[:pos]
20
- &hidden name='pos' value=params[:pos]
21
- &hidden name='len' value=content.size
22
- textarea#edit-content.observe name='content' cols='100' rows='20' = content
23
- br
24
- label for='edit-comment' = :comment.t
25
- &text#edit-comment name='comment' value=params[:comment] size='50'
26
- = render_block :edit_buttons do
27
- button&submit name='action' value='edit' = :save.t
28
- button&submit name='action' value='edit-close' = :save_and_close.t
29
- button&reset = :reset.t
9
+ - if page.mime.text?
10
+ #tab-edit.tab
11
+ h2= :edit.t
12
+ ruby:
13
+ content =
14
+ if params[:content]
15
+ params[:content]
16
+ else
17
+ params[:pos] ? page.content[params[:pos].to_i, params[:len].to_i].to_s : page.content
18
+ end
19
+ - if page.new?
20
+ label for='edit-path' = :path.t
21
+ &text#edit-path name='path' value=params[:path]
22
+ br
23
+ hr
24
+ - else
25
+ &hidden name='version' value=page.version
26
+ - if params[:pos]
27
+ &hidden name='pos' value=params[:pos]
28
+ &hidden name='len' value=content.size
29
+ textarea#edit-content.observe name='content' cols='100' rows='20' = content
30
30
  br
31
+ label for='edit-comment' = :comment.t
32
+ &text#edit-comment name='comment' value=params[:comment] size='50'
33
+ = render_block :edit_buttons do
34
+ button&submit name='action' value='edit' = :save.t
35
+ button&submit name='action' value='edit-close' = :save_and_close.t
36
+ button&reset = :reset.t
37
+ br
31
38
  form action=build_path(page.new? ? nil : page.path) method='post' enctype='multipart/form-data'
32
39
  #tab-upload.tab
33
40
  h2= :upload_file.t
@@ -38,7 +45,6 @@ form action=build_path(page.new? ? nil : page.path) method='post' enctype='multi
38
45
  hr
39
46
  - else
40
47
  &hidden name='version' value=page.version
41
- = flash_messages :upload
42
48
  label for='upload-file' = :file.t
43
49
  &file#upload-file.observe name='file'
44
50
  br
@@ -57,7 +63,6 @@ form action=build_path(page.new? ? nil : page.path) method='post'
57
63
  hr
58
64
  - else
59
65
  &hidden name='version' value=page.version
60
- = flash_messages :attributes
61
66
  = page.attribute_editor
62
67
  = render_block :attributes_buttons do
63
68
  .indent
@@ -1,6 +1,6 @@
1
- - title :history_of.t(:page => page.title)
1
+ - title :history_of.t(page: page.title)
2
2
  h1= title
3
- = pagination(page, @page_count, @page_nr, :action => :history)
3
+ = pagination(page, @page_count, @page_nr, action: :history)
4
4
  table#history-table
5
5
  thead
6
6
  tr
@@ -11,10 +11,10 @@ table#history-table
11
11
  - @history.each do |version|
12
12
  tr id="version-#{version}"
13
13
  td
14
- a href=build_path(page, :version => version) = truncate(version.comment, 50)
14
+ a href=build_path(page, version: version) = truncate(version.comment, 50)
15
15
  | (
16
- a href=build_path(page, :action => 'changes'/version) = :changes.t
16
+ a href=build_path(page, action: 'changes'/version) = :changes.t
17
17
  | )
18
18
  td= truncate(version.author.name, 30)
19
19
  td= date version.date
20
- = pagination(page, @page_count, @page_nr, :action => :history)
20
+ = pagination(page, @page_count, @page_nr, action: :history)
@@ -32,4 +32,4 @@ html.no-js lang=Olelo::Config['locale'].sub('_', '-') class={page && !page.head?
32
32
  == footer
33
33
  .noprint.powered_by
34
34
  ' Powered by
35
- a href='http://github.com/minad/olelo' &#332;lelo
35
+ a href='https://github.com/minad/olelo' &#332;lelo
@@ -1,38 +1,36 @@
1
1
  - title :login.t
2
+ = flash_messages
2
3
  - signup_enabled = Olelo::Config['authentication.enable_signup'] && Olelo::User.supports?(:signup)
3
- p
4
- = signup_enabled ? tabs(:login, :signup) : tabs(:login)
5
- form action=build_path(:login) method='post'
6
- #tab-login.tab.fieldset
7
- h2 Login
8
- = flash_messages :login
9
- label for='login-user' = :user.t
10
- &text#login-user name='user'
4
+ = signup_enabled ? tabs(:login, :signup) : tabs(:login)
5
+ form action=build_path(:login) method='post'
6
+ #tab-login.tab.fieldset
7
+ h2 Login
8
+ label for='login-user' = :user.t
9
+ &text#login-user name='user'
10
+ br
11
+ label for='login-password' = :password.t
12
+ &password#login-password name='password'
13
+ br
14
+ .indent
15
+ = render_block :login_buttons do
16
+ button&submit= :login.t
17
+ br
18
+ - if signup_enabled
19
+ form action=build_path(:signup) method='post'
20
+ #tab-signup.tab.fieldset
21
+ h2= :signup.t
22
+ label for='signup-user' = :user.t
23
+ &text#signup-user name='user'
11
24
  br
12
- label for='login-password' = :password.t
13
- &password#login-password name='password'
25
+ label for='signup-password' = :password.t
26
+ &password#signup-password name='password'
27
+ br
28
+ label for='signup-confirm' = :confirm_password.t
29
+ &password#signup-confirm name='confirm'
30
+ br
31
+ label for='signup-email' = :email.t
32
+ &text#signup-email name='email'
14
33
  br
15
34
  .indent
16
- = render_block :login_buttons do
17
- button&submit= :login.t
35
+ button&submit = :signup.t
18
36
  br
19
- - if signup_enabled
20
- form action=build_path(:signup) method='post'
21
- #tab-signup.tab.fieldset
22
- h2= :signup.t
23
- = flash_messages :signup
24
- label for='signup-user' = :user.t
25
- &text#signup-user name='user'
26
- br
27
- label for='signup-password' = :password.t
28
- &password#signup-password name='password'
29
- br
30
- label for='signup-confirm' = :confirm_password.t
31
- &password#signup-confirm name='confirm'
32
- br
33
- label for='signup-email' = :email.t
34
- &text#signup-email name='email'
35
- br
36
- .indent
37
- button&submit = :signup.t
38
- br