ruwiki 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.rubygems +86 -0
- data/Readme.tarfile +65 -0
- data/bin/ruwiki +58 -0
- data/bin/ruwiki.cgi +87 -0
- data/bin/ruwiki_convert +56 -0
- data/bin/ruwiki_service.rb +82 -0
- data/bin/ruwiki_servlet +53 -0
- data/contrib/enscript-token.rb +55 -0
- data/contrib/rublog_integrator.rb +68 -0
- data/data/Default/ProjectIndex.ruwiki +49 -0
- data/data/Ruwiki/Antispam.ruwiki +65 -0
- data/data/Ruwiki/BugTracking.ruwiki +33 -0
- data/data/Ruwiki/ChangeLog.ruwiki +102 -0
- data/data/Ruwiki/Configuring_Ruwiki.ruwiki +151 -0
- data/data/Ruwiki/Extending_Ruwiki.ruwiki +317 -0
- data/data/Ruwiki/LicenseAndAuthorInfo.ruwiki +30 -0
- data/data/Ruwiki/ProjectIndex.ruwiki +84 -0
- data/data/Ruwiki/Roadmap.ruwiki +225 -0
- data/data/Ruwiki/RuwikiTemplatingLibrary.ruwiki +156 -0
- data/data/Ruwiki/RuwikiUtilities.ruwiki +157 -0
- data/data/Ruwiki/SandBox.ruwiki +9 -0
- data/data/Ruwiki/To_Do.ruwiki +51 -0
- data/data/Ruwiki/TroubleShooting.ruwiki +33 -0
- data/data/Ruwiki/WikiFeatures.ruwiki +17 -0
- data/data/Ruwiki/WikiMarkup.ruwiki +261 -0
- data/data/Tutorial/AddingPages.ruwiki +16 -0
- data/data/Tutorial/AddingProjects.ruwiki +16 -0
- data/data/Tutorial/ProjectIndex.ruwiki +11 -0
- data/data/Tutorial/SandBox.ruwiki +9 -0
- data/data/agents.banned +60 -0
- data/data/agents.readonly +321 -0
- data/data/hostip.banned +30 -0
- data/data/hostip.readonly +28 -0
- data/lib/ruwiki.rb +622 -0
- data/lib/ruwiki/auth.rb +56 -0
- data/lib/ruwiki/auth/gforge.rb +73 -0
- data/lib/ruwiki/backend.rb +318 -0
- data/lib/ruwiki/backend/flatfiles.rb +217 -0
- data/lib/ruwiki/config.rb +244 -0
- data/lib/ruwiki/exportable.rb +192 -0
- data/lib/ruwiki/handler.rb +342 -0
- data/lib/ruwiki/lang/de.rb +339 -0
- data/lib/ruwiki/lang/en.rb +334 -0
- data/lib/ruwiki/lang/es.rb +339 -0
- data/lib/ruwiki/page.rb +262 -0
- data/lib/ruwiki/servlet.rb +38 -0
- data/lib/ruwiki/template.rb +553 -0
- data/lib/ruwiki/utils.rb +24 -0
- data/lib/ruwiki/utils/command.rb +102 -0
- data/lib/ruwiki/utils/converter.rb +297 -0
- data/lib/ruwiki/utils/manager.rb +639 -0
- data/lib/ruwiki/utils/servletrunner.rb +295 -0
- data/lib/ruwiki/wiki.rb +147 -0
- data/lib/ruwiki/wiki/tokens.rb +136 -0
- data/lib/ruwiki/wiki/tokens/00default.rb +211 -0
- data/lib/ruwiki/wiki/tokens/01wikilinks.rb +166 -0
- data/lib/ruwiki/wiki/tokens/02actions.rb +63 -0
- data/lib/ruwiki/wiki/tokens/abbreviations.rb +40 -0
- data/lib/ruwiki/wiki/tokens/calendar.rb +147 -0
- data/lib/ruwiki/wiki/tokens/headings.rb +43 -0
- data/lib/ruwiki/wiki/tokens/lists.rb +112 -0
- data/lib/ruwiki/wiki/tokens/rubylists.rb +48 -0
- data/ruwiki.conf +22 -0
- data/ruwiki.pkg +0 -0
- data/templates/default/body.tmpl +19 -0
- data/templates/default/content.tmpl +7 -0
- data/templates/default/controls.tmpl +23 -0
- data/templates/default/edit.tmpl +27 -0
- data/templates/default/error.tmpl +14 -0
- data/templates/default/footer.tmpl +23 -0
- data/templates/default/ruwiki.css +297 -0
- data/templates/default/save.tmpl +8 -0
- data/templates/sidebar/body.tmpl +19 -0
- data/templates/sidebar/content.tmpl +8 -0
- data/templates/sidebar/controls.tmpl +8 -0
- data/templates/sidebar/edit.tmpl +27 -0
- data/templates/sidebar/error.tmpl +13 -0
- data/templates/sidebar/footer.tmpl +22 -0
- data/templates/sidebar/ruwiki.css +347 -0
- data/templates/sidebar/save.tmpl +10 -0
- data/templates/simple/body.tmpl +13 -0
- data/templates/simple/content.tmpl +7 -0
- data/templates/simple/controls.tmpl +8 -0
- data/templates/simple/edit.tmpl +25 -0
- data/templates/simple/error.tmpl +10 -0
- data/templates/simple/footer.tmpl +10 -0
- data/templates/simple/ruwiki.css +192 -0
- data/templates/simple/save.tmpl +8 -0
- data/tests/harness.rb +52 -0
- data/tests/tc_backend_flatfile.rb +103 -0
- data/tests/tc_bugs.rb +74 -0
- data/tests/tc_exportable.rb +64 -0
- data/tests/tc_template.rb +145 -0
- data/tests/tc_tokens.rb +335 -0
- data/tests/testall.rb +20 -0
- metadata +182 -0
@@ -0,0 +1,317 @@
|
|
1
|
+
page!content: = Extending Ruwiki 0.9.0
|
2
|
+
Ruwiki is relatively easily extended to support new features. There are
|
3
|
+
four primary ways in which Ruwiki can be extended or modified by the
|
4
|
+
end user: templates, translating Ruwiki messages and labels, markup
|
5
|
+
tokens, and creating new backends.
|
6
|
+
|
7
|
+
== Templates
|
8
|
+
Templating is done with a heavily modified version of the \RDoc
|
9
|
+
template.rb library included in the distribution of Ruwiki. The
|
10
|
+
templating library allows for nested templates, and this is used
|
11
|
+
extensively in Ruwiki. This library is documented in
|
12
|
+
RuwikiTemplatingLibrary.
|
13
|
+
|
14
|
+
There are four major templates: content, edit, save, and error. Each of
|
15
|
+
these has a slightly different combination of template files used, and
|
16
|
+
this means that there are different sets of variables available.
|
17
|
+
|
18
|
+
The major templates are “composite templates” that are
|
19
|
+
defined as follows:
|
20
|
+
; content or search : body.tmpl, content.tmpl, controls.tmpl, footer.tmpl
|
21
|
+
; edit or preview : body.tmpl, edit.tmpl
|
22
|
+
; save : body.tmpl, save.tmpl, controls.tmpl, footer.tmpl
|
23
|
+
; error : body.tmpl, error.tmpl
|
24
|
+
|
25
|
+
=== Common Variables
|
26
|
+
The following template variables are presented for all composite
|
27
|
+
templates.
|
28
|
+
; <tt>%css_link%</tt> : The contents of the CSS file for the template set.
|
29
|
+
; <tt>%home_link%</tt> : A link to the root page of the Wiki.
|
30
|
+
; <tt>%editable%</tt> : A boolean value to mark the page as editable or not. Used in a conditional block in the templates.
|
31
|
+
; <tt>%cgi_url%</tt> : The URL for the Wiki.
|
32
|
+
; <tt>%content%</tt> : The formatted content of the current page.
|
33
|
+
; <tt>%page_project%</tt> : The project for the current page.
|
34
|
+
; <tt>%page_raw_topic%</tt> : The topic for the current page, escaped for safe transmission over the web.
|
35
|
+
; <tt>%page_topic%</tt> : The printable topic for the current page.
|
36
|
+
; <tt>%url_project%</tt> : The URL to the current page’s project.
|
37
|
+
; <tt>%url_topic_search%</tt> : The URL to search for the current topic in the current project.
|
38
|
+
; <tt>%link_topic_search%</tt> : A link to the current topic search.
|
39
|
+
|
40
|
+
=== Variables for :content, :save, :search, :edit, :preview
|
41
|
+
; <tt>%message%</tt> : A message presented at the top of the Wiki when Ruwiki needs to inform the user of something that is not an error.
|
42
|
+
|
43
|
+
=== Variables for :content, :save, :search
|
44
|
+
; <tt>%wiki_title%</tt> : The title of the Wiki.
|
45
|
+
; <tt>%label_topic_or_search%</tt> : Either <tt>#topic#</tt> or <tt>#search#</tt>.
|
46
|
+
; <tt>%page_topic_name%</tt> : The same as <tt>%page_topic%</tt>.
|
47
|
+
|
48
|
+
=== Variables for :edit, :preview
|
49
|
+
; <tt>%wiki_title%</tt> : The title of the Wiki with a tag to indicate that the page is being edited.
|
50
|
+
; <tt>%page_content%</tt> : The content of the page.
|
51
|
+
; <tt>%page_version%</tt> : The current version number of the page.
|
52
|
+
; <tt>%unedited_page_content%</tt> : The formatted, unedited content of the page.
|
53
|
+
; <tt>%pre_page_content%</tt> : A Web-escaped form of the page content.
|
54
|
+
; <tt>%edit_comment%</tt> : The current edit comment.
|
55
|
+
|
56
|
+
=== Variables for :error
|
57
|
+
; <tt>%wiki_title%</tt> : The title of the Wiki with an error message.
|
58
|
+
; <tt>%name%</tt> : The name of the error.
|
59
|
+
; <tt>%backtrace%</tt> : The backtrace of the error.
|
60
|
+
; <tt>%backtrace_email%</tt> : The backtrace of the error formatted for sending by email.
|
61
|
+
; <tt>%webmaster%</tt> : The email address of the webmaster.
|
62
|
+
|
63
|
+
== Translating Ruwiki Messages
|
64
|
+
: NOTE: The mechanism for specifying language may be changed in a
|
65
|
+
: future version of Ruwiki, although the internationalisation mechanism
|
66
|
+
: will not be changing.
|
67
|
+
|
68
|
+
Ruwiki is internationalized. This method sets the Ruwiki error messages
|
69
|
+
(and a few other messages) to the specified language Module. The
|
70
|
+
language Module must have a constant Hash called <tt>Message</tt>
|
71
|
+
containing a set of symbols and localized versions of the messages
|
72
|
+
associated with them.
|
73
|
+
|
74
|
+
If the file <em>ruwiki/lang/es.rb</em> contains the module
|
75
|
+
<tt>Ruwiki::Lang::ES</tt>, the messages for RSS could be localized to
|
76
|
+
Spanish thus:
|
77
|
+
|
78
|
+
require 'ruwiki/lang/es'
|
79
|
+
...
|
80
|
+
wiki.config.language = Ruwiki::Lang::ES
|
81
|
+
|
82
|
+
Localization is currently per wiki instance. In a servlet environment,
|
83
|
+
this may mean that only a single language is recognised.
|
84
|
+
|
85
|
+
It is recommended that the hash be created with a default proc that
|
86
|
+
reports unknown message keys.
|
87
|
+
|
88
|
+
Message = Hash.new { |h, k| "Language ERROR: Unknown message key #{k.inspect}." }
|
89
|
+
|
90
|
+
== Extending Ruwiki Markup
|
91
|
+
|
92
|
+
: <strong>WARNING:</strong> These \APIs will change in Ruwiki 0.9.0,
|
93
|
+
: replacing the instance variables @project, @backend, and @script with
|
94
|
+
: a Handler object. There may be other changes as well.
|
95
|
+
|
96
|
+
Ruwiki’s WikiMarkup can be extended by creating a new
|
97
|
+
Ruwiki::Wiki::Token. Tokens will be automatically loaded if they are
|
98
|
+
placed in <em>ruwiki/wiki/tokens</em>.
|
99
|
+
|
100
|
+
It is recommended that new tokens be added to the test cases in
|
101
|
+
<tt>tests/tc_tokens.rb</tt>.
|
102
|
+
|
103
|
+
The following Ruwiki::Wiki::Token class will convert strings in the
|
104
|
+
forms of \[ruby-talk:12345] to links.
|
105
|
+
|
106
|
+
class RubyTalkLinks < Ruwiki::Wiki::Token
|
107
|
+
def self.rank
|
108
|
+
2
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.regexp
|
112
|
+
%r{\[ruby-talk:(\d+)\]}
|
113
|
+
end
|
114
|
+
|
115
|
+
def replace
|
116
|
+
lm = @match.captures[0]
|
117
|
+
%Q(<a class="rw_extlink" href="http://www.ruby-talk.org/#{lm}">#{@match[0]}</a>)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
=== Known Instance Variables
|
122
|
+
==== @match
|
123
|
+
The match data for this token instance is is kept in @match. This is
|
124
|
+
what will be used in #replace and #restore.
|
125
|
+
|
126
|
+
==== @project
|
127
|
+
The project being processed.
|
128
|
+
|
129
|
+
==== @backend
|
130
|
+
The Backend for the wiki. If you are using Ruwiki tokenizers outside of
|
131
|
+
Ruwiki, this does not need to be a \BackendDelegator, but can be the
|
132
|
+
direct Backend (which expects less information).
|
133
|
+
|
134
|
+
==== @script
|
135
|
+
The URI to the script.
|
136
|
+
|
137
|
+
==== @message
|
138
|
+
The message hash for displaying localised messages.
|
139
|
+
|
140
|
+
==== @title
|
141
|
+
The title of the wiki instance.
|
142
|
+
|
143
|
+
=== Required Methods
|
144
|
+
==== ::regexp
|
145
|
+
Ruwiki tokens are matched only through regular expression matches. As
|
146
|
+
shown in the example above, the regular expression for ruby-talk
|
147
|
+
mailing list posts is <tt>%r{\[ruby-\talk:(\d+)\]}</tt>. The purpose of
|
148
|
+
the ::regexp method is to return the regexp for matching.
|
149
|
+
|
150
|
+
For most inline matches, Ruwiki will ensure that the escape character
|
151
|
+
(\) works automatically. For whole-line matches, it is necessary to
|
152
|
+
match the escape character manually and provide a #restore method.
|
153
|
+
|
154
|
+
As an example, the \HRule class implements these methods.
|
155
|
+
|
156
|
+
def self.regexp
|
157
|
+
%r|^\\?-{4,}|
|
158
|
+
end
|
159
|
+
|
160
|
+
def restore
|
161
|
+
@match[0][1 .. -1]
|
162
|
+
end
|
163
|
+
|
164
|
+
It may also be necessary to match escapes manually on inline matches
|
165
|
+
that must be along word boundaries where the regular expression
|
166
|
+
includes characters that normally match word boundaries. The project
|
167
|
+
index match (e.g., \::Ruwiki) regular expression does this
|
168
|
+
<tt>%r{(\B|\\)::([A-Z][a-z]+)}</tt>.
|
169
|
+
|
170
|
+
==== #replace
|
171
|
+
This returns the formatted token. In the \RubyTalkLinks class above,
|
172
|
+
the matched regular expression will be replaced with a hyperlink. The
|
173
|
+
text of the hyperlink will be the matched text; the target of the
|
174
|
+
hyperlink will include the first captured value.
|
175
|
+
|
176
|
+
def replace
|
177
|
+
lm = @match.captures[0]
|
178
|
+
%Q(<a class="rw_extlink" href="http://www.ruby-talk.org/#{lm}">#{@match[0]}</a>)
|
179
|
+
end
|
180
|
+
|
181
|
+
=== Optional Methods
|
182
|
+
==== ::rank
|
183
|
+
By default, a token will be processed in the order created. Tokens may
|
184
|
+
be given a specific rank to ensure that they are processed in a
|
185
|
+
particular order. The default rank is <tt>9999</tt>.
|
186
|
+
|
187
|
+
==== #restore
|
188
|
+
Restores the token without replacement. Implements the results of the
|
189
|
+
escape character. Each Token class is responsible for its own
|
190
|
+
restoration. As noted in #regexp, whole-line tokens are most likely to
|
191
|
+
need a #restore implementation.
|
192
|
+
|
193
|
+
==== ::post_replace
|
194
|
+
Performs any necessary massaging of the data. The Lists token uses this
|
195
|
+
to ensure that lists are collapsed together; the Paragraph token uses
|
196
|
+
this to ensure that there are no empty paragraph tag pairs
|
197
|
+
(<p></p>).
|
198
|
+
|
199
|
+
: <strong>Note:</strong> This has been changed from Ruwiki 0.6.x.
|
200
|
+
: Plugins written for the Ruwiki 0.6.x Token API will need to be
|
201
|
+
: modified so that this is defined as:
|
202
|
+
|
203
|
+
def self.post_replace
|
204
|
+
...
|
205
|
+
end
|
206
|
+
|
207
|
+
: as opposed to:
|
208
|
+
|
209
|
+
def post_replace
|
210
|
+
...
|
211
|
+
end
|
212
|
+
|
213
|
+
== Extending Ruwiki Backends
|
214
|
+
Ruwiki can support varying backends, as the backend interface has been
|
215
|
+
abstracted completely from the data store. The backend
|
216
|
+
<strong>must</strong>:
|
217
|
+
|
218
|
+
# reside in <em>ruwiki/backends/</em> as <em>backend_name</em>.rb.
|
219
|
+
# be registered by adding the <em>backend_name</em> as a symbol (e.g., :<em>backend_name</em>) to Ruwiki::KNOWN_BACKENDS.
|
220
|
+
# inherit from Ruwiki::Backend.
|
221
|
+
# exist as Ruwiki::Backend::<em>\Backend_name</em>.
|
222
|
+
|
223
|
+
=== Required Methods
|
224
|
+
==== #initialize(storage_options)
|
225
|
+
The backend may only obtain its configuration information from an
|
226
|
+
option hash provided by the \BackendDelegate. This is obtained from
|
227
|
+
<tt>wiki.config.options[backend]</tt>. If a configuration error is
|
228
|
+
detected during initialization, the backend should raise the
|
229
|
+
\Ruwiki::Backend exception class \BackendError. This would be done
|
230
|
+
with:
|
231
|
+
|
232
|
+
raise Ruwiki::Backend::BackendError.new([:message_symbol, [message_parameters]])
|
233
|
+
|
234
|
+
Backend writers should add appropriate messages to the
|
235
|
+
<em>lang/en.rb</em> at a minimum. The \BackendDelegator will detect
|
236
|
+
this and report the results appropriately.
|
237
|
+
|
238
|
+
==== #load(topic, project)
|
239
|
+
The backend will be provided the name of the topic and project. It must
|
240
|
+
return the selected page as a hash of hashes. The hash must match that
|
241
|
+
of \Ruwiki::Page#export. It will be passed as the parameter to
|
242
|
+
\Ruwiki:::Page.new.
|
243
|
+
|
244
|
+
==== #store(page)
|
245
|
+
This method must store the provided Ruwiki::Page object. Current Ruwiki
|
246
|
+
backend implementations store the Ruwiki::Page#export hash. This method
|
247
|
+
is responsible for calling the private method Backend#make_diff and
|
248
|
+
adding the result to the list of diffs for the page.
|
249
|
+
|
250
|
+
===== Backend#make_diff(oldpage, newpage)
|
251
|
+
This method expects two page objects, or their Ruwiki::Page#export
|
252
|
+
representation. It will return a hash representing the difference set
|
253
|
+
between the two pages.
|
254
|
+
|
255
|
+
==== #obtain_lock(page, time, expire, address = 'UKNOWN')
|
256
|
+
Obtains an exclusive lock on the page. The \BackendDelegator is called
|
257
|
+
with the page, the address, and a timeout which is provided. The time
|
258
|
+
is provided by the call to the BackendDelegate, and the expire is also
|
259
|
+
provided by the call to the BackendDelegate which is given a timeout
|
260
|
+
value (by default 600 seconds). If the lock is still in effect, a
|
261
|
+
second call to #obtain_lock should renew the timeout on the lock.
|
262
|
+
|
263
|
+
==== #release_lock(page, address = 'UNKNOWN')
|
264
|
+
Releases the exclusive lock on the page. The lock should not be released
|
265
|
+
unless the IP address on the lock is the same or the lock has expired.
|
266
|
+
|
267
|
+
==== #project_exists?(project)
|
268
|
+
Returns <tt>true</tt> if the project exists.
|
269
|
+
|
270
|
+
==== #page_exists?(topic, project = 'Default')
|
271
|
+
Returns <tt>true</tt> if the page exists within the specified project.
|
272
|
+
|
273
|
+
==== #create_project(project)
|
274
|
+
Attempts to create the project.
|
275
|
+
|
276
|
+
==== #search_project(project, search_string)
|
277
|
+
String search all topic names and content in a project and return a
|
278
|
+
hash of topic hits:
|
279
|
+
|
280
|
+
topicname => hits
|
281
|
+
|
282
|
+
==== #list_projects
|
283
|
+
Return an array of all projects.
|
284
|
+
|
285
|
+
==== #list_topics(project)
|
286
|
+
Return an array of all topics within the project.
|
287
|
+
|
288
|
+
=== Future Methods
|
289
|
+
Note that these methods are currently optional (they are not yet called
|
290
|
+
from Ruwiki), but will become required moving forward as the functions
|
291
|
+
are implemented in Ruwiki.
|
292
|
+
|
293
|
+
==== #destroy(page)
|
294
|
+
Removes the page from the wiki. This should <strong>not</strong> remove
|
295
|
+
the change history of the topic (in the event that the page has been
|
296
|
+
removed maliciously). There will be a separate method to remove the
|
297
|
+
page history.
|
298
|
+
|
299
|
+
==== #destroy_project(project)
|
300
|
+
Attempts to destroy the project.
|
301
|
+
|
302
|
+
=== Optional Methods
|
303
|
+
These methods are completely optional. They are guarded in the
|
304
|
+
\BackendDelegate by a call to #respond_to?().
|
305
|
+
|
306
|
+
==== #global_search(search_string)
|
307
|
+
The global search in the backend delegate is by default implemented as
|
308
|
+
a looping search through all projects. A backend may have a more
|
309
|
+
efficient backend global search mechanism. If the backend responds to
|
310
|
+
#global_search, then the \BackendDelegate will use this method.
|
311
|
+
properties!project: Ruwiki
|
312
|
+
properties!title: Extending_Ruwiki
|
313
|
+
properties!topic: Extending_Ruwiki
|
314
|
+
properties!version: 1
|
315
|
+
ruwiki!content-version: 2
|
316
|
+
ruwiki!version: 0.9.0
|
317
|
+
properties!editable: false
|
@@ -0,0 +1,30 @@
|
|
1
|
+
page!content: = Ruwiki Licence
|
2
|
+
Ruwiki is copyright © 2002 - 2004 [mailto:alan@digikata.com Alan
|
3
|
+
Chen] and [mailto:ruwiki@halostatue.ca Austin Ziegler].
|
4
|
+
|
5
|
+
Ruwiki is provided free of use and without any warranty express or
|
6
|
+
implied. You may use, distribute, or modify Ruwiki under the conditions
|
7
|
+
of Ruby’s licence or the [http://www.gnu.org/copyleft/gpl.html
|
8
|
+
GNU General Public Licence].
|
9
|
+
|
10
|
+
* Ruwiki includes a modified version of rdoc/template.rb originally by Dave Thomas for use in \RDoc.
|
11
|
+
|
12
|
+
== Translations
|
13
|
+
* Translation to German by [mailto:chneukirchen@yahoo.de Christian Neukirchen] on 2003.10.22, with corrections by Mauricio Fernáez. Note that the initial template translations (./templates/de/) were done via \AltaVista Babelfish and should not be blamed on Christian.
|
14
|
+
* Translation to Spanish by [mailto:batsman.geo@yahoo.com Mauricio Fernández] on 2003.10.22. Note that the initial template translations (./templates/es/) were done via \AltaVista Babelfish and should not be blamed on Mauricio.
|
15
|
+
|
16
|
+
== Austin’s Other Projects
|
17
|
+
Austin has also released several other projects available on the RAA that you may be interested in:
|
18
|
+
* [http://raa.ruby-lang.org/list.rhtml?name=mime-types MIME::Types], \RubyForge [http://rubyforge.org/projects/mime-types project].
|
19
|
+
* [http://raa.ruby-lang.org/list.rhtml?name=pdf-writer PDF::Writer], \RubyForge [http://rubyforge.org/projects/ruby-pdf project].
|
20
|
+
* [http://raa.ruby-lang.org/list.rhtml?name=text-format Text::Format], \RubyForge [http://rubyforge.org/projects/text-format project].
|
21
|
+
* [http://raa.ruby-lang.org/list.rhtml?name=trans-simple Transaction::Simple], \RubyForge [http://rubyforge.org/projects/trans-simple project].
|
22
|
+
* [http://raa.ruby-lang.org/list.rhtml?name=uninheritable Uninheritable], Transaction::Simple’s \RubyForge [http://rubyforge.org/projects/trans-simple project].
|
23
|
+
* [http://raa.ruby-lang.org/list.rhtml?name=diff-lcs Diff::LCS], Ruwiki’s \RubyForge [http://rubyforge.org/projects/ruwiki project].
|
24
|
+
properties!project: Ruwiki
|
25
|
+
properties!title: LicenseAndAuthorInfo
|
26
|
+
properties!topic: LicenseAndAuthorInfo
|
27
|
+
properties!version: 1
|
28
|
+
ruwiki!content-version: 2
|
29
|
+
ruwiki!version: 0.9.0
|
30
|
+
properties!editable: false
|
@@ -0,0 +1,84 @@
|
|
1
|
+
page!content: = Ruwiki 0.9.0
|
2
|
+
This is the \ProjectIndex page for Ruwiki. For any given project, the
|
3
|
+
\ProjectIndex topic will be the default topic for plain project links.
|
4
|
+
|
5
|
+
== Features and Information
|
6
|
+
* This wiki supports a variety of WikiFeatures that you may be interested in. The rules for WikiMarkup are similar to some other wikis, but there are a few unique markup capabilities in Ruwiki.
|
7
|
+
* Configuring_Ruwiki is simple.
|
8
|
+
* Extending_Ruwiki is almost as simple.
|
9
|
+
* What you need to know for using Ruwiki's [[Antispam]] capabilities.
|
10
|
+
* Who wrote Ruwiki? Read the LicenseAndAuthorInfo.
|
11
|
+
|
12
|
+
== Requirements
|
13
|
+
Ruwiki currently requires Ruby 1.8, Diff::LCS 1.1.2 and
|
14
|
+
Archive::Tar::Minitar 0.5.1. These packages are included in the
|
15
|
+
<em>packages/</em> directory in the
|
16
|
+
<code>ruwiki-0.9.0-full.tar.gz</code> form of the distribution.
|
17
|
+
|
18
|
+
The YAML backend requires Ruby 1.8.2 preview 3 or later.
|
19
|
+
|
20
|
+
== Upgrading
|
21
|
+
Ruwiki 0.9.0 has a flatfile format that is incompatible with versions
|
22
|
+
of Ruwiki older than Ruwiki 0.8.0. If you are upgrading from one of
|
23
|
+
these versions, you must use the bin/ruwiki_convert. The simple case
|
24
|
+
will be (assuming that your data files are in ./data):
|
25
|
+
|
26
|
+
% ruwiki_convert ./data
|
27
|
+
|
28
|
+
The ruwiki_convert utility is automatically installed by \RubyGems and
|
29
|
+
RPA. See RuwikiUtilities for more information. Note that this utility
|
30
|
+
will probably be incorporated into the main Ruwiki utility in a future
|
31
|
+
version.
|
32
|
+
|
33
|
+
== Getting Started
|
34
|
+
There are some differences between the startup of <tt>.tar.gz</tt>,
|
35
|
+
\RubyGems, and RPA installations of Ruwiki.
|
36
|
+
|
37
|
+
=== \QuickStart (Read-only: \RubyGem and RPA Installation Only)
|
38
|
+
Run:
|
39
|
+
% ruwiki_servlet --central
|
40
|
+
|
41
|
+
Point your web browser to \http://localhost:8808/.
|
42
|
+
|
43
|
+
=== \QuickStart (CGI)
|
44
|
+
# Install the Ruwiki CGI (<tt>ruwiki.cgi</tt>) program in a place where your webserver can execute it.
|
45
|
+
#* <strong>\RubyGem:</strong> <tt>ruwiki install cgi,data --to <em>directory</em></tt>
|
46
|
+
#* <strong><tt>.tar.gz</tt>:</strong> Extract the Ruwiki directory to that directory. <tt>cp bin/ruwiki.cgi .</tt> <em>or</em> <tt>copy bin\ruwiki.cgi .</tt>
|
47
|
+
# Point your web browser to the appropriate URL.
|
48
|
+
|
49
|
+
=== \QuickStart (\WEBrick)
|
50
|
+
# Install the Ruwiki servlet or data.
|
51
|
+
#* <strong>\RubyGem:</strong> <tt>ruwiki install data --to <em>directory</em></tt> <em>or</em> <tt>ruwiki install servlet,data --to <em>directory</em></tt>
|
52
|
+
#* <strong><tt>.tar.gz</tt>:</strong> Extract the Ruwiki directory.
|
53
|
+
# Run <tt>ruwiki_servlet</tt>. Under the <tt>.tar.gz</tt>, this would be <tt>bin/ruwiki_servlet</tt> <em>or</em> <tt>ruby bin\ruwiki_servlet</tt>
|
54
|
+
# Point your web browser to \http://localhost:8808/.
|
55
|
+
|
56
|
+
== Support
|
57
|
+
* Troubles with Ruwiki? See TroubleShooting for some suggestions. Have a new problem? Add it to the main [http://ruwiki.rubyforge.org/ruwiki.cgi/Ruwiki/TroubleShooting TroubleShooting] page.
|
58
|
+
* Subscribe to [http://rubyforge.org/mailman/listinfo/ruwiki-discuss ruwiki-discuss] ([http://rubyforge.org/pipermail/ruwiki-discuss/ archives]).
|
59
|
+
* You can also use the [http://rubyforge.org/forum/?group_id=84 Ruwiki Public Forum] or the on \RubyForge.
|
60
|
+
|
61
|
+
== Tracking Ruwiki Development
|
62
|
+
The development progress of Ruwiki is kept primarily in the wiki
|
63
|
+
itself, but the services of [http://rubyforge.org RubyForge] are used
|
64
|
+
as well.
|
65
|
+
* The BugTracking page in Ruwiki keeps track of open and closed bugs in Ruwiki. Bugs can also be found in the \RubyForge [http://rubyforge.org/tracker/?atid=407&group_id=84&func=browse bug tracker] and [http://rubyforge.org/tracker/?atid=408&group_id=84&func=browse Support Requests].
|
66
|
+
* The To_Do list keeps track of major development goals for Ruwiki. Items for this list can be found on \RubyForge in [http://rubyforge.org/tracker/?atid=410&group_id=84&func=browse Feature Requests] and [http://rubyforge.org/tracker/?atid=409&group_id=84&func=browse Patches].
|
67
|
+
* There is a mailing list to track CVS changes: [http://rubyforge.org/mailman/listinfo/ruwiki-checkin ruwiki-checkin] ([http://rubyforge.org/pipermail/ruwiki-checkin/ archives]).
|
68
|
+
|
69
|
+
== Different Features?
|
70
|
+
If this wiki doesn’t have the right combination of features, (or if it
|
71
|
+
just doesn’t feel right) try these other Ruby-based Wikis:
|
72
|
+
|
73
|
+
* [http://pimwiki.rubyforge.org/ PIMWiki]
|
74
|
+
* [http://instiki.rubyforge.org/ Instiki]
|
75
|
+
* [http://www.walrus-ruby.org/amrita/cgi-bin/aswiki/aswiki.cgi Amrita Wiki]
|
76
|
+
* [http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=top RWiki]
|
77
|
+
* [http://www.xpsd.com/MiniRubyWiki MiniRubyWiki]
|
78
|
+
properties!project: Ruwiki
|
79
|
+
properties!title: ProjectIndex
|
80
|
+
properties!topic: ProjectIndex
|
81
|
+
properties!version: 1
|
82
|
+
ruwiki!content-version: 2
|
83
|
+
ruwiki!version: 0.9.0
|
84
|
+
properties!editable: false
|
@@ -0,0 +1,225 @@
|
|
1
|
+
page!content: = Ruwiki 0.9.0: The Road Ahead
|
2
|
+
This roadmap is accurate as of the release of 0.9.0.
|
3
|
+
|
4
|
+
What lies ahead for Ruwiki? The To_Do list will give a detailed list
|
5
|
+
of what is to follow, but this list is not the roadmap. There is no
|
6
|
+
clear indication of the reason for — and in some cases, the
|
7
|
+
meaning of — the items on the list. The intention of this
|
8
|
+
document is to expand on that list. As items are completed, they will
|
9
|
+
be removed from this document.
|
10
|
+
|
11
|
+
== A Note About Targets
|
12
|
+
Ruwiki development is not proceeding as quickly as I would prefer, but
|
13
|
+
it is continuing steadily. I am at times choosing to delay releases
|
14
|
+
and bypass some versions because there are other pressing concerns; I
|
15
|
+
am definitely aiming for quality here, not for timeliness.
|
16
|
+
|
17
|
+
== Development Inputs
|
18
|
+
The primary driver of development on Ruwiki is the needs of a few
|
19
|
+
groups of people. First, both Alan and Austin use or will use Ruwiki
|
20
|
+
at work. There are particular needs that both have. Austin will be
|
21
|
+
replacing an installation of \PhpWiki with an installation of Ruwiki
|
22
|
+
sometime in early 2005.
|
23
|
+
|
24
|
+
Second, [http://www.rubygarden.org/ruby RubyGarden], and
|
25
|
+
[http://www.rubyforge.org RubyForge], and the
|
26
|
+
[http://rpa.rubygarden.org <acronym title="Ruby Production Archive">RPA</acronym>]
|
27
|
+
have expressed an intention to replace the Perl-based \UseMod wiki
|
28
|
+
with a Ruby-based wiki. The popular and easy-to-use Instiki
|
29
|
+
(“there is no step 3”) is not an ideal choice for either
|
30
|
+
because they either require or prefer a CGI-based wiki. Ruwiki has the
|
31
|
+
desired level of performance and implemenation simplicity that
|
32
|
+
impresses both groups, and it is the current preferred choice. Thus,
|
33
|
+
the needs of both websites factor highly into the goals for Ruwiki.
|
34
|
+
|
35
|
+
Third, Austin gave a talk on Ruwiki at \RubyConf 2004. Many of the
|
36
|
+
features in the current release come from a development effort leading
|
37
|
+
up to the talk and in the weeks following.
|
38
|
+
|
39
|
+
Last, and certainly not least, feature requests and bug reports are a
|
40
|
+
factor. One of the things that changed in Ruwiki 0.8.0 was the look
|
41
|
+
and feel; admittedly, the look and feel in earlier versions was a bit
|
42
|
+
garish, designed to fit in with a particular website more than be a
|
43
|
+
general wiki theme. Users complained, and we changed this. The
|
44
|
+
continual spam defacement of the \RubyGarden wiki suggested several
|
45
|
+
possible improvements that could be made in Ruwiki to fight wiki spam;
|
46
|
+
initial work has been implemented in Ruwiki 0.9.0 and more work
|
47
|
+
remains. Additionally, Ruwiki is the first wiki with built-in
|
48
|
+
deployment support for package management systems (such as \RubyGems
|
49
|
+
and rpa-base), although Instiki has been modified for RPA by the RPA
|
50
|
+
team to support limited installation in RPA locations.
|
51
|
+
|
52
|
+
== Ruwiki 0.10.0: “Are You Being Served?”
|
53
|
+
Ruwiki 0.8.0 introduced an incompatible change in the way that page
|
54
|
+
diffs were stored, so users were advised to remove any existing .rdiff
|
55
|
+
files. This isn’t as problematic as it may sound, as until
|
56
|
+
0.10.0, there is no way to actually view the page diffs from Ruwiki
|
57
|
+
itself.
|
58
|
+
|
59
|
+
In Ruwiki 0.7.0, a new token was introduced: %calendar(). The concept
|
60
|
+
here is a sound one that can be extended to make token addition
|
61
|
+
easier. Currently, it is necessary for token writers to create their
|
62
|
+
own regular expressions. The “function token” will be
|
63
|
+
added — although the form may not be
|
64
|
+
“%<em>function-name</em>” — that will work with
|
65
|
+
either a line replacement or a word replacement so that the regular
|
66
|
+
expression does not need to be written. Tests for the replacement will
|
67
|
+
still need to be written, but standardizing new custom tokens will be
|
68
|
+
a good thing.
|
69
|
+
|
70
|
+
Chad Fowler’s port of \RubLog’s vector search will
|
71
|
+
probably be added to this version.
|
72
|
+
|
73
|
+
The presence of static HTML content (headers and footers) per page has
|
74
|
+
been accounted for in Ruwiki 0.8.0, but it will not be displayed.
|
75
|
+
Further, there is currently no way to specify or display static
|
76
|
+
content for the wiki or the project. (A related problem here is that
|
77
|
+
projects do not have any properties. This will become important as
|
78
|
+
projects should be able to be marked private within a wiki in the
|
79
|
+
future.)
|
80
|
+
|
81
|
+
The purpose of the \WikiWikiWeb is to provide a collaborative,
|
82
|
+
community knowledge editing environment. Unfortunately, the pondscum
|
83
|
+
known as spammers have figured out that the \WikiWikiWeb provides a
|
84
|
+
positive Google \PageRank, and having their links on our Wikis is
|
85
|
+
benefits them. Just as they don’t care about filling our
|
86
|
+
mailboxes with junk, they don’t care about defacing our
|
87
|
+
community knowledge. Ruwiki 0.10.0 provides additional antispam
|
88
|
+
defences.
|
89
|
+
|
90
|
+
The \RecentChanges mechanism will be updated to make it possible to
|
91
|
+
see the \GlobalRecentChanges list.
|
92
|
+
|
93
|
+
The most significant change in Ruwiki 0.10.0 will be the modification
|
94
|
+
of the request pipeline. This will not be visible to the end user, but
|
95
|
+
it will be significant to users who wish to extend Ruwiki. Currently,
|
96
|
+
Ruwiki processes all commands in ruwiki.rb. In Ruwiki 0.10.0, this
|
97
|
+
will be changed to a dispatch mechanism, where Action objects are
|
98
|
+
introduced, and ruwiki.rb dispatches requests to Action objects.
|
99
|
+
|
100
|
+
<table summary="Pipeline" style="border: 1px solid black"><tr><td>
|
101
|
+
+---------+ +-------------------+
|
102
|
+
| Request |--------->| Authorize Request |
|
103
|
+
+---------+ +-------------------+
|
104
|
+
|
|
105
|
+
v
|
106
|
+
+-------------------+
|
107
|
+
| Configure Ruwiki |
|
108
|
+
+-------------------+
|
109
|
+
|
|
110
|
+
v
|
111
|
+
+-------------------+
|
112
|
+
| Parse Request |
|
113
|
+
+-------------------+
|
114
|
+
|
|
115
|
+
v
|
116
|
+
+-------------------+
|
117
|
+
| Perform Action |
|
118
|
+
+-------------------+
|
119
|
+
|
|
120
|
+
v
|
121
|
+
+-------------------+
|
122
|
+
| Prepare Response |
|
123
|
+
+-------------------+
|
124
|
+
|
|
125
|
+
v
|
126
|
+
+--------+ +----+--------------+
|
127
|
+
| Page |<----------| Send Page |
|
128
|
+
+--------+ +-------------------+
|
129
|
+
</td></tr></table>
|
130
|
+
|
131
|
+
The diagram above shows the general pipeline. The difference is that
|
132
|
+
the action will be its own object. In general, it will need to know
|
133
|
+
how to process certain URL formats.
|
134
|
+
|
135
|
+
In the process of defining the action objects, \ActionCards will be
|
136
|
+
created. Below is an example \ActionCard for the default action,
|
137
|
+
<tt>_show</tt>. In \ActionCards, everything is relative to the Ruwiki
|
138
|
+
root URI. Important to note is that \ActionCards are an ideal: they may
|
139
|
+
not represent something that can be accomplished for 0.10.0, 0.11.0,
|
140
|
+
or even 1.0. They do, however, represent the ultimate target.
|
141
|
+
|
142
|
+
Ruwiki does some implicit URI rewriting in the general form of:
|
143
|
+
|
144
|
+
<table summary="Ruwiki URI rewriting" style="border: 1px solid black; border-collapse: collapse">
|
145
|
+
<tr><th style="border: 1px solid black">URI</th><th style="border: 1px solid black">Rewritten URI</th></tr>
|
146
|
+
<tr><td style="border: 1px solid black">/</td><td style="border: 1px solid black">/Project<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%">/Topic<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%">/Action<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%"></td></tr>
|
147
|
+
<tr><td style="border: 1px solid black">/Action</td><td style="border: 1px solid black">/Project<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%">/Topic<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%">/Action</td></tr>
|
148
|
+
<tr><td style="border: 1px solid black">/Topic</td><td style="border: 1px solid black">/Project<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%">/Topic/Action<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%"></td></tr>
|
149
|
+
<tr><td style="border: 1px solid black">/Project/</td><td style="border: 1px solid black">/Project/Topic<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%">/Action<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%"></td></tr>
|
150
|
+
<tr><td style="border: 1px solid black">/Project/Action</td><td style="border: 1px solid black">/Project/Topic<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%">/Action</td></tr>
|
151
|
+
<tr><td style="border: 1px solid black">/Project/Topic</td><td style="border: 1px solid black">/Project/Topic/Action<sub style="border: 1px solid black; font-size: 50%">Default</sub style="border: 1px solid black; font-size: 50%"></td></tr>
|
152
|
+
<tr><td style="border: 1px solid black">/Project/Topic/Action</td><td style="border: 1px solid black">/Project/Topic/Action</td></tr>
|
153
|
+
</table>
|
154
|
+
|
155
|
+
<table summary="_show Action Card" style="border: 1px solid black"><tr><td>
|
156
|
+
=== Action: Show [_show] <strong>DEFAULT</strong>
|
157
|
+
The Show action is the default action that will be performed when
|
158
|
+
there is no action specified. Without any arguments, the latest
|
159
|
+
version of the page will be displayed.
|
160
|
+
|
161
|
+
==== Action Arguments
|
162
|
+
; ?r=<em>revision</em> : Show the specified revision of the page.
|
163
|
+
; ?r : Show the list of revisions known to the page.
|
164
|
+
; ?r=<em>revision1</em>:<em>revision2</em> : Shows the difference of revision1 and revision2 for the page.
|
165
|
+
; ?r=:<em>revision</em> : Shows the difference between the current page and the specified revision.
|
166
|
+
; ?d=<em>yyyymmdd[:hh[mm[ss]]]</em> : Shows the last revision from at or before the specified date and time. If time is not specified, it is assumed to be 23:59:59.
|
167
|
+
|
168
|
+
==== Interaction Notes
|
169
|
+
Without arguments, _show generates pages pages that are editable and
|
170
|
+
indexable (<meta name="robots" content="index,follow,archive">). If
|
171
|
+
any argument is specified, the page is still editable, but not
|
172
|
+
indexable (<meta name="robots" content="noindex,nofollow,noarchive">).
|
173
|
+
</td></tr></table>
|
174
|
+
|
175
|
+
== Ruwiki 0.11.0: “What’s My Line?”
|
176
|
+
The antispam techniques introduced in 0.9.0 are positive steps in the
|
177
|
+
fight against wiki defacement. They are hopefully effective, too. The
|
178
|
+
problem is that because 0.9.0 doesn’t offer users or user
|
179
|
+
authentication, there’s no way of safely allowing the edit of
|
180
|
+
the antispam lists. Thus, to allow this and other potentially
|
181
|
+
dangerous actions, a user and capability framework will be added to
|
182
|
+
Ruwiki. This framework will allow for user identification,
|
183
|
+
authentication, and authorization to indicate what users are allowed
|
184
|
+
to perform what actions.
|
185
|
+
|
186
|
+
Authenticated users will be able to bypass blacklist checking; thus,
|
187
|
+
if “msn.com” is blocked, “joe.blog@msn.com”
|
188
|
+
could still authenticate with Ruwiki and edit the pages. Some users
|
189
|
+
will be able to manage user permissions (including user management),
|
190
|
+
edit antispam lists, etc.
|
191
|
+
|
192
|
+
Other actions will be added, including the ability to rename topics
|
193
|
+
and move topics between projects. In both cases, the topic change
|
194
|
+
history must be maintained.
|
195
|
+
|
196
|
+
The documentation for Ruwiki will be substantially complete with this
|
197
|
+
version, lacking only specific information on the features that will
|
198
|
+
be added in Ruwiki 1.0.0.
|
199
|
+
|
200
|
+
== Ruwiki 1.0.0: “Yes, Minister”
|
201
|
+
A combined strength and weakness of Ruwiki is that it currently does
|
202
|
+
little to protect against arbitrary HTML being inserted into the
|
203
|
+
current topic. The allowed subset of HTML should be restricted to a
|
204
|
+
safe subset to prevent cross-site-scripting attacks.
|
205
|
+
|
206
|
+
Pages and projects have properties: we need to provide the ability to
|
207
|
+
edit those properties. Part of the properties that should be editable
|
208
|
+
include whether a page is frozen — this means that the page is
|
209
|
+
no longer editable by any user (unless it is unfrozen) and is
|
210
|
+
effectively a plain HTML page. Other properties include the static
|
211
|
+
header and footer information in a page or project.
|
212
|
+
|
213
|
+
Modern Wikis require an RSS feed. Ruwiki will provide one.
|
214
|
+
|
215
|
+
== The Future: “Yes, Prime Minister”
|
216
|
+
Ruwiki 1.0.0 does not represent the end of the line for Ruwiki, but
|
217
|
+
what the future holds is unclear. We’ll see what the future
|
218
|
+
brings.
|
219
|
+
properties!project: Ruwiki
|
220
|
+
properties!title: Roadmap
|
221
|
+
properties!topic: Roadmap
|
222
|
+
properties!version: 1
|
223
|
+
ruwiki!content-version: 2
|
224
|
+
ruwiki!version: 0.9.0
|
225
|
+
properties!editable: false
|