module ActsAsMarkupOn::ActiveRecordExtension::ClassMethods

Public Instance Methods

acts_as_markdown_on(*columns) click to toggle source

This is a convenience method for ‘acts_as_markup_on :language => :markdown, :columns => [:body]` Additional options can be given at the end, if necessary.

# File lib/acts_as_markup_on/active_record_extension.rb, line 82
def acts_as_markdown_on(*columns)
  options = columns.extract_options!
  acts_as_markup_on options.merge(:language => :markdown, :columns => columns)
end
acts_as_markup_on(options) click to toggle source

This allows you to specify columns you want to define as containing Markdown, Textile, Wikitext or RDoc content. Then you can simply call .to_html method on the attribute.

You can also specify the language as :variable. The language used to process the column will be based on another column. By default a column named “markup_language” is used, but this can be changed by providing a :language_column option. When a value is accessed it will create the correct object (Markdown, Textile, Wikitext or RDoc) based on the value of the language column. If any value besides markdown, textile, mediawiki, or RDoc is supplied for the markup language the text will pass through as a string.

You can specify additional options to pass to the markup library by using :markdown_options, :textile_options or :mediawiki_options. RDoc does not support any useful options. The options should be given as an array of arguments. You can specify options for more than one language when using :variable. See each library’s documentation for more details on what options are available.

Examples

Using Markdown language
class Post < ActiveRecord
  acts_as_markup_on :language => :markdown, :columns => [:body]
end

@post = Post.find(:first)
@post.body.to_s            # => "## Markdown Headline"
@post.body.to_html         # => "<h2> Markdown Headline</h2>"
Using variable language
class Post < ActiveRecord
  acts_as_markup_on :language => :variable, :columns => [:body], :language_column => 'language_name'
end

@post = Post.find(:first)
@post.language_name        # => "markdown"
@post.body.to_s            # => "## Markdown Headline"
@post.body.to_html         # => "<h2> Markdown Headline</h2>"
Using options
class Post < ActiveRecord
  acts_as_markup_on :language => :markdown, :columns => [:body], :markdown_options => [ :filter_html ]
end

class Post < ActiveRecord
  acts_as_markup_on :language => :textile, :columns => [:body], :textile_options => [ [ :filter_html ] ]
end

class Post < ActiveRecord
  acts_as_markup_on :language => :mediawiki, :columns => [:body], :mediawiki_options => [ { :space_to_underscore => true } ]
end
# File lib/acts_as_markup_on/active_record_extension.rb, line 67
def acts_as_markup_on(options)
  options.reverse_merge!(:language_column => :markup_language)
  markup_class = load_markup_class(options)
  
  unless options[:language].to_sym == :variable
    define_markup_columns_reader_methods(markup_class, options)
  else
    define_variable_markup_columns_reader_methods(markup_class, options)
  end
end
acts_as_mediawiki_on(*columns) click to toggle source

This is a convenience method for ‘acts_as_markup_on :language => :mediawiki, :columns => [:body]` Additional options can be given at the end, if necessary.

# File lib/acts_as_markup_on/active_record_extension.rb, line 100
def acts_as_mediawiki_on(*columns)
  options = columns.extract_options!
  acts_as_markup_on options.merge(:language => :mediawiki, :columns => columns)
end
acts_as_rdoc_on(*columns) click to toggle source

This is a convenience method for ‘acts_as_markup_on :language => :rdoc, :columns => [:body]` Additional options can be given at the end, if necessary.

# File lib/acts_as_markup_on/active_record_extension.rb, line 109
def acts_as_rdoc_on(*columns)
  options = columns.extract_options!
  acts_as_markup_on options.merge(:language => :rdoc, :columns => columns)
end
acts_as_textile_on(*columns) click to toggle source

This is a convenience method for ‘acts_as_markup_on :language => :textile, :columns => [:body]` Additional options can be given at the end, if necessary.

# File lib/acts_as_markup_on/active_record_extension.rb, line 91
def acts_as_textile_on(*columns)
  options = columns.extract_options!
  acts_as_markup_on options.merge(:language => :textile, :columns => columns)
end

Private Instance Methods

