arclight 0.2.0 → 1.6.2

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.
Files changed (246) hide show
  1. checksums.yaml +4 -4
  2. data/.all-contributorsrc +450 -0
  3. data/.codeclimate.yml +5 -0
  4. data/.eslintrc +14 -4
  5. data/.github/workflows/ruby.yml +51 -0
  6. data/.gitignore +1 -0
  7. data/.rspec +0 -1
  8. data/.rubocop.yml +504 -8
  9. data/.rubocop_todo.yml +62 -199
  10. data/.solr_wrapper +2 -1
  11. data/CONTRIBUTING.md +5 -5
  12. data/CONTRIBUTORS.md +79 -0
  13. data/Gemfile +15 -10
  14. data/README.md +36 -34
  15. data/Rakefile +0 -1
  16. data/app/assets/images/blacklight/bookmark.svg +1 -0
  17. data/app/assets/images/blacklight/collection.svg +5 -0
  18. data/app/assets/images/blacklight/compact.svg +1 -25
  19. data/app/assets/images/blacklight/container.svg +5 -0
  20. data/app/assets/images/blacklight/ead.svg +1 -0
  21. data/app/assets/images/blacklight/file.svg +5 -0
  22. data/app/assets/images/blacklight/folder.svg +1 -0
  23. data/app/assets/images/blacklight/list.svg +1 -0
  24. data/app/assets/images/blacklight/minus.svg +1 -0
  25. data/app/assets/images/blacklight/online.svg +5 -0
  26. data/app/assets/images/blacklight/pdf.svg +1 -0
  27. data/app/assets/images/blacklight/plus.svg +1 -0
  28. data/app/assets/images/blacklight/repository.svg +1 -0
  29. data/app/assets/javascripts/arclight/arclight.js +4 -10
  30. data/app/assets/javascripts/arclight/oembed_controller.js +58 -0
  31. data/app/assets/javascripts/arclight/truncate_controller.js +27 -0
  32. data/app/assets/stylesheets/arclight/application.scss +4 -4
  33. data/app/assets/stylesheets/arclight/build.scss +4 -0
  34. data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +117 -146
  35. data/app/assets/stylesheets/arclight/modules/highlights.scss +2 -1
  36. data/app/assets/stylesheets/arclight/modules/icons.scss +20 -0
  37. data/app/assets/stylesheets/arclight/modules/layout.scss +183 -40
  38. data/app/assets/stylesheets/arclight/modules/mastheads.scss +24 -75
  39. data/app/assets/stylesheets/arclight/modules/repositories.scss +3 -7
  40. data/app/assets/stylesheets/arclight/modules/repository_card.scss +5 -50
  41. data/app/assets/stylesheets/arclight/modules/search_form.scss +9 -0
  42. data/app/assets/stylesheets/arclight/modules/search_results.scss +197 -26
  43. data/app/assets/stylesheets/arclight/modules/show_collection.scss +21 -69
  44. data/app/assets/stylesheets/arclight/modules/truncator.scss +58 -0
  45. data/app/assets/stylesheets/arclight/responsive.scss +13 -0
  46. data/app/assets/stylesheets/arclight/variables.scss +25 -2
  47. data/app/components/arclight/access_component.html.erb +14 -0
  48. data/app/components/arclight/access_component.rb +25 -0
  49. data/app/components/arclight/bookmark_component.html.erb +25 -0
  50. data/app/components/arclight/bookmark_component.rb +9 -0
  51. data/app/components/arclight/breadcrumb_component.rb +50 -0
  52. data/app/components/arclight/breadcrumbs_hierarchy_component.html.erb +34 -0
  53. data/app/components/arclight/breadcrumbs_hierarchy_component.rb +25 -0
  54. data/app/components/arclight/collection_context_component.html.erb +12 -0
  55. data/app/components/arclight/collection_context_component.rb +27 -0
  56. data/app/components/arclight/collection_info_component.html.erb +28 -0
  57. data/app/components/arclight/collection_info_component.rb +26 -0
  58. data/app/components/arclight/collection_sidebar_component.html.erb +15 -0
  59. data/app/components/arclight/collection_sidebar_component.rb +39 -0
  60. data/app/{views/catalog/_search_results_repository.html.erb → components/arclight/constraints_component.html.erb} +2 -1
  61. data/app/components/arclight/constraints_component.rb +17 -0
  62. data/app/components/arclight/document_collection_context_component.html.erb +29 -0
  63. data/app/components/arclight/document_collection_context_component.rb +28 -0
  64. data/app/components/arclight/document_collection_hierarchy_component.html.erb +50 -0
  65. data/app/components/arclight/document_collection_hierarchy_component.rb +62 -0
  66. data/app/components/arclight/document_component.html.erb +39 -0
  67. data/app/components/arclight/document_component.rb +49 -0
  68. data/app/components/arclight/document_components_hierarchy_component.html.erb +20 -0
  69. data/app/components/arclight/document_components_hierarchy_component.rb +34 -0
  70. data/app/components/arclight/document_download_component.html.erb +24 -0
  71. data/app/components/arclight/document_download_component.rb +71 -0
  72. data/app/components/arclight/embed_component.html.erb +10 -0
  73. data/app/components/arclight/embed_component.rb +43 -0
  74. data/app/components/arclight/expand_hierarchy_button_component.html.erb +5 -0
  75. data/app/components/arclight/expand_hierarchy_button_component.rb +16 -0
  76. data/app/components/arclight/group_component.html.erb +34 -0
  77. data/app/components/arclight/group_component.rb +23 -0
  78. data/app/components/arclight/header_component.html.erb +5 -0
  79. data/app/components/arclight/header_component.rb +10 -0
  80. data/app/components/arclight/index_metadata_field_component.html.erb +16 -0
  81. data/app/components/arclight/index_metadata_field_component.rb +20 -0
  82. data/app/components/arclight/masthead_component.html.erb +17 -0
  83. data/app/components/arclight/masthead_component.rb +10 -0
  84. data/app/components/arclight/metadata_section_component.html.erb +13 -0
  85. data/app/components/arclight/metadata_section_component.rb +22 -0
  86. data/app/components/arclight/oembed_viewer_component.html.erb +5 -0
  87. data/app/components/arclight/oembed_viewer_component.rb +16 -0
  88. data/app/components/arclight/online_content_filter_component.html.erb +15 -0
  89. data/app/components/arclight/online_content_filter_component.rb +17 -0
  90. data/app/components/arclight/online_status_indicator_component.rb +19 -0
  91. data/app/components/arclight/repository_breadcrumb_component.html.erb +10 -0
  92. data/app/components/arclight/repository_breadcrumb_component.rb +17 -0
  93. data/app/components/arclight/repository_location_component.html.erb +20 -0
  94. data/app/components/arclight/repository_location_component.rb +10 -0
  95. data/app/components/arclight/search_bar_component.html.erb +27 -0
  96. data/app/components/arclight/search_bar_component.rb +32 -0
  97. data/app/components/arclight/search_result_breadcrumbs_component.html.erb +6 -0
  98. data/app/components/arclight/search_result_breadcrumbs_component.rb +37 -0
  99. data/app/components/arclight/search_result_component.html.erb +20 -0
  100. data/app/components/arclight/search_result_component.rb +18 -0
  101. data/app/components/arclight/search_result_title_component.html.erb +15 -0
  102. data/app/components/arclight/search_result_title_component.rb +15 -0
  103. data/app/components/arclight/sidebar_component.html.erb +9 -0
  104. data/app/components/arclight/sidebar_component.rb +19 -0
  105. data/app/components/arclight/upper_metadata_layout_component.rb +10 -0
  106. data/app/components/blacklight/icons/bookmark_component.rb +12 -0
  107. data/app/components/blacklight/icons/collection_component.rb +14 -0
  108. data/app/components/blacklight/icons/compact_component.rb +12 -0
  109. data/app/components/blacklight/icons/container_component.rb +14 -0
  110. data/app/components/blacklight/icons/ead_component.rb +12 -0
  111. data/app/components/blacklight/icons/file_component.rb +14 -0
  112. data/app/components/blacklight/icons/folder_component.rb +12 -0
  113. data/app/components/blacklight/icons/online_component.rb +15 -0
  114. data/app/components/blacklight/icons/pdf_component.rb +12 -0
  115. data/app/components/blacklight/icons/repository_component.rb +12 -0
  116. data/app/controllers/arclight/repositories_controller.rb +4 -4
  117. data/app/helpers/arclight/ead_format_helpers.rb +309 -0
  118. data/app/helpers/arclight/field_config_helpers.rb +26 -0
  119. data/app/helpers/arclight_helper.rb +55 -120
  120. data/app/models/arclight/document_downloads.rb +122 -0
  121. data/app/models/arclight/parent.rb +9 -9
  122. data/app/models/arclight/parents.rb +9 -4
  123. data/app/models/arclight/requests/aeon_external_request.rb +42 -0
  124. data/app/models/arclight/requests/aeon_web_ead.rb +52 -0
  125. data/app/models/arclight/requests/google_form.rb +8 -3
  126. data/app/models/concerns/arclight/catalog.rb +33 -11
  127. data/app/models/concerns/arclight/search_behavior.rb +22 -21
  128. data/app/models/concerns/arclight/solr_document.rb +88 -59
  129. data/app/presenters/arclight/show_presenter.rb +34 -7
  130. data/app/views/arclight/_requests.html.erb +7 -0
  131. data/app/views/arclight/repositories/_repository.html.erb +22 -41
  132. data/app/views/arclight/repositories/index.html.erb +5 -0
  133. data/app/views/arclight/repositories/show.html.erb +7 -8
  134. data/app/views/arclight/requests/_aeon_external_request_endpoint.html.erb +8 -0
  135. data/app/views/arclight/requests/_aeon_web_ead.html.erb +6 -0
  136. data/app/views/arclight/requests/_google_form.html.erb +4 -5
  137. data/app/views/catalog/_document_list.html.erb +8 -0
  138. data/app/views/catalog/_group.html.erb +4 -0
  139. data/app/views/catalog/_group_toggle.html.erb +10 -0
  140. data/app/views/catalog/_search_results_header.html.erb +3 -0
  141. data/app/views/catalog/hierarchy.html.erb +19 -0
  142. data/app/views/catalog/index.html.erb +16 -7
  143. data/app/views/shared/_breadcrumbs.html.erb +3 -15
  144. data/app/views/shared/_main_menu_links.html.erb +1 -1
  145. data/arclight.gemspec +18 -17
  146. data/config/breadcrumbs.rb +24 -0
  147. data/config/i18n-tasks.yml +11 -9
  148. data/config/importmap.rb +3 -0
  149. data/config/locales/arclight.en.yml +68 -34
  150. data/config/routes.rb +1 -1
  151. data/docker-compose.yml +16 -0
  152. data/lib/arclight/digital_object.rb +2 -1
  153. data/lib/arclight/engine.rb +22 -31
  154. data/lib/arclight/exceptions.rb +1 -0
  155. data/lib/arclight/hash_absolute_xpath.rb +13 -8
  156. data/lib/arclight/level_label.rb +46 -0
  157. data/lib/arclight/normalized_date.rb +5 -10
  158. data/lib/arclight/normalized_id.rb +7 -2
  159. data/lib/arclight/normalized_title.rb +3 -0
  160. data/lib/arclight/repository.rb +70 -28
  161. data/lib/arclight/routes/hierarchy.rb +19 -0
  162. data/lib/arclight/routes.rb +8 -0
  163. data/lib/arclight/traject/ead2_component_config.rb +335 -0
  164. data/lib/arclight/traject/ead2_config.rb +172 -331
  165. data/lib/arclight/traject/nokogiri_namespaceless_reader.rb +22 -0
  166. data/lib/arclight/version.rb +1 -1
  167. data/lib/arclight/year_range.rb +13 -4
  168. data/lib/arclight.rb +6 -1
  169. data/lib/generators/arclight/install_generator.rb +100 -10
  170. data/lib/generators/arclight/templates/arclight.scss +6 -3
  171. data/lib/generators/arclight/templates/catalog_controller.rb +237 -179
  172. data/lib/generators/arclight/templates/config/downloads.yml +12 -0
  173. data/lib/generators/arclight/templates/config/locales/arclight.en.yml +61 -0
  174. data/lib/generators/arclight/templates/config/repositories.yml +42 -31
  175. data/lib/generators/arclight/update_generator.rb +1 -1
  176. data/lib/tasks/index.rake +25 -30
  177. data/package.json +15 -9
  178. data/solr/conf/schema.xml +97 -328
  179. data/solr/conf/solrconfig.xml +99 -164
  180. data/tasks/arclight.rake +18 -9
  181. data/template.rb +6 -7
  182. metadata +188 -129
  183. data/.travis.yml +0 -28
  184. data/app/assets/javascripts/arclight/collection_context.js +0 -18
  185. data/app/assets/javascripts/arclight/collection_navigation.js +0 -117
  186. data/app/assets/javascripts/arclight/collection_scrollspy.js +0 -6
  187. data/app/assets/javascripts/arclight/component_ancestors.js +0 -56
  188. data/app/assets/javascripts/arclight/oembed_viewer.js +0 -46
  189. data/app/assets/javascripts/arclight/search_results.js +0 -15
  190. data/app/assets/javascripts/arclight/truncator.js.erb +0 -23
  191. data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +0 -3
  192. data/app/assets/stylesheets/arclight/modules/sidebar.scss +0 -21
  193. data/app/controllers/concerns/arclight/field_config_helpers.rb +0 -86
  194. data/app/factories/blacklight_field_configuration_factory.rb +0 -29
  195. data/app/views/arclight/repositories/_in_person_repository.html.erb +0 -19
  196. data/app/views/arclight/viewers/_oembed.html.erb +0 -7
  197. data/app/views/catalog/_arclight_document_index_header.html.erb +0 -13
  198. data/app/views/catalog/_arclight_document_index_header_online_contents_default.html.erb +0 -0
  199. data/app/views/catalog/_arclight_index_compact_default.html.erb +0 -15
  200. data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -5
  201. data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
  202. data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
  203. data/app/views/catalog/_collection_contents.html.erb +0 -12
  204. data/app/views/catalog/_collection_count.html.erb +0 -7
  205. data/app/views/catalog/_collection_downloads.html.erb +0 -15
  206. data/app/views/catalog/_collection_online_contents.html.erb +0 -17
  207. data/app/views/catalog/_collection_overview.html.erb +0 -7
  208. data/app/views/catalog/_component_contents.html.erb +0 -16
  209. data/app/views/catalog/_component_overview.html.erb +0 -40
  210. data/app/views/catalog/_context_card.html.erb +0 -27
  211. data/app/views/catalog/_context_sidebar.html.erb +0 -8
  212. data/app/views/catalog/_custom_metadata.html.erb +0 -16
  213. data/app/views/catalog/_home.html.erb +0 -1
  214. data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -3
  215. data/app/views/catalog/_index_default.html.erb +0 -17
  216. data/app/views/catalog/_index_header.html.erb +0 -7
  217. data/app/views/catalog/_index_header_hierarchy_default.html.erb +0 -42
  218. data/app/views/catalog/_index_header_online_contents_default.html.erb +0 -1
  219. data/app/views/catalog/_index_hierarchy_default.html.erb +0 -28
  220. data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
  221. data/app/views/catalog/_results_histogram.html.erb +0 -15
  222. data/app/views/catalog/_search_results.html.erb +0 -31
  223. data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -21
  224. data/app/views/catalog/_show_collection.html.erb +0 -48
  225. data/app/views/catalog/_show_component_sidebar.html.erb +0 -12
  226. data/app/views/catalog/_show_default.html.erb +0 -42
  227. data/app/views/catalog/_show_sidebar.html.erb +0 -22
  228. data/app/views/catalog/_show_upper_metadata_collection.html.erb +0 -1
  229. data/app/views/catalog/_show_upper_metadata_default.html.erb +0 -14
  230. data/app/views/layouts/catalog_result.html.erb +0 -7
  231. data/app/views/shared/_context_sidebar.html.erb +0 -8
  232. data/app/views/shared/_header_navbar.html.erb +0 -65
  233. data/lib/arclight/custom_component.rb +0 -99
  234. data/lib/arclight/custom_document.rb +0 -93
  235. data/lib/arclight/indexer.rb +0 -9
  236. data/lib/arclight/shared_indexing_behavior.rb +0 -97
  237. data/lib/arclight/shared_terminology_behavior.rb +0 -65
  238. data/lib/arclight/solr_ead_indexer_ext.rb +0 -155
  239. data/lib/arclight/viewer.rb +0 -45
  240. data/lib/arclight/viewers/oembed.rb +0 -56
  241. data/lib/generators/arclight/templates/arclight.js +0 -2
  242. data/solr/conf/scripts.conf +0 -24
  243. data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
  244. data/vendor/assets/javascripts/stickyfill.js +0 -480
  245. /data/app/assets/images/{blacklight → arclight}/logo.png +0 -0
  246. /data/{app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb → config/repositories.yml} +0 -0
