motiro 0.6.7 → 0.6.8

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License
15
15
  along with this program; if not, write to the Free Software
16
16
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
17
  --------------------------------------------------------------------------------
18
- Motiro version 0.6.7 - July 2007
18
+ Motiro version 0.6.8 - July 2007
19
19
 
20
20
  Please refer to your preferred language README. Every text file below this
21
21
  directory is UTF-8 encoded. Please make sure to set up your reader accordingly.
@@ -19,8 +19,9 @@ class WikiController < ApplicationController
19
19
 
20
20
  layout :choose_layout
21
21
 
22
- before_filter :login_required, :except => [:show, :last, :history, :diff]
22
+ before_filter :login_required, :only => [:new, :edit, :save]
23
23
  before_filter :fetch_page, :fetch_revision
24
+ before_filter :fetch_diff, :only => [:diff, :sourcediff]
24
25
  before_filter :check_edit_access, :only => [:edit, :save]
25
26
 
26
27
  cache_sweeper :wiki_sweeper, :only => [:edit, :save]
@@ -65,6 +66,19 @@ class WikiController < ApplicationController
65
66
  end
66
67
  end
67
68
 
69
+ def fetch_diff
70
+ redirect_to params.delete_if {|k,v| :btnCompare == k.to_sym} if params[:btnCompare]
71
+ @old_revision_num = params[:old_revision]
72
+ @new_revision_num = params[:new_revision]
73
+ @old_revision = @page.revisions[@old_revision_num.to_i - 1]
74
+ @new_revision = @page.revisions[@new_revision_num.to_i - 1]
75
+ unless @old_revision && @new_revision
76
+ flash[:notice] = '%s has no revision %s' / @page.name /
77
+ (@old_revision.nil? ? @old_revision_num : @new_revision_num)
78
+ redirect_to :action => 'show', :page_name => params[:page_name]
79
+ end
80
+ end
81
+
68
82
  def check_edit_access
69
83
  unless current_user.can_edit?(@page)
70
84
  flash[:not_authorized] = true
@@ -100,19 +114,6 @@ class WikiController < ApplicationController
100
114
  end
101
115
  end
102
116
 
103
- def diff
104
- redirect_to params.delete_if {|k,v| :btnCompare == k.to_sym} if params[:btnCompare]
105
- @old_revision_num = params[:old_revision]
106
- @new_revision_num = params[:new_revision]
107
- @old_revision = @page.revisions[@old_revision_num.to_i - 1]
108
- new_revision = @page.revisions[@new_revision_num.to_i - 1]
109
- unless @old_revision && new_revision
110
- flash[:notice] = '%s has no revision %s' / @page.name /
111
- (@old_revision.nil? ? @old_revision_num : @new_revision_num)
112
- redirect_to :action => 'show', :page_name => params[:page_name]
113
- end
114
- end
115
-
116
117
  def access_denied
117
118
  redirect_to :controller => 'wiki', :action => 'show',
118
119
  :page_name => params[:page_name]
data/app/core/version.rb CHANGED
@@ -1 +1 @@
1
- MOTIRO_VERSION = '0.6.7'
1
+ MOTIRO_VERSION = '0.6.8'
@@ -15,9 +15,6 @@
15
15
  # along with this program; if not, write to the Free Software
16
16
  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
- require 'diff/lcs'
19
- require 'diff/lcs/array'
20
-
21
18
  class Revision < ActiveRecord::Base
22
19
  belongs_to :page
23
20
  belongs_to :last_editor, :class_name => 'User', :foreign_key => 'last_editor_id'
@@ -27,32 +24,37 @@ class Revision < ActiveRecord::Base
27
24
  define_method(method) { page.send(method) }
28
25
  end
29
26
 
27
+ def diff(rev_num)
28
+ ChunkDiffer.new.diff(text.split($/),
29
+ #position numbers are 1-based, but we want 0-based when indexing revisions
30
+ page.revisions[rev_num - 1].text.split($/))
31
+ end
32
+
33
+ end
34
+
35
+ class ChunkDiffer
36
+
37
+ def diff(old_lines, new_lines)
38
+ @chunks = []
39
+ Differ.new(self).diff(old_lines, new_lines)
40
+ end
41
+
30
42
  LCS_ACTION_TO_SYMBOL = {'=' => :unchanged, '!' => :modification,
31
- '-' => :removal, '+' => :addition}
43
+ '-' => :deletion, '+' => :addition}
32
44
 
33
- def diff(rev_num)
34
- #position numbers are 1-based, but we want 0-based when indexing revisions
35
- sdiffs = text.split($/).sdiff(page.revisions[rev_num - 1].text.split($/))
36
- chunks = []
37
- last_action = chunk = nil
38
- sdiffs.each do |sdiff|
39
- if chunk_break_needed(last_action, sdiff.action)
40
- chunk = Chunk.new(LCS_ACTION_TO_SYMBOL[sdiff.action])
41
- chunks << chunk
42
- end
43
- last_action = sdiff.action
44
- #lcs's position are 0-based, but we want 1-based when rendering
45
- chunk << Line.new(sdiff.old_element, sdiff.old_position + 1,
46
- sdiff.new_element, sdiff.new_position + 1)
47
- end
48
-
49
- chunks
45
+ def start_new_chunk(action)
46
+ @chunk = Chunk.new(LCS_ACTION_TO_SYMBOL[action])
47
+ @chunks << @chunk
50
48
  end
51
49
 
52
- private
50
+ def store_diff(sdiff)
51
+ #lcs's position are 0-based, but we want 1-based when rendering
52
+ @chunk << Line.new(sdiff.old_element, sdiff.old_position + 1,
53
+ sdiff.new_element, sdiff.new_position + 1)
54
+ end
53
55
 
54
- def chunk_break_needed(prev, curr)
55
- prev.nil? || curr != prev && [prev, curr].include?('=')
56
+ def get_result
57
+ @chunks
56
58
  end
57
59
 
58
60
  end
@@ -1,7 +1,7 @@
1
1
  <% @title = "#{'Revision details'.t} - #{@headline.title(Translator.for(@locale))} (Motiro)" %>
2
2
  <% cache(:action => 'show', :suffix => 'summary', :locale => @locale) do %>
3
3
  <% pagetext('Revision %s' / truncate(@revision_id)) do %>
