Class: Jekyll::ClientSearch::Configuration
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
EmbeddingConfiguration::PREFIXES
Instance Method Summary
collapse
#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
#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
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
|
#collections ⇒ Object
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
123
124
125
|
# File 'lib/jekyll/client_search/configuration.rb', line 123
def copy_runtime?
@values["copy_runtime"] != false
end
|
#enabled? ⇒ Boolean
84
85
86
|
# File 'lib/jekyll/client_search/configuration.rb', line 84
def enabled?
@values["enabled"] != false
end
|
#engine ⇒ Object
88
89
90
|
# File 'lib/jekyll/client_search/configuration.rb', line 88
def engine
@values.fetch("engine").to_s
end
|
#engine_crossorigin ⇒ Object
100
101
102
|
# File 'lib/jekyll/client_search/configuration.rb', line 100
def engine_crossorigin
@values.fetch("engine_crossorigin", nil)
end
|
#engine_sri ⇒ Object
96
97
98
|
# File 'lib/jekyll/client_search/configuration.rb', line 96
def engine_sri
@values.fetch("engine_sri", nil)
end
|
#engine_url ⇒ Object
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_field ⇒ Object
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
119
120
121
|
# File 'lib/jekyll/client_search/configuration.rb', line 119
def include_pages?
@values["include_pages"] == true
end
|
#output ⇒ Object
111
112
113
|
# File 'lib/jekyll/client_search/configuration.rb', line 111
def output
normalize_output(@values.fetch("output"))
end
|
#passthrough_fields ⇒ Object
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_assets ⇒ Object
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_field ⇒ Object
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
|