class Jekyll::PaginateV2::Generator::PaginationIndexer
as well as filtering said collections when requested by the defined filters.
Performs indexing of the posts or collection documents
def self.index_posts_by(all_posts, index_key)
Create a hash index for all post based on a key in the post.data table
def self.index_posts_by(all_posts, index_key) return nil if all_posts.nil? return all_posts if index_key.nil? index = {} all_posts.each do |post| next if post.data.nil? next if !post.data.has_key?(index_key) next if post.data[index_key].nil? next if post.data[index_key].size <= 0 next if post.data[index_key].to_s.strip.length == 0 # Only tags and categories come as premade arrays, locale does not, so convert any data # elements that are strings into arrays post_data = post.data[index_key] if post_data.is_a?(String) post_data = post_data.split(/;|,|\s/) end post_data.each do |key| key = key.to_s.downcase.strip # If the key is a delimetered list of values # (meaning the user didn't use an array but a string with commas) key.split(/;|,/).each do |k_split| k_split = k_split.to_s.downcase.strip #Clean whitespace and junk if !index.has_key?(k_split) index[k_split.to_s] = [] end index[k_split.to_s] << post end end end return index end # function index_posts_by
def self.intersect_arrays(first, *rest)
between multiple arrays
Creates an intersection (only returns common elements)
def self.intersect_arrays(first, *rest) return nil if first.nil? return nil if rest.nil? intersect = first rest.each do |item| return [] if item.nil? intersect = intersect & item end return intersect end #function intersect_arrays
def self.read_config_value_and_filter_posts(config, config_key, posts, source_posts)
the two sets. Returns only posts that are common between all collections
Filters posts based on a keyed source_posts hash of indexed posts and performs a intersection of
def self.read_config_value_and_filter_posts(config, config_key, posts, source_posts) return nil if posts.nil? return nil if source_posts.nil? # If the source is empty then simply don't do anything return posts if config.nil? return posts if !config.has_key?(config_key) return posts if config[config_key].nil? # Get the filter values from the config (this is the cat/tag/locale values that should be filtered on) config_value = config[config_key] # If we're dealing with a delimitered string instead of an array then let's be forgiving if( config_value.is_a?(String)) config_value = config_value.split(/;|,/) end # Now for all filter values for the config key, let's remove all items from the posts that # aren't common for all collections that the user wants to filter on config_value.each do |key| key = key.to_s.downcase.strip posts = PaginationIndexer.intersect_arrays(posts, source_posts[key]) end # The fully filtered final post list return posts end #function read_config_value_and_filter_posts