Module: Middleman::Util::Data
- Includes:
- Contracts
- Defined in:
- lib/middleman-core/util/data.rb
Constant Summary
Constants included from Contracts
Class Method Summary collapse
- .parse(file, frontmatter_delims, known_type = nil) ⇒ Object
- .parse_json(content, full_path) ⇒ Object
- .parse_yaml(content, full_path) ⇒ Object
-
.String ⇒ Hash
Parse JSON frontmatter out of a string.
- .symbolize_recursive(value) ⇒ Object
Methods included from Contracts
Class Method Details
.parse(file, frontmatter_delims, known_type = nil) ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/middleman-core/util/data.rb', line 47 def parse(file, frontmatter_delims, known_type=nil) full_path = file[:full_path] return [{}, nil] if ::Middleman::Util.binary?(full_path) || file[:types].include?(:binary) # Avoid weird race condition when a file is renamed begin content = file.read rescue EOFError, IOError, ::Errno::ENOENT return [{}, nil] end start_delims, stop_delims = frontmatter_delims .values .flatten(1) .transpose .map(&::Regexp.method(:union)) match = / \A(?:[^\r\n]*coding:[^\r\n]*\r?\n)? (?<start>#{start_delims})[ ]*\r?\n (?<frontmatter>.*?)[ ]*\r?\n? ^(?<stop>#{stop_delims})[ ]*\r?\n? \r?\n? (?<additional_content>.*) /mx.match(content) || {} unless match[:frontmatter] case known_type when :yaml return [parse_yaml(content, full_path), nil] when :json return [parse_json(content, full_path), nil] end end case [match[:start], match[:stop]] when *frontmatter_delims[:yaml] [ parse_yaml(match[:frontmatter], full_path), match[:additional_content] ] when *frontmatter_delims[:json] [ parse_json("{#{match[:frontmatter]}}", full_path), match[:additional_content] ] else [ {}, content ] end end |
.parse_json(content, full_path) ⇒ Object
116 117 118 119 120 121 |
# File 'lib/middleman-core/util/data.rb', line 116 def parse_json(content, full_path) symbolize_recursive(::JSON.parse(content) || {}) rescue StandardError => error warn "JSON Exception parsing #{full_path}: #{error.}" {} end |
.parse_yaml(content, full_path) ⇒ Object
105 106 107 108 109 110 |
# File 'lib/middleman-core/util/data.rb', line 105 def parse_yaml(content, full_path) symbolize_recursive(::YAML.load(content) || {}) rescue StandardError, ::Psych::SyntaxError => error warn "YAML Exception parsing #{full_path}: #{error.}" {} end |
.String ⇒ Hash
Parse JSON frontmatter out of a string
104 |
# File 'lib/middleman-core/util/data.rb', line 104 Contract String, Pathname, Bool => Hash |
.symbolize_recursive(value) ⇒ Object
123 124 125 126 127 128 129 130 131 132 |
# File 'lib/middleman-core/util/data.rb', line 123 def symbolize_recursive(value) case value when Hash value.map { |k, v| [k.to_sym, symbolize_recursive(v)] }.to_h when Array value.map { |v| symbolize_recursive(v) } else value end end |