Jekyll plugins generate data files at build time from various sources (GitHub API, calculations, external APIs).
# frozen_string_literal: true
module Jekyll
class PluginName < Generator
safe true
priority :normal
def generate(site)
begin
# Plugin logic
data = generate_data(site)
# Write to data file
data_dir = File.join(site.source, '_data')
FileUtils.mkdir_p(data_dir)
data_file = File.join(data_dir, 'output.yml')
File.write(data_file, data.to_yaml)
Jekyll.logger.info "Plugin Name:", "Generated data"
rescue => e
Jekyll.logger.warn "Plugin Name:", "Error: #{e.message}"
end
end
private
def generate_data(site)
# Implementation
end
end
end
Run during site generation, create data files:
github_data_fetcher.rb - Fetches GitHub datamarket_data_fetcher.rb - Fetches market datametrics_calculator.rb - Calculates metricsseo_generator.rb - Generates SEO dataProvide Liquid filters:
custom_filters.rb - Custom filters (time_ago, format_currency):high - Run early (data dependencies):normal - Default priority:low - Run late (optimizations)All plugins should:
begin/rescue# Access config
site.config['github_username']
# Access data files
site.data['terminal']
site.data['companies']
# Access posts/pages
site.posts.docs
site.pages
data_dir = File.join(site.source, '_data')
FileUtils.mkdir_p(data_dir)
data_file = File.join(data_dir, 'output.yml')
File.write(data_file, data.to_yaml)
Access via ENV:
token = ENV['GITHUB_TOKEN']
if token
# Use token
else
# Fallback behavior
end
Jekyll.logger.info "Plugin:", "Success message"
Jekyll.logger.warn "Plugin:", "Warning message"
Jekyll.logger.debug "Plugin:", "Debug message"
Jekyll.logger.error "Plugin:", "Error message"
bundle exec jekyll build_data/ for generated filesdef generate(site)
data = {
'items' => ['item1', 'item2'],
'generated_at' => Time.now.iso8601
}
write_data_file(site, 'simple.yml', data)
end
def generate(site)
begin
data = fetch_from_api
write_data_file(site, 'api_data.yml', data)
rescue => e
Jekyll.logger.warn "API Fetcher:", "Error: #{e.message}"
write_fallback_data(site)
end
end
def generate(site)
source_data = site.data['source']
return unless source_data
calculated = calculate_metrics(source_data)
write_data_file(site, 'metrics.yml', calculated)
end
safe true