Class: Jekyll::ClientSearch::Configuration

Inherits:
Object
  • Object
show all
Includes:
ConfigurationAccessors, EmbeddingConfiguration
Defined in:
lib/jekyll/client_search/configuration.rb

Overview

Reads the client_search section of the Jekyll site config and exposes validated, normalized values to the generator.

Constant Summary collapse

ENGINES =
%w[minisearch elasticlunr semantic].freeze
ENGINE_CDN_URLS =
{
  "minisearch" => "https://cdn.jsdelivr.net/npm/minisearch@7.2.0/dist/umd/index.min.js",
  "elasticlunr" => "https://cdn.jsdelivr.net/npm/elasticlunr@0.9.5/elasticlunr.min.js",
  "semantic" => nil
}.freeze
DEFAULTS =
{
  "enabled" => true,
  "engine" => "minisearch",
  "output" => "search-index.json",
  "collections" => ["posts"],
  "include_pages" => false,
  "copy_runtime" => true,
  "passthrough_fields" => [],
  "icon_field" => "icon_url",
  "embedding" => {
    "enabled" => false,
    "model" => "embeddinggemma:300m",
    "base_url" => "http://localhost:11434",
    "connect_timeout" => 5,
    "read_timeout" => 120,
    "fail_on_error" => true,
    "query_embedder" => {
      "type" => "transformers"
    }
  }
}.freeze

Constants included from EmbeddingConfiguration

EmbeddingConfiguration::PREFIXES

Instance Method Summary collapse

Methods included from EmbeddingConfiguration

#embedding_base_url, #embedding_connect_timeout, #embedding_document_prefix, #embedding_enabled?, #embedding_fail_on_error?, #embedding_identity, #embedding_include_in_index?, #embedding_model, #embedding_query_prefix, #embedding_read_timeout

Methods included from ConfigurationAccessors

#live_search_config, #query_embedder_api_url, #query_embedder_asset, #query_embedder_assets, #query_embedder_config_json, #query_embedder_model, #query_embedder_type, #related_configuration, #related_enabled?, #related_output

Constructor Details

#initialize(site) ⇒ Configuration

Returns a new instance of Configuration.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/jekyll/client_search/configuration.rb', line 41

def initialize(site)
  configured = site.config["client_search"]
  configured = { "enabled" => false } if configured == false
  configured ||= {}
  unless configured.is_a?(Hash)
    raise Jekyll::Errors::FatalException,
          "client_search configuration must be a mapping or false"
  end

  @values = DEFAULTS.merge(configured)
  @live_search = LiveSearchConfiguration.new(configured["live_search"] || {}, engine: engine)
  @related = RelatedConfiguration.new(configured["related"] || {})
  merge_embedding_config(configured["embedding"])
  validate_engine!
  return unless embedding_enabled?

  validate_embedding!
  validate_query_embedder!
end

Instance Method Details

#add_hash_fields(hash, fields) ⇒ Object



133
134
135
136
137
# File 'lib/jekyll/client_search/configuration.rb', line 133

def add_hash_fields(hash, fields)
  hash.each do |s, t|
    fields << [s.to_s, t.to_s] unless s.to_s.empty? || t.to_s.empty?
  end
end

#add_string_field(entry, fields) ⇒ Object



139
140
141
# File 'lib/jekyll/client_search/configuration.rb', line 139

def add_string_field(entry, fields)
  fields << [entry.to_s, entry.to_s] unless entry.to_s.empty?
end

#collectionsObject



115
116
117
# File 'lib/jekyll/client_search/configuration.rb', line 115

def collections
  Array(@values["collections"]).compact.map(&:to_s).reject(&:empty?).uniq
end

#copy_runtime?Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/jekyll/client_search/configuration.rb', line 123

def copy_runtime?
  @values["copy_runtime"] != false
end

#enabled?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/jekyll/client_search/configuration.rb', line 84

def enabled?
  @values["enabled"] != false
end

#engineObject



88
89
90
# File 'lib/jekyll/client_search/configuration.rb', line 88

def engine
  @values.fetch("engine").to_s
end

#engine_crossoriginObject



100
101
102
# File 'lib/jekyll/client_search/configuration.rb', line 100

def engine_crossorigin
  @values.fetch("engine_crossorigin", nil)
end

#engine_sriObject



96
97
98
# File 'lib/jekyll/client_search/configuration.rb', line 96

def engine_sri
  @values.fetch("engine_sri", nil)
end

#engine_urlObject



92
93
94
# File 'lib/jekyll/client_search/configuration.rb', line 92

def engine_url
  @values.key?("engine_url") ? @values.fetch("engine_url") : ENGINE_CDN_URLS.fetch(engine)
end

#icon_fieldObject



143
144
145
146
# File 'lib/jekyll/client_search/configuration.rb', line 143

def icon_field
  v = @values["icon_field"]
  v.nil? || v == false ? nil : v.to_s
end

#include_pages?Boolean

Returns:

  • (Boolean)


119
120
121
# File 'lib/jekyll/client_search/configuration.rb', line 119

def include_pages?
  @values["include_pages"] == true
end

#outputObject



111
112
113
# File 'lib/jekyll/client_search/configuration.rb', line 111

def output
  normalize_output(@values.fetch("output"))
end

#passthrough_fieldsObject



127
128
129
130
131
# File 'lib/jekyll/client_search/configuration.rb', line 127

def passthrough_fields
  Array(@values["passthrough_fields"]).compact.each_with_object([]) do |e, f|
    e.is_a?(Hash) ? add_hash_fields(e, f) : add_string_field(e, f)
  end.uniq
end

#runtime_assetsObject



104
105
106
107
108
109
# File 'lib/jekyll/client_search/configuration.rb', line 104

def runtime_assets
  assets = ["assets/client-search-base.js", "assets/adapters/#{engine}.js"]
  assets.concat(query_embedder_assets) if engine == "semantic" && embedding_enabled?
  assets << "assets/client-search-related.js" if related_enabled?
  assets
end

#runtime_icon_fieldObject



148
149
150
# File 'lib/jekyll/client_search/configuration.rb', line 148

def runtime_icon_field
  icon_field if passthrough_fields.map(&:last).include?(icon_field)
end