4
- <%= @renderer.render_html(@headline.description(Translator.for(@locale))) %>
4
+ <%= @renderer.render_wiki_text(@headline.description(Translator.for(@locale))) %>
5
5
  <div id="summary">
6
6
  <% @headline.changes.each do |change| %>
7
7
  <%= render_summary(change) -%>
@@ -0,0 +1,12 @@
1
+ <div class='toolbar bottombar'>
2
+ <%= render :partial => 'editor' %>
3
+ <%= if 'diff' == params[:action]
4
+ link_to 'View source diff'.t, params.merge(:action => 'sourcediff')
5
+ else
6
+ link_to 'View rendered diff'.t, params.merge(:action => 'diff')
7
+ end -%> |
8
+ <%= link_to 'View revision %s' / @new_revision_num,
9
+ :action => 'show', :page_name => @page.name,
10
+ :revision => @new_revision_num -%>
11
+ <%= page_history_link(@page) -%>
12
+ </div>
@@ -1,10 +1,5 @@
1
- <div class='toolbar editbar'>
2
- <% unless @page.last_editor.nil? || @page.modified_at.nil? %>
3
- <p>
4
- <i><%= 'Last update by %s at %s' / @page.last_editor.login /
5
- @page.modified_at.to_s(:rfc822) -%></i>
6
- </p>
7
- <% end %>
1
+ <div class='toolbar bottombar'>
2
+ <%= render :partial => 'editor' %>
8
3
  <% if current_user.nil? then %>
9
4
  <span class='disabled'>
10
5
  <%= 'Edit'.t -%> <%= '(requires authentication)'.t -%>
@@ -0,0 +1,6 @@
1
+ <% unless @page.last_editor.nil? || @page.modified_at.nil? %>
2
+ <p>
3
+ <i><%= 'Last update by %s at %s' / @page.last_editor.login /
4
+ @page.modified_at.to_s(:rfc822) -%></i>
5
+ </p>
6
+ <% end %>
@@ -1,4 +1,4 @@
1
1
  <% pagetext(@page.title, '(Comparing revisions %s and %s)' / @old_revision_num / @new_revision_num) do %>
2
- <%= render_diff_table(@old_revision.diff(@new_revision_num.to_i))%>
3
- <%= render :partial => 'editbar' %>
2
+ <%= @renderer.render_wiki_diff(@old_revision.text, @new_revision.text) %>
3
+ <%= render :partial => 'diffbar' %>
4
4
  <% end %>
@@ -13,7 +13,12 @@ xml.rss 'version' => '2.0',
13
13
  @page.revisions.reverse[0..10].each do |rev|
14
14
  xml.item do
15
15
  xml.title h(rev.title)
16
- xml.description @renderer.render_html(rev.text)
16
+ if rev.position > 1
17
+ xml.description @renderer.render_wiki_diff(
18
+ @page.revisions[rev.position - 2].text, rev.text)
19
+ else
20
+ xml.description @renderer.render_wiki_text(rev.text)
21
+ end
17
22
  xml.pubDate h(rev.modified_at.to_s(:rfc822))
18
23
  xml.dc :creator, h(rev.last_editor.login)
19
24
  xml.guid server_url_for(:action => 'show', :page_name => @page.name,
@@ -3,7 +3,7 @@
3
3
  :page => @page.name, :locale_suffix => @locale,
4
4
  :revision => @page_revision_id) do %>
5
5
  <%= render :partial => 'properties_show' %>
6
- <%= @renderer.render_html(@page.text) %>
6
+ <%= @renderer.render_wiki_text(@page.text) %>
7
7
  <% end %>
8
8
  <%= render :partial => 'editbar' %>
9
9
  <% end %>
@@ -0,0 +1,4 @@
1
+ <% pagetext(@page.title, '(Comparing revisions %s and %s)' / @old_revision_num / @new_revision_num) do %>
2
+ <%= render_diff_table(@old_revision.diff(@new_revision_num.to_i))%>
3
+ <%= render :partial => 'diffbar' %>
4
+ <% end %>
data/config/routes.rb CHANGED
@@ -42,8 +42,9 @@ ActionController::Routing::Routes.draw do |map|
42
42
  :action => 'last',
43
43
  :defaults => locale_defaults.merge(:kind => 'common')
44
44
 
45
- map.connect 'wiki/diff/:page_name/:old_revision/:new_revision',
46
- :controller => 'wiki', :action => 'diff'
45
+ map.connect 'wiki/:action/:page_name/:old_revision/:new_revision',
46
+ :controller => 'wiki',
47
+ :requirements => { :action => /(source)?diff/}
47
48
 
48
49
  map.connect 'wiki/:action/:locale',
49
50
  :controller => 'wiki',
@@ -71,7 +71,12 @@
71
71
  'event description' => 'descrição de evento',
72
72
  'Who should be able to edit this page?' => 'Quem pode editar esta página?',
73
73
  '(Usernames separated by spaces. Blank for everyone)' => '(Nomes de usuário separados por espaços. Em branco para todos.)',
74
+
75
+ # Wiki diff
74
76
  '(Comparing revisions %s and %s)' => '(Diferenças entre as revisões %s e %s)',
77
+ 'View rendered diff' => 'Ver comparativo renderizado',
78
+ 'View source diff' => 'Ver comparativo de código',
79
+ 'View revision %s' => 'Ver a revisão %s',
75
80
 
76
81
  # Older headlines and history pages
77
82
  'Author' => 'Autor',
