Soks 0.0.7 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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>
|