module Lookbook::ApplicationHelper

def beautify(source, language = "html")

def beautify(source, language = "html")
  source = source.strip
  result = language.downcase == "html" ? HtmlBeautifier.beautify(source) : source
  result.strip.html_safe
end

def build_tag_values(*args)

def build_tag_values(*args)
  tag_values = []
  args.each do |tag_value|
    case tag_value
    when Hash
      tag_value.each do |key, val|
        tag_values << key.to_s if val && key.present?
      end
    when Array
      tag_values.concat build_tag_values(*tag_value)
    else
      tag_values << tag_value.to_s if tag_value.present?
    end
  end
  tag_values
end

def class_names(*args)

def class_names(*args)
  tokens = build_tag_values(*args).flat_map { |value| value.to_s.split(/\s+/) }.uniq
  safe_join(tokens, " ")
end

def component(name, **attrs, &block)

def component(name, **attrs, &block)
  render "lookbook/components/#{name}",
    classes: class_names(attrs[:class]),
    **attrs.except(:class),
    &block
end

def config

def config
  Lookbook::Engine.config.lookbook
end

def highlight(source, language, opts = {})

def highlight(source, language, opts = {})
  formatter = Lookbook::CodeFormatter.new(opts)
  lexer = Rouge::Lexer.find(language)
  formatter.format(lexer.lex(source)).html_safe
end

def icon(name = nil, size: 4, **attrs)

def icon(name = nil, size: 4, **attrs)
  render "lookbook/components/icon",
    name: name,
    size: size,
    classes: class_names(attrs[:class]),
    **attrs.except(:class)
end

def markdown(text)

def markdown(text)
  markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, {
    tables: true,
    fenced_code_blocks: true,
    disable_indented_code_blocks: true
  })
  markdown.render(text).html_safe
end