Module: Textus::Entry::Yaml
- Defined in:
- lib/textus/entry/yaml.rb
Overview
YAML entry storage. Top-level must be a mapping so we can carry _meta.
Class Method Summary collapse
- .extensions ⇒ Object
- .parse(raw, path: nil) ⇒ Object
- .serialize(frontmatter:, body:, content: nil) ⇒ Object
Class Method Details
.extensions ⇒ Object
36 |
# File 'lib/textus/entry/yaml.rb', line 36 def self.extensions = [".yaml", ".yml"] |
.parse(raw, path: nil) ⇒ Object
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/textus/entry/yaml.rb', line 7 def self.parse(raw, path: nil) raw = raw.dup.force_encoding(Encoding::UTF_8) raise BadFrontmatter.new(path, "entry is not valid UTF-8") unless raw.valid_encoding? begin parsed = ::YAML.safe_load(raw, permitted_classes: [Date, Time], aliases: false) rescue Psych::SyntaxError, Psych::AliasesNotEnabled, Psych::DisallowedClass => e raise BadFrontmatter.new(path, "YAML parse failed: #{e.}") end raise BadFrontmatter.new(path, "YAML top-level must be a mapping") unless parsed.is_a?(Hash) = parsed["_meta"] fm = .is_a?(Hash) ? : {} { "frontmatter" => fm, "body" => raw, "content" => parsed } end |
.serialize(frontmatter:, body:, content: nil) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/textus/entry/yaml.rb', line 23 def self.serialize(frontmatter:, body:, content: nil) _ = frontmatter if content.is_a?(Hash) ::YAML.dump(content).sub(/\A---\n/, "") elsif body && !body.to_s.empty? b = body.to_s b += "\n" unless b.end_with?("\n") b else raise UsageError.new("yaml serialize requires :content or :body") end end |