@@ -0,0 +1,30 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ class Array
19
+
20
+ def xml_join
21
+ str = ''
22
+ each do |s|
23
+ str << ' ' unless str.empty? || s.empty? ||
24
+ str.match(/<[^\/][^>]*>\Z/) || s.match(/\A<\//)
25
+ str << s
26
+ end
27
+ str
28
+ end
29
+
30
+ end
data/lib/differ.rb ADDED
@@ -0,0 +1,46 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require 'diff/lcs'
19
+ require 'diff/lcs/array'
20
+
21
+ Differ = Struct.new(:target)
22
+ class Differ
23
+
24
+ def diff(old_elems, new_elems)
25
+ sdiffs = old_elems.sdiff(new_elems)
26
+
27
+ last_action = nil
28
+ sdiffs.each do |sdiff|
29
+ if chunk_break_needed(last_action, sdiff.action)
30
+ target.start_new_chunk(sdiff.action)
31
+ end
32
+ last_action = sdiff.action
33
+
34
+ target.store_diff(sdiff)
35
+ end
36
+
37
+ target.get_result
38
+ end
39
+
40
+ private
41
+
42
+ def chunk_break_needed(prev, curr)
43
+ prev.nil? || curr != prev && [prev, curr].include?('=')
44
+ end
45
+
46
+ end
@@ -1,10 +1,37 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
1
18
  require 'rubygems'
2
19
  require 'mediacloth'
3
20
 
4
21
  class String
5
-
22
+
6
23
  def medialize
7
24
  MediaCloth::wiki_to_html self
8
25
  end
9
-
26
+
27
+ def xml_split
28
+ str = self
29
+ words = []
30
+ while(md = str.match(/<([^>]+)(\s+[^>]+)?>.*?<\/\1>|[^\s<]+/m))
31
+ words << md[0]
32
+ str = md.post_match
33
+ end
34
+ words
35
+ end
36
+
10
37
  end
data/lib/wiki_renderer.rb CHANGED
@@ -18,6 +18,9 @@
18
18
  require 'rubygems'
19
19
  require 'mediacloth'
20
20
 
21
+ require 'string_extensions'
22
+ require 'array_extensions'
23
+
21
24
  class WikiRenderer
22
25
 
23
26
  include MediaCloth
@@ -27,16 +30,84 @@ class WikiRenderer
27
30
  @translator = Translator.for(locale_code)
28
31
  end
29
32
 
30
- def render_html(text)
33
+ def render_wiki_text(text)
31
34
  localized_text = @translator.localize(text).delete("\r")
32
35
  expanded_text = expand_internal_links(localized_text)
33
36
  wiki_to_html(expanded_text)
34
37
  end
35
38
 
39
+ def render_wiki_diff(old_text, new_text)
40
+ old_result = render_wiki_text(old_text)
41
+ new_result = render_wiki_text(new_text)
42
+
43
+ HtmlDiffRenderer.new.render_html_diff(old_result, new_result)
44
+ end
45
+
46
+ private
47
+
36
48
  def expand_internal_links(text)
37
49
  text.gsub(/\[(\w+)([ \t]+([^\]]+))?\]/) do |substr|
38
50
  "[#{@url_generator.generate_url_for($1)} #{$2 ? $2: $1}]"
39
51
  end
40
52
  end
41
53
 
42
- end
54
+ end
55
+
56
+ class HtmlDiffRenderer
57
+
58
+ def render_html_diff(old_html, new_html)
59
+ @diff_words = @removed_text = @inserted_text = []
60
+ Differ.new(self).diff(old_html.xml_split, new_html.xml_split)
61
+ end
62
+
63
+ def start_new_chunk(action)
64
+ inject(@diff_words, @removed_text.xml_join, @inserted_text.xml_join)
65
+ @removed_text = []
66
+ @inserted_text = []
67
+ end
68
+
69
+ def store_diff(sdiff)
70
+ if '=' == sdiff.action
71
+ @diff_words << sdiff.old_element
72
+ else
73
+ @removed_text << sdiff.old_element unless sdiff.old_element.nil?
74
+ @inserted_text << sdiff.new_element unless sdiff.new_element.nil?
75
+ end
76
+ end
77
+
78
+ def get_result
79
+ inject(@diff_words, @removed_text.xml_join, @inserted_text.xml_join)
80
+
81
+ @diff_words.xml_join
82
+ end
83
+
84
+ private
85
+
86
+ HTML_ELEMENT = /<([^>]+)(\s+[^>]+)?>(.*?)<\/\1>/m
87
+
88
+ def inject(words, old_text, new_text)
89
+ match_old = old_text.match(HTML_ELEMENT)
90
+ match_new = new_text.match(HTML_ELEMENT)
91
+ if match_old && match_new && match_old[1..2] == match_new[1..2]
92
+ words << [HtmlDiffRenderer.new.render_html_diff(match_old.pre_match, match_new.pre_match),
93
+ "<#{match_old[1..2].join}>",
94
+ HtmlDiffRenderer.new.render_html_diff(match_old[3], match_new[3]),
95
+ "</#{match_old[1]}>",
96
+ HtmlDiffRenderer.new.render_html_diff(match_old.post_match, match_new.post_match)].xml_join
97
+ else
98
+ injection = ''
99
+ injection += enclose('#ffb8b8', old_text) unless old_text.empty?
100
+ injection += enclose('#b8ffb8', new_text) unless new_text.empty?
101
+ words << injection
102
+ end
103
+ words
104
+ end
105
+
106
+ def enclose(color, text)
107
+ return "<span style=\"background: #{color}\">#{text}</span>" unless ?< == text[0]
108
+ match = text.match(HTML_ELEMENT)
109
+ [match.pre_match,
110
+ "<#{match[1..2].join}><span style=\"background: #{color}\">#{match[3]}</span></#{match[1]}>",
111
+ match.post_match].xml_join
112
+ end
113
+ end
@@ -122,11 +122,11 @@ div.toolbar {
122
122
  font-size: 0.8em;
123
123
  }
124
124
 
