Soks 0.0.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/LICENSE.txt +2 -0
  2. data/README.txt +3 -2
  3. data/TODO.txt +31 -0
  4. data/bin/soks-create-wiki.rb +0 -1
  5. data/lib/authenticators.rb +30 -4
  6. data/lib/helpers/counter-helpers.rb +132 -0
  7. data/lib/helpers/default-helpers.rb +170 -169
  8. data/lib/helpers/mail2wiki-helper.rb +18 -22
  9. data/lib/helpers/maintenance-helpers.rb +149 -0
  10. data/lib/helpers/rss2wiki-helper.rb +7 -8
  11. data/lib/soks-model.rb +82 -54
  12. data/lib/soks-servlet.rb +126 -108
  13. data/lib/soks-storage.rb +74 -11
  14. data/lib/soks-utils.rb +77 -3
  15. data/lib/soks-view.rb +169 -103
  16. data/lib/soks.rb +5 -23
  17. data/templates/default/attachment/newpage.js +4 -13
  18. data/templates/default/attachment/print_stylesheet.css +2 -7
  19. data/templates/default/caches/readme.txt +1 -0
  20. data/templates/default/content/Api%20for%20classes%20to%20modify%20the%20wiki.textile +2 -0
  21. data/templates/default/content/Author.textile +4 -1
  22. data/templates/default/content/Automatic%20Summaries.textile +16 -53
  23. data/templates/default/content/Automatic%20linking%20between%20pages.textile +3 -3
  24. data/templates/default/content/{bug%3A%20competing%20edits.textile → Bug%3A%20Competing%20edits.textile} +9 -0
  25. data/templates/default/content/Bug%3A%20Does%20not%20make%20use%20of%20if%2Dmodified%2Dsince%20r.textile +2 -0
  26. data/templates/default/content/Bug%3A%20E%2Dmail%20addresses%20with%20hyphens%20not%20recognised.textile +17 -0
  27. data/templates/default/content/Bug%3A%20Email%20adresses%20in%20page%20titles%20cause%20incorrec.textile +3 -0
  28. data/templates/default/content/Bug%3A%20GEM%20limits%20title%20lengths.textile +3 -1
  29. data/templates/default/content/Bug%3A%20Memory%20leak.textile +13 -0
  30. data/templates/default/content/Bug%3A%20Pages%20that%20link%20here%20may%20not%20appear%20on%20r.textile +13 -0
  31. data/templates/default/content/Bug%3A%20Textile%20mishandles%20paragraphs.textile +4 -0
  32. data/templates/default/content/Bug%3A%20Unanticipated%20Rollbacks.textile +2 -0
  33. data/templates/default/content/Bug%3A%20notextile%20does%20not%20prevent%20page%20inserts.textile +2 -0
  34. data/templates/default/content/Home%20Page.textile +3 -1
  35. data/templates/default/content/How%20to%20administrate%20this%20wiki.textile +23 -13
  36. data/templates/default/content/How%20to%20change%20the%20way%20this%20wiki%20looks.textile +3 -1
  37. data/templates/default/content/How%20to%20export%20a%20site%20from%20this%20wiki.textile +22 -0
  38. data/templates/default/content/How%20to%20get%20the%20latest%20Soks%20from%20cvs.textile +2 -0
  39. data/templates/default/content/How%20to%20hack%20soks.textile +2 -0
  40. data/templates/default/content/How%20to%20import%20a%20site%20from%20instiki.textile +2 -0
  41. data/templates/default/content/{How%20to%20import%20data%20to%20this%20wiki.textile → How%20to%20import%20data.textile} +3 -7
  42. data/templates/default/content/How%20to%20install%20Soks.textile +2 -0
  43. data/templates/default/content/How%20to%20password%20protect%20your%20wiki.textile +21 -11
  44. data/templates/default/content/How%20to%20report%20a%20bug.textile +2 -1
  45. data/templates/default/content/How%20to%20upgrade%20soks.textile +22 -0
  46. data/templates/default/content/How%20to%20use%20the%20keyboard%20shortcuts.textile +2 -2
  47. data/templates/default/content/How%20to%20use%20this%20wiki.textile +3 -1
  48. data/templates/default/content/List%20of%20changes.textile +84 -118
  49. data/templates/default/content/News%3A%20Version%201%2D0%2D0%20released.textile +19 -0
  50. data/templates/default/content/Pages%20to%20include%20in%20the%20distribution.textile +51 -0
  51. data/templates/default/content/Per%20Wiki%20Templates.textile +2 -0
  52. data/templates/default/content/Planned%20Features.textile +30 -9
  53. data/templates/default/content/README.textile +3 -2
  54. data/templates/default/content/RSS%20feed.textile +1 -1
  55. data/templates/default/content/Recent%20changes%20to%20this%20site.textile +283 -0
  56. data/templates/default/content/SOKS%20features.textile +3 -0
  57. data/templates/default/content/Site%20Index.textile +202 -0
  58. data/templates/default/content/Soks%20Licence.textile +2 -0
  59. data/templates/default/content/Tag%3A%20Include%20this%20page%20in%20the%20distribution.textile +6 -0
  60. data/templates/default/start.rb +67 -123
  61. data/templates/default/version.txt +1 -1
  62. data/templates/default/views/Page_edit.rhtml +7 -7
  63. data/templates/default/views/{Page_search_results.rhtml → Page_find.rhtml} +9 -3
  64. data/templates/default/views/Page_linksfromrss.rhtml +24 -0
  65. data/templates/default/views/Page_listrss.rhtml +46 -0
  66. data/templates/default/views/Page_meta.rhtml +1 -1
  67. data/templates/default/views/Page_revision.rhtml +39 -0
  68. data/templates/default/views/Page_revisions.rhtml +13 -5
  69. data/templates/default/views/Page_rss.rhtml +8 -8
  70. data/templates/default/views/Page_view.rhtml +3 -3
  71. data/templates/default/views/UploadPage_edit.rhtml +8 -8
  72. data/templates/default/views/frame.rhtml +8 -8
  73. data/templates/default/views/messages.yaml +1 -0
  74. data/test/html/2006Mar.html +66 -0
  75. data/test/html/poignant.html +36 -0
  76. data/test/html/poignant.textile +36 -0
  77. data/test/mock-objects.rb +69 -0
  78. data/test/stress_url_calls.rb +33 -0
  79. data/test/stress_urls.txt +68 -0
  80. data/test/test_counter-helper.rb +158 -0
  81. data/test/test_soks-helper-maintenance.rb +106 -0
  82. data/test/test_soks-helpers.rb +104 -0
  83. data/test/test_soks-model.rb +144 -0
  84. data/test/test_soks-servlet.rb +231 -0
  85. data/test/test_soks-storage.rb +70 -31
  86. data/test/test_soks-utils.rb +112 -13
  87. data/test/test_soks-view.rb +141 -3
  88. metadata +38 -27
  89. data/templates/default/content/A%20page%20with%20an%20umlaut%20%F6%20in%20its%20title.textile +0 -1
  90. data/templates/default/content/All%20News.textile +0 -26
  91. data/templates/default/content/Bil%20Kleb.textile +0 -1
  92. data/templates/default/content/Bil.textile +0 -1
  93. data/templates/default/content/Bill%20Wood.textile +0 -3
  94. data/templates/default/content/Bug%3A%20RSS%20feed%20does%20not%20validate.textile +0 -10
  95. data/templates/default/content/Bug%3A%20Type%20a%20title%20here.textile +0 -31
  96. data/templates/default/content/Instructions%20and%20Howtos.textile +0 -21
  97. data/templates/default/content/Latest%20News.textile +0 -26
  98. data/templates/default/content/New%20Recent%20Changes%20class.textile +0 -68
  99. data/templates/default/content/New%20page%20templates%20or%20categories%20code.textile +0 -68
  100. data/templates/default/content/News%3A%20Version%200%2E0%2E6%20Released.textile +0 -13
  101. data/templates/default/content/Recent%20Blog%20Entries.textile +0 -5
  102. data/templates/default/content/Recent%20Changes%20to%20This%20Site.textile +0 -286
  103. data/templates/default/content/Ruby.textile +0 -9
  104. data/templates/default/content/Skorgu.textile +0 -3
  105. data/templates/default/content/ctrl%2Dn.textile +0 -1
  106. data/templates/default/content/let%20me%20know.textile +0 -1
  107. data/templates/default/content/sandbox.textile +0 -20
  108. data/templates/default/content/tamc.textile +0 -1
  109. data/templates/default/content/tamc2.textile +0 -1