define_markup_columns_reader_methods(markup_class, options) click to toggle source
# File lib/acts_as_markup_on/active_record_extension.rb, line 177
def define_markup_columns_reader_methods(markup_class, options)
  markup_options = options["#{options[:language]}_options".to_sym] || []
  
  options[:columns].each do |col|
    define_method col do
      if instance_variable_defined?("@#{col}") && !send("#{col}_changed?")
          instance_variable_get("@#{col}")
      else
        instance_variable_set("@#{col}", markup_class.new(self[col].to_s, *markup_options))
      end
    end
  end
end
define_variable_markup_columns_reader_methods(markup_classes, options) click to toggle source
# File lib/acts_as_markup_on/active_record_extension.rb, line 191
def define_variable_markup_columns_reader_methods(markup_classes, options)
  options[:columns].each do |col|
    define_method col do
      if instance_variable_defined?("@#{col}")
        unless send("#{col}_changed?") || send("#{options[:language_column]}_changed?")
          return instance_variable_get("@#{col}")
        end
      end
      instance_variable_set("@#{col}", case send(options[:language_column])
      when /markdown/i
        markup_classes[:markdown].new self[col].to_s, *(options[:markdown_options] || [])
      when /textile/i
        markup_classes[:textile].new self[col].to_s, *(options[:textile_options] || [])
      when /mediawiki/i
        markup_classes[:mediawiki].new self[col].to_s, *(options[:mediawiki_options] || [])
      when /rdoc/i
        markup_classes[:rdoc].new self[col].to_s
      else
        self[col]
      end)
    end
  end
end
get_markdown_class() click to toggle source
# File lib/acts_as_markup_on/active_record_extension.rb, line 116
def get_markdown_class
  if ActsAsMarkupOn::MARKDOWN_LIBS.keys.include? ActsAsMarkupOn.markdown_library
    markdown_library_names = ActsAsMarkupOn::MARKDOWN_LIBS[ActsAsMarkupOn.markdown_library]
    require markdown_library_names[:lib_name]
    require_extensions(markdown_library_names[:lib_name])
    return markdown_library_names[:class_name].constantize
  else
    raise ActsAsMarkupOn::UnsportedMarkdownLibrary, "#{ActsAsMarkupOn.markdown_library} is not currently supported."
  end
end
get_mediawiki_class() click to toggle source
# File lib/acts_as_markup_on/active_record_extension.rb, line 127
def get_mediawiki_class
  if ActsAsMarkupOn::MEDIAWIKI_LIBS.keys.include? ActsAsMarkupOn.mediawiki_library
    mediawiki_library_names = ActsAsMarkupOn::MEDIAWIKI_LIBS[ActsAsMarkupOn.mediawiki_library]
    require mediawiki_library_names[:lib_name]
    require_extensions(mediawiki_library_names[:lib_name])
    return mediawiki_library_names[:class_name].constantize
  else
    raise ActsAsMarkupOn::UnsportedMediawikiLibrary, "#{ActsAsMarkupOn.mediawiki_library} is not currently supported."
  end
end
load_markup_class(options) click to toggle source
# File lib/acts_as_markup_on/active_record_extension.rb, line 162
def load_markup_class(options)
  case options[:language].to_sym
  when :markdown, :textile, :mediawiki, :rdoc
    require_library_and_get_class(options[:language].to_sym)
  when :variable
    markup_classes = {}
    [:textile, :mediawiki, :rdoc, :markdown].each do |language|
      markup_classes[language] = require_library_and_get_class(language)
    end
    markup_classes
  else
    raise ActsAsMarkupOn::UnsupportedMarkupLanguage, "#{options[:langauge]} is not a currently supported markup language."
  end
end
require_library_and_get_class(language) click to toggle source
# File lib/acts_as_markup_on/active_record_extension.rb, line 144
def require_library_and_get_class(language)
  case language
  when :markdown
    return get_markdown_class
  when :textile
    require 'redcloth'
    return RedCloth
  when :mediawiki
    return get_mediawiki_class
  when :rdoc
    require 'rdoc'
    require_extensions 'rdoc'
    return RDocText
  else
    return String
  end
end