module TinyMCE::Rails::Helper

def tinymce(config=:default, options={})

<%= tinymce(selector: "editorClass", theme: "inlite") %>
@example

override these defaults.
available. The :editor_selector and :language options can be used to
TinyMCE language files are available, falling back to English if not
editor applied. The current locale will also be used as the language when
By default, all textareas with a class of "tinymce" will have the TinyMCE

the TinyMCE init function.
Custom options can be set via the options hash, which will be passed to

Initializes TinyMCE on the current page based on the global configuration.
def tinymce(config=:default, options={})
  javascript_tag(nonce: true) do
    unless @_tinymce_configurations_added
      concat tinymce_configurations_javascript
      concat "\n"
      @_tinymce_configurations_added = true
    end
    concat tinymce_javascript(config, options)
  end
end

def tinymce_assets

Includes TinyMCE javascript assets via a script tag.
def tinymce_assets
  javascript_include_tag "tinymce", "data-turbolinks-track" => "reload"
end

def tinymce_configuration(config=:default, options={})

It should be converted to JavaScript (via #to_javascript) for use within JavaScript.
Returns the TinyMCE configuration object.
def tinymce_configuration(config=:default, options={})
  options, config = config, :default if config.is_a?(Hash)
  options.stringify_keys!
  base_configuration = TinyMCE::Rails.configuration
  if base_configuration.is_a?(MultipleConfiguration)
    base_configuration = base_configuration.fetch(config)
  end
  base_configuration.merge(options)
end

def tinymce_configurations_javascript(options={})

Returns the JavaScript code for initializing each configuration defined within tinymce.yml.
def tinymce_configurations_javascript(options={})
  javascript = []
  TinyMCE::Rails.each_configuration do |name, config|
    config = config.merge(options) if options.present?
    javascript << "TinyMCERails.configuration.#{name} = #{config.to_javascript};".html_safe
  end
  safe_join(javascript, "\n")
end

def tinymce_javascript(config=:default, options={})

Returns the JavaScript code required to initialize TinyMCE.
def tinymce_javascript(config=:default, options={})
  options, config = config, :default if config.is_a?(Hash)
  options = Configuration.new(options)
  "TinyMCERails.initialize('#{config}', #{options.to_javascript});".html_safe
end