Module: ActionView::Helpers::FormHelper

Defined in:
lib/textile_editor_helper.rb

Instance Method Summary collapse

Instance Method Details

#textile_editor(object_name, method, options = {}) ⇒ Object

Returns a textarea opening and closing tag set tailored for accessing a specified attribute (identified by method) on an object assigned to the template (identified by object). Additional options on the input tag can be passed as a hash with options and places the textile toolbar above it

Examples

textile_editor(:post, :body, :cols => 20, :rows => 40) # => <textarea cols=“20” rows=“40” id=“post_body” name=“post”> # #ActionView::Helpers::FormHelper.@[email protected] # </textarea>

textile_editor(:comment, :text, :size => “20x30”) # => <textarea cols=“20” rows=“30” id=“comment_text” name=“comment”> # #ActionView::Helpers::FormHelper.@[email protected] # </textarea>

textile_editor(:application, :notes, :cols => 40, :rows => 15, :class => ‘app_input’) # => <textarea cols=“40” rows=“15” id=“application_notes” name=“application” class=“app_input”> # #ActionView::Helpers::FormHelper.@[email protected] # </textarea>

textile_editor(:entry, :body, :size => “20x20”, :disabled => ‘disabled’) # => <textarea cols=“20” rows=“20” id=“entry_body” name=“entry” disabled=“disabled”> # #ActionView::Helpers::FormHelper.@[email protected] # </textarea>



37
38
39
40
41
42
43
# File 'lib/textile_editor_helper.rb', line 37

def textile_editor(object_name, method, options = {})
  editor_id = options[:id] || '%s_%s' % [object_name, method]
  mode = options.delete(:simple) ? 'simple' : 'extended'
  (@textile_editor_ids ||= []) << [editor_id.to_s, mode.to_s]

  InstanceTag.new(object_name, method, self, options.delete(:object)).to_text_area_tag(options)
end

#textile_editor_button(text, options = {}) ⇒ Object

registers a new button for the Textile Editor toolbar Parameters:

  • text: text to display (contents of button tag, so HTML is valid as well)

  • options: options Hash as supported by content_tag helper in Rails

Example: The following example adds a button labeled ‘Greeting’ which triggers an alert:

<% textile_editor_button ‘Greeting’, :onclick => “alert(‘Hello!’)” %>

Note: this method must be called before textile_editor_initialize



68
69
70
71
72
73
# File 'lib/textile_editor_helper.rb', line 68

def textile_editor_button(text, options={})
  return textile_editor_button_separator if text == :separator
  button = (:button, text, options)
  button = "TextileEditor.buttons.push(\"%s\");" % escape_javascript(button)
  (@textile_editor_buttons ||= []) << button
end

#textile_editor_button_separator(options = {}) ⇒ Object



75
76
77
78
# File 'lib/textile_editor_helper.rb', line 75

def textile_editor_button_separator(options={})
  button = "TextileEditor.buttons.push(new TextileEditorButtonSeparator('%s'));" % (options[:simple] || '')
  (@textile_editor_buttons ||= []) << button
end

#textile_editor_initialize(*dom_ids) ⇒ Object

adds the necessary javascript include tags, stylesheet tags, and load event with necessary javascript to active textile editor(s) sample output: <link href=“/stylesheets/textile-editor.css” media=“screen” rel=“Stylesheet” type=“text/css” /> <script src=“/javascripts/textile-editor.js” type=“text/javascript”></script> <script type=“text/javascript”> document.observe(‘dom:loaded’, function() { TextileEditor.initialize(‘article_body’, ‘extended’); TextileEditor.initialize(‘article_body_excerpt’, ‘simple’); }); </script>

Note: in the case of this helper being called via AJAX, the output will be reduced: <script type=“text/javascript”> TextileEditor.initialize(‘article_body’, ‘extended’); TextileEditor.initialize(‘article_body_excerpt’, ‘simple’); </script>

This means that the support files must be loaded outside of the AJAX request, either via a call to this helper or the textile_editor_support() helper



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/textile_editor_helper.rb', line 107

def textile_editor_initialize(*dom_ids)
  options = textile_editor_options.dup

  # extract options from last argument if it's a hash
  if dom_ids.last.is_a?(Hash)
    hash = dom_ids.last.dup
    options.merge! hash
    dom_ids.last.delete :framework
  end

  editor_ids = (@textile_editor_ids || []) + textile_extract_dom_ids(*dom_ids)
  editor_buttons = (@textile_editor_buttons || [])
  output = []
  output << textile_editor_support unless request.xhr?
  output << '<script type="text/javascript">'
  output << '/* <![CDATA[ */'
  
  if !request.xhr?
    case options[:framework]
    when :prototype
      output << %{document.observe('dom:loaded', function() \{}
    when :jquery
      output << %{jQuery(document).ready(function($) \{}
    end
  end

  # output << %q{TextileEditor.framework = '%s';} % options[:framework].to_s
  output << editor_buttons.join("\n") if editor_buttons.any?
  editor_ids.each do |editor_id, mode|
    output << %q{TextileEditor.initialize('%s', '%s');} % [editor_id, mode || 'extended']
  end
  output << '});' unless request.xhr?

  output << '/* ]]> */'
  output << '</script>'
  output.join("\n").html_safe
end

#textile_editor_options(options = {}) ⇒ Object



45
46
47
# File 'lib/textile_editor_helper.rb', line 45

def textile_editor_options(options={})
  (@textile_editor_options ||= { :framework => :prototype }).merge! options
end

#textile_editor_supportObject



49
50
51
52
53
54
# File 'lib/textile_editor_helper.rb', line 49

def textile_editor_support
  output = []
  output << stylesheet_link_tag('textile-editor')
  output << javascript_include_tag('textile-editor')
  output.join("\n").html_safe
end

#textile_extract_dom_ids(*dom_ids) ⇒ Object



80
81
82
83
84
85
# File 'lib/textile_editor_helper.rb', line 80

def textile_extract_dom_ids(*dom_ids)
  hash = dom_ids.last.is_a?(Hash) ? dom_ids.pop : {}
  hash.inject(dom_ids) do |ids, (object, fields)|
    ids + Array(fields).map { |field| "%s_%s" % [object, field] }
  end
end