@@ -5,6 +5,8 @@ require 'traject'
5
5
  require 'traject/nokogiri_reader'
6
6
  require 'traject_plus'
7
7
  require 'traject_plus/macros'
8
+ require 'arclight/level_label'
9
+ require 'arclight/normalized_id'
8
10
  require 'arclight/normalized_date'
9
11
  require 'arclight/normalized_title'
10
12
  require 'active_model/conversion' ## Needed for Arclight::Repository
@@ -12,14 +14,14 @@ require 'active_support/core_ext/array/wrap'
12
14
  require 'arclight/digital_object'
13
15
  require 'arclight/year_range'
14
16
  require 'arclight/repository'
15
- require 'arclight/missing_id_strategy'
16
-
17
- NAME_ELEMENTS = %w[corpname famname name persname].freeze
17
+ require 'arclight/traject/nokogiri_namespaceless_reader'
18
18
 
19
19
  # rubocop:disable Style/MixinUsage
20
20
  extend TrajectPlus::Macros
21
21
  # rubocop:enable Style/MixinUsage
22
22
 
23
+ NAME_ELEMENTS = %w[corpname famname name persname].freeze
24
+
23
25
  SEARCHABLE_NOTES_FIELDS = %w[
24
26
  accessrestrict
25
27
  accruals
@@ -47,13 +49,17 @@ DID_SEARCHABLE_NOTES_FIELDS = %w[
47
49
  abstract
48
50
  materialspec
49
51
  physloc
52
+ note
50
53
  ].freeze
51
54
 
52
55
  settings do
53
- provide 'nokogiri.namespaces',
54
- 'xmlns' => 'urn:isbn:1-931666-22-9'
56
+ provide 'component_traject_config', File.join(__dir__, 'ead2_component_config.rb')
57
+ provide 'id_normalizer', 'Arclight::NormalizedId'
58
+ provide 'date_normalizer', 'Arclight::NormalizedDate'
59
+ provide 'title_normalizer', 'Arclight::NormalizedTitle'
60
+ provide 'reader_class_name', 'Arclight::Traject::NokogiriNamespacelessReader'
55
61
  provide 'solr_writer.commit_on_close', 'true'
56
- provide 'repository', ENV['REPOSITORY_ID']
62
+ provide 'repository', ENV.fetch('REPOSITORY_ID', nil)
57
63
  provide 'logger', Logger.new($stderr)
58
64
  end
59
65
 
@@ -65,51 +71,66 @@ each_record do |_record, context|
65
71
  ).name
