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.
Files changed (96) hide show
  1. data/Readme.rubygems +86 -0
  2. data/Readme.tarfile +65 -0
  3. data/bin/ruwiki +58 -0
  4. data/bin/ruwiki.cgi +87 -0
  5. data/bin/ruwiki_convert +56 -0
  6. data/bin/ruwiki_service.rb +82 -0
  7. data/bin/ruwiki_servlet +53 -0
  8. data/contrib/enscript-token.rb +55 -0
  9. data/contrib/rublog_integrator.rb +68 -0
  10. data/data/Default/ProjectIndex.ruwiki +49 -0
  11. data/data/Ruwiki/Antispam.ruwiki +65 -0
  12. data/data/Ruwiki/BugTracking.ruwiki +33 -0
  13. data/data/Ruwiki/ChangeLog.ruwiki +102 -0
  14. data/data/Ruwiki/Configuring_Ruwiki.ruwiki +151 -0
  15. data/data/Ruwiki/Extending_Ruwiki.ruwiki +317 -0
  16. data/data/Ruwiki/LicenseAndAuthorInfo.ruwiki +30 -0
  17. data/data/Ruwiki/ProjectIndex.ruwiki +84 -0
  18. data/data/Ruwiki/Roadmap.ruwiki +225 -0
  19. data/data/Ruwiki/RuwikiTemplatingLibrary.ruwiki +156 -0
  20. data/data/Ruwiki/RuwikiUtilities.ruwiki +157 -0
  21. data/data/Ruwiki/SandBox.ruwiki +9 -0
  22. data/data/Ruwiki/To_Do.ruwiki +51 -0
  23. data/data/Ruwiki/TroubleShooting.ruwiki +33 -0
  24. data/data/Ruwiki/WikiFeatures.ruwiki +17 -0
  25. data/data/Ruwiki/WikiMarkup.ruwiki +261 -0
  26. data/data/Tutorial/AddingPages.ruwiki +16 -0
  27. data/data/Tutorial/AddingProjects.ruwiki +16 -0
  28. data/data/Tutorial/ProjectIndex.ruwiki +11 -0
  29. data/data/Tutorial/SandBox.ruwiki +9 -0
  30. data/data/agents.banned +60 -0
  31. data/data/agents.readonly +321 -0
  32. data/data/hostip.banned +30 -0
  33. data/data/hostip.readonly +28 -0
  34. data/lib/ruwiki.rb +622 -0
  35. data/lib/ruwiki/auth.rb +56 -0
  36. data/lib/ruwiki/auth/gforge.rb +73 -0
  37. data/lib/ruwiki/backend.rb +318 -0
  38. data/lib/ruwiki/backend/flatfiles.rb +217 -0
  39. data/lib/ruwiki/config.rb +244 -0
  40. data/lib/ruwiki/exportable.rb +192 -0
  41. data/lib/ruwiki/handler.rb +342 -0
  42. data/lib/ruwiki/lang/de.rb +339 -0
  43. data/lib/ruwiki/lang/en.rb +334 -0
  44. data/lib/ruwiki/lang/es.rb +339 -0
  45. data/lib/ruwiki/page.rb +262 -0
  46. data/lib/ruwiki/servlet.rb +38 -0
  47. data/lib/ruwiki/template.rb +553 -0
  48. data/lib/ruwiki/utils.rb +24 -0
  49. data/lib/ruwiki/utils/command.rb +102 -0
  50. data/lib/ruwiki/utils/converter.rb +297 -0
  51. data/lib/ruwiki/utils/manager.rb +639 -0
  52. data/lib/ruwiki/utils/servletrunner.rb +295 -0
  53. data/lib/ruwiki/wiki.rb +147 -0
  54. data/lib/ruwiki/wiki/tokens.rb +136 -0
  55. data/lib/ruwiki/wiki/tokens/00default.rb +211 -0
  56. data/lib/ruwiki/wiki/tokens/01wikilinks.rb +166 -0
  57. data/lib/ruwiki/wiki/tokens/02actions.rb +63 -0
  58. data/lib/ruwiki/wiki/tokens/abbreviations.rb +40 -0
  59. data/lib/ruwiki/wiki/tokens/calendar.rb +147 -0
  60. data/lib/ruwiki/wiki/tokens/headings.rb +43 -0
  61. data/lib/ruwiki/wiki/tokens/lists.rb +112 -0
  62. data/lib/ruwiki/wiki/tokens/rubylists.rb +48 -0
  63. data/ruwiki.conf +22 -0
  64. data/ruwiki.pkg +0 -0
  65. data/templates/default/body.tmpl +19 -0
  66. data/templates/default/content.tmpl +7 -0
  67. data/templates/default/controls.tmpl +23 -0
  68. data/templates/default/edit.tmpl +27 -0
  69. data/templates/default/error.tmpl +14 -0
  70. data/templates/default/footer.tmpl +23 -0
  71. data/templates/default/ruwiki.css +297 -0
  72. data/templates/default/save.tmpl +8 -0
  73. data/templates/sidebar/body.tmpl +19 -0
  74. data/templates/sidebar/content.tmpl +8 -0
  75. data/templates/sidebar/controls.tmpl +8 -0
  76. data/templates/sidebar/edit.tmpl +27 -0
  77. data/templates/sidebar/error.tmpl +13 -0
  78. data/templates/sidebar/footer.tmpl +22 -0
  79. data/templates/sidebar/ruwiki.css +347 -0
  80. data/templates/sidebar/save.tmpl +10 -0
  81. data/templates/simple/body.tmpl +13 -0
  82. data/templates/simple/content.tmpl +7 -0
  83. data/templates/simple/controls.tmpl +8 -0
  84. data/templates/simple/edit.tmpl +25 -0
  85. data/templates/simple/error.tmpl +10 -0
  86. data/templates/simple/footer.tmpl +10 -0
  87. data/templates/simple/ruwiki.css +192 -0
  88. data/templates/simple/save.tmpl +8 -0
  89. data/tests/harness.rb +52 -0
  90. data/tests/tc_backend_flatfile.rb +103 -0
  91. data/tests/tc_bugs.rb +74 -0
  92. data/tests/tc_exportable.rb +64 -0
  93. data/tests/tc_template.rb +145 -0
  94. data/tests/tc_tokens.rb +335 -0
  95. data/tests/testall.rb +20 -0
  96. 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