125
- div.editbar {
125
+ div.bottombar {
126
126
  border-top: 1px dotted #9C9C9C;
127
127
  }
128
128
 
129
- div.editbar p { margin-top: 0 }
129
+ div.bottombar p { margin-top: 0 }
130
130
 
131
131
  div.channel_toolbar {
132
132
  border-bottom: 1px dotted #9C9C9C;
@@ -138,6 +138,7 @@ first_multilanguage_revision:
138
138
  id: 15
139
139
  page_id: 12
140
140
  kind: feature
141
+ position: 1
141
142
  modified_at: 2007-06-14 12:03:24
142
143
  last_editor_id: 1000004 #john
143
144
  editors: ""
@@ -156,6 +157,7 @@ second_multilanguage_revision:
156
157
  id: 16
157
158
  page_id: 12
158
159
  kind: feature
160
+ position: 2
159
161
  modified_at: 2007-06-14 12:06:38
160
162
  last_editor_id: 1000004 #john
161
163
  editors: ""
@@ -17,7 +17,7 @@ class RootControllerTest < Test::Unit::TestCase
17
17
  def test_version_number
18
18
  get :index, :locale => 'en'
19
19
 
20
- assert_tag :content => /Motiro version 0.6.7/
20
+ assert_tag :content => /Motiro version 0.6.8/
21
21
  end
22
22
 
23
23
 
@@ -155,11 +155,14 @@ class WikiControllerTest < Test::Unit::TestCase
155
155
  end
156
156
 
157
157
  def test_considers_last_chosen_language_when_displaying_not_found_page
158
- get '/en'
159
-
158
+ get :show, :page_name => 'MultiLanguagePage', :locale => 'en'
160
159
  get :show, :page_name => 'NotYetCreatedPage'
161
160
  assert_tag :content => /nothing to be read here/
162
- end
161
+
162
+ get :show, :page_name => 'MultiLanguagePage', :locale => 'pt'
163
+ get :show, :page_name => 'NotYetCreatedPage'
164
+ assert_tag :content => /agora mesmo, basta clicar/
165
+ end
163
166
 
164
167
  def test_auto_selects_page_kind
165
168
  log_as 'bob'
@@ -349,11 +352,11 @@ class WikiControllerTest < Test::Unit::TestCase
349
352
 
350
353
  assert_xml_element "//item/description[contains(text(), 'This is the first English version')]"
351
354
  assert_xml_element "//item/description[contains(text(), 'Here is some &lt;b&gt;bold&lt;/b&gt; text')]"
352
- assert_xml_element "//item/description[contains(text(), 'This is the second English version')]"
355
+ assert_xml_element "//item/description[contains(text(), 'This is the &lt;span style=\"background: #ffb8b8\"&gt;first&lt;/span&gt;&lt;span style=\"background: #b8ffb8\"&gt;second&lt;/span&gt; English version')]"
353
356
 
354
357
  get :history, :page_name => page_name, :locale => 'pt-br', :format => 'xml'
355
358
  assert_xml_element "//item/description[contains(text(), 'Esta &#233; a primeira vers&#227;o em portugu&#234;s')]"
356
- assert_xml_element "//item/description[contains(text(), 'Esta &#233; a segunda vers&#227;o em portugu&#234;s')]"
359
+ assert_xml_element "//item/description[contains(text(), 'Esta &#233; a &lt;span style=\"background: #ffb8b8\"&gt;primeira&lt;/span&gt;&lt;span style=\"background: #b8ffb8\"&gt;segunda&lt;/span&gt; vers&#227;o em portugu&#234;s')]"
357
360
  end
358
361
 
359
362
  def test_history_links_to_page_revision
@@ -403,6 +406,29 @@ class WikiControllerTest < Test::Unit::TestCase
403
406
  assert_no_xml_element "//input[@name='old_revision' and @value!='#{n - 1}' and @checked='checked']"
404
407
  assert_no_xml_element "//input[@name='new_revision' and @value!='#{n}' and @checked='checked']"
405
408
  end
409
+
410
+ def test_shows_rendered_diff
411
+ page = pages('changed_page')
412
+ get :diff, :page_name => page.name, :old_revision => 1, :new_revision => 2
413
+
414
+ assert_tag :span, :attributes => {:style => 'background: #b8ffb8'},
415
+ :content => 'Eric changed the text that'
416
+ assert_tag :span, :attributes => {:style => 'background: #ffb8b8'},
417
+ :content => 'some text here'
418
+ assert_tag :a, :content => 'View source diff'
419
+ assert_tag :a, :content => 'View revision 2'
420
+ end
421
+
422
+ def test_shows_source_diff
423
+ page = pages('changed_page')
424
+ get :sourcediff, :page_name => page.name,
425
+ :old_revision => 1, :new_revision => 2
426
+
427
+ assert_tag :td, :content => /John entered some text here/
428
+ assert_tag :td, :content => /Eric changed the text that John entered/
429
+ assert_tag :a, :content => 'View rendered diff'
430
+ assert_tag :a, :content => 'View revision 2'
431
+ end
406
432
 
407
433
  private
408
434
 
@@ -0,0 +1,40 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require File.dirname(__FILE__) + '/../test_helper'
19
+ require 'array_extensions'
20
+
21
+ class ArrayExtensionsTest < Test::Unit::TestCase
22
+
23
+ def test_xml_joins_enclosing_elements
24
+ words = ['<p>', 'This', 'is', 'a', 'paragraph', '</p>']
25
+ assert_equal '<p>This is a paragraph</p>', words.xml_join
26
+ end
27
+
28
+ def test_xml_joins_inline_elements_with_spaces
29
+ words = ['<p>', 'A', '<a href="http://www.motiro.org">', 'link', '</a>',
30
+ 'here', '</p>']
31
+ assert_equal '<p>A <a href="http://www.motiro.org">link</a> here</p>',
32
+ words.xml_join
33
+ end
34
+
35
+ def test_xml_joins_empty_strings
36
+ words = ['<p>A paragraph</p>', '']
37
+ assert_equal '<p>A paragraph</p>', words.xml_join
38
+ end
39
+
40
+ end
@@ -185,7 +185,7 @@ class RevisionTest < Test::Unit::TestCase
185
185
  assert !chunks[1].unchanged?
186
186
  assert chunks[2].unchanged?
187
187
  chunk = chunks[1]
188
- assert_equal :removal, chunk.action
188
+ assert_equal :deletion, chunk.action
189
189
  assert_equal 1, chunk.lines.size
190
190
  assert_equal 2, chunk.lines.first.original_position
191
191
  assert_equal 'This is the second line', chunk.lines.first.original_text
@@ -1,3 +1,20 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
1
18
  require File.dirname(__FILE__) + '/../test_helper'
2
19
 
3
20
  class StringExtensionsTest < Test::Unit::TestCase
@@ -7,4 +24,26 @@ class StringExtensionsTest < Test::Unit::TestCase
7
24
  assert_equal '<h1>Motiro</h1><p>Another paragraph</p>', str.medialize
8
25
  end
9
26
 
27
+ def test_xml_splits_simple_elements
28
+ str = "<p>This is a paragraph</p><p>And another one</p>"
29
+ assert_equal ['<p>This is a paragraph</p>', '<p>And another one</p>'],
30
+ str.xml_split
31
+ end
32
+
33
+ def test_xml_splits_elements_with_attributes
34
+ str = 'This is a paragraph with a <a href="http://www.motiro.org/">link</a> inside'
35
+ assert_equal ['This', 'is', 'a', 'paragraph', 'with', 'a',
36
+ '<a href="http://www.motiro.org/">link</a>', 'inside'], str.xml_split
37
+ end
38
+
39
+ def test_xml_splits_tag_with_line_break
40
+ str = "<p>This is a\nmultiline change</p>"
41
+ assert_equal ["<p>This is a\nmultiline change</p>"], str.xml_split
42
+ end
43
+
44
+ def test_xml_splits_multiletter_tags
45
+ str = '<h2>Level 2 title</h2><p>Paragraph</p>'
46
+ assert_equal ['<h2>Level 2 title</h2>', '<p>Paragraph</p>'], str.xml_split
47
+ end
48
+
10
49
  end
@@ -28,7 +28,7 @@ class WikiRendererTest < Test::Unit::TestCase
28
28
  end
29
29
 
30
30
  def test_renders_title
31
- assert_equal "<h1>Motiro</h1>", renderer.render_html('= Motiro =')
31
+ assert_equal "<h1>Motiro</h1>", renderer.render_wiki_text('= Motiro =')
32
32
  end
33
33
 
34
34
  def test_breaks_paragraphs_on_linebreak_and_return_feed
@@ -36,48 +36,187 @@ class WikiRendererTest < Test::Unit::TestCase
36
36
  feed_return_text = "= Motiro =\r\n\r\nThis is project Motiro"
37
37
  expected_text = '<h1>Motiro</h1><p>This is project Motiro</p>'
38
38
 
39
- assert_equal expected_text, renderer.render_html(line_break_only_text)
40
- assert_equal expected_text, renderer.render_html(feed_return_text)
39
+ assert_equal expected_text, renderer.render_wiki_text(line_break_only_text)
40
+ assert_equal expected_text, renderer.render_wiki_text(feed_return_text)
41
41
  end
42
42
 
43
43
  def test_render_external_links
44
44
  expected = "<p><a href=\"http://nowhere.com\" rel=\"nofollow\">Nowhere</a></p>"
45
- assert_equal expected, renderer.render_html('[http://nowhere.com Nowhere]')
45
+ assert_equal expected, renderer.render_wiki_text('[http://nowhere.com Nowhere]')
46
46
  end
47
47
 
48
48
  def test_renders_multiple_languages
49
49
  wiki_text = "Bem-vindo ao Motiro\n\n" +
50
50
  "--- en ---\n" +
51
51
  "Welcome to Motiro"
52
- assert_equal "<p>Bem-vindo ao Motiro</p>", renderer.render_html(wiki_text)
52
+ assert_equal "<p>Bem-vindo ao Motiro</p>", renderer.render_wiki_text(wiki_text)
53
53
  assert_equal "<p>Welcome to Motiro</p>",
54
- WikiRenderer.new(url_generator, 'en').render_html(wiki_text)
54
+ WikiRenderer.new(url_generator, 'en').render_wiki_text(wiki_text)
55
55
  end
56
56
 
57
57
  def test_renders_internal_link
58
58
  expected = "<p><a href=\"http://test.host/wiki/show/AnotherPage\" rel=\"nofollow\">go somewhere else</a></p>"
59
- assert_equal expected, renderer.render_html('[AnotherPage go somewhere else]')
59
+ assert_equal expected, renderer.render_wiki_text('[AnotherPage go somewhere else]')
60
60
  end
61
61
 
62
62
  def test_renders_multiple_internal_links
63
63
  expected = "<p><a href=\"http://test.host/wiki/show/InternalPage\" rel=\"nofollow\">go there</a> <a href=\"http://test.host/wiki/show/OtherInternalPage\" rel=\"nofollow\">and there</a></p>"
64
- assert_equal expected, renderer.render_html("[InternalPage go there] " +
65
- "[OtherInternalPage and there]")
64
+ assert_equal expected, renderer.render_wiki_text("[InternalPage go there] " +
65
+ "[OtherInternalPage and there]")
66
66
  end
67
67
 
68
68
  def test_do_not_expand_links_when_there_is_a_break_inside_the_brackets
69
69
  expected = "<p>[ThisIsNotALink\nto anywhere]</p>"
70
- assert_equal expected, renderer.render_html("[ThisIsNotALink\nto anywhere]")
70
+ assert_equal expected, renderer.render_wiki_text("[ThisIsNotALink\nto anywhere]")
71
71
  end
72
72
 
73
73
  def test_expands_internal_links_with_address_only
74
74
  expected = "<p><a href=\"http://test.host/wiki/show/AnotherPage\" rel=\"nofollow\">AnotherPage</a></p>"
75
- assert_equal expected, renderer.render_html("[AnotherPage]")
75
+ assert_equal expected, renderer.render_wiki_text("[AnotherPage]")
76
76
  end
77
77
 
78
78
  def test_recover_from_unmatched_opening_bracket_inside_link_text
79
79
  assert_equal "<p><a href=\"http://test.host/wiki/show/SomeoneMistankenly\" rel=\"nofollow\">placed an opening bracket [ inside the link text, but Motiro managed to recover correctly</a></p>",
80
- renderer.render_html("[SomeoneMistankenly placed an opening bracket [ inside the link text, but Motiro managed to recover correctly]")
80
+ renderer.render_wiki_text("[SomeoneMistankenly placed an opening bracket [ inside the link text, but Motiro managed to recover correctly]")
81
+ end
82
+
83
+ def test_emphasizes_diffs_inside_pure_text_change
84
+ previous = "There is going to be some change inside this text"
85
+ current = "There has been some change inside this text"
86
+
87
+ assert_equal '<p>There <span style="background: #ffb8b8">is going to be</span>' +
88
+ '<span style="background: #b8ffb8">has been</span> some change inside ' +
89
+ 'this text</p>',
90
+ renderer.render_wiki_diff(previous, current)
91
+ end
92
+
93
+ def test_emphasizes_diffs_in_multiple_changes
94
+ previous = "There is going to be more than one change inside this text"
95
+ current = "There has been more than one change outside this text"
96
+
97
+ assert_equal '<p>There <span style="background: #ffb8b8">is going to be</span>' +
98
+ '<span style="background: #b8ffb8">has been</span> more than one ' +
99
+ 'change <span style="background: #ffb8b8">inside</span>' +
100
+ '<span style="background: #b8ffb8">outside</span> ' +
101
+ 'this text</p>',
102
+ renderer.render_wiki_diff(previous, current)
103
+ end
104
+
105
+ def test_emphasizes_changes_next_to_html_tags
106
+ previous = "First version was good"
107
+ current = "Second version was bad"
108
+
109
+ assert_equal '<p><span style="background: #ffb8b8">First</span>' +
110
+ '<span style="background: #b8ffb8">Second</span> version was ' +
111
+ '<span style="background: #ffb8b8">good</span>' +
112
+ '<span style="background: #b8ffb8">bad</span></p>',
113
+ renderer.render_wiki_diff(previous, current)
114
+ end
115
+
116
+ def test_emphasizes_changes_inside_html_tags
117
+ previous = "Some ''long emphasized'' text"
118
+ current = "Some ''short emphasized'' text"
119
+
120
+ assert_equal '<p>Some <i><span style="background: #ffb8b8">long</span>' +
121
+ '<span style="background: #b8ffb8">short</span> emphasized</i> text</p>',
122
+ renderer.render_wiki_diff(previous, current)
123
+ end
124
+
125
+ def test_emphasizes_changes_to_html_tags
126
+ previous = "Some ''emphasized'' text"
127
+ current = "Some '''emphasized''' text"
128
+
129
+ assert_equal '<p>Some <i><span style="background: #ffb8b8">emphasized</span></i>' +
130
+ '<b><span style="background: #b8ffb8">emphasized</span></b> text</p>',
131
+ renderer.render_wiki_diff(previous, current)
132
+ end
133
+
134
+ def test_emphasizes_changes_inside_partially_changed_html_tags
135
+ previous = "Here is a [http://www.motiro.org link]"
136
+ current = "Here is a [http://www.motiro.com link]"
137
+
138
+ assert_equal '<p>Here is a <a href="http://www.motiro.org" rel="nofollow"><span style="background: #ffb8b8">link</span></a>' +
139
+ '<a href="http://www.motiro.com" rel="nofollow"><span style="background: #b8ffb8">link</span></a></p>',
140
+ renderer.render_wiki_diff(previous, current)
141
+ end
142
+
143
+ def test_emphasizes_changed_html_tags_after_changed_text
144
+ previous = "Here is my ''long text''"
145
+ current = "Here is your ''long article''"
146
+
147
+ assert_equal '<p>Here is <span style="background: #ffb8b8">my</span>' +
148
+ '<span style="background: #b8ffb8">your</span> ' +
149
+ '<i>long <span style="background: #ffb8b8">text</span>' +
150
+ '<span style="background: #b8ffb8">article</span></i>' +
151
+ '</p>',
152
+ renderer.render_wiki_diff(previous, current)
153
+ end
154
+
155
+ def test_emphasizes_changed_html_tags_before_changed_text
156
+ previous = "Here is some ''long text'' that is yours"
157
+ current = "Here is some ''long article'' that is mine"
158
+
159
+ assert_equal '<p>Here is some ' +
160
+ '<i>long <span style="background: #ffb8b8">text</span>' +
161
+ '<span style="background: #b8ffb8">article</span></i> ' +
162
+ 'that is <span style="background: #ffb8b8">yours</span>' +
163
+ '<span style="background: #b8ffb8">mine</span>' +
164
+ '</p>',
165
+ renderer.render_wiki_diff(previous, current)
166
+ end
167
+
168
+ def test_emphasizes_line_breaked_changes_as_one
169
+ previous = "This is a\nmultiline change"
170
+ current = "This is an\nenvious change"
171
+
172
+ assert_equal '<p>This is <span style="background: #ffb8b8">a multiline</span>' +
173
+ '<span style="background: #b8ffb8">an envious</span> change</p>',
174
+ renderer.render_wiki_diff(previous, current)
175
+ end
176
+
177
+ def test_emphasizes_text_deletions
178
+ previous = "Here is something deleted"
179
+ current = "Here is something"
180
+
181
+ assert_equal '<p>Here is something <span style="background: #ffb8b8">deleted</span></p>',
182
+ renderer.render_wiki_diff(previous, current)
183
+ end
184
+
185
+ def test_emphasizes_text_additions
186
+ previous = "Here is something"
187
+ current = "Here is the place I added something"
188
+
189
+ assert_equal '<p>Here is <span style="background: #b8ffb8">the place I added</span> something</p>',
190
+ renderer.render_wiki_diff(previous, current)
191
+ end
192
+
193
+ def test_emphasizes_addition_and_deletions_inside_tags
194
+ previous = "Here is some ''text in italics''"
195
+ current = "Here is some ''very good text''"
196
+
197
+ assert_equal '<p>Here is some <i><span style="background: #b8ffb8">very good</span> ' +
198
+ 'text <span style="background: #ffb8b8">in italics</span></i></p>',
199
+ renderer.render_wiki_diff(previous, current)
200
+ end
201
+
202
+ def test_emphasizes_paragraph_addition_and_deletion
203
+ previous = "First paragraph\n\nSecond paragraph"
204
+ current = "Second paragraph\n\nThird paragraph"
205
+
206
+ assert_equal '<p><span style="background: #ffb8b8">First paragraph</span></p> ' +
207
+ '<p>Second paragraph</p> ' +
208
+ '<p><span style="background: #b8ffb8">Third paragraph</span></p>',
209
+ renderer.render_wiki_diff(previous, current)
210
+ end
211
+
212
+ def test_emphasize_change_inside_title_tag
213
+ previous = "== Sub title ==\n\nParagraph"
214
+ current = "== Super title ==\n\nParagraph"
215
+
216
+ assert_equal '<h2><span style="background: #ffb8b8">Sub</span>' +
217
+ '<span style="background: #b8ffb8">Super</span> title</h2> ' +
218
+ '<p>Paragraph</p>',
219
+ renderer.render_wiki_diff(previous, current)
81
220
  end
82
221
 
83
222
  private
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: motiro
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.6.7
7
- date: 2007-07-13 00:00:00 -03:00
6
+ version: 0.6.8
7
+ date: 2007-07-25 00:00:00 -03:00
8
8
  summary: Simple project tracking tool
9
9
  require_paths:
10
10
  - .
@@ -68,7 +68,6 @@ files:
68
68
  - db/translation
69
69
  - db/migrate
70
70
  - db/translation/pt-BR.rb
71
- - db/translation/pt-BR.rb.rej
72
71
  - db/migrate/018_drop_redundant_page_columns.rb
73
72
  - db/migrate/013_nullify_initial_page_attributes.rb
74
73
  - db/migrate/017_revision_mimics_page.rb
@@ -117,14 +116,16 @@ files:
117
116
  - app/views/report
118
117
  - app/views/wiki/diff.rhtml
119
118
  - app/views/wiki/_editbar.rhtml
119
+ - app/views/wiki/sourcediff.rhtml
120
120
  - app/views/wiki/history.rhtml
121
121
  - app/views/wiki/page_feed.rxml
122
+ - app/views/wiki/_diffbar.rhtml
122
123
  - app/views/wiki/_properties_show.rhtml
123
124
  - app/views/wiki/properties_edit.rhtml
124
125
  - app/views/wiki/edit.rhtml
125
126
  - app/views/wiki/show.rhtml
126
- - app/views/wiki/history.rhtml.rej
127
127
  - app/views/wiki/_properties_edit.rhtml
128
+ - app/views/wiki/_editor.rhtml
128
129
  - app/views/account/_availability.rhtml
129
130
  - app/views/account/logout.rhtml
130
131
  - app/views/account/availability.rhtml
@@ -170,7 +171,6 @@ files:
170
171
  - app/helpers/root_helper.rb
171
172
  - app/helpers/account_helper.rb
172
173
  - app/helpers/default_page_provider.rb
173
- - app/helpers/report_helper.rb.rej
174
174
  - app/reporters/svn_connection.rb
175
175
  - app/reporters/svn_settings.rb
176
176
  - app/reporters/darcs_settings.rb
@@ -188,6 +188,7 @@ files:
188
188
  - app/controllers/application.rb
189
189
  - lib/diff_chunk_builder.rb
190
190
  - lib/tick_daemon.rb
191
+ - lib/array_extensions.rb
191
192
  - lib/import_translations.rb
192
193
  - lib/translator.rb
193
194
  - lib/stub_hash.rb
@@ -195,12 +196,12 @@ files:
195
196
  - lib/login_system.rb
196
197
  - lib/tasks
197
198
  - lib/wiki_url_generator.rb
199
+ - lib/differ.rb
198
200
  - lib/wiki_renderer.rb
199
201
  - lib/string_extensions.rb
200
202
  - lib/tasks/packaging.rake
201
203
  - lib/tasks/testing.rake
202
204
  - doc/README_FOR_APP
203
- - public/wiki
204
205
  - public/dispatch.fcgi
205
206
  - public/dispatch.rb
206
207
  - public/favicon.ico
@@ -211,12 +212,9 @@ files:
211
212
  - public/500.html
212
213
  - public/dispatch.cgi
213
214
  - public/404.html
214
- - public/wiki/history
215
- - public/wiki/history/OtherPage-en-us.xml
216
215
  - public/images/rss.png
217
216
  - public/images/calendar.png
218
217
  - public/stylesheets/niftyCorners.css
219
- - public/stylesheets/motiro.css.rej
220
218
  - public/stylesheets/scaffold.css
221
219
  - public/stylesheets/motiro.css
222
220
  - public/javascripts/dragdrop.js
@@ -283,6 +281,7 @@ files:
283
281
  - test/unit/caching_test.rb
284
282
  - test/unit/settings_test.rb
285
283
  - test/unit/default_page_provider_test.rb
284
+ - test/unit/array_extensions_test.rb
286
285
  - test/stubs/svn_settings.rb
287
286
  - test/stubs/url_generator.rb
288
287
  - test/fixtures/revisions.yml
@@ -1,46 +0,0 @@
1
- ***************
2
- *** 22,57 ****
3
- Builder::XmlMarkup.new.div(:id => ref(change),
4
- :class => "diff-window") do |b|
5
- b.h2 'Changes to %s' / change.resource_name
6
- - b.table :class => 'diff', :cellspacing => '0' do
7
- - b.colgroup do
8
- - b.col :class => 'line_number'
9
- - b.col :class => 'left'
10
- - b.col :class => 'right'
11
- - b.col :class => 'line_number'
12
- - end
13
- - change.chunked_diff.each do |chunk|
14
- - if chunk.separator?
15
- - b.tbody :class => 'separator' do
16
- - b.tr do
17
- - b.td
18
- - b.td('%s more lines' / chunk.num_lines.to_s, :colspan => '2')
19
- - b.td
20
- - end
21
- - end
22
- - else
23
- - b.tbody :class => chunk.action.to_s do
24
- - chunk.lines.each do |line|
25
- - b.tr do
26
- - b.td {b << (line.original_position || '&nbsp;').to_s}
27
- - b.td {b.pre{b << (h(line.original_text) || '&nbsp;')}}
28
- - b.td {b.pre{b << (h(line.modified_text) || '&nbsp;')}}
29
- - b.td {b << (line.modified_position || '&nbsp;').to_s}
30
- - end
31
- - end
32
- - end
33
- - end
34
- - end
35
- - end
36
- end
37
- end
38
-
39
- --- 22,28 ----
40
- Builder::XmlMarkup.new.div(:id => ref(change),
41
- :class => "diff-window") do |b|
42
- b.h2 'Changes to %s' / change.resource_name
43
- + b << render_diff_table(change.chunked_diff)
44
- end
45
- end
46
-
@@ -1,63 +0,0 @@
1
- ***************
2
- *** 1,26 ****
3
- <% pagetext('Page history for %s' / @page.title) do %>
4
- - <table class="oldernews">
5
- - <thead>
6
- - <tr>
7
- - <th class="date"><%= 'Date'.t -%></th>
8
- - <th class="relative"/>
9
- - <th><%= 'Author'.t -%></th>
10
- - <th><%= 'Title'.t -%></th>
11
- - </tr>
12
- - </thead>
13
- - <tbody>
14
- - <% @page.revisions.reverse.each do |rev| %>
15
- - <tr class="<%= rev.position % 2 == 0 ? 'odd' : 'even' -%>">
16
- - <td class="date"><%= rev.modified_at-%></td>
17
- - <td class="relative"><%= rev.modified_at.relative_to_now %></td>
18
- - <td><%= rev.last_editor.login %></td>
19
- - <td><%= content_tag :a, rev.title,
20
- :href => server_url_for(:controller => 'wiki',
21
- :action => 'show',
22
- :page_name => @page.name,
23
- - :revision => rev.position) -%></td>
24
- - </tr>
25
- - <% end %>
26
- - </tbody>
27
- - </table>
28
- <% end %>
29
- --- 1,34 ----
30
- <% pagetext('Page history for %s' / @page.title) do %>
31
- + <% form_tag "/wiki/diff/#{params[:page_name]}", :method => 'get' do %>
32
- + <%= submit_tag 'Compare revisions'.t, :class => 'button',
33
- + :name => 'btnCompare' %>
34
- + <table class="oldernews">
35
- + <thead>
36
- + <tr>
37
- + <th/>
38
- + <th class="date"><%= 'Date'.t -%></th>
39
- + <th><%= 'Author'.t -%></th>
40
- + </tr>
41
- + </thead>
42
- + <tbody>
43
- + <% @page.revisions.reverse.each do |rev| %>
44
- + <tr class="<%= rev.position % 2 == 0 ? 'odd' : 'even' -%>">
45
- + <td>
46
- + <input type="radio" name="old_revision" value="<%= rev.position-%>" />
47
- + <input type="radio" name="new_revision" value="<%= rev.position-%>" />
48
- + </td>
49
- + <td class="date">
50
- + <%= content_tag :a, rev.modified_at,
51
- :href => server_url_for(:controller => 'wiki',
52
- :action => 'show',
53
- :page_name => @page.name,
54
- + :revision => rev.position) %>
55
- + (<%= rev.modified_at.relative_to_now -%>)
56
- + </td>
57
- + <td><%= rev.last_editor.login %></td>
58
- + </tr>
59
- + <% end %>
60
- + </tbody>
61
- + </table>
62
- + <% end %>
63
- <% end %>
@@ -1,26 +0,0 @@
1
- ***************
2
- *** 71,80 ****
3
- 'event description' => 'descrição de evento',
4
- 'Who should be able to edit this page?' => 'Quem pode editar esta página?',
5
- '(Usernames separated by spaces. Blank for everyone)' => '(Nomes de usuário separados por espaços. Em branco para todos.)',
6
-
7
- # Older headlines and history pages
8
- 'Author' => 'Autor',
9
- 'Page history for %s' => 'Histórico da página %s',
10
- 'Page history' => 'Histórico da página',
11
- '(Revision %s)' => '(Revisão %s)'
12
- }
13
- --- 71,83 ----
14
- 'event description' => 'descrição de evento',
15
- 'Who should be able to edit this page?' => 'Quem pode editar esta página?',
16
- '(Usernames separated by spaces. Blank for everyone)' => '(Nomes de usuário separados por espaços. Em branco para todos.)',
17
- + '(Comparing revisions %s and %s)' => '(Diferenças entre as revisões %s e %s)',
18
-
19
- # Older headlines and history pages
20
- 'Author' => 'Autor',
21
- + 'Page has no history yet' => 'Página ainda sem histórico',
22
- 'Page history for %s' => 'Histórico da página %s',
23
- + 'Page history (%s revisions)' => 'Histórico da página (%s revisões)',
24
- 'Page history' => 'Histórico da página',
25
- '(Revision %s)' => '(Revisão %s)'
26
- }
@@ -1,37 +0,0 @@
1
- ***************
2
- *** 182,187 ****
3
- }
4
-
5
- table.oldernews {
6
- border-spacing: 0;
7
- text-align: left;
8
- font-size: .85em;
9
- --- 183,189 ----
10
- }
11
-
12
- table.oldernews {
13
- + margin: .8em 0;
14
- border-spacing: 0;
15
- text-align: left;
16
- font-size: .85em;
17
- ***************
18
- *** 190,198 ****
19
-
20
- table.oldernews tr.even { background-color: #fff; }
21
-
22
- - table.oldernews tr.odd { background-color: #eee; }
23
-
24
- - table.oldernews thead { background-color: #d0d0d0; }
25
-
26
- table.oldernews tbody th { border: 1px #c9c9c9 solid; }
27
-
28
- --- 192,200 ----
29
-
30
- table.oldernews tr.even { background-color: #fff; }
31
-
32
- + table.oldernews tr.odd { background-color: #e0eeff; }
33
-
34
- + table.oldernews thead { background-color: #66a0e0; }
35
-
36
- table.oldernews tbody th { border: 1px #c9c9c9 solid; }
37
-
@@ -1,40 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
3
- <channel>
4
- <title>Changes to OtherPage</title>
5
- <description/>
6
- <link>http://localhost:3000/en-us</link>
7
- <language>en-us</language>
8
- <generator>Motiro</generator>
9
- <pubDate>Wed, 04 Jul 2007 00:14:13 -0300</pubDate>
10
- <ttl>60</ttl>
11
- <item>
12
- <title>Another page</title>
13
- <description>&lt;p&gt;This is the modified English version.&lt;/p&gt;&lt;p&gt;And I have modified it once more, but that version was not recorded.&lt;/p&gt;</description>
14
- <pubDate>Wed, 04 Jul 2007 00:14:13 -0300</pubDate>
15
- <dc:creator>thiagoarrais</dc:creator>
16
- <guid>http://localhost:3000/wiki/show/OtherPage?revision=4</guid>
17
- </item>
18
- <item>
19
- <title>Another page</title>
20
- <description>&lt;p&gt;This is the modified English version.&lt;/p&gt;&lt;p&gt;And I have modified it once more&lt;/p&gt;</description>
21
- <pubDate>Thu, 14 Jun 2007 00:48:09 -0300</pubDate>
22
- <dc:creator>thiagoarrais</dc:creator>
23
- <guid>http://localhost:3000/wiki/show/OtherPage?revision=3</guid>
24
- </item>
25
- <item>
26
- <title>Another page</title>
27
- <description>&lt;p&gt;This is the modified English version&lt;/p&gt;</description>
28
- <pubDate>Thu, 14 Jun 2007 00:47:45 -0300</pubDate>
29
- <dc:creator>thiagoarrais</dc:creator>
30
- <guid>http://localhost:3000/wiki/show/OtherPage?revision=2</guid>
31
- </item>
32
- <item>
33
- <title>Another page</title>
34
- <description>&lt;p&gt;This is the English version&lt;/p&gt;</description>
35
- <pubDate>Wed, 13 Jun 2007 21:37:54 -0300</pubDate>
36
- <dc:creator>thiagoarrais</dc:creator>
37
- <guid>http://localhost:3000/wiki/show/OtherPage?revision=1</guid>
38
- </item>
39
- </channel>
40
- </rss>