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