Class: Jekyll::Plugins::PaginateV3::Generators::PaginationGenerator

Inherits:
Generator
  • Object
show all
Defined in:
lib/jekyll-paginate-v3/generators/pagination_generator.rb

Overview

Jekyll generator entry point for paginate-v3.

Used by Jekyll's generator lifecycle to invoke the v3 pagination pipeline for each site build.

Instance Method Summary collapse

Instance Method Details

#generate(site) ⇒ Object

Entrypoint called by Jekyll once the site graph is loaded.

Normalises config, wires lightweight callbacks for mutating site content, then delegates all pagination behaviour to Pagination::Model.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/jekyll-paginate-v3/generators/pagination_generator.rb', line 21

def generate(site)
	logger = nil
	overall_started_at = monotonic_seconds
	config = Config::Normaliser.normalise_site_config(site.config)
	config = enable_implicit_v1_compatibility(config, site)

	logger = Utils::Logger.new(debug_enabled: config['debug'])
	logger.debug("Normalised config summary: enabled=#{config['enabled']} compatibility=#{config['compatibility'] || 'none'} items=#{config['items']} templates.location=#{config.dig('templates', 'location')} generate.count=#{config.dig('templates', 'generate')&.length || 0}.")

	unless config['enabled']
		logger.info('Disabled in site config.')
		return
	end

	# Shared logger callback so deeper layers do not depend directly on
	# Jekyll logger globals.
	log_lambda = logger.method(:call)
	scoped_log_lambda_builder = logger.method(:scoped_log_lambda)

	# Abstract site mutation so the model can add pages or documents
	# without knowing where Jekyll stores each item type.
	add_item_lambda = lambda do |item, collection_index: nil|
		add_site_item(site, item, collection_index: collection_index)
	end

	# Mirror add_item_lambda for replacing template pages with generated
	# paginated siblings.
	remove_item_lambda = lambda do |item|
		remove_site_item(site, item)
	end

	model = Pagination::Model.new(
		site: site,
		site_config: config,
		log_lambda: log_lambda,
		scoped_log_lambda_builder: scoped_log_lambda_builder,
		add_item_lambda: add_item_lambda,
		remove_item_lambda: remove_item_lambda
	)

	run_report = model.run
	log_generate_report(logger, run_report['generated_template_report'])
	log_search_location_report(
		logger,
		run_report['search_location_report'],
		processed_templates: run_report['processed_templates'],
		search_duration_seconds: run_report['search_duration_seconds']
	)
	logger.info("Done in #{format_duration(monotonic_seconds - overall_started_at)}.")
rescue StandardError => error
	if logger.nil?
		Jekyll.logger.error('Pagination:', "Failed with #{error.class}: #{error.message}")
	else
		logger.error("Failed with #{error.class}: #{error.message}")
	end
	raise
end