app/models/page.rb in instiki-0.9.2 vs app/models/page.rb in instiki-0.10.0

- old
+ new

@@ -1,86 +1,112 @@ -require "date" -require "page_lock" -require "revision" -require "wiki_words" -require "chunks/wiki" - -class Page - include PageLock - - CONTINOUS_REVISION_PERIOD = 30 * 60 # 30 minutes - - attr_reader :name, :revisions, :web - - def initialize(web, name, content, created_at, author) - @web, @name, @revisions = web, name, [] - revise(content, created_at, author) - end - - def revise(content, created_at, author) - if !@revisions.empty? && continous_revision?(created_at, author) - @revisions.last.created_at = Time.now - @revisions.last.content = content - @revisions.last.clear_display_cache - else - @revisions << Revision.new(self, @revisions.length, content, created_at, author) - end - - web.refresh_pages_with_references(name) if @revisions.length == 1 - end - - def rollback(revision_number, created_at, author_ip = nil) - roll_back_revision = @revisions[revision_number].dup - revise(roll_back_revision.content, created_at, Author.new(roll_back_revision.author, author_ip)) - end - - def revisions? - revisions.length > 1 - end - - def revised_on - created_on - end - - def pretty_revised_on - DateTime.new(revised_on.year, revised_on.mon, revised_on.day).strftime "%B %e, %Y" - end - - def in_category?(cat) - cat.nil? || cat.empty? || categories.include?(cat) - end - - def categories - display_content.find_chunks(Category).map { |cat| cat.list }.flatten - end - - def authors - revisions.collect { |rev| rev.author } - end - - def references - web.select.pages_that_reference(name) - end - - # Returns the original wiki-word name as separate words, so "MyPage" becomes "My Page". - def plain_name - WikiWords.separate(name, web.brackets_only) - end - - def link(options = {}) - web.make_link(name, nil, options) - end - - def author_link(options = {}) - web.make_link(author, nil, options) - end - - private - def continous_revision?(created_at, author) - @revisions.last.author == author && @revisions.last.created_at + CONTINOUS_REVISION_PERIOD > created_at - end - - # Forward method calls to the current revision, so the page responds to all revision calls - def method_missing(method_symbol) - revisions.last.send(method_symbol) - end -end \ No newline at end of file +require 'date' +require 'page_lock' +require 'revision' +require 'wiki_words' +require 'chunks/wiki' + +class Page + include PageLock + + attr_reader :name, :web + attr_accessor :revisions + + def initialize(web, name, content, created_at, author) + @web, @name, @revisions = web, name, [] + revise(content, created_at, author) + end + + def revise(content, created_at, author) + + if not @revisions.empty? and content == @revisions.last.content + raise Instiki::ValidationError.new( + "You have tried to save page '#{name}' without changing its content") + end + + # A user may change a page, look at it and make some more changes - several times. + # Not to record every such iteration as a new revision, if the previous revision was done + # by the same author, not more than 30 minutes ago, then update the last revision instead of + # creating a new one + if !@revisions.empty? && continous_revision?(created_at, author) + @revisions.last.created_at = created_at + @revisions.last.content = content + @revisions.last.clear_display_cache + else + @revisions << Revision.new(self, @revisions.length, content, created_at, author) + end + + self.revisions.last.force_rendering + # at this point the page may not be inserted in the web yet, and therefore + # references to the page itself are rendered as "unresolved". Clearing the cache allows + # the page to re-render itself once again, hopefully _after_ it is inserted in the web + self.revisions.last.clear_display_cache + + @web.refresh_pages_with_references(@name) if @revisions.length == 1 + end + + def rollback(revision_number, created_at, author_ip = nil) + roll_back_revision = @revisions[revision_number].dup + revise(roll_back_revision.content, created_at, Author.new(roll_back_revision.author, author_ip)) + end + + def revisions? + revisions.length > 1 + end + + def revised_on + created_on + end + + def in_category?(cat) + cat.nil? || cat.empty? || categories.include?(cat) + end + + def categories + display_content.find_chunks(Category).map { |cat| cat.list }.flatten + end + + def authors + revisions.collect { |rev| rev.author } + end + + def references + @web.select.pages_that_reference(name) + end + + def linked_from + @web.select.pages_that_link_to(name) + end + + def included_from + @web.select.pages_that_include(name) + end + + # Returns the original wiki-word name as separate words, so "MyPage" becomes "My Page". + def plain_name + @web.brackets_only ? name : WikiWords.separate(name) + end + + # used to build chunk ids. + def id + @id ||= name.unpack('H*').first + end + + def link(options = {}) + @web.make_link(name, nil, options) + end + + def author_link(options = {}) + @web.make_link(author, nil, options) + end + + private + + def continous_revision?(created_at, author) + @revisions.last.author == author && @revisions.last.created_at + 30.minutes > created_at + end + + # Forward method calls to the current revision, so the page responds to all revision calls + def method_missing(method_symbol) + revisions.last.send(method_symbol) + end + +end