Module: Sourcerer::Jekyll::Bootstrapper

Defined in:
lib/sourcerer/jekyll/bootstrapper.rb

Overview

This module provides methods for programmatically setting up a Jekyll site environment, which is useful for loading plugins or creating a mock site for rendering.

Class Method Summary collapse

Class Method Details

.fake_site(includes_load_paths: [], plugin_dirs: []) ⇒ Jekyll::Site

Creates an ephemeral Jekyll site instance for rendering purposes. This is useful for leveraging Jekyll's templating outside of a full site build. rubocop:disable Lint/UnusedMethodArgument

Parameters:

  • includes_load_paths (Array<String>) (defaults to: [])
    Paths to load includes from.
  • plugin_dirs (Array<String>) (defaults to: [])
    Paths to load plugins from.

Returns:

  • (Jekyll::Site)
    The initialized fake Jekyll site object.


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
# File 'lib/sourcerer/jekyll/bootstrapper.rb', line 41

def self.fake_site includes_load_paths: [], plugin_dirs: []
  # NOTE: plugin_dirs parameter is accepted but not yet implemented; reserved for future plugin loading
  ::Jekyll.logger.log_level = :error if ::Jekyll.logger.respond_to?(:log_level=)

  config = ::Jekyll.configuration(
    'source'              => Dir.pwd,
    'includes_dir'        => includes_load_paths.first,
    'includes_load_paths' => includes_load_paths,
    'destination'         => File.join(Dir.pwd, '_site'),
    'quiet'               => true,
    'skip_config_files'   => true,
    'disable_disk_cache'  => true)

  site = ::Jekyll::Site.new(config)

  include_paths = site.includes_load_paths || []
  site.inclusions ||= {}

  include_paths.each do |dir|
    Dir[File.join(dir, '**/*')].each do |file|
      next unless File.file?(file)

      relative_path = file.sub("#{dir}/", '')
      site.inclusions[relative_path] = File.read(file)
    end
  end

  site.instance_variable_set(:@liquid_renderer, ::Jekyll::LiquidRenderer.new(site))

  plugin_manager = ::Jekyll::PluginManager.new(site)
  plugin_manager.conscientious_require

  site
end

.load_plugins(plugin_dirs: []) ⇒ Jekyll::Site

Loads Jekyll plugins from specified directories.

Parameters:

  • plugin_dirs (Array<String>) (defaults to: [])
    A list of directories to search for plugins.

Returns:

  • (Jekyll::Site)
    The initialized Jekyll site object.


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/sourcerer/jekyll/bootstrapper.rb', line 15

def self.load_plugins plugin_dirs: []
  config = ::Jekyll.configuration(
    {
      'source'      => Dir.pwd,
      'destination' => File.join(Dir.pwd, '_site'),
      'quiet'       => true,
      'skip_config_files' => true,
      'plugins_dir' => plugin_dirs.map { |d| File.expand_path(d) },
      'disable_disk_cache' => true
    })

  site = ::Jekyll::Site.new(config)
  site.plugin_manager.conscientious_require

  ::Jekyll::Hooks.trigger :site, :after_init, site

  site
end