@@ -62,3 +62,5 @@ GPL (see the file GPL), or the conditions below:
62
62
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
63
63
  PURPOSE.
64
64
  </pre>
65
+
66
+ Tag: Include this page in the distribution
@@ -0,0 +1,6 @@
1
+ h1. Tag: Include this page in the distribution
2
+
3
+ Pages with this text on are downloaded from http://www.soks.org and packaged up in the soks distribution.
4
+
5
+
6
+ [[insert pages to include in the distribution]]
@@ -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
- $LOG = Logger.new(STDOUT) # For development
9
- $LOG.level = Logger::DEBUG # For development
10
- # $LOG = Logger.new('soks.log', 10, 1024000) # For production
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', '= <%= settings[:version] %>'
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
- module StartSoks
27
-
28
- # EDIT THIS TO CHANGE THE AUTHENTICATION
29
- =begin
30
- # If you uncomment this, don't forget to uncomment the authenticators line in the CUSTOMSETTINGS hash below!
31
- # You can choose what level of authentication to apply based on regular expressions matched
32
- # against the page title. These regexps are tried in order.Defaults are here:
33
- authenticators = [ [ %r{/(view|rss|print|find|meta|attachment)/.*}, WEBrick::HTTPAuth::NoAuthenticationRequired.new ],
34
- # [ %r{/upload/.*}, WEBrick::HTTPAuth::NotPermitted.new ],
35
- # [ %r{/(edit|save)/home page}, WEBrick::HTTPAuth::SiteWidePassword.new('password','You need to enter the site wide password to edit the home page') ],
36
- # [ %r{/(view|edit|save)/private.*},WEBrick::HTTPAuth::BasicAuth.new( :UserDB => htpasswd, :Realm => realm ) ], # See webrick documentation
37
- [ %r{.*}, WEBrick::HTTPAuth::AskForUserName.new( 'No password, just enter a name') ]
38
- ]
39
- =end
40
-
41
- # EDIT THIS TO CHANGE THE BASIC SETTINGS, DEFAULTS ARE IN /LIB/SOKS.rb
42
- CUSTOMSETTINGS = {
43
- :root_directory => File.expand_path( File.dirname( __FILE__) ),
44
- # :name => 'test',
45
- # :description => 'A Soks Wiki',
46
- # :server_type => WEBrick::Daemon, # Uncomment if you wish to fork, only works on some OSs
47
- # :home_page => 'Home Page',
48
- :url => '<%= settings[:url] %>',
49
- :port => <%= settings[:port] %>,
50
- # :authenticators => authenticators
51
- }
52
-
53
- def self.start
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
- # EDIT THIS TO CHANGE THE HELPERS (Index, Recent changes etc)
56
- start_wiki( CUSTOMSETTINGS ) do |wiki, view|
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
- end
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
- if $0 == __FILE__ then
143
- StartSoks::start
144
- end
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.7
1
+ 1.0.0
@@ -1,5 +1,5 @@
1
1
  <span class='pagename'>
