adamhollett/writedown

View on GitHub
lib/writedown/aside.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Writedown
  module Aside
    def self.pattern
      /(#{Writedown.configuration.aside_headings.join('|')}):?\n/i
    end

    def convert_aside(el, indent)
      text_content = el.children.first.children.first.value
      # Determine the heading string used
      heading_text = text_content.match(Writedown::Aside.pattern)[1]
      # Remove the heading string from the contents
      text_content.sub!(Writedown::Aside.pattern, '')

      # Create CSS classes
      base_class    = Writedown.configuration.aside_base_class
      aside_classes = [base_class]
      heading_slug  = Writedown::Utils.slugify(heading_text)
      sep = Writedown.configuration.aside_class_separator
      aside_classes << [base_class, heading_slug].join(sep) unless heading_slug == base_class

      # Create the container element
      aside = Kramdown::Element.new(
        :html_element, :aside, { class: aside_classes.join(' ') }.merge(el.attr),
        category: :block, content_model: :block
      )

      # Insert a heading if they're enabled
      if Writedown.configuration.aside_show_headings
        heading = Kramdown::Element.new(
          :header, nil, nil,
          level: Writedown.configuration.aside_heading_level, raw_text: heading_text
        )
        heading.children << Kramdown::Element.new(:text, heading_text)
        aside.children << heading
      end

      aside.children += el.children

      format_as_indented_block_html(:aside, aside.attr, inner(aside, indent), indent)
    end
  end
end