class Thoth::Page
Public Class Methods
Returns true if the specified page name is already taken or is a reserved name.
# File lib/thoth/model/page.rb, line 58 def self.name_unique?(name) !PageController.methods.include?(name) && !PageController.instance_methods.include?(name) && !Page[:name => name.to_s.downcase] end
Returns true if the specified page name consists of valid characters and is not too long or too short.
# File lib/thoth/model/page.rb, line 66 def self.name_valid?(name) !!(name =~ /^[0-9a-z_-]{1,64}$/i) end
Adjusts the position values of all pages, resolving duplicate positions and eliminating gaps.
# File lib/thoth/model/page.rb, line 72 def self.normalize_positions db.transaction do i = 1 order(:position).all do |page| unless page.position == i filter(:id => page.id).update(:position => i) end i += 1 end end end
Sets the display position of the specified page, adjusting the position of other pages as necessary.
# File lib/thoth/model/page.rb, line 88 def self.set_position(page, pos) unless page.is_a?(Page) || page = Page[page.to_i] raise ArgumentError, "Invalid page id: #{page}" end pos = pos.to_i cur_pos = page.position unless pos > 0 raise ArgumentError, "Invalid position: #{pos}" end db.transaction do if pos < cur_pos filter{:position >= pos && :position < cur_pos}. update(:position => 'position + 1'.lit) elsif pos > cur_pos filter{:position > cur_pos && :position <= pos}. update(:position => 'position - 1'.lit) end filter(:id => page.id).update(:position => pos) end end
Returns a valid, unique page name based on the specified title. If the title is empty or cannot be converted into a valid name, an empty string will be returned.
# File lib/thoth/model/page.rb, line 116 def self.suggest_name(title) index = 1 # Remove HTML entities and non-alphanumeric characters, replace spaces # with hyphens, and truncate the name at 64 characters. name = title.to_s.strip.downcase.gsub(/&[^\s;]+;/, '_'). gsub(/[^\s0-9a-z-]/, '').gsub(/\s+/, '-')[0..63] # Strip off any trailing non-alphanumeric characters. name.gsub!(/[_-]+$/, '') return '' if name.empty? # Ensure that the name doesn't conflict with any methods on the Page # controller and that no two pages have the same name. until self.name_unique?(name) if name[-1] == index name[-1] = (index += 1).to_s else name = name[0..62] if name.size >= 64 name += (index += 1).to_s end end return name end
Public Instance Methods
# File lib/thoth/model/page.rb, line 147 def body=(body) self[:body] = body.strip self[:body_rendered] = RedCloth.new(wiki_to_html(body.dup.strip)).to_html end
Gets the creation time of this page. If format is provided, the time will be returned as a formatted String. See Time.strftime for details.
# File lib/thoth/model/page.rb, line 154 def created_at(format = nil) if new? format ? Time.now.strftime(format) : Time.now else format ? self[:created_at].strftime(format) : self[:created_at] end end
# File lib/thoth/model/page.rb, line 162 def name=(name) self[:name] = name.strip.downcase unless name.nil? end
# File lib/thoth/model/page.rb, line 166 def title=(title) title.strip! # Set the page name if it isn't already set. if self[:name].nil? || self[:name].empty? self[:name] = Page.suggest_name(title) end self[:title] = title end
Gets the time this page was last updated. If format is provided, the time will be returned as a formatted String. See Time.strftime for details.
# File lib/thoth/model/page.rb, line 179 def updated_at(format = nil) if new? format ? Time.now.strftime(format) : Time.now else format ? self[:updated_at].strftime(format) : self[:updated_at] end end
URL for this page.
# File lib/thoth/model/page.rb, line 188 def url Config.site['url'].chomp('/') + PageController.r(:/, name).to_s end
# File lib/thoth/model/page.rb, line 192 def validate validates_presence(:name, :message => 'Please enter a name for this page.') validates_presence(:title, :message => 'Please enter a title for this page.') validates_presence(:body, :message => "Come on, I'm sure you can think of something to write.") validates_max_length(255, :title, :message => 'Please enter a title under 255 characters.') validates_max_length(64, :name, :message => 'Please enter a name under 64 characters.') validates_format(/^[0-9a-z_-]+$/i, :name, :message => 'Page names may only contain letters, numbers, underscores, and dashes.') end