require "active_support/core_ext/hash/keys" module TinyMCE::Rails module Helper # Initializes TinyMCE on the current page based on the global configuration. # # Custom options can be set via the options hash, which will be passed to # the TinyMCE init function. # # By default, all textareas with a class of "tinymce" will have the TinyMCE # editor applied. The current locale will also be used as the language when # TinyMCE language files are available, falling back to English if not # available. The :editor_selector and :language options can be used to # override these defaults. # # @example # <%= tinymce(selector: "editorClass", theme: "inlite") %> 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 # 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 # 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 # Returns the TinyMCE configuration object. # It should be converted to JavaScript (via #to_javascript) for use within JavaScript. 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 # Includes TinyMCE javascript assets via a script tag. def tinymce_assets(options=Rails.application.config.tinymce.default_script_attributes) if defined?(Sprockets) javascript_include_tag("tinymce", options) else safe_join([ tinymce_preinit, javascript_include_tag("tinymce/tinymce", options), javascript_include_tag("tinymce/rails", options) ], "\n") end end # Configures where dynamically loaded TinyMCE assets are located and named def tinymce_preinit(base=TinyMCE::Rails::Engine.base) js = "window.tinymce = window.tinymce || { base: '#{base}', suffix: '' };" javascript_tag(js, nonce: true) end # Allow methods to be called as module functions: # e.g. TinyMCE::Rails.tinymce_javascript module_function :tinymce, :tinymce_javascript, :tinymce_configurations_javascript, :tinymce_configuration, :tinymce_preinit public :tinymce, :tinymce_javascript, :tinymce_configurations_javascript, :tinymce_configuration, :tinymce_preinit end end