class Jekyll::Document
Attributes
Public Class Methods
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
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
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
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
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
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
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
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
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
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
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
The permalink for this Document. Permalink is set via the data Hash.
Returns the permalink or nil if no permalink was set in the data.
# File lib/jekyll/document.rb, line 140 def permalink data && data.is_a?(Hash) && data['permalink'] end
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
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 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
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
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
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
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
The string representation for this document.
Returns the content of the document
# File lib/jekyll/document.rb, line 256 def to_s content || '' end
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
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
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
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