class Jekyll::StickyPosts::Generator

Attributes

posts[R]

Public Instance Methods

generate(site) click to toggle source
# File lib/jekyll-stickyposts.rb, line 21
def generate(site)
  config = site.config["stickyposts"] || {}
  # Defaults:
  # sort = date
  # reverse = false
  # enabled = true
  # retain = false

  return if !(config["enabled"].nil? || config["enabled"])

  debug = config["debug"]
  StickyPosts::debug_state debug

  sort_field = config["sort"] || 'date'
  sort_reverse = config["reverse"]

  collections = [ config['collection'], config["collections"] ].flatten.compact;
  collections = [ "posts" ] if collections.empty?

  if config["sort"]
    StickyPosts::debug "Sorting by #{sort_field}, reverse: #{sort_reverse ? "true" : "false"}"
  end

  collections.each do |collection|
    sorted = site.collections[collection].docs

    unless config["sort"] == "none"
      sorted.sort! { |docB, docA|
        a = sort_value(docA.data, sort_field)
        b = sort_value(docB.data, sort_field)

        if a.nil? && !b.nil?
          -1
        elsif !a.nil? && b.nil?
          1
        elsif a.respond_to?('to_datetime') && b.respond_to?('to_datetime')
          a.to_datetime <=> b.to_datetime
        else
          a <=> b
        end
      }

      sorted.reverse! if sort_reverse
    end

    remove = config["retain"].nil? || !config["retain"]

    sticky = []
    sorted.delete_if do |doc|
      if doc.data['sticky']
        StickyPosts::debug "\"#{doc.data['title']}\" is sticky; #{remove ? "removing" : "retaining"} copy", doc
        if remove
          sticky << doc
        else
          copy = Jekyll::Document.new(doc.path, { :site => site,
            :collection => site.collections[collection]})
          copy.merge_data!(doc.data)
          sticky << copy
        end
        remove
      end
    end

    sticky.reverse! if config["reverse_sticky"]
    sorted.unshift(*sticky)

    order = 0;
    sorted.each do |doc|
      doc.data["stickiness"] = order
      order += 1
    end

    StickyPosts::info "[#{collection}] #{sticky.length} post(s) pinned"
  end
end

Private Instance Methods

sort_value(data, path) click to toggle source
# File lib/jekyll-stickyposts.rb, line 98
def sort_value(data, path)
  value = data

  path.split(":").each do |key|
    return nil unless value = value[key.downcase.strip]
  end

  value.is_a?(Hash) ? nil : value
end