ruwiki 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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,211 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruwiki
|
|
3
|
+
# Copyright � 2002 - 2004, Digikata and HaloStatue
|
|
4
|
+
# Alan Chen (alan@digikata.com)
|
|
5
|
+
# Austin Ziegler (ruwiki@halostatue.ca)
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the same terms as Ruby.
|
|
8
|
+
#
|
|
9
|
+
# $Id: 00default.rb,v 1.16 2004/11/28 23:59:18 austin Exp $
|
|
10
|
+
#++
|
|
11
|
+
|
|
12
|
+
# $debug = File.open("output.txt", "wb")
|
|
13
|
+
|
|
14
|
+
class Ruwiki::Wiki
|
|
15
|
+
# The Paragraph Token class changes blank lines to <p> tags. This class,
|
|
16
|
+
# under the current implementation, should be *first* in the Token list
|
|
17
|
+
# after Token.
|
|
18
|
+
class Paragraph < Ruwiki::Wiki::Token
|
|
19
|
+
# This Token is #rank 0, because it should be first in the Token list.
|
|
20
|
+
def self.rank
|
|
21
|
+
0
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Matches blank lines. %r{^$}
|
|
25
|
+
def self.regexp
|
|
26
|
+
%r{(^$)}
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def replace
|
|
30
|
+
%Q(</p><p class="rwtk_Paragraph">)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Ensures that <p> won't be surrounded by <br> tags.
|
|
34
|
+
def self.post_replace(content)
|
|
35
|
+
content.gsub!(%r{\A}, '<p class="rwtk_Paragraph">')
|
|
36
|
+
content.gsub!(%r{\z}, '</p>')
|
|
37
|
+
content.gsub!(%r{\n(</p>)}, '\1')
|
|
38
|
+
content.gsub!(%r{(<p[^>]*>)\n}, '\1')
|
|
39
|
+
content.gsub!(%r{(</p>)(<p[^>]*>)}) { "#{$1}\n#{$2}" }
|
|
40
|
+
content.gsub!(%r{(<pre[^>]*>.*?)<p[^>]*></p>(.*?</pre>)}) { "#{$1}\n#{$2}" }
|
|
41
|
+
content.gsub!(%r{<p[^>]*></p>}, '')
|
|
42
|
+
content.gsub!(%r{^\n(<p[^>]*>)}, '\1')
|
|
43
|
+
content
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# The Code Token class converts indented text to "unformatted" (<pre>)
|
|
48
|
+
# text. This class should be *second* in the Token list.
|
|
49
|
+
class Code < Ruwiki::Wiki::Token
|
|
50
|
+
# This Token is #rank 1, because it should be second in the Token list.
|
|
51
|
+
def self.rank
|
|
52
|
+
1
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Matches indented text. %r{^(\s+\S?.*)$}
|
|
56
|
+
def self.regexp
|
|
57
|
+
%r{^([ \t]+[^\n]*)\n}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Replaces the text to <pre>content</pre>.
|
|
61
|
+
def replace
|
|
62
|
+
content = Ruwiki.clean_entities(@match.captures[0])
|
|
63
|
+
|
|
64
|
+
%Q{</p><pre class="rwtk_Code">#{content}</pre>\n}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Converts cases of %r{</pre>(\n|<br ?/?>)<pre>} to \1.
|
|
68
|
+
def self.post_replace(content)
|
|
69
|
+
content.gsub!(%r{</pre>((\n)*</p>(\n)*)?<pre[^>]*>}, "\n")
|
|
70
|
+
content.gsub!(%r{</pre>(\n|<br ?/?>)?<pre[^>]*>}, '\1')
|
|
71
|
+
content.gsub!(%r{<p[^>]*>(<pre[^>]*>)}, '\1')
|
|
72
|
+
content.gsub!(%r{</pre></p>}, '</pre>')
|
|
73
|
+
# content.gsub!(%r{(<pre[^>]*>.*?)<p[^>]*></p>(.*?</pre>)}) { "#{$1}\n#{$2}" }
|
|
74
|
+
content
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
RE_URI_SCHEME = %r{[-a-z0-9+.]{3,}?:}
|
|
79
|
+
RE_URI_PATH = %r{[^\s<>\]]}
|
|
80
|
+
RE_URI_TEXT = %r{[^\]]*}
|
|
81
|
+
|
|
82
|
+
def self.redirect(uri)
|
|
83
|
+
"http://www.google.com/url?sa=D;q=#{CGI.escape(uri)}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Converts URLs in the form of [url] to numbered links.
|
|
87
|
+
class NumberedLinks < Ruwiki::Wiki::Token
|
|
88
|
+
class << self
|
|
89
|
+
def increment
|
|
90
|
+
@count ||= 0
|
|
91
|
+
@count += 1
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def reset
|
|
95
|
+
@count = 0
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def self.rank
|
|
100
|
+
2
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def self.regexp
|
|
104
|
+
%r{\[(#{RE_URI_SCHEME}(?:#{RE_URI_PATH})*?)\]}
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def replace
|
|
108
|
+
extlink = @match.captures[0]
|
|
109
|
+
|
|
110
|
+
name = "[#{NumberedLinks.increment}]"
|
|
111
|
+
|
|
112
|
+
%Q{<a class="rwtk_NumberedLinks" href="#{Ruwiki::Wiki.redirect(extlink)}">#{name}</a>}
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
class Image < Ruwiki::Wiki::Token
|
|
117
|
+
def self.rank
|
|
118
|
+
1
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
RE_IMAGE_OPTIONS=%r{([^=]+)=("[^"]+"|[^ ]+)}
|
|
122
|
+
|
|
123
|
+
def self.regexp
|
|
124
|
+
%r{\[image\s*:\s*(#{RE_URI_SCHEME}(?:#{RE_URI_PATH})*?)(\s+[^\]]+)?\]}
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def replace
|
|
128
|
+
options = { 'src' => %Q("#{@match.captures[0]}") }
|
|
129
|
+
groups = @match.captures[1]
|
|
130
|
+
unless groups.nil?
|
|
131
|
+
groups.scan(RE_IMAGE_OPTIONS).each { |gg| options[gg[0].strip] = gg[1].strip }
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
unless options['numbered'].nil? or options['numbered'] == "false"
|
|
135
|
+
options['title'] = %Q("[#{NumberedLinks.increment}]")
|
|
136
|
+
options.delete('numbered')
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
options['title'] ||= options['alt']
|
|
140
|
+
options['title'] ||= options['src']
|
|
141
|
+
options['alt'] ||= options['title']
|
|
142
|
+
|
|
143
|
+
ss = ""
|
|
144
|
+
options.keys.sort.map { |kk| ss << %Q( #{kk}=#{options[kk]}) }
|
|
145
|
+
|
|
146
|
+
%Q{<img class="rwtk_Image"#{ss} />}
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Converts URLs in the form of [url name] to named links.
|
|
151
|
+
class NamedLinks < Ruwiki::Wiki::Token
|
|
152
|
+
def self.rank
|
|
153
|
+
3
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def self.regexp
|
|
157
|
+
%r{\[(#{RE_URI_SCHEME}(?:#{RE_URI_PATH})*?)\s+(#{RE_URI_TEXT})\]}
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def replace
|
|
161
|
+
extlink = @match.captures[0]
|
|
162
|
+
name = @match.captures[1]
|
|
163
|
+
|
|
164
|
+
%Q{<a class="rwtk_NamedLinks" href="#{Ruwiki::Wiki.redirect(extlink)}">#{name}</a>}
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Converts URLs to links where the "name" of the link is the URL itself.
|
|
169
|
+
class ExternalLinks < Ruwiki::Wiki::Token
|
|
170
|
+
def self.rank
|
|
171
|
+
501
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def self.regexp
|
|
175
|
+
%r{\b(#{RE_URI_SCHEME}#{RE_URI_PATH}+)}
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def restore
|
|
179
|
+
@match[0]
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def replace
|
|
183
|
+
extlink = @match.captures[0]
|
|
184
|
+
|
|
185
|
+
%Q{<a class="rwtk_ExternalLinks" href="#{Ruwiki::Wiki.redirect(extlink)}">#{extlink}</a>}
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Creates a horizontal rule.
|
|
190
|
+
class HRule < Ruwiki::Wiki::Token
|
|
191
|
+
def self.regexp
|
|
192
|
+
%r|^\\?-{4,}|
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def replace
|
|
196
|
+
%Q(<hr class="rwtk_HRule" />)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def restore
|
|
200
|
+
@match[0][1 .. -1]
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def self.post_replace(content)
|
|
204
|
+
content.gsub!(%r{(<p[^>]*>)*(<hr[^ />]* ?/?>)(</p>)*}, '\1')
|
|
205
|
+
content.gsub!(%r{\n<hr />}, "</p>\n<hr />")
|
|
206
|
+
content.gsub!(%r{<hr ?/?>\n<br ?/?>}, "<hr />")
|
|
207
|
+
content.gsub!(%r{(\n|<br ?/?>)?<hr>(\n|<br ?/?>)?}, "<hr />")
|
|
208
|
+
content
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruwiki
|
|
3
|
+
# Copyright � 2002 - 2004, Digikata and HaloStatue
|
|
4
|
+
# Alan Chen (alan@digikata.com)
|
|
5
|
+
# Austin Ziegler (ruwiki@halostatue.ca)
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the same terms as Ruby.
|
|
8
|
+
#
|
|
9
|
+
# $Id: 01wikilinks.rb,v 1.12 2004/08/16 11:28:27 austin Exp $
|
|
10
|
+
#++
|
|
11
|
+
require 'cgi'
|
|
12
|
+
|
|
13
|
+
class Ruwiki::Wiki
|
|
14
|
+
# This provides the basic WikiWord match. This supports WikiWord,
|
|
15
|
+
# CPlusPlus, ThisIsALink, and C_Plus_Plus.
|
|
16
|
+
RE_WIKI_WORDS = %r{[[:upper:]][\w_]*(?:[[:lower:]]+[[:upper:]_]|[[:upper:]_]+[[:lower:]])[\w_]*}
|
|
17
|
+
# This provides wikipedia format matches, e.g., [[wikipedia links]]. The
|
|
18
|
+
# only restriction on words in this format is that they must NOT begin
|
|
19
|
+
# with an underscore ('_').
|
|
20
|
+
RE_WIKIPEDIA_WORDS = %r{\[\[([^_].*?)\]\]}
|
|
21
|
+
# This provides the basic Wiki Project match.
|
|
22
|
+
RE_PROJECT_WORD = %r{[[:upper:]][[:lower:]]+}
|
|
23
|
+
|
|
24
|
+
# This provides the Wiki view link format:
|
|
25
|
+
VIEW_LINK = %Q[<a class="rwtk_WikiLink" href="%s">%s</a>]
|
|
26
|
+
EDIT_LINK = %Q[<span class="rwtk_EditWikiLink">%s</span><a class="rwtk_WikiLink" href="%s">?</a>]
|
|
27
|
+
|
|
28
|
+
# Creates a crosslink for a Project::WikiPage.
|
|
29
|
+
class ProjectCrossLink < Ruwiki::Wiki::Token
|
|
30
|
+
def self.rank
|
|
31
|
+
500
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.regexp
|
|
35
|
+
%r{(#{RE_PROJECT_WORD})::(#{RE_WIKI_WORDS})}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def replace
|
|
39
|
+
project = @match.captures[0]
|
|
40
|
+
topic = @match.captures[1]
|
|
41
|
+
link = CGI.escape(topic.dup)
|
|
42
|
+
|
|
43
|
+
if @backend.page_exists?(topic, project) or @backend.page_exists?(link, project)
|
|
44
|
+
VIEW_LINK % ["#{@script}/#{project}/#{link}", "#{project}::#{topic.gsub(/_/, ' ')}"]
|
|
45
|
+
else
|
|
46
|
+
EDIT_LINK % ["#{project}::#{topic.gsub(/_/, ' ')}", "#{@script}/#{project}/#{link}/_edit"]
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Creates a crosslink for a Project::WikiPage using a Wikipedia link
|
|
52
|
+
# format.
|
|
53
|
+
class ProjectCrossLinkWikipedia < Ruwiki::Wiki::Token
|
|
54
|
+
def self.rank
|
|
55
|
+
500
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def self.regexp
|
|
59
|
+
%r{(#{RE_PROJECT_WORD})::#{RE_WIKIPEDIA_WORDS}}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def replace
|
|
63
|
+
project = @match.captures[0]
|
|
64
|
+
topic = @match.captures[1]
|
|
65
|
+
link = CGI.escape(topic)
|
|
66
|
+
|
|
67
|
+
if @backend.page_exists?(topic, project) or @backend.page_exists?(link, project)
|
|
68
|
+
VIEW_LINK % ["#{@script}/#{project}/#{link}", "#{project}::#{topic}"]
|
|
69
|
+
else
|
|
70
|
+
EDIT_LINK % ["#{project}::#{topic}", "#{@script}/#{project}/#{link}/_edit"]
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Creates a link to the project index from ::Project.
|
|
76
|
+
class ProjectIndex < Ruwiki::Wiki::Token
|
|
77
|
+
def self.rank
|
|
78
|
+
501
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.regexp
|
|
82
|
+
%r{(\B|\\)::(#{RE_PROJECT_WORD})\b}
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def restore
|
|
86
|
+
@match[0][1..-1]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def replace
|
|
90
|
+
project = @match.captures[1]
|
|
91
|
+
|
|
92
|
+
if @backend.page_exists?('ProjectIndex', project)
|
|
93
|
+
VIEW_LINK % ["#{@script}/#{project}/ProjectIndex", project]
|
|
94
|
+
else
|
|
95
|
+
if @backend.project_exists?(project)
|
|
96
|
+
EDIT_LINK % [project, "#{@script}/#{project}/ProjectIndex/_edit"]
|
|
97
|
+
else
|
|
98
|
+
EDIT_LINK % [project, "#{@script}/#{project}/_create"]
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Creates a link to a WikiPage in the current project.
|
|
105
|
+
class WikiLinks < Ruwiki::Wiki::Token
|
|
106
|
+
def self.rank
|
|
107
|
+
503
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def self.regexp
|
|
111
|
+
%r{(\b|\\)(#{RE_WIKI_WORDS})\b}
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def restore
|
|
115
|
+
@match[0][1..-1]
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def replace
|
|
119
|
+
topic = @match.captures[1]
|
|
120
|
+
link = CGI.escape(topic.dup)
|
|
121
|
+
|
|
122
|
+
if @backend.page_exists?(topic, @project) or @backend.page_exists?(link, @project)
|
|
123
|
+
VIEW_LINK % ["#{@script}/#{@project}/#{link}", topic.gsub(/_/, ' ')]
|
|
124
|
+
else
|
|
125
|
+
EDIT_LINK % [topic.gsub(/_/, ' '), "#{@script}/#{@project}/#{link}/_edit"]
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Creates a link to a WikiPage in the current project using a Wikipedia
|
|
131
|
+
# link format.
|
|
132
|
+
class WikipediaLinks < Ruwiki::Wiki::Token
|
|
133
|
+
def self.rank
|
|
134
|
+
502
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def self.regexp
|
|
138
|
+
%r{(\B|\\)#{RE_WIKIPEDIA_WORDS}\B}
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def restore
|
|
142
|
+
@match[0][1..-1]
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
ALT_TEXT = %r{(.+)\|(.+)}o
|
|
146
|
+
|
|
147
|
+
def replace
|
|
148
|
+
captures = @match.captures
|
|
149
|
+
topic = @match.captures[1]
|
|
150
|
+
link = CGI.escape(topic)
|
|
151
|
+
|
|
152
|
+
at = ALT_TEXT.match(topic)
|
|
153
|
+
|
|
154
|
+
if not at.nil?
|
|
155
|
+
topic = at.captures[1]
|
|
156
|
+
link = CGI.escape(at.captures[0])
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
if @backend.page_exists?(link, @project) or @backend.page_exists?(link, @project)
|
|
160
|
+
VIEW_LINK % ["#{@script}/#{@project}/#{link}", topic]
|
|
161
|
+
else
|
|
162
|
+
EDIT_LINK % [topic, "#{@script}/#{@project}/#{link}/_edit"]
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruwiki
|
|
3
|
+
# Copyright � 2002 - 2004, Digikata and HaloStatue
|
|
4
|
+
# Alan Chen (alan@digikata.com)
|
|
5
|
+
# Austin Ziegler (ruwiki@halostatue.ca)
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the same terms as Ruby.
|
|
8
|
+
#
|
|
9
|
+
# $Id: 02actions.rb,v 1.2 2004/11/26 12:18:47 austin Exp $
|
|
10
|
+
#++
|
|
11
|
+
require 'cgi'
|
|
12
|
+
|
|
13
|
+
class Ruwiki::Wiki
|
|
14
|
+
# Produces a list of topics.
|
|
15
|
+
class TopicList < Ruwiki::Wiki::Token
|
|
16
|
+
def self.regexp
|
|
17
|
+
%r{^%topics\((#{Ruwiki::Wiki::RE_PROJECT_WORD})?\)$}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def replace
|
|
21
|
+
project = @match.captures[0] || @project
|
|
22
|
+
|
|
23
|
+
if @backend.project_exists?(project)
|
|
24
|
+
topic_list = @backend.list_topics(project)
|
|
25
|
+
else
|
|
26
|
+
topic_list = []
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
if topic_list.empty?
|
|
30
|
+
ss = @message[:no_topics] % [project]
|
|
31
|
+
else
|
|
32
|
+
ss = %Q(<h4 class="rwtk_Headings">#{@message[:topics_for_project] % [project]}</h4>\n<ul class="rwtk_Lists">\n)
|
|
33
|
+
topic_list.each do |tt|
|
|
34
|
+
ss << %Q(<li class="rwtk_Lists">)
|
|
35
|
+
ss << VIEW_LINK % ["#{@script}/#{project}/#{tt}", "#{CGI::unescape(tt.gsub(/_/, ' '))}"]
|
|
36
|
+
ss << "</li>\n"
|
|
37
|
+
end
|
|
38
|
+
ss << "</ul>\n"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
ss
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class ProjectList < Ruwiki::Wiki::Token
|
|
46
|
+
def self.regexp
|
|
47
|
+
%r{^%projects\(\)$}
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def replace
|
|
51
|
+
proj_list = @backend.list_projects
|
|
52
|
+
|
|
53
|
+
ss = %Q(<h4 class="rwtk_Headings">#{@message[:wiki_projects] % [@title]}</h4>\n<ul class="rwtk_Lists">\n)
|
|
54
|
+
proj_list.each do |pp|
|
|
55
|
+
ss << %Q(<li class="rwtk_Lists">)
|
|
56
|
+
ss << VIEW_LINK % ["#{@script}/#{pp}/ProjectIndex", pp]
|
|
57
|
+
ss << %Q! <a href='#{@script}/#{pp}/_topics' class='rw_minilink'>#{@message[:project_topics_link]}</a>!
|
|
58
|
+
ss << "</li>\n"
|
|
59
|
+
end
|
|
60
|
+
ss << "</ul>\n"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruwiki
|
|
3
|
+
# Copyright � 2002 - 2004, Digikata and HaloStatue
|
|
4
|
+
# Alan Chen (alan@digikata.com)
|
|
5
|
+
# Austin Ziegler (ruwiki@halostatue.ca)
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the same terms as Ruby.
|
|
8
|
+
#
|
|
9
|
+
# $Id: abbreviations.rb,v 1.9 2004/11/26 12:18:47 austin Exp $
|
|
10
|
+
#++
|
|
11
|
+
class Ruwiki::Wiki
|
|
12
|
+
# Converts abbreviations.
|
|
13
|
+
class Abbreviations < Ruwiki::Wiki::Token
|
|
14
|
+
ABBREVIATIONS = {
|
|
15
|
+
"matz" => "Yukihiro Matsumoto",
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
def self.regexp
|
|
19
|
+
%r!@\{([^\}]*)\}!
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def replace
|
|
23
|
+
kk = @match.captures[0]
|
|
24
|
+
if kk.nil? or kk.empty?
|
|
25
|
+
data = %Q(<dl class="rwtk_Abbreviations">)
|
|
26
|
+
ABBREVIATIONS.each do |kk, vv|
|
|
27
|
+
data << %Q(<dt class="rwtk_Abbreviations">#{kk}</dt><dd class="rwtk_Abbreviations">#{vv}</dd>)
|
|
28
|
+
end
|
|
29
|
+
data << %Q(</dl>)
|
|
30
|
+
else
|
|
31
|
+
if ABBREVIATIONS.has_key?(kk)
|
|
32
|
+
data = ABBREVIATIONS[kk]
|
|
33
|
+
else
|
|
34
|
+
data = @match[0]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
data
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|