module Jekyll::Convertible

Public Instance Methods

[](property) click to toggle source

Accessor for data properties by Liquid.

property - The String name of the property to retrieve.

Returns the String value or nil if the property isn’t included.

# File lib/jekyll/convertible.rb, line 235
def [](property)
  if self.class::ATTRIBUTES_FOR_LIQUID.include?(property)
    send(property)
  else
    data[property]
  end
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/convertible.rb, line 141
def asset_file?
  sass_file? || coffeescript_file?
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/convertible.rb, line 155
def coffeescript_file?
  ext == ".coffee"
end
converters() click to toggle source

Determine which converter to use based on this convertible’s extension.

Returns the Converter instance.

# File lib/jekyll/convertible.rb, line 96
def converters
  renderer.converters
end
do_layout(payload, layouts) click to toggle source

Add any necessary layouts to this convertible document.

payload - The site payload Drop or Hash. layouts - A Hash of {“name” => “layout”}.

Returns nothing.

# File lib/jekyll/convertible.rb, line 205
def do_layout(payload, layouts)
  self.output = renderer.tap do |doc_renderer|
    doc_renderer.layouts = layouts
    doc_renderer.payload = payload
  end.run

  Jekyll.logger.debug "Post-Render Hooks:", relative_path
  Jekyll::Hooks.trigger hook_owner, :post_render, self
ensure
  @renderer = nil # this will allow the modifications above to disappear
end
hook_owner() click to toggle source

returns the owner symbol for hook triggering

# File lib/jekyll/convertible.rb, line 132
def hook_owner
  :pages if is_a?(Page)
end
invalid_layout?(layout) click to toggle source

Checks if the layout specified in the document actually exists

layout - the layout to check

Returns true if the layout is invalid, false if otherwise

# File lib/jekyll/convertible.rb, line 181
def invalid_layout?(layout)
  !data["layout"].nil? && layout.nil? && !(is_a? Jekyll::Excerpt)
end
output_ext() click to toggle source

Determine the extension depending on content_type.

Returns the String extension for the output file.

e.g. ".html" for an HTML output file.
# File lib/jekyll/convertible.rb, line 88
def output_ext
  renderer.output_ext
end
place_in_layout?() click to toggle source

Determine whether the file should be placed into layouts.

Returns false if the document is an asset file or if the front matter

specifies `layout: none`
# File lib/jekyll/convertible.rb, line 172
def place_in_layout?
  !(asset_file? || no_layout?)
end
published?() click to toggle source

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

# File lib/jekyll/convertible.rb, line 25
def published?
  !(data.key?("published") && data["published"] == false)
end
read_yaml(base, name, opts = {}) click to toggle source

Read the YAML frontmatter.

base - The String path to the dir containing the file. name - The String filename of the file. opts - optional parameter to File.read, default at site configs

Returns nothing. rubocop:disable Metrics/AbcSize

# File lib/jekyll/convertible.rb, line 37
def read_yaml(base, name, opts = {})
  filename = @path || site.in_source_dir(base, name)
  Jekyll.logger.debug "Reading:", relative_path

  begin
    self.content = File.read(filename, **Utils.merged_file_read_opts(site, opts))
    if content =~ Document::YAML_FRONT_MATTER_REGEXP
      self.content = Regexp.last_match.post_match
      self.data = SafeYAML.load(Regexp.last_match(1))
    end
  rescue Psych::SyntaxError => e
    Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}"
    raise e if site.config["strict_front_matter"]
  rescue StandardError => e
    Jekyll.logger.warn "Error reading file #{filename}: #{e.message}"
    raise e if site.config["strict_front_matter"]
  end

  self.data ||= {}

  validate_data! filename
  validate_permalink! filename

  self.data
end
render_all_layouts(layouts, payload, info) click to toggle source

Recursively render layouts

layouts - a list of the layouts payload - the payload for Liquid info - the info for Liquid

Returns nothing

# File lib/jekyll/convertible.rb, line 192
def render_all_layouts(layouts, payload, info)
  renderer.layouts = layouts
  self.output = renderer.place_in_layouts(output, payload, info)
ensure
  @renderer = nil # this will allow the modifications above to disappear
end
render_liquid(content, payload, info, path) click to toggle source

Render Liquid in the content

content - the raw Liquid content to render payload - the payload for Liquid info - the info for Liquid

Returns the converted content

# File lib/jekyll/convertible.rb, line 107
def render_liquid(content, payload, info, path)
  renderer.render_liquid(content, payload, info, path)
end
render_with_liquid?() click to toggle source

Determine whether the file should be rendered with Liquid.

Returns true if the file has Liquid Tags or Variables, false otherwise.

# File lib/jekyll/convertible.rb, line 162
def render_with_liquid?
  return false if data["render_with_liquid"] == false

  Jekyll::Utils.has_liquid_construct?(content)
end
renderer() click to toggle source
# File lib/jekyll/convertible.rb, line 243
def renderer
  @renderer ||= Jekyll::Renderer.new(site, self)
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/convertible.rb, line 148
def sass_file?
  Jekyll::Document::SASS_FILE_EXTS.include?(ext)
end
to_liquid(attrs = nil) click to toggle source

Convert this Convertible’s data to a Hash suitable for use by Liquid.

Returns the Hash representation of this Convertible.

# File lib/jekyll/convertible.rb, line 114
def to_liquid(attrs = nil)
  further_data = \
    (attrs || self.class::ATTRIBUTES_FOR_LIQUID).each_with_object({}) do |attribute, hsh|
      hsh[attribute] = send(attribute)
    end

  Utils.deep_merge_hashes defaults, Utils.deep_merge_hashes(data, further_data)
end
to_s() click to toggle source

Returns the contents as a String.

# File lib/jekyll/convertible.rb, line 20
def to_s
  content || ""
end
transform() click to toggle source

Transform the contents based on the content type.

Returns the transformed contents.

# File lib/jekyll/convertible.rb, line 80
def transform
  renderer.convert(content)
end
type() click to toggle source

The type of a document,

i.e., its classname downcase'd and to_sym'd.

Returns the type of self.

# File lib/jekyll/convertible.rb, line 127
def type
  :pages if is_a?(Page)
end
validate_data!(filename) click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/jekyll/convertible.rb, line 64
def validate_data!(filename)
  unless self.data.is_a?(Hash)
    raise Errors::InvalidYAMLFrontMatterError,
          "Invalid YAML front matter in #{filename}"
  end
end
write(dest) click to toggle source

Write the generated page file to the destination directory.

dest - The String path to the destination dir.

Returns nothing.

# File lib/jekyll/convertible.rb, line 222
def write(dest)
  path = destination(dest)
  FileUtils.mkdir_p(File.dirname(path))
  Jekyll.logger.debug "Writing:", path
  File.write(path, output, :mode => "wb")
  Jekyll::Hooks.trigger hook_owner, :post_write, self
end

Private Instance Methods

defaults() click to toggle source
# File lib/jekyll/convertible.rb, line 249
def defaults
  @defaults ||= site.frontmatter_defaults.all(relative_path, type)
end
no_layout?() click to toggle source
# File lib/jekyll/convertible.rb, line 253
def no_layout?
  data["layout"] == "none"
end