Class: WikiAnnotate

Inherits:
Object
  • Object
show all
Defined in:
app/models/wiki_page.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(content) ⇒ WikiAnnotate

Returns a new instance of WikiAnnotate.


262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
# File 'app/models/wiki_page.rb', line 262

def initialize(content)
  @content = content
  current = content
  current_lines = current.text.split(/\r?\n/)
  @lines = current_lines.collect {|t| [nil, nil, t]}
  positions = []
  current_lines.size.times {|i| positions << i}
  while (current.previous)
    d = current.previous.text.split(/\r?\n/).diff(current.text.split(/\r?\n/)).diffs.flatten
    d.each_slice(3) do |s|
      sign, line = s[0], s[1]
      if sign == '+' && positions[line] && positions[line] != -1
        if @lines[positions[line]][0].nil?
          @lines[positions[line]][0] = current.version
          @lines[positions[line]][1] = current.author
        end
      end
    end
    d.each_slice(3) do |s|
      sign, line = s[0], s[1]
      if sign == '-'
        positions.insert(line, -1)
      else
        positions[line] = nil
      end
    end
    positions.compact!
    # Stop if every line is annotated
    break unless @lines.detect { |line| line[0].nil? }
    current = current.previous
  end
  @lines.each { |line|
    line[0] ||= current.version
    # if the last known version is > 1 (eg. history was cleared), we don't know the author
    line[1] ||= current.author if current.version == 1
  }
end

Instance Attribute Details

#contentObject (readonly)

Returns the value of attribute content


260
261
262
# File 'app/models/wiki_page.rb', line 260

def content
  @content
end

#linesObject (readonly)

Returns the value of attribute lines


260
261
262
# File 'app/models/wiki_page.rb', line 260

def lines
  @lines
end