class Jekyll::Document

Attributes

collection[RW]
content[RW]
extname[R]
output[RW]
path[R]
site[R]

Public Class Methods

new(path, relations) click to toggle source

Create a new Document.

site - the Jekyll::Site instance to which this Document belongs path - the path to the file

Returns nothing.

# File lib/jekyll/document.rb, line 15
def initialize(path, relations)
  @site = relations[:site]
  @path = path
  @extname = File.extname(path)
  @collection = relations[:collection]
  @has_yaml_header = nil
end

Public Instance Methods

<=>(anotherDocument) click to toggle source

Compare this document against another document. Comparison is a comparison between the 2 paths of the documents.

Returns -1, 0, +1 or nil depending on whether this doc's path is less than,

equal or greater than the other doc's path. See String#<=> for more details.
# File lib/jekyll/document.rb, line 265
def <=>(anotherDocument)
  path <=> anotherDocument.path
end
asset_file?() click to toggle source

Determine whether the document is an asset file. Asset files include CoffeeScript files and Sass/SCSS files.

Returns true if the extname belongs to the set of extensions

that asset files use.
# File lib/jekyll/document.rb, line 81
def asset_file?
  sass_file? || coffeescript_file?
end
basename() click to toggle source

The base filename of the document.

Returns the base filename of the document.

# File lib/jekyll/document.rb, line 49
def basename
  @basename ||= File.basename(path)
end
basename_without_ext() click to toggle source

The base filename of the document, without the file extname.

Returns the basename without the file extname.

# File lib/jekyll/document.rb, line 42
def basename_without_ext
  @basename_without_ext ||= File.basename(path, '.*')
end
cleaned_relative_path() click to toggle source

Produces a “cleaned” relative path. The “cleaned” relative path is the relative path without the extname

and with the collection's directory removed as well.

This method is useful when building the URL of the document.

Examples:

When relative_path is "_methods/site/generate.md":
  cleaned_relative_path
  # => "/site/generate"

Returns the cleaned relative path of the document.

# File lib/jekyll/document.rb, line 64
def cleaned_relative_path
  @cleaned_relative_path ||=
    relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "")
end
coffeescript_file?() click to toggle source

Determine whether the document is a CoffeeScript file.

Returns true if extname == .coffee, false otherwise.

# File lib/jekyll/document.rb, line 95
def coffeescript_file?
  '.coffee'.eql?(extname)
end
data() click to toggle source

Fetch the Document's data.

Returns a Hash containing the data. An empty hash is returned if

no data was read.
# File lib/jekyll/document.rb, line 27
def data
  @data ||= Hash.new
end
destination(base_directory) click to toggle source

The full path to the output file.

base_directory - the base path of the output directory

Returns the full path to the output file of this document.

# File lib/jekyll/document.rb, line 160
def destination(base_directory)
  dest = site.in_dest_dir(base_directory)
  path = site.in_dest_dir(dest, url)
  path = File.join(path, "index.html") if url =~ /\/$/
  path
end
inspect() click to toggle source

The inspect string for this document. Includes the relative path and the collection label.

Returns the inspect string for this document.

# File lib/jekyll/document.rb, line 249
def inspect
  "#<Jekyll::Document #{relative_path} collection=#{collection.label}>"
end
merged_file_read_opts(opts) click to toggle source

Returns merged option hash for File.read of self.site (if exists) and a given param

opts - override options

Return the file read options hash.

# File lib/jekyll/document.rb, line 186
def merged_file_read_opts(opts)
  site ? site.file_read_opts.merge(opts) : opts
end
place_in_layout?() click to toggle source

Determine whether the file should be placed into layouts.

Returns false if the document is either an asset file or a yaml file,

true otherwise.
# File lib/jekyll/document.rb, line 111
def place_in_layout?
  !(asset_file? || yaml_file?)
end
published?() click to toggle source

Whether the file is published or not, as indicated in YAML front-matter

Returns true if the 'published' key is specified in the YAML front-matter and not `false`.

# File lib/jekyll/document.rb, line 193
def published?
  !(data.key?('published') && data['published'] == false)
end
read(opts = {}) click to toggle source

