class Middleman::CoreExtensions::FrontMatter::FrontmatterManager

Constants

YAML_ERRORS

Attributes

app[R]

Public Class Methods

new(app) click to toggle source
# File lib/middleman-core/core_extensions/front_matter.rb, line 54
def initialize(app)
  @app = app
  @cache = {}
end

Public Instance Methods

clear_data(file) click to toggle source
# File lib/middleman-core/core_extensions/front_matter.rb, line 64
def clear_data(file)
  # Copied from Sitemap::Store#file_to_path, but without
  # removing the file extension
  file = File.expand_path(file, @app.root)
  prefix = @app.source_dir.sub(/\/$/, "") + "/"
  return unless file.include?(prefix)
  path = file.sub(prefix, "")

  @cache.delete(path)
end
data(path) click to toggle source
# File lib/middleman-core/core_extensions/front_matter.rb, line 59
def data(path)
  p = normalize_path(path)
  @cache[p] ||= frontmatter_and_content(p)
end
frontmatter_and_content(path) click to toggle source

Get the frontmatter and plain content from a file @param [String] path @return [Array<Thor::CoreExt::HashWithIndifferentAccess, String>]

# File lib/middleman-core/core_extensions/front_matter.rb, line 132
def frontmatter_and_content(path)
  full_path = if Pathname(path).relative?
    File.join(@app.source_dir, path)
  else
    path
  end
  
  data = {}
  content = nil

  if !::Middleman::Util.binary?(full_path)
    content = File.read(full_path)
    
    begin
      if content =~ /\A.*coding:/
        lines = content.split(/\n/)
        lines.shift
        content = lines.join("\n")
      end

      if result = parse_yaml_front_matter(content)
        data, content = result
      elsif result = parse_json_front_matter(content)
        data, content = result
      end
    rescue => e
      # Probably a binary file, move on
    end
  end

  [::Middleman::Util.recursively_enhance(data).freeze, content]
end
manipulate_resource_list(resources) click to toggle source

Update the main sitemap resource list @return [void]

# File lib/middleman-core/core_extensions/front_matter.rb, line 171
def manipulate_resource_list(resources)
  resources.each do |r|
    if !r.proxy? && !r.data.nil? && r.data["ignored"] == true
      r.frontmatter_ignored = true
    end
  end

  resources
end
normalize_path(path) click to toggle source
# File lib/middleman-core/core_extensions/front_matter.rb, line 165
def normalize_path(path)
  path.sub(%r{^#{@app.source_dir}\/}, "")
end
parse_json_front_matter(content) click to toggle source
# File lib/middleman-core/core_extensions/front_matter.rb, line 106
def parse_json_front_matter(content)
  json_regex = /\A(;;;\s*\n.*?\n?)^(;;;\s*$\n?)/m

  if content =~ json_regex
    content = content.sub(json_regex, "")

    begin
      json = ($1+$2).sub(";;;", "{").sub(";;;", "}")
      data = ActiveSupport::JSON.decode(json)
    rescue => e
      logger.error "JSON Exception: #{e.message}"
      return false
    end

  else
    return false
  end

  [data, content]
rescue
  [{}, content]
end
parse_yaml_front_matter(content) click to toggle source

Parse YAML frontmatter out of a string @param [String] content @return [Array<Hash, String>]

# File lib/middleman-core/core_extensions/front_matter.rb, line 85
def parse_yaml_front_matter(content)
  yaml_regex = /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
  if content =~ yaml_regex
    content = content.sub(yaml_regex, "")

    begin
      data = YAML.load($1)
    rescue *YAML_ERRORS => e
      logger.error "YAML Exception: #{e.message}"
      return false
    end

  else
    return false
  end

  [data, content]
rescue
  [{}, content]
end