middleman/middleman-blog

View on GitHub
lib/middleman-blog/tag_pages.rb

Summary

Maintainability
A
15 mins
Test Coverage
# frozen_string_literal: true

require 'middleman-blog/uri_templates'

module Middleman
  module Blog
    ##
    # A sitemap resource manipulator that adds a tag page to the sitemap for
    # each tag in the associated blog
    ##
    class TagPages
      include UriTemplates

      ##
      # Initialise Tag pages
      #
      # @param  app             [Object] Middleman app
      # @param  blog_controller [Object] Blog controller
      ##
      def initialize(app, blog_controller)
        @sitemap            = app.sitemap
        @blog_controller    = blog_controller
        @tag_link_template  = uri_template blog_controller.options.taglink
        @tag_template       = blog_controller.options.tag_template
        @blog_data          = blog_controller.data
        @generate_tag_pages = blog_controller.options.generate_tag_pages
      end

      ##
      # Get a path to the given tag, based on the :taglink setting.
      #
      # @param  tag [String] Tag name
      # @return     [String] Safe Tag URL
      ##
      def link(tag)
        apply_uri_template @tag_link_template, tag: safe_parameterize(tag)
      end

      ##
      # Update the main sitemap resource list
      #
      # @param  resources [Object] Tag name
      # @return           [void]
      ##
      def manipulate_resource_list(resources)
        return resources unless @generate_tag_pages

        resources + @blog_data.tags.map do |tag, articles|
          tag_page_resource(tag, articles)
        end
      end

      private

      ##
      # Create the tag page resources
      #
      # @param  tag      [String] Tag name
      # @param  articles [Object] Articles
      # @return          [Object] Sitemap
      #
      # @todo Can we inject the correct locale into the metadata here
      ##
      def tag_page_resource(tag, articles)
        Sitemap::ProxyResource.new(@sitemap, link(tag), @tag_template).tap do |p|
          # Detect "formatted" tag in first article - trying to guess the correct format to show
          # tagname = articles.first.tags.detect { |article_tag| safe_parameterize(article_tag) == tag }

          # Add metadata in local variables so it's accessible to later extensions
          p.add_metadata locals: {
            'page_type' => 'tag',
            'tagname' => tag,
            'articles' => articles,
            'blog_controller' => @blog_controller
          }
        end
      end
    end
  end
end