decko-commons/decko

View on GitHub
mod/format/set/all/html/head.rb

Summary

Maintainability
A
0 mins
Test Coverage
basket[:head_views] =
  %i[page_title_tag meta_tags favicon_tag
     head_remote_stylesheets head_stylesheet
     universal_edit_button rss_links]
# TODO: the last two should be in mods

format do
  view :page_title, unknown: true, perms: :none do
    title_parts = [Card::Rule.global_setting(:title)]
    title_parts.unshift safe_name if card.name.present?
    title_parts.join " - "
  end
end

format :html do
  view :head, unknown: true, perms: :none do
    basket[:head_views].map { |viewname| render viewname }.flatten.compact.join "\n"
  end

  view :meta_tags, unknown: true, perms: :none, template: :haml

  view :page_title_tag, unknown: true, perms: :none do
    content_tag(:title) { render :page_title }
  end

  view :favicon_tag, unknown: true, perms: :none do
    nest :favicon, view: :link_tag
  end

  view :universal_edit_button, unknown: :blank, denial: :blank, perms: :update do
    return if card.new?

    tag "link", rel: "alternate", type: "application/x-wiki",
                title: "Edit this page!", href: path(view: :edit)
  end

  # these should render a view of the rule card
  # it would then be safe to cache if combined with param handling
  # (but note that machine clearing would need to reset card cache...)
  view :head_stylesheet, unknown: true, cache: :never, perms: :none do
    return unless (href = head_stylesheet_path)

    tag("link", href: href, media: "all", rel: "stylesheet", type: "text/css")
  end

  view :head_remote_stylesheets, unknown: true, cache: :never, perms: :none do
    remote_style_tags
  end

  def param_or_rule_card setting
    if params[setting]
      Card[params[setting]]
    else
      root.card.rule_card setting
    end
  end

  def debug_or_machine_path setting, debug_lambda, machine_path_lambda
    return unless (asset_card = param_or_rule_card setting)
    debug_path(setting, asset_card, &debug_lambda) ||
      machine_path_lambda.call(asset_card.asset_output_url)
  end

  def debug_path setting, asset_card
    return unless params[:debug] == setting.to_s

    yield asset_card
  end

  # TODO: move to rss mod
  view :rss_links, unknown: true, perms: :none do
    render :rss_link_tag if rss_link?
  end

  def rss_link?
    Card.config.rss_enabled && respond_to?(:rss_link_tag)
  end

  def remote_style_tags
    return unless (asset_card = Card[:style_mods])

    asset_card.item_cards.map do |mod_style_card|
      nest mod_style_card, view: :remote_include_tags
    end.select(&:present?)
  end

  def head_stylesheet_path
    debug_or_machine_path(
      :style,
      ->(style_card) { path mark: style_card.name, item: :import, format: :css },
      ->(machine_path) { machine_path }
    )
  end
end