class Jekyll::JekyllDatapageGenerator

Public Instance Methods

generate(site) click to toggle source

the function =generate= loops over the =_config.yml/page_gen= specification, determining what sets of pages have to be generated, reading the data for each set and invoking the =DataPage= constructor for each record found in the data

# File lib/jekyll-datapage-generator.rb, line 132
def generate(site)
  # page_gen-dirs is a global option which determines whether we want to
  # generate index pages (name/index.html) or HTML files (name.html) for
  # all sets
  index_files = site.config['page_gen-dirs'] == true

  # data contains the specification of all the datasets for which we want
  # to generate individual pages (look at the README file for its documentation)
  data = site.config['page_gen']
  if data
    data.each do |data_spec|
      index_files_for_this_data = data_spec['index_files'] != nil ? data_spec['index_files'] : index_files
      template         = data_spec['template'] || data_spec['data']
      name             = data_spec['name']
      name_expr        = data_spec['name_expr']
      title            = data_spec['title']
      title_expr       = data_spec['title_expr']
      dir              = data_spec['dir'] || data_spec['data']
      extension        = data_spec['extension'] || "html"
      page_data_prefix = data_spec['page_data_prefix']
      debug            = data_spec['debug']
      
      if not site.layouts.key? template
        puts "error (datapage-gen). could not find template #{template}. Skipping dataset #{name}."
      else
        # records is the list of records for which we want to generate
        # individual pages
        records = nil

        data_spec['data'].split('.').each do |level|
          if records.nil?
            records = site.data[level]
          else
            records = records[level]
          end
        end
        if (records.kind_of?(Hash))
          records = records.values
        end

        # apply filtering conditions:
        # - filter requires the name of a boolean field
        # - filter_condition evals a ruby expression which can use =record= as argument
        records = records.select { |record| record[data_spec['filter']] } if data_spec['filter']
        records = records.select { |record| eval(data_spec['filter_condition']) } if data_spec['filter_condition']

        # we now have the list of all records for which we want to generate individual pages
        # iterate and call the constructor
        records.each do |record|
          site.pages << DataPage.new(site, site.source, index_files_for_this_data, dir, page_data_prefix, record, name, name_expr, title, title_expr, template, extension, debug)
        end
      end
    end
  end
end