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.
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>