66
72
  end
67
73
 
68
- # Top level
69
- to_field 'id', extract_xpath('//xmlns:eadid'), strip, gsub('.', '-')
70
- to_field 'title_filing_si', extract_xpath('//xmlns:titleproper[@type="filing"]')
71
- to_field 'title_ssm', extract_xpath('//xmlns:archdesc/xmlns:did/xmlns:unittitle')
72
- to_field 'title_teim', extract_xpath('//xmlns:archdesc/xmlns:did/xmlns:unittitle')
73
- to_field 'ead_ssi', extract_xpath('//xmlns:eadid')
74
+ # ==================
75
+ # Top level document
76
+ #
77
+ # NOTE: All fields should be stored in Solr
78
+ # ==================
79
+
80
+ to_field 'id' do |record, accumulator|
81
+ id = record.at_xpath('/ead/eadheader/eadid')&.text
82
+ unitid = record.at_xpath('/ead/archdesc/did/unitid')&.text
83
+ title = record.at_xpath('/ead/archdesc/did/unittitle')&.text
84
+ repository = settings['repository']
85
+ accumulator << settings['id_normalizer'].constantize.new(id, unitid: unitid, title: title, repository: repository).to_s
86
+ end
74
87
 
75
- to_field 'unitdate_ssm', extract_xpath('//xmlns:archdesc/xmlns:did/xmlns:unitdate')
76
- to_field 'unitdate_bulk_ssim', extract_xpath('//xmlns:archdesc/xmlns:did/xmlns:unitdate[@type="bulk"]')
77
- to_field 'unitdate_inclusive_ssm', extract_xpath('//xmlns:archdesc/xmlns:did/xmlns:unitdate[@type="inclusive"]')
78
- to_field 'unitdate_other_ssim', extract_xpath('//xmlns:archdesc/xmlns:did/xmlns:unitdate[not(@type)]')
88
+ to_field 'title_filing_ssi', extract_xpath('/ead/eadheader/filedesc/titlestmt/titleproper[@type="filing"]')
89
+ to_field 'title_ssm', extract_xpath('/ead/archdesc/did/unittitle')
90
+ to_field 'title_tesim', extract_xpath('/ead/archdesc/did/unittitle')
91
+ to_field 'ead_ssi', extract_xpath('/ead/eadheader/eadid')
79
92
 
