ruwiki 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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,147 @@
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: calendar.rb,v 1.5 2004/11/26 12:18:47 austin Exp $
10
+ #++
11
+ class Ruwiki
12
+ class Wiki
13
+ # Produces a mini-calendar with dates as WikiWords.
14
+ class Calendar < Ruwiki::Wiki::Token
15
+ def self.regexp
16
+ %r{^\\?%calendar\((?:(today)|(\d+),\s*(\d+))(?:,\s*(#{RE_PROJECT_WORD}))?\)}
17
+ end
18
+
19
+ def self.make(year, month)
20
+ result = []
21
+ tt = Time.local(year, month, 1)
22
+ rr = Array.new(tt.wday, nil)
23
+ rr << 1
24
+
25
+ 2.upto(31) do |ii|
26
+ break if Time.local(year, month, ii).month != month
27
+ rr << ii
28
+ end
29
+
30
+ rr += Array.new((- rr.size) % 7, nil)
31
+
32
+ 0.step(rr.size - 1, 7) do |ii|
33
+ result << rr[ii, 7]
34
+ end
35
+ result
36
+ end
37
+
38
+ def make_month_link(project, year, month, state = nil)
39
+ ym = "%04d%02d" % [year, month]
40
+ case state
41
+ when :prev
42
+ title = "&laquo; #{year}.#{month}"
43
+ when :next
44
+ title = "#{year}.#{month} &raquo;"
45
+ else
46
+ title = "#{project}::#{year}.#{month}"
47
+ end
48
+ url = "#{@script}/#{project}/#{ym}"
49
+
50
+ if @backend.page_exists?(ym, project)
51
+ VIEW_LINK % [url, title]
52
+ else
53
+ EDIT_LINK % [title, "#{url}/_edit"]
54
+ end
55
+ end
56
+
57
+ def replace
58
+ today = @match.captures[0]
59
+ project = @match.captures[3] || @project
60
+ now = Time.now
61
+
62
+ if today.nil?
63
+ year = @match.captures[1].to_i
64
+ month = @match.captures[2].to_i
65
+ else
66
+ year = now.year
67
+ month = now.month
68
+ end
69
+
70
+ if (year == now.year) and (month == now.month)
71
+ show_today = now.day
72
+ else
73
+ show_today = nil
74
+ end
75
+
76
+ result = <<-"CALENDAR_HEAD"
77
+ </p>
78
+ <div class="rwtk_Calendar">
79
+ <table class="rwtk_Calendar" summary="calendar for ::#{project}: #{year}.#{month}">
80
+ <thead>
81
+ CALENDAR_HEAD
82
+
83
+ result << %Q{ <tr>\n<th colspan="7" class="rwtk_Calendar_current_month">}
84
+ result << make_month_link(project, year, month)
85
+ result << %Q{</th>\n </tr>\n <tr>\n<th colspan="2" class="rwtk_Calendar_prev_month">}
86
+ result << make_month_link(project, year, month - 1, :prev)
87
+ result << %Q{</th>\n<th colspan="3"></th>\n<th colspan="2" class="rwtk_Calendar_next_month">}
88
+ result << make_month_link(project, year, month + 1, :next)
89
+ result << "</th>\n"
90
+
91
+ result << <<-"CALENDAR_HEAD2"
92
+ </tr>
93
+ <tr>
94
+ <th class="rwtk_Calendar_weekend">Su</th>
95
+ <th class="rwtk_Calendar_weekday">Mo</th>
96
+ <th class="rwtk_Calendar_weekday">Tu</th>
97
+ <th class="rwtk_Calendar_weekday">We</th>
98
+ <th class="rwtk_Calendar_weekday">Th</th>
99
+ <th class="rwtk_Calendar_weekday">Fr</th>
100
+ <th class="rwtk_Calendar_weekend">Sa</th>
101
+ </tr>
102
+ </thead>
103
+ <tbody>
104
+ CALENDAR_HEAD2
105
+
106
+ Calendar.make(year, month).each do |week|
107
+ result << " <tr>\n"
108
+ week.each do |day|
109
+ if day.nil?
110
+ result << %Q{ <td class="rwtk_Calendar_day"></td>\n}
111
+ else
112
+ date = "%04d%02d%02d" % [year, month, day]
113
+ # Add the ability to create pages based on date here.
114
+ if show_today == day
115
+ result << %Q{ <td class="rwtk_Calendar_today">}
116
+ else
117
+ result << %Q{ <td class="rwtk_Calendar_day">}
118
+ end
119
+ if @backend.page_exists?(date, project)
120
+ result << VIEW_LINK % ["#{@script}/#{project}/#{date}", day]
121
+ else
122
+ result << EDIT_LINK % [day, "#{@script}/#{project}/#{date}/_edit"]
123
+ end
124
+ result << %Q{</td>\n}
125
+ end
126
+ end
127
+ result << " </tr>\n"
128
+ end
129
+
130
+ result << %Q(</tbody>\n</table>\n</div>\n<p class="rwtk_Paragraph">)
131
+ result
132
+ end
133
+
134
+ def restore
135
+ @match[0][1 .. -1]
136
+ end
137
+
138
+ def self.post_replace(content)
139
+ content.gsub!(%r{<p[^>]*>(\s*</?div(?: [^>]+)?>\s*)</p>}, '\1')
140
+ content.gsub!(%r{<p[^>]*>(\s*</?table(?: [^>]+)?>\s*)</p>}, '\1')
141
+ content.gsub!(%r{<p[^>]*>(\s*</?t(?:head|body|r)(?: [^>]+)?>\s*)</p>}, '\1')
142
+ content.gsub!(%r{<p[^>]*>(\s*<t[hd].+?</t[hd]>\s*)</p>}, '\1')
143
+ content
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,43 @@
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: headings.rb,v 1.7 2004/08/11 11:20:01 austin Exp $
10
+ #++
11
+ class Ruwiki
12
+ class Wiki
13
+ # Converts headings.
14
+ class Headings < Ruwiki::Wiki::Token
15
+ # def self.rank
16
+ # 5
17
+ # end
18
+
19
+ def self.regexp
20
+ %r{^\\?(=+)\s+(.*)}
21
+ end
22
+
23
+ def restore
24
+ @match[0][1 .. -1]
25
+ end
26
+
27
+ def replace
28
+ level = @match.captures[0].count("=")
29
+ content = @match.captures[1]
30
+ level = 6 if level > 6
31
+ %Q(<h#{level} class="rwtk_Headings">#{content}</h#{level}>)
32
+ end
33
+
34
+ def self.post_replace(content)
35
+ content.gsub!(%r{(</h\d>)\n}) { |m| %Q(#{$1}\n<p class="rwtk_Paragraph">) }
36
+ content.gsub!(%r{(</h\d>)</p>\n<p>}) { |m| %Q(#{$1}\n<p class="rwtk_Paragraph">) }
37
+ content.gsub!(%r{<p[^>]*>(<h\d[^>]*>)}, '\1')
38
+ content.gsub!(%r{(</h\d>)</p>}, '\1')
39
+ content
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,112 @@
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: lists.rb,v 1.9 2004/08/13 21:33:33 austin Exp $
10
+ #++
11
+ class Ruwiki::Wiki
12
+ # Produces Lists
13
+ class Lists < Ruwiki::Wiki::Token
14
+ def self.regexp
15
+ %r{^\\?([*#]+)\s+(.*)$}
16
+ end
17
+
18
+ def replace
19
+ indent = @match.captures[0].scan(/./).map { |ee| ee == "*" ? 'ul' : 'ol' }
20
+ content = @match.captures[1]
21
+
22
+ pre = ''
23
+ post = ''
24
+ indent.each { |elem| pre << %Q(<#{elem} class="rwtk_Lists">) }
25
+ indent.reverse_each { |elem| post << %Q(</#{elem}>) }
26
+ %Q(#{pre}<li class="rwtk_Lists">#{content}</li>#{post})
27
+ end
28
+
29
+ def restore
30
+ @match[0][1 .. -1]
31
+ end
32
+
33
+ RE_NESTED_LISTS = %r{</[uo]l>\s*<[uo]l[^>]*>}
34
+
35
+ def self.post_replace(content)
36
+ content.gsub!(%r{<p[^>]*><([uo]l[^>]*)>}, '<\1>')
37
+ content.gsub!(%r{</([uo]l)></p>}, '</\1>')
38
+ content.gsub!(RE_NESTED_LISTS, '') while content =~ RE_NESTED_LISTS
39
+ content
40
+ end
41
+ end
42
+
43
+ # Produces block quotes.
44
+ class Blockquotes < Ruwiki::Wiki::Token
45
+ def self.regexp
46
+ %r{^\\?((:+)|(>+))(\s+.*)$}
47
+ end
48
+
49
+ def replace
50
+ content = @match.captures[3]
51
+
52
+ if @match.captures[2].nil?
53
+ char = ':'
54
+ cite = ''
55
+ else
56
+ char = '>'
57
+ cite = ' type="cite"'
58
+ end
59
+ indent = @match.captures[0].count(char)
60
+
61
+ pre = ''
62
+ post = ''
63
+ indent.times do
64
+ pre << %Q(<blockquote#{cite} class="rwtk_Blockquotes">)
65
+ post << %Q(</blockquote>)
66
+ end
67
+ "#{pre}#{content}#{post}"
68
+ end
69
+
70
+ def restore
71
+ @match[0][1 .. -1].gsub(/^>/, '&gt;')
72
+ end
73
+
74
+ def self.post_replace(content)
75
+ content.gsub!(%r{</blockquote>(\n|<br ?/?>)?<blockquote[^>]*>}, '')
76
+ content.gsub!(%r{(</?blockquote[^>]*>\n?)\s*}, '\1')
77
+ content.gsub!(%r{</blockquote>(<blockquote[^>]*>)+}, '\1')
78
+ content
79
+ end
80
+ end
81
+
82
+ # Produces definition lists. Does not completely work correctly.
83
+ class Definitions < Ruwiki::Wiki::Token
84
+ def self.regexp
85
+ %r{^\\?(;+)\s+(.+?)\s+:\s+(.*)}
86
+ end
87
+
88
+ def replace
89
+ definition = @match.captures[2]
90
+ term = @match.captures[1]
91
+ indent = @match.captures[0].count(';')
92
+
93
+ pre = ''
94
+ post = ''
95
+ indent.times do
96
+ pre << %Q(<dl class="rwtk_Definitions">)
97
+ post << %Q(</dl>)
98
+ end
99
+ %Q(#{pre}<dt class="rwtk_Definitions">#{term}</dt><dd class="rwtk_Definitions">#{definition}</dd>#{post})
100
+ end
101
+
102
+ def restore
103
+ @match[0][1 .. -1]
104
+ end
105
+
106
+ def self.post_replace(content)
107
+ content.gsub!(%r{</dl>(\n|<br ?/?>)?<dl[^>]*>}, '')
108
+ content.gsub!(%r{</dl>(<dl[^>]*>)+}, '\1')
109
+ content
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,48 @@
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: rubylists.rb,v 1.6 2004/09/26 16:30:45 austin Exp $
10
+ #++
11
+ class Ruwiki
12
+ class Wiki
13
+ # Convert ruby-talk mailing list references (e.g., [ruby-talk:12345])
14
+ # into named links.
15
+ class RubyTalkLinks < Ruwiki::Wiki::Token
16
+ def self.rank
17
+ 1
18
+ end
19
+
20
+ def self.regexp
21
+ %r{\[ruby-talk:(\d+)\]}
22
+ end
23
+
24
+ def replace
25
+ lm = @match.captures[0]
26
+ # %Q(<a class="rwtk_RubyTalkLinks" href="http://www.ruby-talk.org/#{lm}">#{@match[0]}</a>)
27
+ %Q(<a class="rwtk_RubyTalkLinks" href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/#{lm}">#{@match[0]}</a>)
28
+ end
29
+ end
30
+
31
+ # Convert ruby-core/ext/dev/list/math mailing list references (e.g.,
32
+ # [ruby-core:12345]) into named links.
33
+ class OtherRubyLinks < Ruwiki::Wiki::Token
34
+ def self.rank
35
+ 1
36
+ end
37
+
38
+ def self.regexp
39
+ %r{\[ruby-(list|doc|core|dev|ext|math):(\d+)\]}
40
+ end
41
+
42
+ def replace
43
+ ln, lm = @match.captures[0..1]
44
+ %Q(<a class="rwtk_OtherRubyLinks" href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-#{ln}/#{lm}">#{@match[0]}</a>)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,22 @@
1
+ ruwiki-config!auth-options:
2
+ ruwiki-config!css: ruwiki.css
3
+ ruwiki-config!date-format: %Y.%m.%d
4
+ ruwiki-config!datetime-format: %Y.%m.%d %H:%M:%S
5
+ ruwiki-config!debug: true
6
+ ruwiki-config!default-page: ProjectIndex
7
+ ruwiki-config!default-project: Default
8
+ ruwiki-config!language: en
9
+ ruwiki-config!storage-options: flatfiles!data-path: ./data
10
+ flatfiles!extension: ruwiki
11
+ ruwiki-config!storage-type: flatfiles
12
+ ruwiki-config!template-path: ./templates/
13
+ ruwiki-config!template-set: default
14
+ ruwiki-config!time-format: %H:%M:%S
15
+ ruwiki-config!title: Ruwiki
16
+ ruwiki-config!webmaster: webmaster@domain.tld
17
+ webrick-config!addresses:
18
+ webrick-config!do-log: true
19
+ webrick-config!log-dest: <STDERR>
20
+ webrick-config!mount: /
21
+ webrick-config!port: 8808
22
+ webrick-config!threads: 1
Binary file
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <title>%wiki_title%</title>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=#charset_encoding#" />
7
+ [!indexable|<meta name="robots" content="noindex,nofollow,noarchive" />?]
8
+ %css_link%
9
+ <!--[if IE 6]>
10
+ <style type="text/css" media="screen,print">
11
+ html { overflow: hidden; }
12
+ body { height: 100%; overflow: auto; }
13
+ </style>
14
+ <![endif]-->
15
+ </head>
16
+ <body>
17
+ !INCLUDE!
18
+ </body>
19
+ </html>
@@ -0,0 +1,7 @@
1
+ <!-- header -->!INCLUDE!<!-- /header -->
2
+ <!-- content --><div id="rw_content">
3
+ [?message|<div class="rw_message">%message%</div>?]
4
+ <div class="rw_content">
5
+ %content%
6
+ </div></div><!-- /content -->
7
+ <!-- footer -->!INCLUDE!<!-- /footer -->
@@ -0,0 +1,23 @@
1
+ <div id="rw_header">
2
+ <form class="rw_navbar" action="_search">
3
+ <div class="rw_navbar_tab">%home_link%</div>
4
+ <div class="rw_navbar_tab">#label_project#<a href="%cgi_url%/%page_project%/"><strong>%page_project%</strong></a></div>
5
+ <div class="rw_navbar_tab">%label_topic_or_search% %page_topic%</div>
6
+ [?editable|<div class="rw_navbar_tab"><a href="%cgi_url%/%page_project%/%page_raw_topic%/_edit">#label_edit#</a></div>?]
7
+ <!-- Right-hand tabs must go in reverse order! -->
8
+ <div class="rw_navbar_righttab">
9
+ <input class="rw_search_box" type="text" name="q" size="10" />
10
+ <button class="rw_search_button" type="submit">#label_search_project#</button>
11
+ <input class="rw_search_all_check" type="checkbox" name="a">#label_search_all#</input>
12
+ </div>
13
+ <div class="rw_navbar_righttab">
14
+ <a href="%cgi_url%/%page_project%/RecentChanges">#label_recent_changes#</a>
15
+ </div>
16
+ <div class="rw_navbar_righttab">
17
+ %page_project%::<a href="%cgi_url%/%page_project%/_topics">#label_topics#</a>
18
+ </div>
19
+ <div class="rw_navbar_righttab">
20
+ <a href="%cgi_url%/_projects">#label_projects#</a>
21
+ </div>
22
+ </form>
23
+ </div>
@@ -0,0 +1,27 @@
1
+ <div id="rw_header">
2
+ <div class="rw_navbar">
3
+ <div class="rw_navbar_tab">%home_link%</div>
4
+ <div class="rw_navbar_tab">#label_topic#<b>%page_topic%</b></div>
5
+ <div class="rw_navbar_tab">#label_project#<b>%page_project%</b></div>
6
+ <div class="rw_navbar_righttab" id="rw_editing_tab"><strong><em>#label_editing#</em> #%page_version%</strong></div>
7
+ </div>
8
+ </div>
9
+
10
+ <div id="rw_content">
11
+ [?message|<div class="rw_message">%message%</div>?]
12
+ <div class="rw_content">
13
+ <form class="rw_edit_form" action="%cgi_url%/%page_project%/%page_raw_topic%" method="post">
14
+ <span class="rw_accelerator">(#label_text_accelerator#)</span> #label_text#<br /><textarea accesskey="#label_text_accelerator#" class="rw_edit_content" rows="15" name="newpage">%page_content%</textarea>
15
+ <div class="rw_edit_comment"><span class="rw_accelerator">(#label_comment_accelerator#)</span> #label_edit_comment#<input accesskey="#label_comment_accelerator#" type="text" name="edcomment" value="%edit_comment%" /></div>
16
+ <input type="hidden" name="topic" value="%page_raw_topic%" />
17
+ <input type="hidden" name="project" value="%page_project%" />
18
+ <input type="hidden" name="version" value="%page_version%" /><br />
19
+ <button class="rw_edit_form_button" accesskey="#label_save_accelerator#" type="submit" name="save"><span class="rw_accelerator">(#label_save_accelerator#)</span> #label_save#</button>
20
+ <button class="rw_edit_form_button" accesskey="#label_cancel_accelerator#" type="submit" name="cancel"><span class="rw_accelerator">(#label_cancel_accelerator#)</span> #label_cancel#</button>
21
+ <button class="rw_edit_form_button" accesskey="#label_preview_accelerator#" type="submit" name="preview"><span class="rw_accelerator">(#label_preview_accelerator#)</span> #label_preview#</button>
22
+ </form>
23
+ <h2 style="border-bottom: 1px solid black">#label_original_text#</h2>
24
+ <div class="rw_edit_raw"><h2 class="rw_edit_title">#label_raw#</h2><pre>%pre_page_content%</pre></div>
25
+ <div class="rw_edit_format"><h2 class="rw_edit_title">#label_formatted#</h2><div>%unedited_page_content%</div></div>
26
+ </div>
27
+ </div>