Read in the file and assign the content and data based on the file contents. Merge the frontmatter of the file with the frontmatter default values

Returns nothing.

# File lib/jekyll/document.rb, line 202
def read(opts = {})
  if yaml_file?
    @data = SafeYAML.load_file(path)
  else
    begin
      defaults = @site.frontmatter_defaults.all(url, collection.label.to_sym)
      unless defaults.empty?
        @data = defaults
      end
      @content = File.read(path, merged_file_read_opts(opts))
      if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
        @content = $POSTMATCH
        data_file = SafeYAML.load($1)
        unless data_file.nil?
          @data = Utils.deep_merge_hashes(defaults, data_file)
        end
      end
    rescue SyntaxError => e
      puts "YAML Exception reading #{path}: #{e.message}"
    rescue Exception => e
      puts "Error reading file #{path}: #{e.message}"
    end
  end
end
relative_path() click to toggle source

The path to the document, relative to the site source.

Returns a String path which represents the relative path

from the site source to this document
# File lib/jekyll/document.rb, line 35
def relative_path
  @relative_path ||= Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s
end
render_with_liquid?() click to toggle source

Determine whether the file should be rendered with Liquid.

Returns false if the document is either an asset file or a yaml file,

true otherwise.
# File lib/jekyll/document.rb, line 103
def render_with_liquid?
  !(coffeescript_file? || yaml_file?)
end
sass_file?() click to toggle source

Determine whether the document is a Sass file.

Returns true if extname == .sass or .scss, false otherwise.

# File lib/jekyll/document.rb, line 88
def sass_file?
  %w[.sass .scss].include?(extname)
end
to_liquid() click to toggle source

Create a Liquid-understandable version of this Document.

Returns a Hash representing this Document's data.

# File lib/jekyll/document.rb, line 230
def to_liquid
  if data.is_a?(Hash)
    Utils.deep_merge_hashes data, {
      "output"        => output,
      "content"       => content,
      "path"          => path,
      "relative_path" => relative_path,
      "url"           => url,
      "collection"    => collection.label
    }
  else
    data
  end
end
to_s() click to toggle source

The string representation for this document.

Returns the content of the document

# File lib/jekyll/document.rb, line 256
def to_s
  content || ''
end
url() click to toggle source

The computed URL for the document. See `Jekyll::URL#to_s` for more details.

Returns the computed URL for the document.

# File lib/jekyll/document.rb, line 147
def url
  @url = URL.new({
    template:     url_template,
    placeholders: url_placeholders,
    permalink:    permalink
  }).to_s
end
url_placeholders() click to toggle source

Construct a Hash of key-value pairs which contain a mapping between

a key in the URL template and the corresponding value for this document.

Returns the Hash of key-value pairs for replacement in the URL.

# File lib/jekyll/document.rb, line 126
def url_placeholders
  {
    collection: collection.label,
    path:       cleaned_relative_path,
    output_ext: Jekyll::Renderer.new(site, self).output_ext,
    name:       Utils.slugify(basename_without_ext),
    title:      Utils.slugify(data['title']) || Utils.slugify(basename_without_ext)
  }
end
url_template() click to toggle source

The URL template where the document would be accessible.

Returns the URL template for the document.

# File lib/jekyll/document.rb, line 118
def url_template
  collection.url_template
end
write(dest) click to toggle source

Write the generated Document file to the destination directory.

dest - The String path to the destination dir.

Returns nothing.

# File lib/jekyll/document.rb, line 172
def write(dest)
  path = destination(dest)
  FileUtils.mkdir_p(File.dirname(path))
  File.open(path, 'wb') do |f|
    f.write(output)
  end
end
write?() click to toggle source

Determine whether this document should be written. Based on the Collection to which it belongs.

True if the document has a collection and if that collection's write?

method returns true, otherwise false.
# File lib/jekyll/document.rb, line 274
def write?
  collection && collection.write?
end
yaml_file?() click to toggle source

Determine whether the document is a YAML file.

Returns true if the extname is either .yml or .yaml, false otherwise.

# File lib/jekyll/document.rb, line 72
def yaml_file?
  %w[.yaml .yml].include?(extname)
end