class Jekyll::Collection
Attributes
Public Class Methods
Create a new Collection
.
site - the site to which this collection belongs. label - the name of the collection
Returns nothing.
# File lib/jekyll/collection.rb, line 14 def initialize(site, label) @site = site @label = sanitize_label(label) @metadata = extract_metadata end
Public Instance Methods
The full path to the directory containing the collection, with
optional subpaths.
*files - (optional) any other path pieces relative to the
directory to append to the path
Returns a String containing th directory name where the collection
is stored on the filesystem.
# File lib/jekyll/collection.rb, line 125 def collection_dir(*files) return directory if files.empty? site.in_source_dir(container, relative_directory, *files) end
The full path to the directory containing the collection.
Returns a String containing th directory name where the collection
is stored on the filesystem.
# File lib/jekyll/collection.rb, line 111 def directory @directory ||= site.in_source_dir( File.join(container, relative_directory) ) end
Fetch the Documents in this collection. Defaults to an empty array if no documents have been read in.
Returns an array of Jekyll::Document
objects.
# File lib/jekyll/collection.rb, line 24 def docs @docs ||= [] end
All the entries in this collection.
Returns an Array of file paths to the documents in this collection
relative to the collection's directory
# File lib/jekyll/collection.rb, line 74 def entries return [] unless exists? @entries ||= Utils.safe_glob(collection_dir, ["**", "*"], File::FNM_DOTMATCH).map do |entry| entry["#{collection_dir}/"] = "" entry end end
The entry filter for this collection. Creates an instance of Jekyll::EntryFilter
.
Returns the instance of Jekyll::EntryFilter
for this collection.
# File lib/jekyll/collection.rb, line 144 def entry_filter @entry_filter ||= Jekyll::EntryFilter.new(site, relative_directory) end
Checks whether the directory “exists” for this collection. The directory must exist on the filesystem and must not be a symlink
if in safe mode.
Returns false if the directory doesn't exist or if it's a symlink
and we're in safe mode.
# File lib/jekyll/collection.rb, line 136 def exists? File.directory?(directory) && !entry_filter.symlink?(directory) end
Extract options for this collection from the site configuration.
Returns the metadata for this collection
# File lib/jekyll/collection.rb, line 196 def extract_metadata if site.config["collections"].is_a?(Hash) site.config["collections"][label] || {} else {} end end
Fetch the static files in this collection. Defaults to an empty array if no static files have been read in.
Returns an array of Jekyll::StaticFile
objects.
# File lib/jekyll/collection.rb, line 50 def files @files ||= [] end
Filtered version of the entries in this collection. See `Jekyll::EntryFilter#filter` for more information.
Returns a list of filtered entry paths.
# File lib/jekyll/collection.rb, line 87 def filtered_entries return [] unless exists? @filtered_entries ||= Dir.chdir(directory) do entry_filter.filter(entries).reject do |f| path = collection_dir(f) File.directory?(path) || entry_filter.symlink?(f) end end end
An inspect string.
Returns the inspect string
# File lib/jekyll/collection.rb, line 151 def inspect "#<Jekyll::Collection @label=#{label} docs=#{docs}>" end
Override of method_missing
to check in @data for the key.
# File lib/jekyll/collection.rb, line 35 def method_missing(method, *args, &blck) if docs.respond_to?(method.to_sym) Jekyll.logger.warn "Deprecation:", "#{label}.#{method} should be changed to #{label}.docs.#{method}." Jekyll.logger.warn "", "Called by #{caller(0..0)}." docs.public_send(method.to_sym, *args, &blck) else super end end
Read the allowed documents into the collection's array of docs.
Returns the sorted array of docs.
# File lib/jekyll/collection.rb, line 57 def read filtered_entries.each do |file_path| full_path = collection_dir(file_path) next if File.directory?(full_path) if Utils.has_yaml_header? full_path read_document(full_path) else read_static_file(file_path, full_path) end end docs.sort! end
The directory for this Collection
, relative to the site source or the directory containing the collection.
Returns a String containing the directory name where the collection
is stored on the filesystem.
# File lib/jekyll/collection.rb, line 103 def relative_directory @relative_directory ||= "_#{label}" end
Override of normal respond_to? to match method_missing
's logic for looking in @data.
# File lib/jekyll/collection.rb, line 30 def respond_to_missing?(method, include_private = false) docs.respond_to?(method.to_sym, include_private) || super end
Produce a sanitized label name Label names may not contain anything but alphanumeric characters,
underscores, and hyphens.
label - the possibly-unsafe label
Returns a sanitized version of the label.
# File lib/jekyll/collection.rb, line 162 def sanitize_label(label) label.gsub(%r![^a-z0-9_\-\.]!i, "") end
Produce a representation of this Collection
for use in Liquid. Exposes two attributes:
- label - docs
Returns a representation of this collection for use in Liquid.
# File lib/jekyll/collection.rb, line 172 def to_liquid Drops::CollectionDrop.new self end
The URL
template to render collection's documents at.
Returns the URL
template to render collection's documents at.
# File lib/jekyll/collection.rb, line 187 def url_template @url_template ||= metadata.fetch("permalink") do Utils.add_permalink_suffix("/:collection/:path", site.permalink_style) end end
Whether the collection's documents ought to be written as individual
files in the output.
Returns true if the 'write' metadata is true, false otherwise.
# File lib/jekyll/collection.rb, line 180 def write? !!metadata.fetch("output", false) end
Private Instance Methods
# File lib/jekyll/collection.rb, line 206 def container @container ||= site.config["collections_dir"] end
# File lib/jekyll/collection.rb, line 212 def read_document(full_path) doc = Document.new(full_path, :site => site, :collection => self) doc.read if site.unpublished || doc.published? docs << doc end end
# File lib/jekyll/collection.rb, line 222 def read_static_file(file_path, full_path) relative_dir = Jekyll.sanitized_path( relative_directory, File.dirname(file_path) ).chomp("/.") files << StaticFile.new( site, site.source, relative_dir, File.basename(full_path), self ) end