Class: Jekyll::Document
- Inherits:
-
Object
- Object
- Jekyll::Document
- Includes:
- Comparable
- Defined in:
- lib/jekyll/document.rb
Instance Attribute Summary collapse
-
#collection ⇒ Object
Returns the value of attribute collection.
-
#content ⇒ Object
Returns the value of attribute content.
-
#extname ⇒ Object
readonly
Returns the value of attribute extname.
-
#output ⇒ Object
Returns the value of attribute output.
-
#path ⇒ Object
readonly
Returns the value of attribute path.
-
#site ⇒ Object
readonly
Returns the value of attribute site.
Instance Method Summary collapse
-
#<=>(anotherDocument) ⇒ Object
Compare this document against another document.
-
#asset_file? ⇒ Boolean
Determine whether the document is an asset file.
-
#basename ⇒ Object
The base filename of the document.
-
#basename_without_ext ⇒ Object
The base filename of the document, without the file extname.
-
#cleaned_relative_path ⇒ Object
Produces a “cleaned” relative path.
-
#coffeescript_file? ⇒ Boolean
Determine whether the document is a CoffeeScript file.
-
#data ⇒ Object
Fetch the Document’s data.
-
#destination(base_directory) ⇒ Object
The full path to the output file.
-
#initialize(path, relations) ⇒ Document
constructor
Create a new Document.
-
#inspect ⇒ Object
The inspect string for this document.
-
#merged_file_read_opts(opts) ⇒ Object
Returns merged option hash for File.read of self.site (if exists) and a given param.
-
#permalink ⇒ Object
The permalink for this Document.
-
#place_in_layout? ⇒ Boolean
Determine whether the file should be placed into layouts.
-
#published? ⇒ Boolean
Whether the file is published or not, as indicated in YAML front-matter.
-
#read(opts = {}) ⇒ Object
Read in the file and assign the content and data based on the file contents.
-
#relative_path ⇒ Object
The path to the document, relative to the site source.
-
#render_with_liquid? ⇒ Boolean
Determine whether the file should be rendered with Liquid.
-
#sass_file? ⇒ Boolean
Determine whether the document is a Sass file.
-
#to_liquid ⇒ Object
Create a Liquid-understandable version of this Document.
-
#to_s ⇒ Object
The string representation for this document.
-
#url ⇒ Object
The computed URL for the document.
-
#url_placeholders ⇒ Object
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.
-
#url_template ⇒ Object
The URL template where the document would be accessible.
-
#write(dest) ⇒ Object
Write the generated Document file to the destination directory.
-
#write? ⇒ Boolean
Determine whether this document should be written.
-
#yaml_file? ⇒ Boolean
Determine whether the document is a YAML file.
Constructor Details
#initialize(path, relations) ⇒ Document
Create a new Document.
site - the Jekyll::Site instance to which this Document belongs path - the path to the file
Returns nothing.
16 17 18 19 20 21 22 |
# File 'lib/jekyll/document.rb', line 16 def initialize(path, relations) @site = relations[:site] @path = path @extname = File.extname(path) @collection = relations[:collection] @has_yaml_header = nil end |
Instance Attribute Details
#collection ⇒ Object
Returns the value of attribute collection.
8 9 10 |
# File 'lib/jekyll/document.rb', line 8 def collection @collection end |
#content ⇒ Object
Returns the value of attribute content.
8 9 10 |
# File 'lib/jekyll/document.rb', line 8 def content @content end |
#extname ⇒ Object (readonly)
Returns the value of attribute extname.
7 8 9 |
# File 'lib/jekyll/document.rb', line 7 def extname @extname end |
#output ⇒ Object
Returns the value of attribute output.
8 9 10 |
# File 'lib/jekyll/document.rb', line 8 def output @output end |
#path ⇒ Object (readonly)
Returns the value of attribute path.
7 8 9 |
# File 'lib/jekyll/document.rb', line 7 def path @path end |
#site ⇒ Object (readonly)
Returns the value of attribute site.
7 8 9 |
# File 'lib/jekyll/document.rb', line 7 def site @site end |
Instance Method Details
#<=>(anotherDocument) ⇒ Object
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.
266 267 268 |
# File 'lib/jekyll/document.rb', line 266 def <=>(anotherDocument) path <=> anotherDocument.path end |
#asset_file? ⇒ Boolean
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.
82 83 84 |
# File 'lib/jekyll/document.rb', line 82 def asset_file? sass_file? || coffeescript_file? end |
#basename ⇒ Object
The base filename of the document.
Returns the base filename of the document.
50 51 52 |
# File 'lib/jekyll/document.rb', line 50 def basename @basename ||= File.basename(path) end |
#basename_without_ext ⇒ Object
The base filename of the document, without the file extname.
Returns the basename without the file extname.
43 44 45 |
# File 'lib/jekyll/document.rb', line 43 def basename_without_ext @basename_without_ext ||= File.basename(path, '.*') end |
#cleaned_relative_path ⇒ Object
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.
65 66 67 68 |
# File 'lib/jekyll/document.rb', line 65 def cleaned_relative_path @cleaned_relative_path ||= relative_path[0 .. -extname.length - 1].sub(collection.relative_directory, "") end |
#coffeescript_file? ⇒ Boolean
Determine whether the document is a CoffeeScript file.
Returns true if extname == .coffee, false otherwise.
96 97 98 |
# File 'lib/jekyll/document.rb', line 96 def coffeescript_file? '.coffee'.eql?(extname) end |
#data ⇒ Object
Fetch the Document’s data.
Returns a Hash containing the data. An empty hash is returned if
no data was read.
28 29 30 |
# File 'lib/jekyll/document.rb', line 28 def data @data ||= Hash.new end |
#destination(base_directory) ⇒ Object
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.
161 162 163 164 165 166 |
# File 'lib/jekyll/document.rb', line 161 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 ⇒ Object
The inspect string for this document. Includes the relative path and the collection label.
Returns the inspect string for this document.
250 251 252 |
# File 'lib/jekyll/document.rb', line 250 def inspect "#<Jekyll::Document #{relative_path} collection=#{collection.label}>" end |
#merged_file_read_opts(opts) ⇒ Object
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.
187 188 189 |
# File 'lib/jekyll/document.rb', line 187 def merged_file_read_opts(opts) site ? site.file_read_opts.merge(opts) : opts end |
#permalink ⇒ Object
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.
141 142 143 |
# File 'lib/jekyll/document.rb', line 141 def permalink data && data.is_a?(Hash) && data['permalink'] end |
#place_in_layout? ⇒ Boolean
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.
112 113 114 |
# File 'lib/jekyll/document.rb', line 112 def place_in_layout? !(asset_file? || yaml_file?) end |
#published? ⇒ Boolean
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`.
194 195 196 |
# File 'lib/jekyll/document.rb', line 194 def published? !(data.key?('published') && data['published'] == false) end |
#read(opts = {}) ⇒ Object
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.
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/jekyll/document.rb', line 203 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.}" rescue Exception => e puts "Error reading file #{path}: #{e.}" end end end |
#relative_path ⇒ Object
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
36 37 38 |
# File 'lib/jekyll/document.rb', line 36 def relative_path @relative_path ||= Pathname.new(path).relative_path_from(Pathname.new(site.source)).to_s end |
#render_with_liquid? ⇒ Boolean
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.
104 105 106 |
# File 'lib/jekyll/document.rb', line 104 def render_with_liquid? !(coffeescript_file? || yaml_file?) end |
#sass_file? ⇒ Boolean
Determine whether the document is a Sass file.
Returns true if extname == .sass or .scss, false otherwise.
89 90 91 |
# File 'lib/jekyll/document.rb', line 89 def sass_file? %w[.sass .scss].include?(extname) end |
#to_liquid ⇒ Object
Create a Liquid-understandable version of this Document.
Returns a Hash representing this Document’s data.
231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
# File 'lib/jekyll/document.rb', line 231 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 ⇒ Object
The string representation for this document.
Returns the content of the document
257 258 259 |
# File 'lib/jekyll/document.rb', line 257 def to_s content || '' end |
#url ⇒ Object
The computed URL for the document. See ‘Jekyll::URL#to_s` for more details.
Returns the computed URL for the document.
148 149 150 151 152 153 154 |
# File 'lib/jekyll/document.rb', line 148 def url @url = URL.new({ template: url_template, placeholders: url_placeholders, permalink: permalink }).to_s end |
#url_placeholders ⇒ Object
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.
127 128 129 130 131 132 133 134 135 |
# File 'lib/jekyll/document.rb', line 127 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 ⇒ Object
The URL template where the document would be accessible.
Returns the URL template for the document.
119 120 121 |
# File 'lib/jekyll/document.rb', line 119 def url_template collection.url_template end |
#write(dest) ⇒ Object
Write the generated Document file to the destination directory.
dest - The String path to the destination dir.
Returns nothing.
173 174 175 176 177 178 179 |
# File 'lib/jekyll/document.rb', line 173 def write(dest) path = destination(dest) FileUtils.mkdir_p(File.dirname(path)) File.open(path, 'wb') do |f| f.write(output) end end |
#write? ⇒ Boolean
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.
275 276 277 |
# File 'lib/jekyll/document.rb', line 275 def write? collection && collection.write? end |
#yaml_file? ⇒ Boolean
Determine whether the document is a YAML file.
Returns true if the extname is either .yml or .yaml, false otherwise.
73 74 75 |
# File 'lib/jekyll/document.rb', line 73 def yaml_file? %w[.yaml .yml].include?(extname) end |