Sha256: 141d6c0bae5752520758d758b2f57cefaa347797aac8da20b007aa387be2a452

Contents?: true

Size: 1.4 KB

Versions: 1

Compression:

Stored size: 1.4 KB

Contents

require 'yaml'
require 'active_support/core_ext/hash'

require_relative 'conrefifier'

module Datafiles

  def self.apply_conditionals(config, path, content)
    data_vars = Conrefifier.file_variables(config[:data_variables], path)
    data_vars = { :page => data_vars, :site => { :config => config } }

    content = content.gsub(/(\s*\{% (?:if|unless).+? %\}.*?\{% end(?:if|unless) %\})/m) do |match|
      # We must obfuscate Liquid variables while replacing conditionals
      match = match.gsub(/{{/, '~~#~~')
      match = Conrefifier.apply_liquid(match, data_vars)
      match.gsub('~~#~~', '{{')
    end

    doc = YAML.load(content)
    data_keys = "#{path}".gsub(%r{^data/}, '').gsub(%r{/}, '.').gsub(/\.yml/, '').split('.')
    # we don't need to create a nested hash for root-level data files
    if data_keys.length == 1
      { data_keys.first => doc }
    else
      create_nested_hash(data_keys, doc)
    end
  end

  def self.create_nested_hash(keys, final)
    keys.reverse.inject do |mem, var|
      if mem == keys.last
        { var => { mem => final } }
      else
        { var => mem }
      end
    end
  end

  def self.collect_data(dir)
    Dir["#{dir}/**/*.{yaml,yml}"]
  end

  def self.process(config)
    data = {}
    files = collect_data('data')
    files.each do |file|
      content = File.read(file)
      data = data.deep_merge apply_conditionals(config, file, content)
    end
    data
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nanoc-conref-fs-0.4.2 lib/nanoc-conref-fs/datafiles.rb