blacklight 6.2.0 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/.solr_wrapper +5 -0
- data/.travis.yml +3 -5
- data/Gemfile +3 -3
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight/core.js +19 -5
- data/app/helpers/blacklight/blacklight_helper_behavior.rb +48 -20
- data/app/helpers/blacklight/configuration_helper_behavior.rb +1 -1
- data/app/helpers/blacklight/url_helper_behavior.rb +2 -1
- data/app/presenters/blacklight/document_presenter.rb +58 -150
- data/app/presenters/blacklight/field_presenter.rb +31 -0
- data/app/presenters/blacklight/index_presenter.rb +69 -0
- data/app/presenters/blacklight/link_alternate_presenter.rb +29 -0
- data/app/presenters/blacklight/rendering/abstract_step.rb +24 -0
- data/app/presenters/blacklight/rendering/helper_method.rb +23 -0
- data/app/presenters/blacklight/rendering/join.rb +16 -0
- data/app/presenters/blacklight/rendering/link_to_facet.rb +35 -0
- data/app/presenters/blacklight/rendering/microdata.rb +17 -0
- data/app/presenters/blacklight/rendering/pipeline.rb +32 -0
- data/app/presenters/blacklight/rendering/terminator.rb +9 -0
- data/app/presenters/blacklight/show_presenter.rb +93 -0
- data/app/services/blacklight/field_retriever.rb +58 -0
- data/app/views/catalog/_document_default.atom.builder +2 -3
- data/app/views/catalog/_document_default.rss.builder +2 -2
- data/app/views/kaminari/blacklight/_next_page.html.erb +9 -3
- data/app/views/kaminari/blacklight/_prev_page.html.erb +10 -3
- data/lib/blacklight/configuration.rb +15 -3
- data/lib/blacklight/configuration/null_field.rb +13 -0
- data/lib/blacklight/configuration/view_config.rb +6 -0
- data/lib/generators/blacklight/templates/catalog_controller.rb +1 -1
- data/lib/generators/blacklight/templates/config/blacklight.yml +1 -1
- data/lib/generators/blacklight/templates/config/jetty.yml +1 -1
- data/spec/controllers/alternate_controller_spec.rb +2 -2
- data/spec/controllers/application_controller_spec.rb +1 -1
- data/spec/controllers/blacklight/facet_spec.rb +3 -3
- data/spec/controllers/blacklight/search_fields_spec.rb +7 -7
- data/spec/controllers/blacklight/search_helper_spec.rb +44 -44
- data/spec/controllers/blacklight/suggest_search_spec.rb +1 -1
- data/spec/controllers/bookmarks_controller_spec.rb +6 -6
- data/spec/controllers/catalog_controller_spec.rb +125 -125
- data/spec/controllers/saved_searches_controller_spec.rb +4 -9
- data/spec/controllers/search_history_controller_spec.rb +3 -6
- data/spec/controllers/suggest_controller_spec.rb +2 -2
- data/spec/features/alternate_controller_spec.rb +3 -3
- data/spec/features/bookmarks_spec.rb +6 -6
- data/spec/features/did_you_mean_spec.rb +10 -10
- data/spec/features/facets_spec.rb +4 -4
- data/spec/features/record_view_spec.rb +4 -4
- data/spec/features/saved_searches_spec.rb +4 -4
- data/spec/features/search_context_spec.rb +4 -4
- data/spec/features/search_filters_spec.rb +10 -10
- data/spec/features/search_formats_spec.rb +2 -2
- data/spec/features/search_history_spec.rb +5 -5
- data/spec/features/search_pagination_spec.rb +4 -4
- data/spec/features/search_results_spec.rb +7 -7
- data/spec/features/search_sort_spec.rb +2 -2
- data/spec/features/search_spec.rb +6 -6
- data/spec/helpers/blacklight_helper_spec.rb +105 -65
- data/spec/helpers/catalog_helper_spec.rb +36 -36
- data/spec/helpers/configuration_helper_spec.rb +28 -28
- data/spec/helpers/facets_helper_spec.rb +39 -39
- data/spec/helpers/hash_as_hidden_fields_spec.rb +1 -1
- data/spec/helpers/render_constraints_helper_spec.rb +1 -1
- data/spec/helpers/search_history_constraints_helper_spec.rb +7 -7
- data/spec/helpers/url_helper_spec.rb +20 -17
- data/spec/lib/blacklight/search_state_spec.rb +2 -2
- data/spec/lib/blacklight/utils_spec.rb +15 -15
- data/spec/lib/blacklight_spec.rb +1 -1
- data/spec/lib/tasks/blacklight_task_spec.rb +1 -1
- data/spec/models/blacklight/configurable_spec.rb +3 -3
- data/spec/models/blacklight/configuration_spec.rb +52 -52
- data/spec/models/blacklight/document_spec.rb +10 -10
- data/spec/models/blacklight/facet_paginator_spec.rb +5 -5
- data/spec/models/blacklight/search_builder_spec.rb +34 -34
- data/spec/models/blacklight/user_spec.rb +4 -4
- data/spec/models/bookmark_spec.rb +5 -5
- data/spec/models/record_mailer_spec.rb +11 -11
- data/spec/models/search_spec.rb +1 -1
- data/spec/models/solr_document_spec.rb +4 -4
- data/spec/presenters/document_presenter_spec.rb +94 -50
- data/spec/presenters/index_presenter_spec.rb +147 -0
- data/spec/presenters/pipeline_spec.rb +28 -0
- data/spec/presenters/show_presenter_spec.rb +287 -0
- data/spec/routing/catalog_routing_spec.rb +11 -11
- data/spec/spec_helper.rb +10 -1
- data/spec/support/backport_test.rb +38 -0
- data/spec/test_app_templates/Gemfile.extra +2 -10
- data/spec/views/_user_util_links.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_constraints.html.erb_spec.rb +3 -3
- data/spec/views/catalog/_constraints_element.html.erb_spec.rb +5 -5
- data/spec/views/catalog/_document.html.erb_spec.rb +2 -2
- data/spec/views/catalog/_document_list.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_facet_layout.html.erb_spec.rb +4 -4
- data/spec/views/catalog/_facets.html.erb_spec.rb +4 -4
- data/spec/views/catalog/_index_default.erb_spec.rb +5 -4
- data/spec/views/catalog/_index_header_default.html.erb_spec.rb +4 -3
- data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +3 -3
- data/spec/views/catalog/_search_header.erb_spec.rb +1 -1
- data/spec/views/catalog/_show_default.erb_spec.rb +6 -5
- data/spec/views/catalog/_show_sidebar.erb_spec.rb +2 -1
- data/spec/views/catalog/_show_tools.html.erb_spec.rb +8 -8
- data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +2 -2
- data/spec/views/catalog/_thumbnail_default.erb_spec.rb +3 -2
- data/spec/views/catalog/_view_type_group.html.erb_spec.rb +3 -3
- data/spec/views/catalog/facet.html.erb_spec.rb +3 -3
- data/spec/views/catalog/index.atom.builder_spec.rb +15 -14
- data/spec/views/catalog/index.html.erb_spec.rb +3 -3
- data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
- data/spec/views/catalog/show.html.erb_spec.rb +5 -4
- data/tasks/blacklight.rake +1 -1
- metadata +25 -4
- data/config/jetty.yml +0 -13
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
# Renders a field and handles link_to_search or helper_method if supplied
|
|
3
|
+
class FieldPresenter
|
|
4
|
+
def initialize(controller, document, field_config, options)
|
|
5
|
+
@controller = controller
|
|
6
|
+
@document = document
|
|
7
|
+
@field_config = field_config
|
|
8
|
+
@options = options
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
attr_reader :controller, :document, :field_config, :options
|
|
12
|
+
|
|
13
|
+
def render
|
|
14
|
+
if options[:value]
|
|
15
|
+
# This prevents helper methods from drawing.
|
|
16
|
+
config = Configuration::NullField.new(field_config.to_h.except(:helper_method))
|
|
17
|
+
values = Array.wrap(options[:value])
|
|
18
|
+
else
|
|
19
|
+
config = field_config
|
|
20
|
+
values = retrieve_values
|
|
21
|
+
end
|
|
22
|
+
Rendering::Pipeline.render(values, config, document, controller, options)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def retrieve_values
|
|
28
|
+
FieldRetriever.new(document, field_config).fetch
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Blacklight
|
|
3
|
+
class IndexPresenter
|
|
4
|
+
# @param [SolrDocument] document
|
|
5
|
+
# @param [ActionController::Base] controller scope for linking and generating urls
|
|
6
|
+
# @param [Blacklight::Configuration] configuration
|
|
7
|
+
def initialize(document, controller, configuration = controller.blacklight_config)
|
|
8
|
+
@document = document
|
|
9
|
+
@configuration = configuration
|
|
10
|
+
@controller = controller
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Render the document index heading
|
|
15
|
+
#
|
|
16
|
+
# @param [Symbol, Proc, String] field Render the given field or evaluate the proc or render the given string
|
|
17
|
+
# @param [Hash] opts
|
|
18
|
+
# TODO: the default field should be `document_show_link_field(doc)'
|
|
19
|
+
def label(field_or_string_or_proc, opts = {})
|
|
20
|
+
config = Configuration::NullField.new
|
|
21
|
+
value = case field_or_string_or_proc
|
|
22
|
+
when Symbol
|
|
23
|
+
config = field_config(field_or_string_or_proc)
|
|
24
|
+
@document[field_or_string_or_proc]
|
|
25
|
+
when Proc
|
|
26
|
+
field_or_string_or_proc.call(@document, opts)
|
|
27
|
+
when String
|
|
28
|
+
field_or_string_or_proc
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
value ||= @document.id
|
|
32
|
+
field_values(config, value: value)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
##
|
|
36
|
+
# Render the index field label for a document
|
|
37
|
+
#
|
|
38
|
+
# Allow an extention point where information in the document
|
|
39
|
+
# may drive the value of the field
|
|
40
|
+
# @param [String] field
|
|
41
|
+
# @param [Hash] opts
|
|
42
|
+
# @options opts [String] :value
|
|
43
|
+
def field_value field, options = {}
|
|
44
|
+
field_config = field_config(field)
|
|
45
|
+
field_values(field_config, options)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
##
|
|
51
|
+
# Get the value for a document's field, and prepare to render it.
|
|
52
|
+
# - highlight_field
|
|
53
|
+
# - accessor
|
|
54
|
+
# - solr field
|
|
55
|
+
#
|
|
56
|
+
# Rendering:
|
|
57
|
+
# - helper_method
|
|
58
|
+
# - link_to_search
|
|
59
|
+
# @param [Blacklight::Configuration::Field] solr field configuration
|
|
60
|
+
# @param [Hash] options additional options to pass to the rendering helpers
|
|
61
|
+
def field_values(field_config, options={})
|
|
62
|
+
FieldPresenter.new(@controller, @document, field_config, options).render
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def field_config(field)
|
|
66
|
+
@configuration.index_fields.fetch(field) { Configuration::NullField.new(field) }
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
# Create <link rel="alternate"> links from a documents dynamically
|
|
3
|
+
class LinkAlternatePresenter
|
|
4
|
+
include ActionView::Helpers::OutputSafetyHelper
|
|
5
|
+
include ActionView::Helpers::TagHelper
|
|
6
|
+
|
|
7
|
+
def initialize(controller, document, options)
|
|
8
|
+
@controller = controller
|
|
9
|
+
@document = document
|
|
10
|
+
@options = { unique: false, exclude: [] }.merge(options)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :controller, :document, :options
|
|
14
|
+
|
|
15
|
+
# Renders links to alternate representations
|
|
16
|
+
# provided by export formats. Returns empty string if no links available.
|
|
17
|
+
def render
|
|
18
|
+
seen = Set.new
|
|
19
|
+
|
|
20
|
+
safe_join(document.export_formats.map do |format, spec|
|
|
21
|
+
next if options[:exclude].include?(format) || (options[:unique] && seen.include?(spec[:content_type]))
|
|
22
|
+
|
|
23
|
+
seen.add(spec[:content_type])
|
|
24
|
+
|
|
25
|
+
tag(:link, rel: "alternate", title: format, type: spec[:content_type], href: controller.polymorphic_url(document, format: format))
|
|
26
|
+
end.compact, "\n")
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
module Rendering
|
|
3
|
+
class AbstractStep
|
|
4
|
+
def initialize(values, config, document, context, options, stack)
|
|
5
|
+
@values = values
|
|
6
|
+
@config = config
|
|
7
|
+
@document = document
|
|
8
|
+
@context = context
|
|
9
|
+
@options = options
|
|
10
|
+
@stack = stack
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :values, :config, :document, :context, :options, :stack
|
|
14
|
+
|
|
15
|
+
protected
|
|
16
|
+
|
|
17
|
+
def next_step(output_values)
|
|
18
|
+
first, *rest = *stack
|
|
19
|
+
first.new(output_values, config, document, context, options, rest).render
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
module Rendering
|
|
3
|
+
class HelperMethod < AbstractStep
|
|
4
|
+
def render
|
|
5
|
+
return next_step(values) unless config.helper_method
|
|
6
|
+
return render_helper # short circut the rest of the steps
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def render_helper
|
|
12
|
+
context.send(config.helper_method,
|
|
13
|
+
options.merge(document: document,
|
|
14
|
+
field: config.field,
|
|
15
|
+
config: config,
|
|
16
|
+
value: values))
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
module Rendering
|
|
3
|
+
class Join < AbstractStep
|
|
4
|
+
def render
|
|
5
|
+
options = config.separator_options || {}
|
|
6
|
+
next_step(values.map { |x| html_escape(x) }.to_sentence(options).html_safe)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def html_escape(*args)
|
|
12
|
+
ERB::Util.html_escape(*args)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
module Rendering
|
|
3
|
+
class LinkToFacet < AbstractStep
|
|
4
|
+
def render
|
|
5
|
+
# TODO: We should rename the config variable, because it creates a link to a facet.
|
|
6
|
+
return next_step(values) unless config.link_to_search
|
|
7
|
+
next_step(render_link)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
# This allows the link to wrap an itemprop
|
|
13
|
+
def render_link
|
|
14
|
+
values.map { |v| link(link_field, v) }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def link_field
|
|
18
|
+
return config.key if config.link_to_search === true
|
|
19
|
+
config.link_to_search
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def link(field, v)
|
|
23
|
+
context.link_to v, search_path(field, v)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def search_path(field, v)
|
|
27
|
+
context.search_action_path(facet_params(field, v))
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def facet_params(field, v)
|
|
31
|
+
context.search_state.reset.add_facet_params(field, v)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
module Rendering
|
|
3
|
+
class Microdata < AbstractStep
|
|
4
|
+
include ActionView::Helpers::TagHelper
|
|
5
|
+
def render
|
|
6
|
+
return next_step(values) unless config.itemprop
|
|
7
|
+
next_step(values.map { |x| itemprop(x, config.itemprop) })
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def itemprop(val, itemprop)
|
|
13
|
+
content_tag :span, val, itemprop: itemprop
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
module Rendering
|
|
3
|
+
# The field rendering pipeline
|
|
4
|
+
class Pipeline
|
|
5
|
+
def initialize(values, config, document, context, options)
|
|
6
|
+
@values = values
|
|
7
|
+
@config = config
|
|
8
|
+
@document = document
|
|
9
|
+
@context = context
|
|
10
|
+
@options = options
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :values, :config, :document, :context, :options
|
|
14
|
+
|
|
15
|
+
def self.render(values, config, document, context, options)
|
|
16
|
+
new(values, config, document, context, options).render
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def render
|
|
20
|
+
first, *rest = *stack
|
|
21
|
+
first.new(values, config, document, context, options, rest).render
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
protected
|
|
25
|
+
|
|
26
|
+
# Ordered list of operations, Terminator must be at the end.
|
|
27
|
+
def stack
|
|
28
|
+
[HelperMethod, LinkToFacet, Microdata, Join, Terminator]
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Blacklight
|
|
3
|
+
class ShowPresenter
|
|
4
|
+
# @param [SolrDocument] document
|
|
5
|
+
# @param [ActionController::Base] controller scope for linking and generating urls
|
|
6
|
+
# @param [Blacklight::Configuration] configuration
|
|
7
|
+
def initialize(document, controller, configuration = controller.blacklight_config)
|
|
8
|
+
@document = document
|
|
9
|
+
@configuration = configuration
|
|
10
|
+
@controller = controller
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Create <link rel="alternate"> links from a documents dynamically
|
|
15
|
+
# provided export formats. Returns empty string if no links available.
|
|
16
|
+
#
|
|
17
|
+
# @params [Hash] options
|
|
18
|
+
# @option options [Boolean] :unique ensures only one link is output for every
|
|
19
|
+
# content type, e.g. as required by atom
|
|
20
|
+
# @option options [Array<String>] :exclude array of format shortnames to not include in the output
|
|
21
|
+
# @deprecated moved to ShowPresenter#link_rel_alternates
|
|
22
|
+
def link_rel_alternates(options = {})
|
|
23
|
+
LinkAlternatePresenter.new(@controller, @document, options).render
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# Get the document's "title" to display in the <title> element.
|
|
28
|
+
# (by default, use the #document_heading)
|
|
29
|
+
#
|
|
30
|
+
# @see #document_heading
|
|
31
|
+
# @return [String]
|
|
32
|
+
def html_title
|
|
33
|
+
if view_config.html_title_field
|
|
34
|
+
fields = Array.wrap(view_config.html_title_field)
|
|
35
|
+
f = fields.detect { |field| @document.has? field }
|
|
36
|
+
f ||= 'id'
|
|
37
|
+
field_values(field_config(f))
|
|
38
|
+
else
|
|
39
|
+
heading
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
##
|
|
44
|
+
# Get the value of the document's "title" field, or a placeholder
|
|
45
|
+
# value (if empty)
|
|
46
|
+
#
|
|
47
|
+
# @param [SolrDocument] document
|
|
48
|
+
# @return [String]
|
|
49
|
+
def heading
|
|
50
|
+
fields = Array.wrap(view_config.title_field)
|
|
51
|
+
f = fields.detect { |field| @document.has? field }
|
|
52
|
+
f ||= @configuration.document_model.unique_key
|
|
53
|
+
field_values(field_config(f), value: @document[f])
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# Render the show field value for a document
|
|
58
|
+
#
|
|
59
|
+
# Allow an extention point where information in the document
|
|
60
|
+
# may drive the value of the field
|
|
61
|
+
# @param [String] field
|
|
62
|
+
# @param [Hash] options
|
|
63
|
+
# @options opts [String] :value
|
|
64
|
+
def field_value field, options={}
|
|
65
|
+
field_values(field_config(field), options)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
##
|
|
71
|
+
# Get the value for a document's field, and prepare to render it.
|
|
72
|
+
# - highlight_field
|
|
73
|
+
# - accessor
|
|
74
|
+
# - solr field
|
|
75
|
+
#
|
|
76
|
+
# Rendering:
|
|
77
|
+
# - helper_method
|
|
78
|
+
# - link_to_search
|
|
79
|
+
# @param [Blacklight::Configuration::Field] solr field configuration
|
|
80
|
+
# @param [Hash] options additional options to pass to the rendering helpers
|
|
81
|
+
def field_values(field_config, options={})
|
|
82
|
+
FieldPresenter.new(@controller, @document, field_config, options).render
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def view_config
|
|
86
|
+
@configuration.view_config(:show)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def field_config(field)
|
|
90
|
+
@configuration.show_fields.fetch(field) { Configuration::NullField.new(field) }
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Blacklight
|
|
2
|
+
class FieldRetriever
|
|
3
|
+
# @param [SolrDocument] document
|
|
4
|
+
# @param [Blacklight::Configuration::Field] field_config solr field configuration
|
|
5
|
+
def initialize(document, field_config)
|
|
6
|
+
@document = document
|
|
7
|
+
@field_config = field_config
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
attr_reader :document, :field_config
|
|
11
|
+
delegate :field, to: :field_config
|
|
12
|
+
|
|
13
|
+
# @return [Array]
|
|
14
|
+
def fetch
|
|
15
|
+
Array.wrap(
|
|
16
|
+
case
|
|
17
|
+
when field_config.highlight
|
|
18
|
+
retrieve_highlight
|
|
19
|
+
when field_config.accessor
|
|
20
|
+
retieve_using_accessor
|
|
21
|
+
when field_config
|
|
22
|
+
retrieve_simple
|
|
23
|
+
end
|
|
24
|
+
)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def retrieve_simple
|
|
30
|
+
# regular document field
|
|
31
|
+
if field_config.default and field_config.default.is_a? Proc
|
|
32
|
+
document.fetch(field_config.field, &field_config.default)
|
|
33
|
+
else
|
|
34
|
+
document.fetch(field_config.field, field_config.default)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def retieve_using_accessor
|
|
39
|
+
# implicit method call
|
|
40
|
+
if field_config.accessor === true
|
|
41
|
+
document.send(field)
|
|
42
|
+
# arity-1 method call (include the field name in the call)
|
|
43
|
+
elsif !field_config.accessor.is_a?(Array) && document.method(field_config.accessor).arity != 0
|
|
44
|
+
document.send(field_config.accessor, field)
|
|
45
|
+
# chained method calls
|
|
46
|
+
else
|
|
47
|
+
Array(field_config.accessor).inject(document) do |result, method|
|
|
48
|
+
result.send(method)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def retrieve_highlight
|
|
54
|
+
# retrieve the document value from the highlighting response
|
|
55
|
+
document.highlight_field(field_config.field).map(&:html_safe) if document.has_highlight_field? field_config.field
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|