lib/jekyll/airtable_fetcher.rb in jekyll-airtable-0.2.0 vs lib/jekyll/airtable_fetcher.rb in jekyll-airtable-0.3.0

- old
+ new

@@ -9,36 +9,39 @@ def generate(site) return false if site.config['AIRTABLE_API_KEY'].nil? || site.config['AIRTABLE_API_KEY'] == '' return false if site.config['SYNC_WITH_AIRTABLE'] == 'false' + setup_directories + # For storing hashes of attachments that will be saved to the data file + @attachments_hash = {} + Airtable.configure do |config| config.api_key = site.config['AIRTABLE_API_KEY'] end - client = Airtable.client(base_uid: site.config['AIRTABLE_BASE_UID']) + client = Airtable.client(base_uid: site.config['AIRTABLE_BASE_UID']) site.config['AIRTABLE_TABLE_NAMES'].each do |table_name| records = client.list_records(table_name: table_name) next if records.size == 0 - converted_table_name = to_snake(table_name) - directory_name = "collections/_" + converted_table_name - + directory_name = "collections/_" + to_snake(table_name) Dir.mkdir(directory_name) unless File.exists?(directory_name) records.each do |record| fields = record['fields'] # We use the first field as the primary key # Then find the value of the primary key to be stored as the slug, which # will be used as file name and the path to the record in the url. # However, if the record has field called 'slug', it will be used instead pkey = fields.keys.first slug = fields['slug'].nil? ? fields[pkey] : fields['slug'] + filename = to_snake(slug) + '.md' uid = record['id'] - out_file = File.new("#{directory_name}/#{slug}.md", "w") + out_file = File.new("#{directory_name}/#{filename}", "w") out_file.puts(front_matter_mark) out_file.puts("uid: #{uid}") fields.each do |key, value| snake_key = to_snake(key) @@ -46,19 +49,22 @@ if value.class.name == 'Array' out_file.puts("#{snake_key}:") write_array_values(out_file, value) else value = stringify_value_if_necessary(value) + out_file.puts("#{snake_key}: #{value}") end end out_file.puts(front_matter_mark) out_file.close end end + + write_attachments_data_file end private def front_matter_mark @@ -69,17 +75,51 @@ string.split(' ').map(&:downcase).join('_') end def write_array_values(file, array) array.each do |element| - # - { name: 'Low', color: '#306d8c' } - value = stringify_value_if_necessary(element) - file.puts(" - #{value}") + if is_this_is_an_attachment?(element) + # Store only the uid of the attachment in the front matter + value = element['id'] + + # Store the hash into the hash of hashes + @attachments_hash[value] = element + else + # - { name: 'Low', color: '#306d8c' } + value = stringify_value_if_necessary(element) + end + + file.puts(" - #{value}") end end def stringify_value_if_necessary(value) - return "'#{value}'" if value.include?(':') - value + begin + return "'#{value}'" if value.include?(':') + + value + rescue NoMethodError + value + end + end + + def is_this_is_an_attachment?(value) + is_hash = value.class.name == 'Hash' + return false unless is_hash + + value.keys.map(&:to_s).include?('filename') + end + + def setup_directories + Dir.mkdir('_data') unless File.exists?('_data') + Dir.mkdir('_data/airtable') unless File.exists?('_data/airtable') + + Dir.mkdir('collections') unless File.exists?('collections') + end + + def write_attachments_data_file + File.open("_data/airtable/attachments.yml", "w") do |f| + f.write(@attachments_hash.to_yaml) + end end end end