class Thoth::Page

Public Class Methods

name_unique?(name) click to toggle source

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
name_valid?(name) click to toggle source

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
normalize_positions() click to toggle source

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
set_position(page, pos) click to toggle source

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
suggest_name(title) click to toggle source

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

body=(body) click to toggle source
# 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
created_at(format = nil) click to toggle source

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
name=(name) click to toggle source
# File lib/thoth/model/page.rb, line 162
def name=(name)
  self[:name] = name.strip.downcase unless name.nil?
end
title=(title) click to toggle source
# 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
updated_at(format = nil) click to toggle source

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() click to toggle source

URL for this page.

# File lib/thoth/model/page.rb, line 188
def url
  Config.site['url'].chomp('/') + PageController.r(:/, name).to_s
end
validate() click to toggle source
# 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