80
- to_field 'level_ssm' do |record, accumulator|
81
- accumulator << record.at_xpath('//xmlns:archdesc').attribute('level').value
82
- end
93
+ to_field 'unitdate_ssm', extract_xpath('/ead/archdesc/did/unitdate')
94
+ to_field 'unitdate_bulk_ssim', extract_xpath('/ead/archdesc/did/unitdate[@type="bulk"]')
95
+ to_field 'unitdate_inclusive_ssm', extract_xpath('/ead/archdesc/did/unitdate[@type="inclusive"]')
96
+ to_field 'unitdate_other_ssim', extract_xpath('/ead/archdesc/did/unitdate[not(@type)]')
83
97
 
84
- to_field 'level_sim' do |record, accumulator|
85
- accumulator << record.at_xpath('//xmlns:archdesc').attribute('level').value&.capitalize
98
+ # All top-level docs treated as 'collection' for routing / display purposes
99
+ to_field 'level_ssm' do |_record, accumulator|
100
+ accumulator << 'collection'
86
101
  end
87
102
 
88
- to_field 'unitid_ssm', extract_xpath('//xmlns:archdesc/xmlns:did/xmlns:unitid')
89
- to_field 'unitid_teim', extract_xpath('//xmlns:archdesc/xmlns:did/xmlns:unitid')
103
+ # Keep the original top-level archdesc/@level for Level facet in addition to 'Collection'
104
+ to_field 'level_ssim' do |record, accumulator|
105
+ level = record.at_xpath('/ead/archdesc').attribute('level')&.value
106
+ other_level = record.at_xpath('/ead/archdesc').attribute('otherlevel')&.value
90
107
 
91
- to_field 'normalized_title_ssm' do |_record, accumulator, context|
92
- dates = Arclight::NormalizedDate.new(
93
- context.output_hash['unitdate_inclusive_ssm'],
94
- context.output_hash['unitdate_bulk_ssim'],
95
- context.output_hash['unitdate_other_ssim']
96
- ).to_s
97
- title = context.output_hash['title_ssm'].first
98
- accumulator << Arclight::NormalizedTitle.new(title, dates).to_s
108
+ accumulator << Arclight::LevelLabel.new(level, other_level).to_s
109
+ accumulator << 'Collection' unless level == 'collection'
99
110
  end
100
111
 
112
+ to_field 'unitid_ssm', extract_xpath('/ead/archdesc/did/unitid')
113
+ to_field 'unitid_tesim', extract_xpath('/ead/archdesc/did/unitid')
114
+
101
115
  to_field 'normalized_date_ssm' do |_record, accumulator, context|
