motiro 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +1 -1
- data/app/controllers/wiki_controller.rb +14 -1
- data/app/core/version.rb +1 -1
- data/app/core/wiki_reporter.rb +4 -17
- data/app/helpers/application_helper.rb +33 -0
- data/app/helpers/report_helper.rb +39 -0
- data/app/helpers/report_helper.rb.rej +46 -0
- data/app/helpers/wiki_helper.rb +1 -1
- data/app/models/change.rb +12 -41
- data/app/models/chunk.rb +56 -0
- data/app/models/page.rb +17 -0
- data/app/models/revision.rb +31 -0
- data/app/reporters/events_reporter.rb +0 -2
- data/app/views/report/show.rhtml +2 -2
- data/app/views/wiki/diff.rhtml +4 -0
- data/app/views/wiki/history.rhtml +32 -21
- data/app/views/wiki/history.rhtml.rej +63 -0
- data/config/motiro.yml +1 -1
- data/config/routes.rb +3 -0
- data/db/motirodb.sqlite.initial +0 -0
- data/db/translation/pt-BR.rb +6 -1
- data/db/translation/pt-BR.rb.rej +26 -0
- data/lib/diff_chunk_builder.rb +98 -0
- data/lib/tasks/packaging.rake +2 -1
- data/public/stylesheets/motiro.css +49 -18
- data/public/stylesheets/motiro.css.rej +37 -0
- data/public/wiki/history/OtherPage-en-us.xml +40 -0
- data/test/fixtures/pages.yml +1 -1
- data/test/fixtures/revisions.yml +15 -4
- data/test/functional/report_features_test.rb +7 -1
- data/test/functional/root_controller_test.rb +1 -1
- data/test/functional/wiki_controller_test.rb +44 -4
- data/test/unit/change_test.rb +29 -56
- data/test/unit/diff_chunk_builder_test.rb +269 -0
- data/test/unit/page_test.rb +46 -0
- data/test/unit/revision_test.rb +160 -0
- data/test/unit/wiki_reporter_test.rb +2 -1
- metadata +301 -283
- data/app/models/diff_table_builder.rb +0 -285
- data/test/unit/diff_table_builder_test.rb +0 -602
@@ -1,285 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
|
3
|
-
class DiffTableBuilder
|
4
|
-
|
5
|
-
include ERB::Util
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
@mod_groups = []
|
9
|
-
@curr_group = 0
|
10
|
-
@left_line_to_start = @right_line_to_start = 1
|
11
|
-
@last_mod_type = nil
|
12
|
-
end
|
13
|
-
|
14
|
-
def render_diff_table
|
15
|
-
result = "<table class='diff 'cellspacing='0'>\n"
|
16
|
-
@mod_groups.each do |mg|
|
17
|
-
result += mg.render_diff_lines
|
18
|
-
end
|
19
|
-
result += "</table>"
|
20
|
-
end
|
21
|
-
|
22
|
-
def start_line(left_line_num, right_line_num=left_line_num)
|
23
|
-
@mod_groups << SpacingGroup.instance if @left_line_to_start != 1 || @right_line_to_start != 1
|
24
|
-
@left_line_to_start = left_line_num
|
25
|
-
@right_line_to_start = right_line_num
|
26
|
-
@start_new_group = true
|
27
|
-
end
|
28
|
-
|
29
|
-
{ 'addition' => 'add',
|
30
|
-
'deletion' => 'del',
|
31
|
-
'unchanged' => 'unch'}.each do |k,v|
|
32
|
-
eval "def push_#{k}(text); " +
|
33
|
-
"get_current_group(:#{v}).push_#{k}(html_escape(text)); " +
|
34
|
-
"end"
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def get_current_group(mod_type)
|
40
|
-
if need_a_new_group(mod_type) then
|
41
|
-
@mod_groups << create_group(mod_type)
|
42
|
-
end
|
43
|
-
@last_mod_type = mod_type
|
44
|
-
|
45
|
-
return @mod_groups.last
|
46
|
-
end
|
47
|
-
|
48
|
-
def create_group(mod_type)
|
49
|
-
left_line, right_line = curr_lines
|
50
|
-
mg = :unch == mod_type ? UnchangedGroup.new(left_line, right_line) :
|
51
|
-
ModGroup.new(left_line, right_line)
|
52
|
-
@left_line_to_start, @right_line_to_start = left_line, right_line
|
53
|
-
@start_new_group = false
|
54
|
-
return mg
|
55
|
-
end
|
56
|
-
|
57
|
-
def curr_lines
|
58
|
-
if @start_new_group or @mod_groups.empty? then
|
59
|
-
return [@left_line_to_start, @right_line_to_start]
|
60
|
-
else
|
61
|
-
return [ @left_line_to_start + @mod_groups.last.num_lines_left,
|
62
|
-
@right_line_to_start + @mod_groups.last.num_lines_right ]
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
CREATE_GROUP_DECISION_TABLE = # current / last
|
67
|
-
{ :add => { :add => false, :del => false, :unch => true },
|
68
|
-
:del => { :add => true, :del => false, :unch => true },
|
69
|
-
:unch => { :add => true, :del => true, :unch => false} }
|
70
|
-
|
71
|
-
def need_a_new_group(mod_type)
|
72
|
-
if @start_new_group then
|
73
|
-
return true
|
74
|
-
end
|
75
|
-
(@mod_groups.empty?) or
|
76
|
-
CREATE_GROUP_DECISION_TABLE[mod_type][@last_mod_type]
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
|
81
|
-
class Group
|
82
|
-
|
83
|
-
def render_diff_lines
|
84
|
-
result = ''
|
85
|
-
0.upto(num_lines - 1) do |i|
|
86
|
-
|
87
|
-
result += " <tr style='background: #FFF'>\n"
|
88
|
-
result += render_counter(:left, i)
|
89
|
-
result += render_left_cell(i)
|
90
|
-
result += render_right_cell(i)
|
91
|
-
result += render_counter(:right, i)
|
92
|
-
result += " </tr>\n"
|
93
|
-
end
|
94
|
-
|
95
|
-
return result
|
96
|
-
end
|
97
|
-
|
98
|
-
protected
|
99
|
-
|
100
|
-
attr_reader :initial_left_line, :initial_right_line
|
101
|
-
|
102
|
-
def initialize(initial_left_line = 1, initial_right_line = 1)
|
103
|
-
@initial_left_line = initial_left_line
|
104
|
-
@initial_right_line = initial_right_line
|
105
|
-
end
|
106
|
-
|
107
|
-
def render_cell_contents(text)
|
108
|
-
return "<pre>#{text}</pre>" unless text.nil? || 0 == text.length
|
109
|
-
return ' '
|
110
|
-
end
|
111
|
-
|
112
|
-
def render_counter(side, pos)
|
113
|
-
num_lines, initial_line = num_lines_left, initial_left_line
|
114
|
-
if :right == side then
|
115
|
-
num_lines, initial_line = num_lines_right, initial_right_line
|
116
|
-
end
|
117
|
-
|
118
|
-
result = " <td class='line_number'>"
|
119
|
-
|
120
|
-
if pos < num_lines then
|
121
|
-
result += (initial_line + pos).to_s
|
122
|
-
else
|
123
|
-
result += ' '
|
124
|
-
end
|
125
|
-
|
126
|
-
return result + "</td>\n"
|
127
|
-
end
|
128
|
-
|
129
|
-
def render_left_cell(pos)
|
130
|
-
style = cell_border_width(pos, :left)
|
131
|
-
return render_cell(left_lines[pos], style, :left)
|
132
|
-
end
|
133
|
-
|
134
|
-
def render_right_cell(pos)
|
135
|
-
style = cell_border_width(pos, :right)
|
136
|
-
return render_cell(right_lines[pos], style, :right)
|
137
|
-
end
|
138
|
-
|
139
|
-
def render_cell(text, style, side)
|
140
|
-
clazz = class_for(text)
|
141
|
-
cell_contents = render_cell_contents(text)
|
142
|
-
return " <td class='#{side.to_s}#{clazz}' style='#{style}'>" +
|
143
|
-
cell_contents +
|
144
|
-
"</td>\n"
|
145
|
-
end
|
146
|
-
|
147
|
-
end
|
148
|
-
|
149
|
-
class ModGroup < Group
|
150
|
-
|
151
|
-
def initialize(initial_left_line = 1, initial_right_line = 1)
|
152
|
-
super(initial_left_line, initial_right_line)
|
153
|
-
@deletions = []
|
154
|
-
@additions = []
|
155
|
-
end
|
156
|
-
|
157
|
-
def push_addition(text)
|
158
|
-
additions << text
|
159
|
-
end
|
160
|
-
|
161
|
-
def push_deletion(text)
|
162
|
-
deletions << text
|
163
|
-
end
|
164
|
-
|
165
|
-
def num_lines_left
|
166
|
-
deletions.length
|
167
|
-
end
|
168
|
-
|
169
|
-
def num_lines_right
|
170
|
-
additions.length
|
171
|
-
end
|
172
|
-
|
173
|
-
private
|
174
|
-
|
175
|
-
def num_lines
|
176
|
-
deletions.length > additions.length ? deletions.length :
|
177
|
-
additions.length
|
178
|
-
end
|
179
|
-
|
180
|
-
def cell_border_width(pos, side)
|
181
|
-
borders = 'border-width: '
|
182
|
-
|
183
|
-
borders += top_border(pos)
|
184
|
-
borders += right_border(pos, side)
|
185
|
-
borders += bottom_border(pos, :left == side ? deletions : additions)
|
186
|
-
borders += left_border(pos, side)
|
187
|
-
|
188
|
-
return borders
|
189
|
-
end
|
190
|
-
|
191
|
-
def top_border(pos)
|
192
|
-
if 0 == pos then
|
193
|
-
return '1px '
|
194
|
-
else
|
195
|
-
return '0 '
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
def right_border(pos, side)
|
200
|
-
if :right == side and 0!=pos and pos >= additions.length then
|
201
|
-
return '0 '
|
202
|
-
else
|
203
|
-
return '1px '
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
def bottom_border(pos, lines)
|
208
|
-
if lines.length == pos+1 or (lines.length == 0 and 0==pos) then
|
209
|
-
return '1px '
|
210
|
-
else
|
211
|
-
return '0 '
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
def left_border(pos, side)
|
216
|
-
if 0!=pos and pos >= additions.length then
|
217
|
-
return '1px;'
|
218
|
-
elsif !( (:right == side) ^ (0!=pos and pos >= deletions.length) ) then
|
219
|
-
return '1px;'
|
220
|
-
else
|
221
|
-
return '0;'
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
|
226
|
-
def class_for(text)
|
227
|
-
return ' changed' unless text.nil?
|
228
|
-
return ''
|
229
|
-
end
|
230
|
-
|
231
|
-
attr_accessor :additions, :deletions
|
232
|
-
alias left_lines deletions
|
233
|
-
alias right_lines additions
|
234
|
-
|
235
|
-
end
|
236
|
-
|
237
|
-
class UnchangedGroup < Group
|
238
|
-
|
239
|
-
include ERB::Util
|
240
|
-
|
241
|
-
def initialize(initial_left_line = 1, initial_right_line = 1)
|
242
|
-
super(initial_left_line, initial_right_line)
|
243
|
-
@lines = []
|
244
|
-
end
|
245
|
-
|
246
|
-
def push_unchanged(text)
|
247
|
-
@lines << text
|
248
|
-
end
|
249
|
-
|
250
|
-
def num_lines
|
251
|
-
@lines.size
|
252
|
-
end
|
253
|
-
|
254
|
-
alias num_lines_left num_lines
|
255
|
-
alias num_lines_right num_lines
|
256
|
-
|
257
|
-
private
|
258
|
-
|
259
|
-
def cell_border_width(pos, side)
|
260
|
-
return 'border-width: 0 1px 0 0;' if :left == side
|
261
|
-
return 'border-width: 0 0 0 0;'
|
262
|
-
end
|
263
|
-
|
264
|
-
def class_for(text)
|
265
|
-
return ''
|
266
|
-
end
|
267
|
-
|
268
|
-
attr_accessor :lines
|
269
|
-
alias left_lines lines
|
270
|
-
alias right_lines lines
|
271
|
-
|
272
|
-
end
|
273
|
-
|
274
|
-
class SpacingGroup
|
275
|
-
|
276
|
-
include Singleton
|
277
|
-
|
278
|
-
def render_diff_lines
|
279
|
-
cell = " <td style='border:solid gray; " +
|
280
|
-
"border-width: 1px 0 1px 0;'> </td>\n"
|
281
|
-
|
282
|
-
return " <tr>\n" + cell + cell + cell + cell + " </tr>\n"
|
283
|
-
end
|
284
|
-
|
285
|
-
end
|