Soks 0.0.7 → 1.0.0
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/LICENSE.txt +2 -0
- data/README.txt +3 -2
- data/TODO.txt +31 -0
- data/bin/soks-create-wiki.rb +0 -1
- data/lib/authenticators.rb +30 -4
- data/lib/helpers/counter-helpers.rb +132 -0
- data/lib/helpers/default-helpers.rb +170 -169
- data/lib/helpers/mail2wiki-helper.rb +18 -22
- data/lib/helpers/maintenance-helpers.rb +149 -0
- data/lib/helpers/rss2wiki-helper.rb +7 -8
- data/lib/soks-model.rb +82 -54
- data/lib/soks-servlet.rb +126 -108
- data/lib/soks-storage.rb +74 -11
- data/lib/soks-utils.rb +77 -3
- data/lib/soks-view.rb +169 -103
- data/lib/soks.rb +5 -23
- data/templates/default/attachment/newpage.js +4 -13
- data/templates/default/attachment/print_stylesheet.css +2 -7
- data/templates/default/caches/readme.txt +1 -0
- data/templates/default/content/Api%20for%20classes%20to%20modify%20the%20wiki.textile +2 -0
- data/templates/default/content/Author.textile +4 -1
- data/templates/default/content/Automatic%20Summaries.textile +16 -53
- data/templates/default/content/Automatic%20linking%20between%20pages.textile +3 -3
- data/templates/default/content/{bug%3A%20competing%20edits.textile → Bug%3A%20Competing%20edits.textile} +9 -0
- data/templates/default/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +2 -0
- data/templates/default/content/Bug%3A%20E%2Dmail%20addresses%20with%20hyphens%20not%20recognised.textile +17 -0
- data/templates/default/content/Bug%3A%20Email%20adresses%20in%20page%20titles%20cause%20incorrec.textile +3 -0
- data/templates/default/content/Bug%3A%20GEM%20limits%20title%20lengths.textile +3 -1
- data/templates/default/content/Bug%3A%20Memory%20leak.textile +13 -0
- data/templates/default/content/Bug%3A%20Pages%20that%20link%20here%20may%20not%20appear%20on%20r.textile +13 -0
- data/templates/default/content/Bug%3A%20Textile%20mishandles%20paragraphs.textile +4 -0
- data/templates/default/content/Bug%3A%20Unanticipated%20Rollbacks.textile +2 -0
- data/templates/default/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +2 -0
- data/templates/default/content/Home%20Page.textile +3 -1
- data/templates/default/content/How%20to%20administrate%20this%20wiki.textile +23 -13
- data/templates/default/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +3 -1
- data/templates/default/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +22 -0
- data/templates/default/content/How%20to%20get%20the%20latest%20Soks%20from%20cvs.textile +2 -0
- data/templates/default/content/How%20to%20hack%20soks.textile +2 -0
- data/templates/default/content/How%20to%20import%20a%20site%20from%20instiki.textile +2 -0
- data/templates/default/content/{How%20to%20import%20data%20to%20this%20wiki.textile → How%20to%20import%20data.textile} +3 -7
- data/templates/default/content/How%20to%20install%20Soks.textile +2 -0
- data/templates/default/content/How%20to%20password%20protect%20your%20wiki.textile +21 -11
- data/templates/default/content/How%20to%20report%20a%20bug.textile +2 -1
- data/templates/default/content/How%20to%20upgrade%20soks.textile +22 -0
- data/templates/default/content/How%20to%20use%20the%20keyboard%20shortcuts.textile +2 -2
- data/templates/default/content/How%20to%20use%20this%20wiki.textile +3 -1
- data/templates/default/content/List%20of%20changes.textile +84 -118
- data/templates/default/content/News%3A%20Version%201%2D0%2D0%20released.textile +19 -0
- data/templates/default/content/Pages%20to%20include%20in%20the%20distribution.textile +51 -0
- data/templates/default/content/Per%20Wiki%20Templates.textile +2 -0
- data/templates/default/content/Planned%20Features.textile +30 -9
- data/templates/default/content/README.textile +3 -2
- data/templates/default/content/RSS%20feed.textile +1 -1
- data/templates/default/content/Recent%20changes%20to%20this%20site.textile +283 -0
- data/templates/default/content/SOKS%20features.textile +3 -0
- data/templates/default/content/Site%20Index.textile +202 -0
- data/templates/default/content/Soks%20Licence.textile +2 -0
- data/templates/default/content/Tag%3A%20Include%20this%20page%20in%20the%20distribution.textile +6 -0
- data/templates/default/start.rb +67 -123
- data/templates/default/version.txt +1 -1
- data/templates/default/views/Page_edit.rhtml +7 -7
- data/templates/default/views/{Page_search_results.rhtml → Page_find.rhtml} +9 -3
- data/templates/default/views/Page_linksfromrss.rhtml +24 -0
- data/templates/default/views/Page_listrss.rhtml +46 -0
- data/templates/default/views/Page_meta.rhtml +1 -1
- data/templates/default/views/Page_revision.rhtml +39 -0
- data/templates/default/views/Page_revisions.rhtml +13 -5
- data/templates/default/views/Page_rss.rhtml +8 -8
- data/templates/default/views/Page_view.rhtml +3 -3
- data/templates/default/views/UploadPage_edit.rhtml +8 -8
- data/templates/default/views/frame.rhtml +8 -8
- data/templates/default/views/messages.yaml +1 -0
- data/test/html/2006Mar.html +66 -0
- data/test/html/poignant.html +36 -0
- data/test/html/poignant.textile +36 -0
- data/test/mock-objects.rb +69 -0
- data/test/stress_url_calls.rb +33 -0
- data/test/stress_urls.txt +68 -0
- data/test/test_counter-helper.rb +158 -0
- data/test/test_soks-helper-maintenance.rb +106 -0
- data/test/test_soks-helpers.rb +104 -0
- data/test/test_soks-model.rb +144 -0
- data/test/test_soks-servlet.rb +231 -0
- data/test/test_soks-storage.rb +70 -31
- data/test/test_soks-utils.rb +112 -13
- data/test/test_soks-view.rb +141 -3
- metadata +38 -27
- data/templates/default/content/A%20page%20with%20an%20umlaut%20%F6%20in%20its%20title.textile +0 -1
- data/templates/default/content/All%20News.textile +0 -26
- data/templates/default/content/Bil%20Kleb.textile +0 -1
- data/templates/default/content/Bil.textile +0 -1
- data/templates/default/content/Bill%20Wood.textile +0 -3
- data/templates/default/content/Bug%3A%20RSS%20feed%20does%20not%20validate.textile +0 -10
- data/templates/default/content/Bug%3A%20Type%20a%20title%20here.textile +0 -31
- data/templates/default/content/Instructions%20and%20Howtos.textile +0 -21
- data/templates/default/content/Latest%20News.textile +0 -26
- data/templates/default/content/New%20Recent%20Changes%20class.textile +0 -68
- data/templates/default/content/New%20page%20templates%20or%20categories%20code.textile +0 -68
- data/templates/default/content/News%3A%20Version%200%2E0%2E6%20Released.textile +0 -13
- data/templates/default/content/Recent%20Blog%20Entries.textile +0 -5
- data/templates/default/content/Recent%20Changes%20to%20This%20Site.textile +0 -286
- data/templates/default/content/Ruby.textile +0 -9
- data/templates/default/content/Skorgu.textile +0 -3
- data/templates/default/content/ctrl%2Dn.textile +0 -1
- data/templates/default/content/let%20me%20know.textile +0 -1
- data/templates/default/content/sandbox.textile +0 -20
- data/templates/default/content/tamc.textile +0 -1
- data/templates/default/content/tamc2.textile +0 -1
data/templates/default/start.rb
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
#!/usr/local/bin/ruby
|
|
2
2
|
|
|
3
3
|
# This file was created automatically on <%= Time.now %>
|
|
4
|
-
# Uncomment different sections to enable features of this wiki.
|
|
5
|
-
|
|
6
|
-
#Get a logger going
|
|
7
4
|
require 'logger'
|
|
8
|
-
|
|
9
|
-
$LOG
|
|
10
|
-
|
|
11
|
-
# $LOG.level = Logger::WARN # For production
|
|
5
|
+
|
|
6
|
+
$LOG = Logger.new(STDOUT)
|
|
7
|
+
$LOG.level = Logger::DEBUG
|
|
12
8
|
$LOG.datetime_format = "%Y-%m-%d %H:%M:%S"
|
|
13
9
|
|
|
14
10
|
#Add the required libraries to the search path
|
|
15
11
|
begin
|
|
16
12
|
require 'rubygems'
|
|
17
|
-
require_gem 'Soks', '
|
|
13
|
+
require_gem 'Soks', '~> <%= settings[:version] %>'
|
|
18
14
|
$LOG.info 'Loaded Soks <%= settings[:version] %> from gem'
|
|
19
15
|
rescue LoadError
|
|
20
16
|
$LOG.info "Soks Gem version <%= settings[:version] %> could not be found"
|
|
@@ -23,122 +19,70 @@ rescue LoadError
|
|
|
23
19
|
$LOG.info 'Loaded Soks libraries from <%= settings[:soks_libraries].join('","') %>'
|
|
24
20
|
end
|
|
25
21
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
=
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
22
|
+
root_directory = File.expand_path( File.dirname( __FILE__) )
|
|
23
|
+
$MESSAGES = YAML.load( IO.readlines("#{root_directory}/views/messages.yaml").join )
|
|
24
|
+
banned_titles = IO.readlines("#{root_directory}/banned_titles.txt").map { |title| title.strip }
|
|
25
|
+
|
|
26
|
+
server = WEBrick::HTTPServer.new(:Port => <%= settings[:port] %> )
|
|
27
|
+
|
|
28
|
+
wiki = Wiki.new( "#{root_directory}/content", "#{root_directory}/caches" )
|
|
29
|
+
wiki.check_files_every = :min
|
|
30
|
+
|
|
31
|
+
view = View.new( wiki, "<%= settings[:url] %>", "#{root_directory}/views" )
|
|
32
|
+
view.name = 'A Soks Wiki'
|
|
33
|
+
view.description = 'A Soks Wiki for you!'
|
|
34
|
+
view.reload_erb_each_request = false
|
|
35
|
+
view.dont_frame_views = ['print','rss','listrss','linksfromrss']
|
|
36
|
+
view.redcloth_hard_breaks = false
|
|
37
|
+
view.author_to_email_conversion = '@address-not-known.com'
|
|
38
|
+
|
|
39
|
+
servlet = ServletSettings.new( wiki, view )
|
|
40
|
+
servlet.home_page = 'Home Page'
|
|
41
|
+
servlet.content_types = { 'Rss' => 'application/xml', 'Listrss' => 'application/xml', 'Linksfromrss' => 'application/xml' }
|
|
42
|
+
servlet.force_no_cache = false
|
|
43
|
+
|
|
44
|
+
servlet.authenticators << [ /\/(edit|save|upload|delete|rollback)\//i, WEBrick::HTTPAuth::AskForUserName.new( 'No password, just enter a name') ]
|
|
45
|
+
servlet.authenticators << [ /.*/, WEBrick::HTTPAuth::NoAuthenticationRequired.new ]
|
|
46
|
+
|
|
47
|
+
servlet.static_file_directories[ 'Attachment' ] = "#{root_directory}/attachment"
|
|
48
|
+
servlet.upload_directory = 'Attachment' # Must be one of the static file directories
|
|
49
|
+
|
|
50
|
+
wiki.watch_for(:start) do |event,wiki,view|
|
|
51
|
+
MergeOldRevisionsHelper.new( wiki, :day, 2, 60*60*24)
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
# Examples of automatically generated summary pages:
|
|
59
|
-
AutomaticSummary.new( wiki,
|
|
60
|
-
:regexp_for_title => /^How to /i,
|
|
61
|
-
:pagename => 'Instructions and Howtos'
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
AutomaticSummary.new( wiki,
|
|
65
|
-
:regexp_for_title => /^Bug:/i,
|
|
66
|
-
:regexp_to_exclude_title => /^Bug: Type a title here/i,
|
|
67
|
-
:pagename => 'Known bugs',
|
|
68
|
-
:include_metadata => true
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
AutomaticSummary.new( wiki,
|
|
72
|
-
:regexp_for_title => /^News:/i,
|
|
73
|
-
:max_pages_to_show => 1,
|
|
74
|
-
:lines_to_include => 10,
|
|
75
|
-
:reverse_sort => true,
|
|
76
|
-
:pagename => 'Latest News'
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
AutomaticSummary.new( wiki,
|
|
80
|
-
:regexp_for_title => /^News:/i,
|
|
81
|
-
:lines_to_include => 10,
|
|
82
|
-
:reverse_sort => true,
|
|
83
|
-
:pagename => 'All News'
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
# Possible settings for the Automatic Summary (with defaults)
|
|
87
|
-
# :regexp_for_title => /.*/, # These three regexps act as an AND
|
|
88
|
-
# :regexp_for_author => nil,
|
|
89
|
-
# :regexp_for_content => nil,
|
|
90
|
-
# :max_pages_to_show => nil,
|
|
91
|
-
# :pagename => 'Summary',
|
|
92
|
-
# :author => 'AutomaticSummary',
|
|
93
|
-
# :lines_to_include => nil, # nil puts a link, can pass a block instead to render
|
|
94
|
-
# :only_new_pages => false,
|
|
95
|
-
# :sort_pages_by => :created_on, # Could be :revised_on or :score or :name or :name_for_index, or :author
|
|
96
|
-
# :reverse_sort => false,
|
|
97
|
-
# :include_metadata => false, # Includes author and time in summary
|
|
98
|
-
# :summarise_revisions => false, # If true, then can contain several revisions for same page
|
|
99
|
-
# :remove_deleted_pages => true, # If false will keep references to deleted pages
|
|
100
|
-
|
|
101
|
-
# These are beta and off by default...
|
|
102
|
-
=begin
|
|
103
|
-
require 'helpers/rss2wiki-helper'
|
|
104
|
-
RSS2WikiHelper.new( wiki, :url => 'http://rubyforge.org/export/rss_sfnews.php' )
|
|
105
|
-
|
|
106
|
-
require 'helpers/mail2wiki-helper'
|
|
107
|
-
Mail2WikiHelper.new( wiki, :server => 'imap.hermes.cam.ac.uk',
|
|
108
|
-
:username => 'tamc2',
|
|
109
|
-
:password => 'PASSWORD',
|
|
110
|
-
:mailbox => 'mcr notices',
|
|
111
|
-
:check_period => 600, # Seconds
|
|
112
|
-
:subject_regexp => /.*/ )
|
|
113
|
-
|
|
114
|
-
require 'helpers/wiki2html'
|
|
115
|
-
Wiki2Html.new( wiki, view, :views_to_copy => ['view','meta','rss'],
|
|
116
|
-
:extension => '.html',
|
|
117
|
-
:destination_dir => '/Users/tamc2/Sites',
|
|
118
|
-
:destination_url => 'http://localhost/~tamc2')
|
|
119
|
-
=end
|
|
120
|
-
|
|
121
|
-
# Putting these towards the end speeds things up.
|
|
122
|
-
AutomaticRecentChanges.new( wiki )
|
|
123
|
-
|
|
124
|
-
AutomaticOnePageIndex.new( wiki ) # Index on one page, best for small wikis
|
|
125
|
-
# AutomaticMultiPageIndex.new( wiki ) # One page per letter index, best for large wikis
|
|
126
|
-
|
|
127
|
-
# calendar = AutomaticCalendar.new( wiki ) # Adds a series of calendar pages to the wiki
|
|
128
|
-
# AutomaticUpcomingEvents.new( wiki, calendar ) # Creates a page with the next weeks events drawn from the calendar pages
|
|
129
|
-
|
|
130
|
-
# This is an array of titles that will NOT be automatically linked.
|
|
131
|
-
# Default is the 30 most common words in the english language
|
|
132
|
-
# Note that pages can still be created with these titles, and they can still be manually linked to.
|
|
133
|
-
banned_titles = IO.readlines("#{CUSTOMSETTINGS[:root_directory]}/banned_titles.txt").map { |title| title.strip }
|
|
134
|
-
|
|
135
|
-
# This takes a while, so do it last. Note that the banned_titles argument is optional.
|
|
136
|
-
AutomaticUpdateCrossLinks.new( wiki, view, banned_titles )
|
|
137
|
-
end
|
|
53
|
+
AutomaticDetailedList.new( wiki, 'Known bugs' ) do |page|
|
|
54
|
+
page.name =~ /^Bug:/i && page.name !~ /^Bug: Type a title here/i
|
|
138
55
|
end
|
|
56
|
+
|
|
57
|
+
AutomaticList.new( wiki, 'Instructions and Howtos' ) { |page| page.name =~ /^How to /i }
|
|
58
|
+
AutomaticSummary.new( wiki, 'Latest News', :max_pages_to_show => 1, :reverse_sort => true) { |page| page.name =~ /^News:/i }
|
|
59
|
+
AutomaticSummary.new( wiki, 'All News', :reverse_sort => true) { |page| page.name =~ /^News:/i }
|
|
139
60
|
|
|
140
|
-
|
|
61
|
+
#ViewCountHelper.new( wiki ) # Counts which are the most popular pages
|
|
62
|
+
#ViewerCountHelper.new( wiki ) # Counts who visits the wiki most
|
|
63
|
+
#AuthorCountHelper.new(wiki) # Counts who makes the most revisions
|
|
64
|
+
|
|
65
|
+
AutomaticRecentChanges.new( wiki )
|
|
141
66
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
67
|
+
AutomaticOnePageIndex.new( wiki ) # Index on one page, best for small wikis
|
|
68
|
+
# AutomaticMultiPageIndex.new( wiki ) # One page per letter index, best for large wikis
|
|
69
|
+
|
|
70
|
+
#calendar = AutomaticCalendar.new( wiki ) # Adds a series of calendar pages to the wiki
|
|
71
|
+
#AutomaticUpcomingEvents.new( wiki, calendar ) # Creates a page with the next weeks events drawn from the calendar pages
|
|
72
|
+
|
|
73
|
+
AutomaticUpdateCrossLinks.new( wiki, view, banned_titles )
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
server.mount("/", WikiServlet, servlet )
|
|
78
|
+
|
|
79
|
+
trap("INT") {
|
|
80
|
+
$LOG.warn "Trying to shutdown gracefully"
|
|
81
|
+
server.shutdown
|
|
82
|
+
wiki.shutdown
|
|
83
|
+
$LOG.info "Shutdown."
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
$LOG.warn "Starting server"
|
|
87
|
+
wiki.notify(:start,wiki,view)
|
|
88
|
+
server.start
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.0
|
|
1
|
+
1.0.0
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<span class='pagename'>
|
|
2
|
-
<a href='<%= url
|
|
2
|
+
<a href='<%= url page.name, "meta" %>'><%= page.name %></a>
|
|
3
3
|
<%= page.deleted? ? "(Deleted)" : '' %>
|
|
4
4
|
</span>
|
|
5
5
|
|
|
@@ -22,14 +22,14 @@
|
|
|
22
22
|
</ul>
|
|
23
23
|
</div>
|
|
24
24
|
|
|
25
|
-
<form class='editpage' method='post' action='<%= url
|
|
25
|
+
<form class='editpage' method='post' action='<%= url page.name, "save" %>' >
|
|
26
26
|
<fieldset>
|
|
27
27
|
|
|
28
28
|
<div id='edittitle'>
|
|
29
29
|
Title:
|
|
30
30
|
<input name='newtitle'
|
|
31
31
|
size = '60'
|
|
32
|
-
value='<%=
|
|
32
|
+
value='<%= page.name %>'
|
|
33
33
|
onblur="validateTitle( this.value );"
|
|
34
34
|
onClick="this.value=this.value.replace('Type a title here' ,'')"
|
|
35
35
|
/>
|
|
@@ -46,10 +46,10 @@
|
|
|
46
46
|
|
|
47
47
|
Hello <a href='<%= url person %>'><%= person %></a> (Quit browser to log out). Would you like to
|
|
48
48
|
<input name='action' value='Save Changes' type='submit' accesskey="S" /></form>,
|
|
49
|
-
<form class='editpage' method='post' action='<%= url
|
|
49
|
+
<form class='editpage' method='post' action='<%= url page.name %>' >
|
|
50
50
|
<input name='action' value='Cancel Changes' type=submit accesskey="C" />
|
|
51
51
|
</form> or
|
|
52
|
-
<form class='editpage' method='post' action='<%= url
|
|
52
|
+
<form class='editpage' method='post' action='<%= url page.name, 'delete' %>' >
|
|
53
53
|
<input name='action' value='Delete this Page' type='submit' accesskey="D" />
|
|
54
54
|
</form>?
|
|
55
55
|
|
|
@@ -71,9 +71,9 @@
|
|
|
71
71
|
%>
|
|
72
72
|
</div>
|
|
73
73
|
<p>
|
|
74
|
-
<form class='editpage' method=post action='<%= url
|
|
74
|
+
<form class='editpage' method=post action='<%= url page.name, "rollback" %>' >
|
|
75
75
|
<input name='revision' value='<%= page.number-1 %>' type='hidden' />
|
|
76
76
|
<input name='action' value='Undo this change' type='submit' accesskey="U" />
|
|
77
|
-
</form> or <a href='<%= url
|
|
77
|
+
</form> or <a href='<%= url page.name, "revisions" %>' accesskey="A" >Show <b>A</b>ll changes</a>.
|
|
78
78
|
</p>
|
|
79
79
|
<% end %>
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
<span class='pagename'
|
|
1
|
+
<span class='pagename'>Search Results</span>
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<%
|
|
4
|
+
search_regexp = /#{query['regex'].strip}/i
|
|
5
|
+
title_results = @wiki.select { |name,apage| name=~ search_regexp }
|
|
6
|
+
text_results = @wiki.select { |name,apage| apage.content=~ search_regexp }
|
|
7
|
+
%>
|
|
8
|
+
|
|
9
|
+
<h1>Results of Search for “<%= query['regex'] %>”</h1>
|
|
4
10
|
|
|
5
11
|
<% unless title_results.empty? %>
|
|
6
12
|
<h2>Matches in the titles of pages</h2>
|
|
@@ -25,5 +31,5 @@
|
|
|
25
31
|
<% end %>
|
|
26
32
|
|
|
27
33
|
<div class='command'>
|
|
28
|
-
<a href='<%= url
|
|
34
|
+
<a href='<%= url query['regex'], "edit" %>' accesskey="E" >Create a page titled “<%= query['regex'] %>”</a>
|
|
29
35
|
</div>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<%=
|
|
2
|
+
require "rss/maker"
|
|
3
|
+
|
|
4
|
+
RSS::Maker.make("2.0") do |maker|
|
|
5
|
+
|
|
6
|
+
maker.encoding = 'iso-8859-1'
|
|
7
|
+
|
|
8
|
+
maker.channel.title = "#{page.name} (#{name})"
|
|
9
|
+
maker.channel.description = description
|
|
10
|
+
maker.channel.link = url(page.name)
|
|
11
|
+
|
|
12
|
+
maker.image.title = name
|
|
13
|
+
maker.image.url = file("logo.png")
|
|
14
|
+
|
|
15
|
+
page.links_from.each do |linked_page|
|
|
16
|
+
item = maker.items.new_item
|
|
17
|
+
item.link = url(linked_page.name)
|
|
18
|
+
item.title = linked_page.name
|
|
19
|
+
item.date = linked_page.revised_on
|
|
20
|
+
item.author = linked_page.author
|
|
21
|
+
item.description = redcloth( linked_page )
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
%>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<%=
|
|
2
|
+
require "rss/maker"
|
|
3
|
+
|
|
4
|
+
RSS::Maker.make("2.0") do |maker|
|
|
5
|
+
|
|
6
|
+
maker.encoding = 'iso-8859-1'
|
|
7
|
+
|
|
8
|
+
maker.channel.title = "#{name} #{page.name}"
|
|
9
|
+
maker.channel.description = description
|
|
10
|
+
maker.channel.link = root_url
|
|
11
|
+
|
|
12
|
+
maker.image.title = name
|
|
13
|
+
maker.image.url = file('logo.png')
|
|
14
|
+
|
|
15
|
+
maker.items.do_sort = true
|
|
16
|
+
|
|
17
|
+
count = 0
|
|
18
|
+
page.textile.scan(%r{/revision/([^?]+)\?time=(\d+)}) do |linked_pagename,time|
|
|
19
|
+
break if (count +=1) == 15
|
|
20
|
+
linked_page = @wiki.page( linked_pagename )
|
|
21
|
+
revision = linked_page.revisions.detect { |revision| revision.created_on.to_i >= time.to_i }
|
|
22
|
+
|
|
23
|
+
item = maker.items.new_item
|
|
24
|
+
item.link = url(linked_page.name)
|
|
25
|
+
item.title = linked_page.name
|
|
26
|
+
item.date = revision.revised_on
|
|
27
|
+
item.author = revision.author
|
|
28
|
+
item.description = ""
|
|
29
|
+
revision.number.downto(0) do |number|
|
|
30
|
+
revision = linked_page.revision(number)
|
|
31
|
+
break unless revision.author == item.author
|
|
32
|
+
content_deleted = false
|
|
33
|
+
revision.changes.each do |change_group|
|
|
34
|
+
change_group.each do |change|
|
|
35
|
+
case change[0]
|
|
36
|
+
when "-"; content_deleted = true
|
|
37
|
+
when "+"; item.description << "#{change[2]}<br />"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
item.description << "…<br />"
|
|
41
|
+
end
|
|
42
|
+
item.description << "Content was also deleted<br />" if content_deleted
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
%>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<span class='pagename'><a href='<%= url
|
|
1
|
+
<span class='pagename'><a href='<%= url page.name %>'><%= page.name %></a> <%= page.deleted? ? "(Deleted)" : '' %></span>
|
|
2
2
|
|
|
3
3
|
<h1><%= pagename %></h1>
|
|
4
4
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<span class='pagename'><a href='<%= url page.name, "meta" %>'><%= page.name %></a> <%= page.deleted? ? "(Deleted)" : '' %></span>
|
|
2
|
+
|
|
3
|
+
<%
|
|
4
|
+
if query['time']
|
|
5
|
+
final_revision = page.revisions.detect { |revision| revision.created_on.to_i >= query['time'].to_i }
|
|
6
|
+
final_revision_number = final_revision.number if final_revision
|
|
7
|
+
end
|
|
8
|
+
final_revision_number ||= ( query['revision'] || page.number ).to_i
|
|
9
|
+
final_revison_number = page.number if final_revision_number > page.number
|
|
10
|
+
final_revision ||= page.revision( final_revision_number )
|
|
11
|
+
%>
|
|
12
|
+
|
|
13
|
+
<h1>Revisions made by <%= final_revision.author%> up to <%= final_revision.revised_on.strftime('%H:%M %a %d %b %Y') %></h1>
|
|
14
|
+
|
|
15
|
+
<p>Note, if you wish to edit or undo these revisions, please follow the links from <a href='<%= url page.name, 'edit' %>'>here</a>. You cannot do it from here, becuase someone may have edited the page more recently and because you may need a password to edit the page.</p>
|
|
16
|
+
|
|
17
|
+
<% final_revision_number.downto(0) do |number| %>
|
|
18
|
+
<% revision = page.revision( number ) %>
|
|
19
|
+
<% break unless revision.author == final_revision.author %>
|
|
20
|
+
<div class="undochange">
|
|
21
|
+
<p><%= revision.created_on.strftime('%H:%M %a %d %b %Y') %></p>
|
|
22
|
+
<ol>
|
|
23
|
+
<% revision.changes.each do |change_group| %>
|
|
24
|
+
<% change_group.each do |change|
|
|
25
|
+
case change[0]
|
|
26
|
+
when "-" %>
|
|
27
|
+
<li><del><%= change[1] %>. <%= change[2].gsub('<','<').gsub('>','>') %></del></li>
|
|
28
|
+
<% when "+" %>
|
|
29
|
+
<li><%= change[1] %>. <%= change[2].gsub('<','<').gsub('>','>') %></li>
|
|
30
|
+
<% end %>
|
|
31
|
+
<% end %>
|
|
32
|
+
<% end %>
|
|
33
|
+
</ol>
|
|
34
|
+
</div>
|
|
35
|
+
<% end %>
|
|
36
|
+
|
|
37
|
+
<div class='command'>
|
|
38
|
+
<a href='<%= url page.name %>' accesskey="V" >View</a>, <a href='<%= url page.name, "edit" %>' accesskey="E" >Edit</a> or <a href='<%= url page.name, "revisions" %>' accesskey="R" >see all changes to</a> this page.
|
|
39
|
+
</div>
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
<span class='pagename'><a href='<%= url
|
|
1
|
+
<span class='pagename'><a href='<%= url page.name, "meta" %>'><%= page.name %></a> <%= page.deleted? ? "(Deleted)" : '' %></span>
|
|
2
2
|
|
|
3
|
+
<% start_at_revision = query['revision'] ? query['revision'].to_i : 0 %>
|
|
3
4
|
|
|
4
|
-
<%
|
|
5
|
+
<% if start_at_revision > 0 %>
|
|
6
|
+
<p><a href='<%= url page.name, "revisions", "?revision=#{start_at_revision-10}" %>' accesskey="N" >Newer revisions</a></p>
|
|
7
|
+
<% end %>
|
|
8
|
+
|
|
9
|
+
<% page.revisions[start_at_revision,10].reverse_each do |revision| %>
|
|
5
10
|
<div class="undochange">
|
|
6
11
|
<p><%= revision.created_on %> by <a href='<%= url revision.author %>'><%= revision.author %></a></p>
|
|
7
12
|
<ol>
|
|
@@ -16,13 +21,16 @@
|
|
|
16
21
|
<% end %>
|
|
17
22
|
<% end %>
|
|
18
23
|
</ol>
|
|
19
|
-
<form method=post action='<%= url
|
|
24
|
+
<form method=post action='<%= url page.name, "rollback" %>' >
|
|
20
25
|
<input name='revision' value='<%= revision.number-1 %>' type='hidden' />
|
|
21
26
|
<input name='action' value='Undo the changes above' type='submit' />
|
|
22
27
|
</form>
|
|
23
28
|
</div>
|
|
24
29
|
<% end %>
|
|
25
30
|
|
|
31
|
+
<% if (start_at_revision+10) < page.revisions.size %>
|
|
32
|
+
<p><a href='<%= url page.name, "revisions", "?revision=#{start_at_revision+10}" %>' accesskey="O" >Older revisions</a></p>
|
|
33
|
+
<% end %>
|
|
26
34
|
<div class='command'>
|
|
27
|
-
<a href='<%= url
|
|
28
|
-
</div>
|
|
35
|
+
<a href='<%= url page.name, "edit" %>' accesskey="R" >Return to editing</a>
|
|
36
|
+
</div>
|