instiki 0.10.0 → 0.10.1
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/CHANGELOG +174 -165
- data/README +68 -68
- data/app/controllers/admin_controller.rb +94 -94
- data/app/controllers/application.rb +135 -131
- data/app/controllers/file_controller.rb +129 -129
- data/app/controllers/wiki_controller.rb +354 -354
- data/app/helpers/application_helper.rb +68 -68
- data/app/models/author.rb +3 -3
- data/app/models/chunks/category.rb +33 -33
- data/app/models/chunks/chunk.rb +86 -86
- data/app/models/chunks/engines.rb +61 -54
- data/app/models/chunks/include.rb +41 -41
- data/app/models/chunks/literal.rb +31 -31
- data/app/models/chunks/nowiki.rb +28 -28
- data/app/models/chunks/test.rb +18 -18
- data/app/models/chunks/uri.rb +182 -182
- data/app/models/chunks/wiki.rb +141 -141
- data/app/models/file_yard.rb +58 -58
- data/app/models/page.rb +112 -112
- data/app/models/page_lock.rb +22 -22
- data/app/models/page_set.rb +89 -89
- data/app/models/revision.rb +123 -123
- data/app/models/web.rb +182 -176
- data/app/models/wiki_content.rb +207 -207
- data/app/models/wiki_service.rb +233 -233
- data/app/models/wiki_words.rb +23 -23
- data/app/views/admin/create_system.rhtml +83 -83
- data/app/views/admin/create_web.rhtml +69 -69
- data/app/views/admin/edit_web.rhtml +137 -136
- data/app/views/file/file.rhtml +18 -18
- data/app/views/file/import.rhtml +22 -22
- data/app/views/layouts/default.rhtml +86 -85
- data/app/views/markdown_help.rhtml +12 -12
- data/app/views/mixed_help.rhtml +6 -6
- data/app/views/navigation.rhtml +30 -30
- data/app/views/rdoc_help.rhtml +12 -12
- data/app/views/textile_help.rhtml +24 -24
- data/app/views/wiki/authors.rhtml +11 -11
- data/app/views/wiki/edit.rhtml +39 -39
- data/app/views/wiki/export.rhtml +12 -12
- data/app/views/wiki/feeds.rhtml +14 -14
- data/app/views/wiki/list.rhtml +64 -64
- data/app/views/wiki/locked.rhtml +23 -23
- data/app/views/wiki/login.rhtml +14 -14
- data/app/views/wiki/new.rhtml +31 -31
- data/app/views/wiki/page.rhtml +115 -115
- data/app/views/wiki/print.rhtml +14 -14
- data/app/views/wiki/published.rhtml +9 -9
- data/app/views/wiki/recently_revised.rhtml +26 -26
- data/app/views/wiki/revision.rhtml +103 -103
- data/app/views/wiki/rollback.rhtml +36 -36
- data/app/views/wiki/rss_feed.rhtml +22 -22
- data/app/views/wiki/search.rhtml +38 -38
- data/app/views/wiki/tex.rhtml +22 -22
- data/app/views/wiki/tex_web.rhtml +34 -34
- data/app/views/wiki/web_list.rhtml +18 -18
- data/app/views/wiki_words_help.rhtml +9 -9
- data/config/environment.rb +82 -82
- data/config/environments/development.rb +5 -5
- data/config/environments/production.rb +4 -4
- data/config/environments/test.rb +17 -17
- data/config/routes.rb +18 -18
- data/lib/active_record_stub.rb +31 -31
- data/lib/bluecloth_tweaked.rb +1127 -0
- data/lib/diff.rb +444 -444
- data/lib/instiki_errors.rb +14 -14
- data/lib/rdocsupport.rb +151 -151
- data/lib/redcloth_for_tex.rb +736 -736
- data/natives/osx/desktop_launcher/AppDelegate.h +18 -18
- data/natives/osx/desktop_launcher/AppDelegate.mm +109 -109
- data/natives/osx/desktop_launcher/Credits.html +15 -15
- data/natives/osx/desktop_launcher/English.lproj/MainMenu.nib/classes.nib +12 -12
- data/natives/osx/desktop_launcher/English.lproj/MainMenu.nib/info.nib +24 -24
- data/natives/osx/desktop_launcher/Info.plist +12 -12
- data/natives/osx/desktop_launcher/Instiki.xcode/project.pbxproj +592 -592
- data/natives/osx/desktop_launcher/Instiki_Prefix.pch +7 -7
- data/natives/osx/desktop_launcher/MakeDMG.sh +9 -9
- data/natives/osx/desktop_launcher/main.mm +14 -14
- data/natives/osx/desktop_launcher/version.plist +16 -16
- data/public/404.html +5 -5
- data/public/500.html +5 -5
- data/public/dispatch.rb +9 -9
- data/public/javascripts/edit_web.js +52 -52
- data/public/javascripts/prototype.js +336 -336
- data/public/stylesheets/instiki.css +222 -222
- data/script/breakpointer +4 -4
- data/script/server +93 -93
- metadata +4 -3
@@ -1,94 +1,94 @@
|
|
1
|
-
require 'application'
|
2
|
-
|
3
|
-
class AdminController < ApplicationController
|
4
|
-
|
5
|
-
layout 'default'
|
6
|
-
|
7
|
-
def create_system
|
8
|
-
if @wiki.setup?
|
9
|
-
flash[:error] = <<-EOL
|
10
|
-
Wiki has already been created in '#{@wiki.storage_path}'. Shut down Instiki and delete
|
11
|
-
this directory if you want to recreate it from scratch.<br/><br/>
|
12
|
-
(WARNING: this will destroy content of your current wiki).
|
13
|
-
EOL
|
14
|
-
|
15
|
-
elsif @params['web_name']
|
16
|
-
# form submitted -> create a wiki
|
17
|
-
@wiki.setup(@params['password'], @params['web_name'], @params['web_address'])
|
18
|
-
flash[:info] = <<-EOL
|
19
|
-
Your new wiki '#{@params['web_name']}' is created!<br/>
|
20
|
-
Please edit its home page and press Submit when finished.
|
21
|
-
EOL
|
22
|
-
redirect_to :web => @params['web_address'], :controller => 'wiki', :action => 'new',
|
23
|
-
:id => 'HomePage'
|
24
|
-
else
|
25
|
-
# no form submitted -> go to template
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def create_web
|
30
|
-
if @params['address']
|
31
|
-
# form submitted
|
32
|
-
if @wiki.authenticate(@params['system_password'])
|
33
|
-
begin
|
34
|
-
@wiki.create_web(@params['name'], @params['address'])
|
35
|
-
flash[:info] = "New web '#{@params['name']}' successfully created."
|
36
|
-
redirect_to :web => @params['address'], :controller => 'wiki', :action => 'new',
|
37
|
-
:id => 'HomePage'
|
38
|
-
rescue Instiki::ValidationError => e
|
39
|
-
flash[:error] = e.message
|
40
|
-
# and re-render the form again
|
41
|
-
end
|
42
|
-
else
|
43
|
-
redirect_to :controller => 'wiki', :action => 'index'
|
44
|
-
end
|
45
|
-
else
|
46
|
-
# no form submitted -> render template
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def edit_web
|
51
|
-
system_password = @params['system_password']
|
52
|
-
if system_password
|
53
|
-
# form submitted
|
54
|
-
if wiki.authenticate(system_password)
|
55
|
-
begin
|
56
|
-
wiki.edit_web(
|
57
|
-
@web.address, @params['address'], @params['name'],
|
58
|
-
@params['markup'].intern,
|
59
|
-
@params['color'], @params['additional_style'],
|
60
|
-
@params['safe_mode'] ? true : false,
|
61
|
-
@params['password'].empty? ? nil : @params['password'],
|
62
|
-
@params['published'] ? true : false,
|
63
|
-
@params['brackets_only'] ? true : false,
|
64
|
-
@params['count_pages'] ? true : false,
|
65
|
-
@params['allow_uploads'] ? true : false,
|
66
|
-
@params['max_upload_size']
|
67
|
-
)
|
68
|
-
flash[:info] = "Web '#{@params['address']}' was successfully updated"
|
69
|
-
|
70
|
-
rescue Instiki::ValidationError => e
|
71
|
-
flash[:error] = e.message
|
72
|
-
# and re-render the same template again
|
73
|
-
end
|
74
|
-
else
|
75
|
-
flash[:error] = password_error(system_password)
|
76
|
-
# and re-render the same template again
|
77
|
-
end
|
78
|
-
else
|
79
|
-
# no form submitted - go to template
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def remove_orphaned_pages
|
84
|
-
if wiki.authenticate(@params['system_password_orphaned'])
|
85
|
-
wiki.remove_orphaned_pages(@web_name)
|
86
|
-
flash[:info] = 'Orphaned pages removed'
|
87
|
-
redirect_to :controller => 'wiki', :web => @web_name, :action => 'list'
|
88
|
-
else
|
89
|
-
flash[:error] = password_error(@params['system_password'])
|
90
|
-
return_to_last_remembered
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
1
|
+
require 'application'
|
2
|
+
|
3
|
+
class AdminController < ApplicationController
|
4
|
+
|
5
|
+
layout 'default'
|
6
|
+
|
7
|
+
def create_system
|
8
|
+
if @wiki.setup?
|
9
|
+
flash[:error] = <<-EOL
|
10
|
+
Wiki has already been created in '#{@wiki.storage_path}'. Shut down Instiki and delete
|
11
|
+
this directory if you want to recreate it from scratch.<br/><br/>
|
12
|
+
(WARNING: this will destroy content of your current wiki).
|
13
|
+
EOL
|
14
|
+
redirect_home(@wiki.webs.keys.first)
|
15
|
+
elsif @params['web_name']
|
16
|
+
# form submitted -> create a wiki
|
17
|
+
@wiki.setup(@params['password'], @params['web_name'], @params['web_address'])
|
18
|
+
flash[:info] = <<-EOL
|
19
|
+
Your new wiki '#{@params['web_name']}' is created!<br/>
|
20
|
+
Please edit its home page and press Submit when finished.
|
21
|
+
EOL
|
22
|
+
redirect_to :web => @params['web_address'], :controller => 'wiki', :action => 'new',
|
23
|
+
:id => 'HomePage'
|
24
|
+
else
|
25
|
+
# no form submitted -> go to template
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_web
|
30
|
+
if @params['address']
|
31
|
+
# form submitted
|
32
|
+
if @wiki.authenticate(@params['system_password'])
|
33
|
+
begin
|
34
|
+
@wiki.create_web(@params['name'], @params['address'])
|
35
|
+
flash[:info] = "New web '#{@params['name']}' successfully created."
|
36
|
+
redirect_to :web => @params['address'], :controller => 'wiki', :action => 'new',
|
37
|
+
:id => 'HomePage'
|
38
|
+
rescue Instiki::ValidationError => e
|
39
|
+
flash[:error] = e.message
|
40
|
+
# and re-render the form again
|
41
|
+
end
|
42
|
+
else
|
43
|
+
redirect_to :controller => 'wiki', :action => 'index'
|
44
|
+
end
|
45
|
+
else
|
46
|
+
# no form submitted -> render template
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def edit_web
|
51
|
+
system_password = @params['system_password']
|
52
|
+
if system_password
|
53
|
+
# form submitted
|
54
|
+
if wiki.authenticate(system_password)
|
55
|
+
begin
|
56
|
+
wiki.edit_web(
|
57
|
+
@web.address, @params['address'], @params['name'],
|
58
|
+
@params['markup'].intern,
|
59
|
+
@params['color'], @params['additional_style'],
|
60
|
+
@params['safe_mode'] ? true : false,
|
61
|
+
@params['password'].empty? ? nil : @params['password'],
|
62
|
+
@params['published'] ? true : false,
|
63
|
+
@params['brackets_only'] ? true : false,
|
64
|
+
@params['count_pages'] ? true : false,
|
65
|
+
@params['allow_uploads'] ? true : false,
|
66
|
+
@params['max_upload_size']
|
67
|
+
)
|
68
|
+
flash[:info] = "Web '#{@params['address']}' was successfully updated"
|
69
|
+
redirect_home(@params['address'])
|
70
|
+
rescue Instiki::ValidationError => e
|
71
|
+
flash[:error] = e.message
|
72
|
+
# and re-render the same template again
|
73
|
+
end
|
74
|
+
else
|
75
|
+
flash[:error] = password_error(system_password)
|
76
|
+
# and re-render the same template again
|
77
|
+
end
|
78
|
+
else
|
79
|
+
# no form submitted - go to template
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def remove_orphaned_pages
|
84
|
+
if wiki.authenticate(@params['system_password_orphaned'])
|
85
|
+
wiki.remove_orphaned_pages(@web_name)
|
86
|
+
flash[:info] = 'Orphaned pages removed'
|
87
|
+
redirect_to :controller => 'wiki', :web => @web_name, :action => 'list'
|
88
|
+
else
|
89
|
+
flash[:error] = password_error(@params['system_password'])
|
90
|
+
return_to_last_remembered
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -1,131 +1,135 @@
|
|
1
|
-
# The filters added to this controller will be run for all controllers in the application.
|
2
|
-
# Likewise will all the methods added be available for all controllers.
|
3
|
-
class ApplicationController < ActionController::Base
|
4
|
-
|
5
|
-
before_filter :set_utf8_http_header, :connect_to_model
|
6
|
-
after_filter :remember_location
|
7
|
-
|
8
|
-
# For injecting a different wiki model implementation. Intended for use in tests
|
9
|
-
def self.wiki=(the_wiki)
|
10
|
-
# a global variable is used here because Rails reloads controller and model classes in the
|
11
|
-
# development environment; therefore, storing it as a class variable does not work
|
12
|
-
# class variable is, anyway, not much different from a global variable
|
13
|
-
$instiki_wiki_service = the_wiki
|
14
|
-
logger.debug("Wiki service: #{the_wiki.to_s}")
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.wiki
|
18
|
-
$instiki_wiki_service
|
19
|
-
end
|
20
|
-
|
21
|
-
protected
|
22
|
-
|
23
|
-
def authorized?
|
24
|
-
@web.nil? ||
|
25
|
-
@web.password.nil? ||
|
26
|
-
cookies['web_address'] == @web.password ||
|
27
|
-
password_check(@params['password'])
|
28
|
-
end
|
29
|
-
|
30
|
-
def check_authorization
|
31
|
-
if in_a_web? and needs_authorization?(@action_name) and not authorized? and
|
32
|
-
redirect_to :controller => 'wiki', :action => 'login', :web => @web_name
|
33
|
-
return false
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def connect_to_model
|
38
|
-
@action_name = @params['action'] || 'index'
|
39
|
-
@web_name = @params['web']
|
40
|
-
@wiki = wiki
|
41
|
-
if @web_name
|
42
|
-
@web = @wiki.webs[@web_name]
|
43
|
-
if @web.nil?
|
44
|
-
render_text "Unknown web '#{@web_name}'", '404 Not Found'
|
45
|
-
return false
|
46
|
-
end
|
47
|
-
end
|
48
|
-
@page_name = @file_name = @params['id']
|
49
|
-
@page = @wiki.read_page(@web_name, @page_name) unless @page_name.nil?
|
50
|
-
@author = cookies['author'] || 'AnonymousCoward'
|
51
|
-
check_authorization
|
52
|
-
end
|
53
|
-
|
54
|
-
FILE_TYPES = {
|
55
|
-
'.exe' => 'application/octet-stream',
|
56
|
-
'.gif' => 'image/gif',
|
57
|
-
'.jpg' => 'image/jpeg',
|
58
|
-
'.pdf' => 'application/pdf',
|
59
|
-
'.png' => 'image/png',
|
60
|
-
'.txt' => 'text/plain',
|
61
|
-
'.zip' => 'application/zip'
|
62
|
-
} unless defined? FILE_TYPES
|
63
|
-
|
64
|
-
def send_file(file, options = {})
|
65
|
-
options[:type] ||= (FILE_TYPES[File.extname(file)] || 'application/octet-stream')
|
66
|
-
super(file, options)
|
67
|
-
end
|
68
|
-
|
69
|
-
def in_a_web?
|
70
|
-
not @web_name.nil?
|
71
|
-
end
|
72
|
-
|
73
|
-
def password_check(password)
|
74
|
-
if password == @web.password
|
75
|
-
cookies['web_address'] = password
|
76
|
-
true
|
77
|
-
else
|
78
|
-
false
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def password_error(password)
|
83
|
-
if password.nil? or password.empty?
|
84
|
-
'Please enter the password.'
|
85
|
-
else
|
86
|
-
'You entered a wrong password. Please enter the right one.'
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
redirect_to_url
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
end
|
122
|
-
|
123
|
-
def
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
def
|
128
|
-
|
129
|
-
end
|
130
|
-
|
131
|
-
|
1
|
+
# The filters added to this controller will be run for all controllers in the application.
|
2
|
+
# Likewise will all the methods added be available for all controllers.
|
3
|
+
class ApplicationController < ActionController::Base
|
4
|
+
|
5
|
+
before_filter :set_utf8_http_header, :connect_to_model
|
6
|
+
after_filter :remember_location
|
7
|
+
|
8
|
+
# For injecting a different wiki model implementation. Intended for use in tests
|
9
|
+
def self.wiki=(the_wiki)
|
10
|
+
# a global variable is used here because Rails reloads controller and model classes in the
|
11
|
+
# development environment; therefore, storing it as a class variable does not work
|
12
|
+
# class variable is, anyway, not much different from a global variable
|
13
|
+
$instiki_wiki_service = the_wiki
|
14
|
+
logger.debug("Wiki service: #{the_wiki.to_s}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.wiki
|
18
|
+
$instiki_wiki_service
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def authorized?
|
24
|
+
@web.nil? ||
|
25
|
+
@web.password.nil? ||
|
26
|
+
cookies['web_address'] == @web.password ||
|
27
|
+
password_check(@params['password'])
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_authorization
|
31
|
+
if in_a_web? and needs_authorization?(@action_name) and not authorized? and
|
32
|
+
redirect_to :controller => 'wiki', :action => 'login', :web => @web_name
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def connect_to_model
|
38
|
+
@action_name = @params['action'] || 'index'
|
39
|
+
@web_name = @params['web']
|
40
|
+
@wiki = wiki
|
41
|
+
if @web_name
|
42
|
+
@web = @wiki.webs[@web_name]
|
43
|
+
if @web.nil?
|
44
|
+
render_text "Unknown web '#{@web_name}'", '404 Not Found'
|
45
|
+
return false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
@page_name = @file_name = @params['id']
|
49
|
+
@page = @wiki.read_page(@web_name, @page_name) unless @page_name.nil?
|
50
|
+
@author = cookies['author'] || 'AnonymousCoward'
|
51
|
+
check_authorization
|
52
|
+
end
|
53
|
+
|
54
|
+
FILE_TYPES = {
|
55
|
+
'.exe' => 'application/octet-stream',
|
56
|
+
'.gif' => 'image/gif',
|
57
|
+
'.jpg' => 'image/jpeg',
|
58
|
+
'.pdf' => 'application/pdf',
|
59
|
+
'.png' => 'image/png',
|
60
|
+
'.txt' => 'text/plain',
|
61
|
+
'.zip' => 'application/zip'
|
62
|
+
} unless defined? FILE_TYPES
|
63
|
+
|
64
|
+
def send_file(file, options = {})
|
65
|
+
options[:type] ||= (FILE_TYPES[File.extname(file)] || 'application/octet-stream')
|
66
|
+
super(file, options)
|
67
|
+
end
|
68
|
+
|
69
|
+
def in_a_web?
|
70
|
+
not @web_name.nil?
|
71
|
+
end
|
72
|
+
|
73
|
+
def password_check(password)
|
74
|
+
if password == @web.password
|
75
|
+
cookies['web_address'] = password
|
76
|
+
true
|
77
|
+
else
|
78
|
+
false
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def password_error(password)
|
83
|
+
if password.nil? or password.empty?
|
84
|
+
'Please enter the password.'
|
85
|
+
else
|
86
|
+
'You entered a wrong password. Please enter the right one.'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def redirect_home(web = @web_name)
|
91
|
+
redirect_to_page('HomePage', web)
|
92
|
+
end
|
93
|
+
|
94
|
+
def redirect_to_page(page_name = @page_name, web = @web_name)
|
95
|
+
redirect_to :web => web, :controller => 'wiki', :action => 'show',
|
96
|
+
:id => (page_name || 'HomePage')
|
97
|
+
end
|
98
|
+
|
99
|
+
@@REMEMBER_NOT = ['locked', 'save', 'back', 'file', 'pic', 'import']
|
100
|
+
def remember_location
|
101
|
+
if @response.headers['Status'] == '200 OK'
|
102
|
+
unless @@REMEMBER_NOT.include? action_name or @request.method != :get
|
103
|
+
@session[:return_to] = @request.request_uri
|
104
|
+
logger.debug("Session ##{session.object_id}: remembered URL '#{@session[:return_to]}'")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def return_to_last_remembered
|
110
|
+
# Forget the redirect location
|
111
|
+
redirect_target, @session[:return_to] = @session[:return_to], nil
|
112
|
+
# then try to redirect to it
|
113
|
+
if redirect_target.nil?
|
114
|
+
logger.debug("Session ##{session.object_id}: no remembered redirect location, trying /")
|
115
|
+
redirect_to_url '/'
|
116
|
+
else
|
117
|
+
logger.debug("Session ##{session.object_id}: " +
|
118
|
+
"redirect to the last remembered URL #{redirect_target}")
|
119
|
+
redirect_to_url(redirect_target)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def set_utf8_http_header
|
124
|
+
@response.headers['Content-Type'] = 'text/html; charset=UTF-8'
|
125
|
+
end
|
126
|
+
|
127
|
+
def wiki
|
128
|
+
$instiki_wiki_service
|
129
|
+
end
|
130
|
+
|
131
|
+
def needs_authorization?(action)
|
132
|
+
not %w( login authenticate published rss_with_content rss_with_headlines ).include?(action)
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|