Class: Jekyll::Collection

Inherits:
Object
  • Object
show all
Defined in:
lib/jekyll/collection.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(site, label) ⇒ Collection

Create a new Collection.

site - the site to which this collection belongs. label - the name of the collection

Returns nothing.



12
13
14
15
16
# File 'lib/jekyll/collection.rb', line 12

def initialize(site, label)
  @site     = site
  @label    = sanitize_label(label)
  @metadata = 
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &blck) ⇒ Object

Override of method_missing to check in @data for the key.



33
34
35
36
37
38
39
40
41
# File 'lib/jekyll/collection.rb', line 33

def method_missing(method, *args, &blck)
  if docs.respond_to?(method.to_sym)
    Jekyll.logger.warn "Deprecation:", "Collection##{method} should be called on the #docs array directly."
    Jekyll.logger.warn "", "Called by #{caller.first}."
    docs.public_send(method.to_sym, *args, &blck)
  else
    super
  end
end

Instance Attribute Details

#docsObject

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.



22
23
24
# File 'lib/jekyll/collection.rb', line 22

def docs
  @docs ||= []
end

#labelObject (readonly)

Returns the value of attribute label.



3
4
5
# File 'lib/jekyll/collection.rb', line 3

def label
  @label
end

#metadataObject (readonly)

Returns the value of attribute metadata.



3
4
5
# File 'lib/jekyll/collection.rb', line 3

def 
  @metadata
end

#siteObject (readonly)

Returns the value of attribute site.



3
4
5
# File 'lib/jekyll/collection.rb', line 3

def site
  @site
end

Instance Method Details

#collection_dir(*files) ⇒ Object

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.


121
122
123
124
# File 'lib/jekyll/collection.rb', line 121

def collection_dir(*files)
  return directory if files.empty?
  site.in_source_dir(relative_directory, *files)
end

#directoryObject

The full path to the directory containing the collection.

Returns a String containing th directory name where the collection

is stored on the filesystem.


109
110
111
# File 'lib/jekyll/collection.rb', line 109

def directory
  @directory ||= site.in_source_dir(relative_directory)
end

#entriesObject

All the entries in this collection.

Returns an Array of file paths to the documents in this collection

relative to the collection's directory


74
75
76
77
78
79
80
# File 'lib/jekyll/collection.rb', line 74

def entries
  return Array.new unless exists?
  @entries ||=
    Dir.glob(collection_dir("**", "*.*")).map do |entry|
      entry["#{collection_dir}/"] = ''; entry
    end
end

#entry_filterObject

The entry filter for this collection. Creates an instance of Jekyll::EntryFilter.

Returns the instance of Jekyll::EntryFilter for this collection.



140
141
142
# File 'lib/jekyll/collection.rb', line 140

def entry_filter
  @entry_filter ||= Jekyll::EntryFilter.new(site, relative_directory)
end

#exists?Boolean

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.

Returns:

  • (Boolean)


132
133
134
# File 'lib/jekyll/collection.rb', line 132

def exists?
  File.directory?(directory) && !(File.symlink?(directory) && site.safe)
end

#extract_metadataObject

Extract options for this collection from the site configuration.

Returns the metadata for this collection



199
200
201
202
203
204
205
# File 'lib/jekyll/collection.rb', line 199

def 
  if site.config['collections'].is_a?(Hash)
    site.config['collections'][label] || Hash.new
  else
    {}
  end
end

#filesObject

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.



47
48
49
# File 'lib/jekyll/collection.rb', line 47

def files
  @files ||= []
end

#filtered_entriesObject

Filtered version of the entries in this collection. See ‘Jekyll::EntryFilter#filter` for more information.

Returns a list of filtered entry paths.



86
87
88
89
90
91
92
93
94
95
# File 'lib/jekyll/collection.rb', line 86

def filtered_entries
  return Array.new unless exists?
  @filtered_entries ||=
    Dir.chdir(directory) do
      entry_filter.filter(entries).reject do |f|
        path = collection_dir(f)
        File.directory?(path) || (File.symlink?(f) && site.safe)
      end
    end
end

#inspectObject

An inspect string.

Returns the inspect string



147
148
149
# File 'lib/jekyll/collection.rb', line 147

def inspect
  "#<Jekyll::Collection @label=#{label} docs=#{docs}>"
end

#readObject

Read the allowed documents into the collection’s array of docs.

Returns the sorted array of docs.



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/jekyll/collection.rb', line 54

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
      doc = Jekyll::Document.new(full_path, { site: site, collection: self })
      doc.read
      docs << doc if site.publisher.publish?(doc) || !write?
    else
      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
  end
  docs.sort!
end

#relative_directoryObject

The directory for this Collection, relative to the site source.

Returns a String containing the directory name where the collection

is stored on the filesystem.


101
102
103
# File 'lib/jekyll/collection.rb', line 101

def relative_directory
  @relative_directory ||= "_#{label}"
end

#respond_to?(method, include_private = false) ⇒ Boolean

Override of normal respond_to? to match method_missing’s logic for looking in @data.

Returns:

  • (Boolean)


28
29
30
# File 'lib/jekyll/collection.rb', line 28

def respond_to?(method, include_private = false)
  docs.respond_to?(method.to_sym, include_private) || super
end

#sanitize_label(label) ⇒ Object

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.



158
159
160
# File 'lib/jekyll/collection.rb', line 158

def sanitize_label(label)
  label.gsub(/[^a-z0-9_\-\.]/i, '')
end

#to_liquidObject

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.



168
169
170
171
172
173
174
175
176
177
# File 'lib/jekyll/collection.rb', line 168

def to_liquid
  .merge({
    "label"     => label,
    "docs"      => docs,
    "files"     => files,
    "directory" => directory,
    "output"    => write?,
    "relative_directory" => relative_directory
  })
end

#url_templateObject

The URL template to render collection’s documents at.

Returns the URL template to render collection’s documents at.



190
191
192
193
194
# File 'lib/jekyll/collection.rb', line 190

def url_template
  .fetch('permalink') do
      Utils.add_permalink_suffix("/:collection/:path", site.permalink_style)
  end
end

#write?Boolean

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.

Returns:

  • (Boolean)


183
184
185
# File 'lib/jekyll/collection.rb', line 183

def write?
  !!.fetch('output', false)
end