Class: Middleman::CoreExtensions::FrontMatter::FrontmatterManager

Inherits:
Object
  • Object
show all
Defined in:
lib/middleman-core/core_extensions/front_matter.rb

Constant Summary collapse

YAML_ERRORS =
[ Exception, ArgumentError ]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ FrontmatterManager

Returns a new instance of FrontmatterManager.



52
53
54
55
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 52

def initialize(app)
  @app = app
  @cache = {}
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



49
50
51
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 49

def app
  @app
end

Instance Method Details

#clear_data(file) ⇒ Object



62
63
64
65
66
67
68
69
70
71
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 62

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) ⇒ Object



57
58
59
60
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 57

def data(path)
  p = normalize_path(path)
  @cache[p] ||= frontmatter_and_content(p)
end

#frontmatter_and_content(path) ⇒ Array<Thor::CoreExt::HashWithIndifferentAccess, String>

Get the frontmatter and plain content from a file

Parameters:

  • path (String)

Returns:

  • (Array<Thor::CoreExt::HashWithIndifferentAccess, String>)


129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 129

def frontmatter_and_content(path)
  full_path = File.expand_path(File.join(@app.source_dir, path))
  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) ⇒ void

This method returns an undefined value.

Update the main sitemap resource list



163
164
165
166
167
168
169
170
171
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 163

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) ⇒ Object



157
158
159
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 157

def normalize_path(path)
  path.sub(@app.source_dir, "").sub(/^\//, "")
end

#parse_json_front_matter(content) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 103

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) ⇒ Array<Hash, String>

Parse YAML frontmatter out of a string

Parameters:

  • content (String)

Returns:

  • (Array<Hash, String>)


82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/middleman-core/core_extensions/front_matter.rb', line 82

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