Module: NanocConrefFS::Datafiles

Defined in:
lib/nanoc-conref-fs/datafiles.rb

Constant Summary collapse

OBFUSCATION =
'~~#~~'

Class Method Summary collapse

Class Method Details

.apply_conditionals(config, path:, content:, rep:) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/nanoc-conref-fs/datafiles.rb', line 10

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

  content = obfuscate_and_liquify(content, data_vars)
  begin
    doc = YAML.load(content)
  rescue Psych::SyntaxError => e
    STDERR.puts "\nCould not convert following file:\n#{content}"
    raise "#{e.message}: #{e.inspect}"
  end

  path = path.dup
  path.slice!("#{ConrefFS.data_dir_name(config)}/") # Beware the slashes, they are important for tokenization
  path.sub!(/\.[yaml]{3,4}\z/, '')
  data_keys = path.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

.collect_data(dir) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/nanoc-conref-fs/datafiles.rb', line 45

def self.collect_data(dir)
  data_files = {}
  Dir["#{dir}/**/*.{yaml,yml}"].each do |filename|
    data_files[filename] = File.read(filename, encoding: 'UTF-8')
  end
  data_files
end

.create_nested_hash(keys, final) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/nanoc-conref-fs/datafiles.rb', line 35

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

.obfuscate_and_liquify(content, data_vars) ⇒ Object



62
63
64
65
66
67
68
# File 'lib/nanoc-conref-fs/datafiles.rb', line 62

def self.obfuscate_and_liquify(content, data_vars)
   # We must obfuscate Liquid variables while replacing conditionals,
   # else they get wiped out
  content.gsub!(/\{\{/, OBFUSCATION)
  content = Conrefifier.apply_liquid(content, data_vars)
  content.gsub(OBFUSCATION, '{{')
end

.process(data_files, config, rep) ⇒ Object



53
54
55
56
57
58
59
60
# File 'lib/nanoc-conref-fs/datafiles.rb', line 53

def self.process(data_files, config, rep)
  data = {}
  data_files.each_pair do |filename, content|
    conditionals = apply_conditionals(config, path: filename, content: content, rep: rep)
    data = data.deep_merge(conditionals)
  end
  data
end