Skip to content
Snippets Groups Projects
multipost.rb 2 KiB
Newer Older
Lukas Ruge's avatar
Lukas Ruge committed
require 'cgi'

module Jekyll
  module PermalinkBuilder
    extend self

    def get_adjusted_permalink(resource, layout)
      layout_path = CGI.escape(layout)
      url = resource.url
      ext = File.extname(url)

      if url.include?(':layout')
        return url.gsub(/:layout/, layout_path)
      end

      if ext.empty?
        "#{url}/#{layout_path}/"
      else
        url.gsub(/\/$|#{ext}$/) { |url_end| "/#{layout_path}#{url_end}" }
      end
    end
  end

  class PageLayoutsGenerator
    def generate(site)
      pages = site.pages.map! do |page|
        if page.data["layout"].is_a?(Array)
          create_layout_views(page)
        else
          page
        end
      end

      pages.flatten!
    end

    private

    def create_layout_views(page)
      page.data["layout"].map do |layout|
        dir = File.dirname(page.relative_path)
        Page.new(page.site, page.site.source, dir, page.name).tap do |new_page|
          new_page.data["layout"] = layout
          new_page.data["permalink"] = PermalinkBuilder.get_adjusted_permalink(page, layout)
        end
      end
    end
  end

  class CollectionLayoutsGenerator
    def generate(site)
      site.collections.each do |_, collection|
        docs = collection.docs.map! do |doc|
          if doc.data["layout"].is_a?(Array)
            create_layout_views(site, collection, doc)
          else
            doc
          end
        end

        docs.flatten!
      end
    end

    private

    def create_layout_views(site, collection, doc)
      doc.data["layout"].map do |layout|
        Document.new(doc.path, :site => site, :collection => collection).tap do |new_doc|
          new_doc.read
          new_doc.data["layout"] = layout
          new_doc.data["permalink"] = PermalinkBuilder.get_adjusted_permalink(doc, layout)
        end
      end
    end
  end

  class MultiPostGenerator < Generator
    safe true

    def generate(site)
      PageLayoutsGenerator.new.generate(site)
      CollectionLayoutsGenerator.new.generate(site)
    end
  end
end