class Pandocomatic::PandocMetadata::MetadataBlockList

List of YAML metadata blocks present in some input source file

Public Class Methods

new(input, path) click to toggle source
# File lib/pandocomatic/pandoc_metadata.rb, line 215
def initialize(input, path)
  blocks = extract_blocks input, path
  if blocks.any? { |b| !b.is_a? Hash }
    raise PandocMetadataError.new :found_horizontal_lines_with_three_dashes, nil, path
  end

  @metadata_blocks = blocks
end

Public Instance Methods

count_pandocomatic_blocks() click to toggle source

Count the number of metadata blocks with a “pandocomatic_” property.

# File lib/pandocomatic/pandoc_metadata.rb, line 225
def count_pandocomatic_blocks
  @metadata_blocks.count do |block|
    block.key? 'pandocomatic_' or block.key? 'pandocomatic'
  end
end
full() click to toggle source

Combine all metadata blocks into a single metadata block @return [Hash]

# File lib/pandocomatic/pandoc_metadata.rb, line 233
def full
  # According to the pandoc manual: "A document may contain multiple
  # metadata blocks. The metadata fields will be combined through a
  # left-biased union: if two metadata blocks attempt to set the
  # same field, the value from the first block will be taken."
  #
  # Here we do the same
  @metadata_blocks
    .reverse
    .reduce({}) { |metadata, block| metadata.merge!(block) }
end

Private Instance Methods

extract_blocks(input, path) click to toggle source
# File lib/pandocomatic/pandoc_metadata.rb, line 247
def extract_blocks(input, path)
  starts = input.scan(BLOCK_START)

  if starts.empty?
    # No YAML metadata blocks expected
    return []
  end

  # Expect YAML metadata blocks
  input
    .scan(METADATA_BLOCK)
    .map { |match| PandocomaticYAML.load "---#{match.join}...", path }
    .select { |block| !block.nil? and !block.empty? }
rescue StandardError => e
  raise PandocMetadataError.new :expected_to_find_YAML_metadata_blocks, e, path
end