2
- <a href='<%= url pagename, "meta" %>'><%= pagename %></a>
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 pagename, "save" %>' >
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='<%= pagename %>'
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 pagename %>' >
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 pagename, 'delete' %>' >
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 pagename, "rollback" %>' >
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 pagename, "revisions" %>' accesskey="A" >Show <b>A</b>ll changes</a>.
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'><%= pagename %></span>
1
+ <span class='pagename'>Search Results</span>
2
2
 
3
- <h1>Results of Search for &#8220;<%= pagename %>&#8221;</h1>
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 &#8220;<%= query['regex'] %>&#8221;</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 pagename, "edit" %>' accesskey="E" >Create a page titled &#8220;<%= pagename %>&#8221;</a>
34
+ <a href='<%= url query['regex'], "edit" %>' accesskey="E" >Create a page titled &#8220;<%= query['regex'] %>&#8221;</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 << "&#8230;<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 pagename %>'><%= pagename %></a> <%= page.deleted? ? "(Deleted)" : '' %></span>
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('<','&lt;').gsub('>','&gt;') %></del></li>
28
+ <% when "+" %>
29
+ <li><%= change[1] %>. <%= change[2].gsub('<','&lt;').gsub('>','&gt;') %></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 pagename, "meta" %>'><%= pagename %></a> <%= page.deleted? ? "(Deleted)" : '' %></span>
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
- <% page.revisions.reverse_each do |revision| %>
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 pagename, "rollback" %>' >
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 pagename, "edit" %>' accesskey="R" >Return to editing</a>
28
- </div>
35
+ <a href='<%= url page.name, "edit" %>' accesskey="R" >Return to editing</a>
36
+ </div>