102
- accumulator << Arclight::NormalizedDate.new(
116
+ accumulator << settings['date_normalizer'].constantize.new(
103
117
  context.output_hash['unitdate_inclusive_ssm'],
104
118
  context.output_hash['unitdate_bulk_ssim'],
105
119
  context.output_hash['unitdate_other_ssim']
106
120
  ).to_s
107
121
  end
108
122
 
109
- to_field 'collection_ssm' do |_record, accumulator, context|
123
+ to_field 'normalized_title_ssm' do |_record, accumulator, context|
124
+ title = context.output_hash['title_ssm']&.first
125
+ date = context.output_hash['normalized_date_ssm']&.first
126
+ accumulator << settings['title_normalizer'].constantize.new(title, date).to_s
127
+ end
128
+
129
+ to_field 'collection_title_tesim' do |_record, accumulator, context|
110
130
  accumulator.concat context.output_hash.fetch('normalized_title_ssm', [])
111
131
  end
112
- to_field 'collection_sim' do |_record, accumulator, context|
132
+
133
+ to_field 'collection_ssim' do |_record, accumulator, context|
113
134
  accumulator.concat context.output_hash.fetch('normalized_title_ssm', [])
114
135
  end
115
136
 
@@ -117,58 +138,40 @@ to_field 'repository_ssm' do |_record, accumulator, context|
117
138
  accumulator << context.clipboard[:repository]
118
139
  end
119
140
 
120
- to_field 'repository_sim' do |_record, accumulator, context|
141
+ to_field 'repository_ssim' do |_record, accumulator, context|
121
142
  accumulator << context.clipboard[:repository]
122
143
  end
123
144
 
124
- to_field 'geogname_ssm', extract_xpath('//xmlns:archdesc/xmlns:controlaccess/xmlns:geogname')
125
-
126
- to_field 'geogname_sim', extract_xpath('//xmlns:archdesc/xmlns:controlaccess/xmlns:geogname')
145
+ to_field 'geogname_ssm', extract_xpath('/ead/archdesc/controlaccess/geogname')
146
+ to_field 'geogname_ssim', extract_xpath('/ead/archdesc/controlaccess/geogname')
127
147
 
128
- to_field 'creator_ssm', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']")
129
- to_field 'creator_sim', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']")
130
- to_field 'creator_ssim', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']")
148
+ to_field 'creator_ssm', extract_xpath('/ead/archdesc/did/origination')
149
+ to_field 'creator_ssim', extract_xpath('/ead/archdesc/did/origination')
131
150
  to_field 'creator_sort' do |record, accumulator|
132
- accumulator << record.xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']").map { |c| c.text.strip }.join(', ')
151
+ accumulator << record.xpath('/ead/archdesc/did/origination').map { |c| c.text.strip }.join(', ')
133
152
  end
134
153
 
135
- to_field 'creator_persname_ssm', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']/xmlns:persname")
136
- to_field 'creator_persname_ssim', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']/xmlns:persname")
137
- to_field 'creator_corpname_ssm', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']/xmlns:corpname")
138
- to_field 'creator_corpname_sim', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']/xmlns:corpname")
139
- to_field 'creator_corpname_ssim', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']/xmlns:corpname")
140
- to_field 'creator_famname_ssm', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']/xmlns:famname")
141
- to_field 'creator_famname_ssim', extract_xpath("//xmlns:archdesc/xmlns:did/xmlns:origination[@label='creator']/xmlns:famname")
142
-
143
- to_field 'persname_sim', extract_xpath('//xmlns:persname')
154
+ to_field 'creator_persname_ssim', extract_xpath('/ead/archdesc/did/origination/persname')
155
+ to_field 'creator_corpname_ssim', extract_xpath('/ead/archdesc/did/origination/corpname')
156
+ to_field 'creator_famname_ssim', extract_xpath('/ead/archdesc/did/origination/famname')
144
157
 
145
158
  to_field 'creators_ssim' do |_record, accumulator, context|
146
- accumulator.concat context.output_hash['creator_persname_ssm'] if context.output_hash['creator_persname_ssm']
147
- accumulator.concat context.output_hash['creator_corpname_ssm'] if context.output_hash['creator_corpname_ssm']
148
- accumulator.concat context.output_hash['creator_famname_ssm'] if context.output_hash['creator_famname_ssm']
159
+ accumulator.concat context.output_hash['creator_persname_ssim'] if context.output_hash['creator_persname_ssim']
160
+ accumulator.concat context.output_hash['creator_corpname_ssim'] if context.output_hash['creator_corpname_ssim']
161
+ accumulator.concat context.output_hash['creator_famname_ssim'] if context.output_hash['creator_famname_ssim']
149
162
  end
150
163
 
151
- to_field 'places_sim', extract_xpath('//xmlns:archdesc/xmlns:controlaccess/xmlns:geogname')
152
- to_field 'places_ssim', extract_xpath('//xmlns:archdesc/xmlns:controlaccess/xmlns:geogname')
153
- to_field 'places_ssm', extract_xpath('//xmlns:archdesc/xmlns:controlaccess/xmlns:geogname')
164
+ to_field 'places_ssim', extract_xpath('/ead/archdesc/controlaccess/geogname')
154
165
 
155
- to_field 'access_terms_ssm', extract_xpath('//xmlns:archdesc/xmlns:userestrict/xmlns:p')
166
+ to_field 'access_terms_ssm', extract_xpath('/ead/archdesc/userestrict/*[local-name()!="head"]')
156
167
 
157
- # Indexes the acquisition group information into the notes field
158
- # Please see https://www.loc.gov/ead/tglib/elements/acqinfo.html
159
- to_field 'acqinfo_ssim', extract_xpath('/xmlns:ead/xmlns:archdesc/xmlns:acqinfo/*[local-name()!="head"]')
160
- to_field 'acqinfo_ssim', extract_xpath('/xmlns:ead/xmlns:archdesc/xmlns:descgrp/xmlns:acqinfo/*[local-name()!="head"]')
161
- to_field 'acqinfo_ssim', extract_xpath('./xmlns:acqinfo/*[local-name()!="head"]')
162
- to_field 'acqinfo_ssim', extract_xpath('./xmlns:descgrp/xmlns:acqinfo/*[local-name()!="head"]')
163
- to_field 'acqinfo_ssm' do |_record, accumulator, context|
164
- accumulator.concat(context.output_hash.fetch('acqinfo_ssim', []))
165
- end
168
+ to_field 'acqinfo_ssim', extract_xpath('/ead/archdesc/acqinfo/*[local-name()!="head"]')
169
+ to_field 'acqinfo_ssim', extract_xpath('/ead/archdesc/descgrp/acqinfo/*[local-name()!="head"]')
166
170
 
167
- # Indexes only specified controlled terms for archival description into the access_subject field
168
- to_field 'access_subjects_ssim', extract_xpath('//xmlns:archdesc/xmlns:controlaccess', to_text: false) do |_record, accumulator|
171
+ to_field 'access_subjects_ssim', extract_xpath('/ead/archdesc/controlaccess', to_text: false) do |_record, accumulator|
169
172
  accumulator.map! do |element|
170
173
  %w[subject function occupation genreform].map do |selector|
171
- element.xpath(".//xmlns:#{selector}").map(&:text)
174
+ element.xpath(".//#{selector}").map(&:text)
172
175
  end
173
176
  end.flatten!
174
177
  end
@@ -177,299 +180,137 @@ to_field 'access_subjects_ssm' do |_record, accumulator, context|
177
180
  accumulator.concat Array.wrap(context.output_hash['access_subjects_ssim'])
178
181
  end
179
182
 
180
- to_field 'has_online_content_ssim', extract_xpath('.//xmlns:dao') do |_record, accumulator|
183
+ to_field 'has_online_content_ssim', extract_xpath('.//dao') do |_record, accumulator|
181
184
  accumulator.replace([accumulator.any?])
182
185
  end
183
186
 
184
- to_field 'extent_ssm', extract_xpath('//xmlns:did/xmlns:physdesc/xmlns:extent')
185
- to_field 'extent_teim', extract_xpath('//xmlns:did/xmlns:physdesc/xmlns:extent')
186
- to_field 'genreform_sim', extract_xpath('//xmlns:archdesc/xmlns:controlaccess/xmlns:genreform')
187
- to_field 'genreform_ssm', extract_xpath('//xmlns:archdesc/xmlns:controlaccess/xmlns:genreform')
188
-
189
- to_field 'date_range_sim', extract_xpath('.//xmlns:did/xmlns:unitdate/@normal', to_text: false) do |_record, accumulator|
190
- range = Arclight::YearRange.new
191
- next range.years if accumulator.blank?
192
-
193
- ranges = accumulator.map(&:to_s)
194
- range << range.parse_ranges(ranges)
195
- accumulator.replace range.years
196
- end
197
-
198
- SEARCHABLE_NOTES_FIELDS.map do |selector|
199
- to_field "#{selector}_ssm", extract_xpath("//xmlns:archdesc/xmlns:#{selector}/*[local-name()!='head']")
200
- to_field "#{selector}_heading_ssm", extract_xpath("//xmlns:archdesc/xmlns:#{selector}/xmlns:head") unless selector == 'prefercite'
201
- to_field "#{selector}_teim", extract_xpath("//xmlns:archdesc/xmlns:#{selector}/*[local-name()!='head']")
202
- end
203
-
204
- DID_SEARCHABLE_NOTES_FIELDS.map do |selector|
205
- to_field "#{selector}_ssm", extract_xpath("//xmlns:did/xmlns:#{selector}")
206
- end
207
- NAME_ELEMENTS.map do |selector|
208
- to_field 'names_coll_ssim', extract_xpath("/xmlns:ead/xmlns:archdesc/xmlns:controlaccess/xmlns:#{selector}")
209
- to_field 'names_ssim', extract_xpath("//xmlns:#{selector}")
210
- to_field "#{selector}_ssm", extract_xpath("//xmlns:#{selector}")
211
- end
212
- to_field 'corpname_sim', extract_xpath('//xmlns:corpname')
213
-
214
- to_field 'language_sim', extract_xpath('//xmlns:did/xmlns:langmaterial')
215
- to_field 'language_ssm', extract_xpath('//xmlns:did/xmlns:langmaterial')
216
-
217
- # Each component child document
218
- # <c> <c01> <c12>
219
- compose 'components', ->(record, accumulator, _context) { accumulator.concat record.xpath('//*[is_component(.)]', NokogiriXpathExtensions.new) } do
220
- to_field 'ref_ssi' do |record, accumulator, context|
221
- accumulator << if record.attribute('id').blank?
222
- strategy = Arclight::MissingIdStrategy.selected
223
- hexdigest = strategy.new(record).to_hexdigest
224
- parent_id = context.clipboard[:parent].output_hash['id'].first
225
- logger.warn('MISSING ID WARNING') do
226
- [
227
- "A component in #{parent_id} did not have and ID so one was minted using the #{strategy} strategy.",
228
- "The ID of this document will be #{parent_id}#{hexdigest}."
229
- ].join(' ')
230
- end
231
- else
232
- record.attribute('id')&.value&.strip&.gsub('.', '-')
233
- end
234
- end
235
- to_field 'ref_ssm' do |_record, accumulator, context|
236
- accumulator.concat context.output_hash['ref_ssi']
187
+ to_field 'digital_objects_ssm', extract_xpath('/ead/archdesc/did/dao|/ead/archdesc/dao', to_text: false) do |_record, accumulator|
188
+ accumulator.map! do |dao|
189
+ label = dao.attributes['title']&.value ||
190
+ dao.xpath('daodesc/p')&.text
191
+ href = (dao.attributes['href'] || dao.attributes['xlink:href'])&.value
192
+ Arclight::DigitalObject.new(label: label, href: href).to_json
237
193
  end
194
+ end
238
195
 
239
- to_field 'id' do |_record, accumulator, context|
240
- accumulator << [
241
- context.clipboard[:parent].output_hash['id'],
242
- context.output_hash['ref_ssi']
243
- ].join('')
244
- end
196
+ # This accumulates direct text from a physdesc, ignoring child elements handled elsewhere
197
+ to_field 'physdesc_tesim', extract_xpath('/ead/archdesc/did/physdesc', to_text: false) do |_record, accumulator|
198
+ accumulator.map! do |element|
199
+ physdesc = []
200
+ element.children.map do |child|
201
+ next if child.instance_of?(Nokogiri::XML::Element)
245
202
 
246
- to_field 'ead_ssi' do |_record, accumulator, context|
247
- accumulator << context.clipboard[:parent].output_hash['ead_ssi'].first
203
+ physdesc << child.text&.strip unless child.text&.strip&.empty?
204
+ end.flatten
205
+ physdesc.join(' ') unless physdesc.empty?
248
206
  end
207
+ end
249
208
 
250
- to_field 'title_filing_si', extract_xpath('./xmlns:did/xmlns:unittitle'), first_only
251
- to_field 'title_ssm', extract_xpath('./xmlns:did/xmlns:unittitle')
252
- to_field 'title_teim', extract_xpath('./xmlns:did/xmlns:unittitle')
253
-
254
- to_field 'unitdate_bulk_ssim', extract_xpath('./xmlns:did/xmlns:unitdate[@type="bulk"]')
255
- to_field 'unitdate_inclusive_ssm', extract_xpath('./xmlns:did/xmlns:unitdate[@type="inclusive"]')
256
- to_field 'unitdate_other_ssim', extract_xpath('./xmlns:did/xmlns:unitdate[not(@type)]')
257
-
258
- to_field 'normalized_title_ssm' do |_record, accumulator, context|
259
- dates = Arclight::NormalizedDate.new(
260
- context.output_hash['unitdate_inclusive_ssm'],
261
- context.output_hash['unitdate_bulk_ssim'],
262
- context.output_hash['unitdate_other_ssim']
263
- ).to_s
264
- title = context.output_hash['title_ssm']&.first
265
- accumulator << Arclight::NormalizedTitle.new(title, dates).to_s
209
+ to_field 'extent_ssm' do |record, accumulator|
210
+ physdescs = record.xpath('/ead/archdesc/did/physdesc')
211
+ extents_per_physdesc = physdescs.map do |physdesc|
212
+ extents = physdesc.xpath('./extent').map { |e| e.text.strip }
213
+ # Join extents within the same physdesc with an empty string
214
+ extents.join(' ') unless extents.empty?
266
215
  end
267
216
 
268
- to_field 'normalized_date_ssm' do |_record, accumulator, context|
269
- accumulator << Arclight::NormalizedDate.new(
270
- context.output_hash['unitdate_inclusive_ssm'],
271
- context.output_hash['unitdate_bulk_ssim'],
272
- context.output_hash['unitdate_other_ssim']
273
- ).to_s
274
- end
217
+ # Add each physdesc separately to the accumulator
218
+ accumulator.concat(extents_per_physdesc)
219
+ end
275
220
 
276
- to_field 'component_level_isim' do |record, accumulator|
277
- accumulator << 1 + record.ancestors.count { |node| node.name == 'c' }
278
- end
221
+ to_field 'extent_tesim' do |_record, accumulator, context|
222
+ accumulator.concat context.output_hash['extent_ssm'] || []
223
+ end
279
224
 
280
- to_field 'parent_ssm' do |record, accumulator, context|
281
- accumulator << context.clipboard[:parent].output_hash['id'].first
282
- accumulator.concat NokogiriXpathExtensions.new.is_component(record.ancestors).reverse.map { |n| n.attribute('id').value }
283
- end
225
+ to_field 'physfacet_tesim', extract_xpath('/ead/archdesc/did/physdesc/physfacet')
226
+ to_field 'dimensions_tesim', extract_xpath('/ead/archdesc/did/physdesc/dimensions')
284
227
 
285
- to_field 'parent_ssi' do |_record, accumulator, context|
286
- accumulator << context.output_hash['parent_ssm'].last
287
- end
228
+ to_field 'genreform_ssim', extract_xpath('/ead/archdesc/controlaccess/genreform')
288
229
 
289
- to_field 'parent_unittitles_ssm' do |_record, accumulator, context|
290
- ## Top level document
291
- accumulator.concat context.clipboard[:parent].output_hash['normalized_title_ssm']
292
- ## Other components
293
- context.output_hash['parent_ssm']&.drop(1)&.each do |id|
294
- accumulator.concat Array
295
- .wrap(context.clipboard[:parent].output_hash['components'])
296
- .find { |c| c['ref_ssi'] == [id] }&.[]('normalized_title_ssm')
297
- end
298
- end
299
- to_field 'parent_unittitles_teim' do |_record, accumulator, context|
300
- accumulator.concat context.output_hash['parent_unittitles_ssm']
301
- end
230
+ to_field 'date_range_isim', extract_xpath('/ead/archdesc/did/unitdate/@normal', to_text: false) do |_record, accumulator|
231
+ range = Arclight::YearRange.new
232
+ next range.years if accumulator.blank?
302
233
 
303
- to_field 'unitid_ssm', extract_xpath('./xmlns:did/xmlns:unitid')
304
- to_field 'repository_ssm' do |_record, accumulator, context|
305
- accumulator << context.clipboard[:parent].clipboard[:repository]
306
- end
307
- to_field 'repository_sim' do |_record, accumulator, context|
308
- accumulator << context.clipboard[:parent].clipboard[:repository]
309
- end
310
- to_field 'collection_ssm' do |_record, accumulator, context|
311
- accumulator.concat context.clipboard[:parent].output_hash['normalized_title_ssm']
312
- end
313
- to_field 'collection_sim' do |_record, accumulator, context|
314
- accumulator.concat context.clipboard[:parent].output_hash['normalized_title_ssm']
315
- end
234
+ ranges = accumulator.map(&:to_s)
235
+ range << range.parse_ranges(ranges)
236
+ accumulator.replace range.years
237
+ end
316
238
 
317
- to_field 'extent_ssm', extract_xpath('./xmlns:did/xmlns:physdesc/xmlns:extent')
318
- to_field 'creator_ssm', extract_xpath("./xmlns:did/xmlns:origination[@label='creator']")
319
- to_field 'creator_ssim', extract_xpath("./xmlns:did/xmlns:origination[@label='creator']")
320
- to_field 'creators_ssim', extract_xpath("./xmlns:did/xmlns:origination[@label='creator']")
321
- to_field 'creator_sort' do |record, accumulator|
322
- accumulator << record.xpath("./xmlns:did/xmlns:origination[@label='creator']").map(&:text).join(', ')
323
- end
324
- to_field 'collection_creator_ssm' do |_record, accumulator, context|
325
- accumulator.concat Array.wrap(context.clipboard[:parent].output_hash['creator_ssm'])
326
- end
327
- to_field 'has_online_content_ssim', extract_xpath('.//xmlns:dao') do |_record, accumulator|
328
- accumulator.replace([accumulator.any?])
329
- end
330
- to_field 'child_component_count_isim', extract_xpath('xmlns:c') do |_record, accumulator|
331
- accumulator.replace([accumulator.length])
332
- end
239
+ to_field 'indexes_html_tesm', extract_xpath('/ead/archdesc/index', to_text: false)
240
+ to_field 'indexes_tesim', extract_xpath('/ead/archdesc/index')
333
241
 
334
- to_field 'ref_ssm' do |record, accumulator|
335
- accumulator << record.attribute('id')
242
+ SEARCHABLE_NOTES_FIELDS.map do |selector|
243
+ to_field "#{selector}_html_tesm", extract_xpath("/ead/archdesc/#{selector}/*[local-name()!='head']", to_text: false) do |_record, accumulator|
244
+ accumulator.map!(&:to_html)
336
245
  end
246
+ to_field "#{selector}_heading_ssm", extract_xpath("/ead/archdesc/#{selector}/head") unless selector == 'prefercite'
247
+ to_field "#{selector}_tesim", extract_xpath("/ead/archdesc/#{selector}/*[local-name()!='head']")
248
+ end
337
249
 
338
- to_field 'level_ssm' do |record, accumulator|
339
- level = record.attribute('level')&.value
340
- other_level = record.attribute('otherlevel')&.value
341
-
342
- accumulator << if level == 'otherlevel'
343
- alternative_level = other_level if other_level
344
- alternative_level.present? ? alternative_level : 'Other'
345
- elsif level.present?
346
- level&.capitalize
347
- end
348
- end
250
+ DID_SEARCHABLE_NOTES_FIELDS.map do |selector|
251
+ to_field "#{selector}_html_tesm", extract_xpath("/ead/archdesc/did/#{selector}", to_text: false)
252
+ to_field "#{selector}_tesim", extract_xpath("/ead/archdesc/did/#{selector}")
253
+ end
349
254
 
350
- to_field 'level_sim' do |_record, accumulator, context|
351
- next unless context.output_hash['level_ssm']
255
+ NAME_ELEMENTS.map do |selector|
256
+ to_field 'names_coll_ssim', extract_xpath("/ead/archdesc/controlaccess/#{selector}")
257
+ to_field 'names_ssim', extract_xpath("//#{selector}"), unique
258
+ to_field "#{selector}_ssim", extract_xpath("//#{selector}"), unique
259
+ end
352
260
 
353
- accumulator.concat context.output_hash['level_ssm']&.map(&:capitalize)
354
- end
261
+ to_field 'language_ssim', extract_xpath('/ead/archdesc/did/langmaterial')
355
262
 
356
- to_field 'parent_access_restrict_ssm', extract_xpath('./xmlns:accessrestrict/xmlns:p')
263
+ to_field 'descrules_ssm', extract_xpath('/ead/eadheader/profiledesc/descrules')
357
264
 
358
- to_field 'parent_access_restrict_ssm' do |_record, accumulator, context|
359
- next unless context.output_hash['accessrestrict_ssm'].nil?
265
+ # count all descendant components from the top-level
266
+ to_field 'total_component_count_is', first_only do |record, accumulator|
267
+ accumulator << record.xpath('//c|//c01|//c02|//c03|//c04|//c05|//c06|//c07|//c08|//c09|//c10|//c11|//c12').count
268
+ end
360
269
 
361
- context.output_hash['parent_ssm']&.each do |id|
362
- accumulator.concat Array
363
- .wrap(context.clipboard[:parent]&.output_hash&.[]('components'))
364
- .select { |c| c['ref_ssi'] == [id] }.map { |c| c['accessrestrict_ssm'] }
365
- end
366
- end
270
+ # count all digital objects from the top-level
271
+ to_field 'online_item_count_is', first_only do |record, accumulator|
272
+ accumulator << record.xpath('//dao').count
273
+ end
367
274
 
368
- to_field 'parent_access_restrict_ssm' do |_record, accumulator, context|
369
- next unless context.output_hash['parent_access_restrict_ssm'].nil?
275
+ to_field 'component_level_isim' do |_record, accumulator, _context|
276
+ accumulator << 0
277
+ end
370
278
 
371
- accumulator.concat Array.wrap(context.clipboard[:parent]&.output_hash&.[]('accessrestrict_ssm'))
372
- end
279
+ to_field 'sort_isi' do |_record, accumulator, _context|
280
+ accumulator << 0
281
+ end
373
282
 
374
- to_field 'parent_access_terms_ssm', extract_xpath('xmlns:userestrict/xmlns:p')
283
+ # =============================
284
+ # Each component child document
285
+ # <c> <c01> <c12>
286
+ # =============================
375
287
 
376
- to_field 'parent_access_terms_ssm' do |_record, accumulator, context|
377
- next unless context.output_hash['userestrict_ssm'].nil?
288
+ to_field 'components' do |record, accumulator, context|
289
+ child_components = record.xpath("/ead/archdesc/dsc/c|#{('/ead/archdesc/dsc/c01'..'/ead/archdesc/dsc/c12').to_a.join('|')}")
290
+ next unless child_components.any?
378
291
 
379
- context.output_hash['parent_ssm']&.each do |id|
380
- accumulator.concat Array
381
- .wrap(context.clipboard[:parent]&.output_hash&.[]('components'))
382
- .select { |c| c['ref_ssi'] == [id] }.map { |c| c['userestrict_ssm'] }
292
+ counter = Class.new do
293
+ def increment
294
+ @counter ||= 0
295
+ @counter += 1
383
296
  end
384
- end
385
-
386
- to_field 'parent_access_terms_ssm' do |_record, accumulator, context|
387
- next unless context.output_hash['parent_access_terms_ssm'].nil?
388
-
389
- accumulator << context.clipboard[:parent]&.output_hash&.[]('access_terms_ssm')&.first
390
- end
391
-
392
- to_field 'digital_objects_ssm', extract_xpath('./xmlns:dao') do |record, accumulator|
393
- accumulator.concat(record.xpath('.//xmlns:dao', xmlns: 'urn:isbn:1-931666-22-9').map do |dao|
394
- label = dao.attributes['title']&.value ||
395
- dao.xpath('xmlns:daodesc/xmlns:p', xmlns: 'urn:isbn:1-931666-22-9')&.text
396
- href = (dao.attributes['href'] || dao.attributes['xlink:href'])&.value
397
- Arclight::DigitalObject.new(label: label, href: href).to_json
398
- end.to_a)
399
- end
400
-
401
- to_field 'date_range_sim', extract_xpath('.//xmlns:did/xmlns:unitdate/@normal', to_text: false) do |_record, accumulator|
402
- range = Arclight::YearRange.new
403
- next range.years if accumulator.blank?
404
-
405
- ranges = accumulator.map(&:to_s)
406
- range << range.parse_ranges(ranges)
407
- accumulator.replace range.years
408
- end
409
-
410
- NAME_ELEMENTS.map do |selector|
411
- to_field 'names_ssim', extract_xpath("./xmlns:controlaccess/xmlns:#{selector}")
412
- to_field "#{selector}_ssm", extract_xpath(".//xmlns:#{selector}")
413
- end
414
-
415
- to_field 'geogname_sim', extract_xpath('./xmlns:controlaccess/xmlns:geogname')
416
- to_field 'geogname_ssm', extract_xpath('./xmlns:controlaccess/xmlns:geogname')
417
- to_field 'places_ssim', extract_xpath('xmlns:controlaccess/xmlns:geogname')
418
-
419
- # Indexes only specified controlled terms for archival description into the access_subject field
420
- to_field 'access_subjects_ssim', extract_xpath('./xmlns:controlaccess', to_text: false) do |_record, accumulator|
421
- accumulator.map! do |element|
422
- %w[subject function occupation genreform].map do |selector|
423
- element.xpath(".//xmlns:#{selector}").map(&:text)
424
- end
425
- end.flatten!
426
- end
427
-
428
- to_field 'access_subjects_ssm' do |_record, accumulator, context|
429
- accumulator.concat(context.output_hash.fetch('access_subjects_ssim', []))
430
- end
431
-
432
- # Indexes the acquisition group information into the notes field
433
- # Please see https://www.loc.gov/ead/tglib/elements/acqinfo.html
434
- to_field 'acqinfo_ssim', extract_xpath('/xmlns:ead/xmlns:archdesc/xmlns:acqinfo/*[local-name()!="head"]')
435
- to_field 'acqinfo_ssim', extract_xpath('/xmlns:ead/xmlns:archdesc/xmlns:descgrp/xmlns:acqinfo/*[local-name()!="head"]')
436
- to_field 'acqinfo_ssim', extract_xpath('./xmlns:acqinfo/*[local-name()!="head"]')
437
- to_field 'acqinfo_ssim', extract_xpath('./xmlns:descgrp/xmlns:acqinfo/*[local-name()!="head"]')
438
- to_field 'acqinfo_ssm' do |_record, accumulator, context|
439
- accumulator.concat(context.output_hash.fetch('acqinfo_ssim', []))
440
- end
441
-
442
- to_field 'language_ssm', extract_xpath('./xmlns:did/xmlns:langmaterial')
443
- to_field 'containers_ssim' do |record, accumulator|
444
- record.xpath('./xmlns:did/xmlns:container').each do |node|
445
- accumulator << [node.attribute('type'), node.text].join(' ').strip
297
+ end.new
298
+
299
+ component_indexer = Traject::Indexer::NokogiriIndexer.new.tap do |i|
300
+ i.settings do
301
+ provide :parent, context
302
+ provide :root, context
303
+ provide :counter, counter
304
+ provide :depth, 1
305
+ provide :logger, context.settings[:logger]
306
+ provide :component_traject_config, context.settings[:component_traject_config]
446
307
  end
447
- end
448
- SEARCHABLE_NOTES_FIELDS.map do |selector|
449
- to_field "#{selector}_ssm", extract_xpath(".//xmlns:#{selector}/*[local-name()!='head']")
450
- to_field "#{selector}_heading_ssm", extract_xpath(".//xmlns:archdesc/xmlns:#{selector}/xmlns:head")
451
- to_field "#{selector}_teim", extract_xpath(".//xmlns:#{selector}/*[local-name()!='head']")
452
- end
453
- DID_SEARCHABLE_NOTES_FIELDS.map do |selector|
454
- to_field "#{selector}_ssm", extract_xpath(".//xmlns:did/xmlns:#{selector}")
455
- end
456
- to_field 'did_note_ssm', extract_xpath('.//xmlns:did/xmlns:note')
457
- end
458
308
 
459
- each_record do |_record, context|
460
- context.output_hash['components'] &&= context.output_hash['components'].select { |c| c.keys.any? }
461
- end
309
+ i.load_config_file(context.settings[:component_traject_config])
310
+ end
462
311
 
463
- ##
464
- # Used for evaluating xpath components to find
465
- class NokogiriXpathExtensions
466
- # rubocop:disable Naming/PredicateName, Style/FormatString
467
- def is_component(node_set)
468
- node_set.find_all do |node|
469
- component_elements = (1..12).map { |i| "c#{'%02d' % i}" }
470
- component_elements.push 'c'
471
- component_elements.include? node.name
472
- end
312
+ child_components.each do |child_component|
313
+ output = component_indexer.map_record(child_component)
314
+ accumulator << output if output.keys.any?
473
315
  end
474
- # rubocop:enable Naming/PredicateName, Style/FormatString
475
316
  end