module CKEditor5::Rails::Cdn::Helpers

def build_assets_html_tags(bundle, preset, importmap:, lazy: nil)

Returns:
  • (String, nil) - HTML tags string or nil if using importmap

Parameters:
  • lazy (Boolean) -- Whether to enable lazy loading
  • importmap (Boolean) -- Whether to use importmap for dependencies
  • preset (PresetBuilder) -- Preset configuration
  • bundle (AssetsBundle) -- Bundle containing assets to include
def build_assets_html_tags(bundle, preset, importmap:, lazy: nil)
  serializer = Assets::AssetsBundleHtmlSerializer.new(
    bundle,
    importmap: importmap && !importmap_available?,
    lazy: lazy
  )
  html = safe_join([
                     serializer.to_html(nonce: content_security_policy_nonce),
                     ckeditor5_inline_plugins_tags(preset)
                   ])
  if importmap_available?
    @__ckeditor_context[:html_tags] = html
    nil
  else
    html
  end
end

def ckeditor5_assets(

Other tags:
    Example: Editor only configuration with different types -
    Example: Using preset builder object -
    Example: Commercial usage with license key -
    Example: Using custom preset with translations and language -
    Example: Simple editor with custom configuration -
    Example: Basic usage with default preset -

Parameters:
  • kwargs (Hash) -- Additional configuration options:
  • preset (Symbol, PresetBuilder) -- The name of the preset to use (default: :default)
def ckeditor5_assets(
  preset: :default,
  importmap: true,
  lazy: false,
  **kwargs
)
  ensure_importmap_not_rendered!
  mapped_preset = merge_with_editor_preset(preset, **kwargs)
  bundle = create_preset_bundle(mapped_preset)
  @__ckeditor_context = {
    license_key: mapped_preset.license_key,
    bundle: bundle,
    preset: mapped_preset
  }
  build_assets_html_tags(bundle, mapped_preset, importmap: importmap, lazy: lazy)
end

def ckeditor5_lazy_javascript_tags

Other tags:
    Example: With Turbo/Stimulus dynamic editor loading -

Other tags:
    Note: - Do not use this helper if ckeditor5_assets is already included on the page
def ckeditor5_lazy_javascript_tags
  ensure_importmap_not_rendered!
  tags = [
    Assets::WebComponentBundle.instance.to_html(nonce: content_security_policy_nonce),
    ckeditor5_inline_plugins_tags
  ]
  if importmap_available?
    @__ckeditor_context = {
      bundle: combined_bundle
    }
  else
    tags.prepend(
      Assets::AssetsImportMap.new(combined_bundle).to_html(nonce: content_security_policy_nonce)
    )
  end
  safe_join(tags)
end

def combined_bundle

Returns:
  • (AssetsBundle) - Combined bundle containing all preset assets
def combined_bundle
  acc = Assets::AssetsBundle.new(scripts: [], stylesheets: [])
  Engine.presets.to_h.values.each_with_object(acc) do |preset, bundle|
    bundle << create_preset_bundle(preset)
  end
  acc
end

def ensure_importmap_not_rendered!

Raises:
  • (ImportmapAlreadyRenderedError) - If importmap was already rendered
def ensure_importmap_not_rendered!
  return unless importmap_available? && importmap_rendered?
  raise ImportmapAlreadyRenderedError,
        'CKEditor5 assets must be included before javascript_importmap_tags. ' \
        'Please move ckeditor5_assets helper before javascript_importmap_tags in your layout.'
end

def importmap_available?

Returns:
  • (Boolean) - true if importmap is supported
def importmap_available?
  respond_to?(:importmap_rendered?)
end

def merge_with_editor_preset(preset, language: nil, **kwargs)

Raises:
  • (ArgumentError) - If required parameters are missing

Returns:
  • (PresetBuilder) - New preset instance with merged configuration

Parameters:
  • kwargs (Hash) -- Additional configuration options
  • language (Symbol, nil) -- UI language code
  • preset (Symbol, PresetBuilder) -- Base preset to merge with
def merge_with_editor_preset(preset, language: nil, **kwargs)
  found_preset = Engine.find_preset!(preset)
  new_preset = found_preset.clone.merge_with_hash!(**kwargs)
  # Assign default language if not present
  if language.present?
    new_preset.language(language)
  elsif !new_preset.language?
    new_preset.language(I18n.locale)
  end
  validate_required_preset_params!(new_preset, preset)
  new_preset
end

def validate_required_preset_params!(preset, preset_name)

Raises:
  • (ArgumentError) - If version or type is missing

Parameters:
  • preset_name (Symbol) -- Name of the preset for error messages
  • preset (PresetBuilder) -- Preset to validate
def validate_required_preset_params!(preset, preset_name)
  %i[version type].each do |key|
    next if preset.public_send(key).present?
    raise ArgumentError,
          "Poor thing. You forgot to define #{key}. Make sure you passed `#{key}:` parameter to " \
          "`ckeditor5_assets` or defined default one in your `#{preset_name}` preset!"
  end
end