arclight 0.1.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.
- checksums.yaml +5 -5
- data/.all-contributorsrc +450 -0
- data/.codeclimate.yml +5 -0
- data/.eslintrc +14 -4
- data/.github/workflows/ruby.yml +51 -0
- data/.gitignore +2 -0
- data/.rspec +0 -1
- data/.rubocop.yml +503 -48
- data/.rubocop_todo.yml +122 -0
- data/.solr_wrapper +2 -1
- data/CONTRIBUTING.md +5 -5
- data/CONTRIBUTORS.md +79 -0
- data/Gemfile +15 -10
- data/README.md +47 -32
- data/Rakefile +0 -1
- data/app/assets/images/blacklight/bookmark.svg +1 -0
- data/app/assets/images/blacklight/collection.svg +5 -0
- data/app/assets/images/blacklight/compact.svg +1 -25
- data/app/assets/images/blacklight/container.svg +5 -0
- data/app/assets/images/blacklight/ead.svg +1 -0
- data/app/assets/images/blacklight/file.svg +5 -0
- data/app/assets/images/blacklight/folder.svg +1 -0
- data/app/assets/images/blacklight/list.svg +1 -0
- data/app/assets/images/blacklight/minus.svg +1 -0
- data/app/assets/images/blacklight/online.svg +5 -0
- data/app/assets/images/blacklight/pdf.svg +1 -0
- data/app/assets/images/blacklight/plus.svg +1 -0
- data/app/assets/images/blacklight/repository.svg +1 -0
- data/app/assets/javascripts/arclight/arclight.js +4 -9
- data/app/assets/javascripts/arclight/oembed_controller.js +58 -0
- data/app/assets/javascripts/arclight/truncate_controller.js +27 -0
- data/app/assets/stylesheets/arclight/application.scss +4 -3
- data/app/assets/stylesheets/arclight/build.scss +4 -0
- data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +117 -136
- data/app/assets/stylesheets/arclight/modules/highlights.scss +3 -2
- data/app/assets/stylesheets/arclight/modules/icons.scss +20 -0
- data/app/assets/stylesheets/arclight/modules/layout.scss +203 -16
- data/app/assets/stylesheets/arclight/modules/mastheads.scss +27 -45
- data/app/assets/stylesheets/arclight/modules/repositories.scss +3 -7
- data/app/assets/stylesheets/arclight/modules/repository_card.scss +5 -50
- data/app/assets/stylesheets/arclight/modules/search_form.scss +9 -0
- data/app/assets/stylesheets/arclight/modules/search_results.scss +200 -25
- data/app/assets/stylesheets/arclight/modules/show_collection.scss +21 -61
- data/app/assets/stylesheets/arclight/modules/truncator.scss +58 -0
- data/app/assets/stylesheets/arclight/responsive.scss +13 -0
- data/app/assets/stylesheets/arclight/variables.scss +25 -2
- data/app/components/arclight/access_component.html.erb +14 -0
- data/app/components/arclight/access_component.rb +25 -0
- data/app/components/arclight/bookmark_component.html.erb +25 -0
- data/app/components/arclight/bookmark_component.rb +9 -0
- data/app/components/arclight/breadcrumb_component.rb +50 -0
- data/app/components/arclight/breadcrumbs_hierarchy_component.html.erb +34 -0
- data/app/components/arclight/breadcrumbs_hierarchy_component.rb +25 -0
- data/app/components/arclight/collection_context_component.html.erb +12 -0
- data/app/components/arclight/collection_context_component.rb +27 -0
- data/app/components/arclight/collection_info_component.html.erb +28 -0
- data/app/components/arclight/collection_info_component.rb +26 -0
- data/app/components/arclight/collection_sidebar_component.html.erb +15 -0
- data/app/components/arclight/collection_sidebar_component.rb +39 -0
- data/app/{views/catalog/_search_results_repository.html.erb → components/arclight/constraints_component.html.erb} +2 -1
- data/app/components/arclight/constraints_component.rb +17 -0
- data/app/components/arclight/document_collection_context_component.html.erb +29 -0
- data/app/components/arclight/document_collection_context_component.rb +28 -0
- data/app/components/arclight/document_collection_hierarchy_component.html.erb +50 -0
- data/app/components/arclight/document_collection_hierarchy_component.rb +62 -0
- data/app/components/arclight/document_component.html.erb +39 -0
- data/app/components/arclight/document_component.rb +49 -0
- data/app/components/arclight/document_components_hierarchy_component.html.erb +20 -0
- data/app/components/arclight/document_components_hierarchy_component.rb +34 -0
- data/app/components/arclight/document_download_component.html.erb +24 -0
- data/app/components/arclight/document_download_component.rb +71 -0
- data/app/components/arclight/embed_component.html.erb +10 -0
- data/app/components/arclight/embed_component.rb +43 -0
- data/app/components/arclight/expand_hierarchy_button_component.html.erb +5 -0
- data/app/components/arclight/expand_hierarchy_button_component.rb +16 -0
- data/app/components/arclight/group_component.html.erb +34 -0
- data/app/components/arclight/group_component.rb +23 -0
- data/app/components/arclight/header_component.html.erb +5 -0
- data/app/components/arclight/header_component.rb +10 -0
- data/app/components/arclight/index_metadata_field_component.html.erb +16 -0
- data/app/components/arclight/index_metadata_field_component.rb +20 -0
- data/app/components/arclight/masthead_component.html.erb +17 -0
- data/app/components/arclight/masthead_component.rb +10 -0
- data/app/components/arclight/metadata_section_component.html.erb +13 -0
- data/app/components/arclight/metadata_section_component.rb +22 -0
- data/app/components/arclight/oembed_viewer_component.html.erb +5 -0
- data/app/components/arclight/oembed_viewer_component.rb +16 -0
- data/app/components/arclight/online_content_filter_component.html.erb +15 -0
- data/app/components/arclight/online_content_filter_component.rb +17 -0
- data/app/components/arclight/online_status_indicator_component.rb +19 -0
- data/app/components/arclight/repository_breadcrumb_component.html.erb +10 -0
- data/app/components/arclight/repository_breadcrumb_component.rb +17 -0
- data/app/components/arclight/repository_location_component.html.erb +20 -0
- data/app/components/arclight/repository_location_component.rb +10 -0
- data/app/components/arclight/search_bar_component.html.erb +27 -0
- data/app/components/arclight/search_bar_component.rb +32 -0
- data/app/components/arclight/search_result_breadcrumbs_component.html.erb +6 -0
- data/app/components/arclight/search_result_breadcrumbs_component.rb +37 -0
- data/app/components/arclight/search_result_component.html.erb +20 -0
- data/app/components/arclight/search_result_component.rb +18 -0
- data/app/components/arclight/search_result_title_component.html.erb +15 -0
- data/app/components/arclight/search_result_title_component.rb +15 -0
- data/app/components/arclight/sidebar_component.html.erb +9 -0
- data/app/components/arclight/sidebar_component.rb +19 -0
- data/app/components/arclight/upper_metadata_layout_component.rb +10 -0
- data/app/components/blacklight/icons/bookmark_component.rb +12 -0
- data/app/components/blacklight/icons/collection_component.rb +14 -0
- data/app/components/blacklight/icons/compact_component.rb +12 -0
- data/app/components/blacklight/icons/container_component.rb +14 -0
- data/app/components/blacklight/icons/ead_component.rb +12 -0
- data/app/components/blacklight/icons/file_component.rb +14 -0
- data/app/components/blacklight/icons/folder_component.rb +12 -0
- data/app/components/blacklight/icons/online_component.rb +15 -0
- data/app/components/blacklight/icons/pdf_component.rb +12 -0
- data/app/components/blacklight/icons/repository_component.rb +12 -0
- data/app/controllers/arclight/repositories_controller.rb +4 -4
- data/app/helpers/arclight/ead_format_helpers.rb +309 -0
- data/app/helpers/arclight/field_config_helpers.rb +26 -0
- data/app/helpers/arclight_helper.rb +55 -120
- data/app/models/arclight/document_downloads.rb +122 -0
- data/app/models/arclight/parent.rb +9 -9
- data/app/models/arclight/parents.rb +9 -4
- data/app/models/arclight/requests/aeon_external_request.rb +42 -0
- data/app/models/arclight/requests/aeon_web_ead.rb +52 -0
- data/app/models/arclight/requests/google_form.rb +8 -3
- data/app/models/concerns/arclight/catalog.rb +33 -11
- data/app/models/concerns/arclight/search_behavior.rb +22 -21
- data/app/models/concerns/arclight/solr_document.rb +88 -59
- data/app/presenters/arclight/show_presenter.rb +34 -7
- data/app/views/arclight/_requests.html.erb +7 -0
- data/app/views/arclight/repositories/_repository.html.erb +22 -41
- data/app/views/arclight/repositories/index.html.erb +5 -0
- data/app/views/arclight/repositories/show.html.erb +7 -8
- data/app/views/arclight/requests/_aeon_external_request_endpoint.html.erb +8 -0
- data/app/views/arclight/requests/_aeon_web_ead.html.erb +6 -0
- data/app/views/arclight/requests/_google_form.html.erb +4 -5
- data/app/views/catalog/_document_list.html.erb +8 -0
- data/app/views/catalog/_group.html.erb +4 -0
- data/app/views/catalog/_group_toggle.html.erb +10 -0
- data/app/views/catalog/_search_results_header.html.erb +3 -0
- data/app/views/catalog/hierarchy.html.erb +19 -0
- data/app/views/catalog/index.html.erb +16 -7
- data/app/views/shared/_breadcrumbs.html.erb +3 -15
- data/app/views/shared/_main_menu_links.html.erb +1 -1
- data/arclight.gemspec +22 -17
- data/config/breadcrumbs.rb +24 -0
- data/config/i18n-tasks.yml +134 -0
- data/config/importmap.rb +3 -0
- data/config/locales/arclight.en.yml +90 -55
- data/config/routes.rb +1 -1
- data/docker-compose.yml +16 -0
- data/lib/arclight/digital_object.rb +2 -1
- data/lib/arclight/engine.rb +23 -31
- data/lib/arclight/exceptions.rb +1 -0
- data/lib/arclight/hash_absolute_xpath.rb +62 -0
- data/lib/arclight/level_label.rb +46 -0
- data/lib/arclight/missing_id_strategy.rb +21 -0
- data/lib/arclight/normalized_date.rb +24 -20
- data/lib/arclight/normalized_id.rb +7 -2
- data/lib/arclight/normalized_title.rb +3 -0
- data/lib/arclight/repository.rb +72 -47
- data/lib/arclight/routes/hierarchy.rb +19 -0
- data/lib/arclight/routes.rb +8 -0
- data/lib/arclight/traject/ead2_component_config.rb +335 -0
- data/lib/arclight/traject/ead2_config.rb +316 -0
- data/lib/arclight/traject/nokogiri_namespaceless_reader.rb +22 -0
- data/lib/arclight/version.rb +1 -1
- data/lib/arclight/year_range.rb +13 -4
- data/lib/arclight.rb +6 -1
- data/lib/generators/arclight/install_generator.rb +110 -10
- data/lib/generators/arclight/templates/arclight.scss +6 -3
- data/lib/generators/arclight/templates/catalog_controller.rb +249 -173
- data/lib/generators/arclight/templates/config/downloads.yml +12 -0
- data/lib/generators/arclight/templates/config/locales/arclight.en.yml +61 -0
- data/lib/generators/arclight/templates/config/repositories.yml +42 -31
- data/lib/generators/arclight/update_generator.rb +1 -1
- data/lib/tasks/index.rake +25 -28
- data/package.json +15 -9
- data/solr/conf/schema.xml +101 -332
- data/solr/conf/solrconfig.xml +99 -164
- data/tasks/arclight.rake +22 -11
- data/template.rb +6 -11
- metadata +230 -105
- data/.travis.yml +0 -33
- data/app/assets/javascripts/arclight/collection_context.js +0 -18
- data/app/assets/javascripts/arclight/collection_navigation.js +0 -114
- data/app/assets/javascripts/arclight/collection_scrollspy.js +0 -6
- data/app/assets/javascripts/arclight/component_ancestors.js +0 -56
- data/app/assets/javascripts/arclight/oembed_viewer.js +0 -39
- data/app/assets/javascripts/arclight/truncator.js.erb +0 -23
- data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +0 -3
- data/app/assets/stylesheets/arclight/modules/sidebar.scss +0 -16
- data/app/controllers/concerns/arclight/field_config_helpers.rb +0 -86
- data/app/factories/blacklight_field_configuration_factory.rb +0 -29
- data/app/views/arclight/repositories/_in_person_repository.html.erb +0 -19
- data/app/views/arclight/viewers/_oembed.html.erb +0 -7
- data/app/views/catalog/_arclight_document_index_header.html.erb +0 -13
- data/app/views/catalog/_arclight_document_index_header_online_contents_default.html.erb +0 -0
- data/app/views/catalog/_arclight_document_show_header.html.erb +0 -15
- data/app/views/catalog/_arclight_document_show_header_collection.html.erb +0 -12
- data/app/views/catalog/_arclight_index_compact_default.html.erb +0 -15
- data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -5
- data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
- data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
- data/app/views/catalog/_collection_contents.html.erb +0 -12
- data/app/views/catalog/_collection_count.html.erb +0 -7
- data/app/views/catalog/_collection_downloads.html.erb +0 -17
- data/app/views/catalog/_collection_online_contents.html.erb +0 -17
- data/app/views/catalog/_collection_overview.html.erb +0 -7
- data/app/views/catalog/_component_overview.html.erb +0 -46
- data/app/views/catalog/_context_card.html.erb +0 -27
- data/app/views/catalog/_context_sidebar.html.erb +0 -8
- data/app/views/catalog/_custom_metadata.html.erb +0 -16
- data/app/views/catalog/_home.html.erb +0 -1
- data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -3
- data/app/views/catalog/_index_default.html.erb +0 -17
- data/app/views/catalog/_index_header.html.erb +0 -7
- data/app/views/catalog/_index_header_hierarchy_default.html.erb +0 -42
- data/app/views/catalog/_index_header_online_contents_default.html.erb +0 -1
- data/app/views/catalog/_index_hierarchy_default.html.erb +0 -28
- data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
- data/app/views/catalog/_results_histogram.html.erb +0 -10
- data/app/views/catalog/_search_results.html.erb +0 -31
- data/app/views/catalog/_search_within_form.html.erb +0 -16
- data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -7
- data/app/views/catalog/_show_collection.html.erb +0 -40
- data/app/views/catalog/_show_component_sidebar.html.erb +0 -12
- data/app/views/catalog/_show_default.html.erb +0 -32
- data/app/views/catalog/_show_header.html.erb +0 -5
- data/app/views/catalog/_show_sidebar.html.erb +0 -30
- data/app/views/layouts/catalog_result.html.erb +0 -7
- data/app/views/shared/_context_sidebar.html.erb +0 -8
- data/app/views/shared/_header_navbar.html.erb +0 -54
- data/lib/arclight/custom_component.rb +0 -98
- data/lib/arclight/custom_document.rb +0 -93
- data/lib/arclight/indexer.rb +0 -9
- data/lib/arclight/shared_indexing_behavior.rb +0 -97
- data/lib/arclight/shared_terminology_behavior.rb +0 -65
- data/lib/arclight/solr_ead_indexer_ext.rb +0 -159
- data/lib/arclight/viewer.rb +0 -45
- data/lib/arclight/viewers/oembed.rb +0 -56
- data/lib/generators/arclight/templates/arclight.js +0 -2
- data/solr/conf/scripts.conf +0 -24
- data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
- data/vendor/assets/javascripts/stickyfill.js +0 -480
- /data/app/assets/images/{blacklight → arclight}/logo.png +0 -0
- /data/{app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb → config/repositories.yml} +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
module Icons
|
|
5
|
+
# The compact icon
|
|
6
|
+
class CompactComponent < Blacklight::Icons::IconComponent
|
|
7
|
+
self.svg = <<~SVG
|
|
8
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"><path d="M3,15H21V13H3Zm0,4H21V17H3Zm0-8H21V9H3ZM3,5V7H21V5Z"/></svg>
|
|
9
|
+
SVG
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
module Icons
|
|
5
|
+
# The container icon
|
|
6
|
+
class ContainerComponent < Blacklight::Icons::IconComponent
|
|
7
|
+
# Used unmodified from https://fontawesome.com
|
|
8
|
+
# CC BY 4.0 https://creativecommons.org/licenses/by/4.0/
|
|
9
|
+
self.svg = <<~SVG
|
|
10
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 512 512"><path d="M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z"/></svg>
|
|
11
|
+
SVG
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
module Icons
|
|
5
|
+
# The ead icon
|
|
6
|
+
class EadComponent < Blacklight::Icons::IconComponent
|
|
7
|
+
self.svg = <<~SVG
|
|
8
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 384 512"><path d="M149.9 349.1l-.2-.2-32.8-28.9 32.8-28.9c3.6-3.2 4-8.8.8-12.4l-.2-.2-17.4-18.6c-3.4-3.6-9-3.7-12.4-.4l-57.7 54.1c-3.7 3.5-3.7 9.4 0 12.8l57.7 54.1c1.6 1.5 3.8 2.4 6 2.4 2.4 0 4.8-1 6.4-2.8l17.4-18.6c3.3-3.5 3.1-9.1-.4-12.4zm220-251.2L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h160v104c0 13.3 10.7 24 24 24h104zM209.6 214c-4.7-1.4-9.5 1.3-10.9 6L144 408.1c-1.4 4.7 1.3 9.6 6 10.9l24.4 7.1c4.7 1.4 9.6-1.4 10.9-6L240 231.9c1.4-4.7-1.3-9.6-6-10.9zm24.5 76.9l.2.2 32.8 28.9-32.8 28.9c-3.6 3.2-4 8.8-.8 12.4l.2.2 17.4 18.6c3.3 3.5 8.9 3.7 12.4.4l57.7-54.1c3.7-3.5 3.7-9.4 0-12.8l-57.7-54.1c-3.5-3.3-9.1-3.2-12.4.4l-17.4 18.6c-3.3 3.5-3.1 9.1.4 12.4z"/></svg>
|
|
9
|
+
SVG
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
module Icons
|
|
5
|
+
# The file icon
|
|
6
|
+
class FileComponent < Blacklight::Icons::IconComponent
|
|
7
|
+
# Used unmodified from https://fontawesome.com
|
|
8
|
+
# CC BY 4.0 https://creativecommons.org/licenses/by/4.0/
|
|
9
|
+
self.svg = <<~SVG
|
|
10
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 384 512"><path d="M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm160-14.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z"/></svg>
|
|
11
|
+
SVG
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
module Icons
|
|
5
|
+
# The folder icon
|
|
6
|
+
class FolderComponent < Blacklight::Icons::IconComponent
|
|
7
|
+
self.svg = <<~SVG
|
|
8
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 512 512"><path d="M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z"/></svg>
|
|
9
|
+
SVG
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
module Icons
|
|
5
|
+
# The online icon
|
|
6
|
+
class OnlineComponent < Blacklight::Icons::IconComponent
|
|
7
|
+
# Used unmodified from https://fontawesome.com
|
|
8
|
+
# CC BY 4.0 https://creativecommons.org/licenses/by/4.0/
|
|
9
|
+
self.svg = <<~SVG
|
|
10
|
+
|
|
11
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 640 512"><path d="M608 0H160a32 32 0 0 0-32 32v96h160V64h192v320h128a32 32 0 0 0 32-32V32a32 32 0 0 0-32-32zM232 103a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm352 208a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm-168 57H32a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h384a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32zM96 224a32 32 0 1 1-32 32 32 32 0 0 1 32-32zm288 224H64v-32l64-64 32 32 128-128 96 96z"/></svg>
|
|
12
|
+
SVG
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
module Icons
|
|
5
|
+
# The pdf icon
|
|
6
|
+
class PdfComponent < Blacklight::Icons::IconComponent
|
|
7
|
+
self.svg = <<~SVG
|
|
8
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 384 512"><path d="M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z"/></svg>
|
|
9
|
+
SVG
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Blacklight
|
|
4
|
+
module Icons
|
|
5
|
+
# The repository icon
|
|
6
|
+
class RepositoryComponent < Blacklight::Icons::IconComponent
|
|
7
|
+
self.svg = <<~SVG
|
|
8
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M4 10v7h3v-7H4zm6 0v7h3v-7h-3zM2 22h19v-3H2v3zm14-12v7h3v-7h-3zm-4.5-9L2 6v2h19V6l-9.5-5z"/></svg>
|
|
9
|
+
SVG
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -12,7 +12,7 @@ module Arclight
|
|
|
12
12
|
@repository = Arclight::Repository.find_by!(slug: params[:id])
|
|
13
13
|
search_service = Blacklight.repository_class.new(blacklight_config)
|
|
14
14
|
@response = search_service.search(
|
|
15
|
-
q: "
|
|
15
|
+
q: "level_ssim:Collection repository_ssim:\"#{@repository.name}\"",
|
|
16
16
|
rows: 100
|
|
17
17
|
)
|
|
18
18
|
@collections = @response.documents
|
|
@@ -30,11 +30,11 @@ module Arclight
|
|
|
30
30
|
def fetch_collection_counts
|
|
31
31
|
search_service = Blacklight.repository_class.new(blacklight_config)
|
|
32
32
|
results = search_service.search(
|
|
33
|
-
q: '
|
|
34
|
-
'facet.field': '
|
|
33
|
+
q: 'level_ssim:Collection',
|
|
34
|
+
'facet.field': 'repository_ssim',
|
|
35
35
|
rows: 0
|
|
36
36
|
)
|
|
37
|
-
Hash[*results.facet_fields['
|
|
37
|
+
Hash[*results.facet_fields['repository_ssim']]
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
end
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
##
|
|
5
|
+
# A module to add EAD to HTML transformation rules for Arclight
|
|
6
|
+
module EadFormatHelpers # rubocop:disable Metrics/ModuleLength
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
def render_html_tags(args)
|
|
10
|
+
values = Array(args[:value])
|
|
11
|
+
values.map! do |value|
|
|
12
|
+
transform_ead_to_html(value)
|
|
13
|
+
end
|
|
14
|
+
values.map! { |value| wrap_in_paragraph(value) } if values.count > 1
|
|
15
|
+
safe_join(values.map(&:html_safe))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def transform_ead_to_html(value)
|
|
21
|
+
Loofah.xml_fragment(condense_whitespace(value))
|
|
22
|
+
.scrub!(ead_to_html_scrubber)
|
|
23
|
+
.scrub!(:strip).to_html
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# rubocop:disable Metrics/AbcSize
|
|
27
|
+
def ead_to_html_scrubber
|
|
28
|
+
Loofah::Scrubber.new do |node|
|
|
29
|
+
format_render_attributes(node) if node.attr('render').present?
|
|
30
|
+
convert_to_span(node) if CONVERT_TO_SPAN_TAGS.include? node.name
|
|
31
|
+
convert_to_br(node) if CONVERT_TO_BR_TAG.include? node.name
|
|
32
|
+
format_links(node) if %w[extptr extref extrefloc ptr ref].include? node.name
|
|
33
|
+
format_lists(node) if %w[list chronlist].include? node.name
|
|
34
|
+
format_indexes(node) if node.name == 'index'
|
|
35
|
+
format_tables(node) if node.name == 'table'
|
|
36
|
+
node
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
# rubocop:enable Metrics/AbcSize
|
|
40
|
+
|
|
41
|
+
# Tags that should be converted to <span> tags because of formatting conflicts between XML and HTML
|
|
42
|
+
CONVERT_TO_SPAN_TAGS = ['title'].freeze
|
|
43
|
+
|
|
44
|
+
# Tags that should be converted to HTML <br/> tags
|
|
45
|
+
CONVERT_TO_BR_TAG = ['lb'].freeze
|
|
46
|
+
|
|
47
|
+
def convert_to_span(node)
|
|
48
|
+
node.name = 'span'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def convert_to_br(node)
|
|
52
|
+
node.name = 'br'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def condense_whitespace(str)
|
|
56
|
+
str.squish.strip.gsub(/>[\n\s]+</, '><')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def wrap_in_paragraph(value)
|
|
60
|
+
if value.start_with?('<')
|
|
61
|
+
value
|
|
62
|
+
else
|
|
63
|
+
content_tag(:p, value)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def format_render_attributes(node) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
68
|
+
case node.attr('render')
|
|
69
|
+
when 'altrender'
|
|
70
|
+
node.name = 'span'
|
|
71
|
+
node['class'] = node['altrender']
|
|
72
|
+
when 'bold'
|
|
73
|
+
node.name = 'strong'
|
|
74
|
+
when 'bolddoublequote'
|
|
75
|
+
node.name = 'strong'
|
|
76
|
+
node.prepend_child '"'
|
|
77
|
+
node.add_child '"'
|
|
78
|
+
when 'bolditalic'
|
|
79
|
+
node.name = 'strong'
|
|
80
|
+
node.wrap('<em/>')
|
|
81
|
+
when 'boldsinglequote'
|
|
82
|
+
node.name = 'strong'
|
|
83
|
+
node.prepend_child '\''
|
|
84
|
+
node.add_child '\''
|
|
85
|
+
when 'boldsmcaps'
|
|
86
|
+
node.name = 'strong'
|
|
87
|
+
node.wrap('<small/>')
|
|
88
|
+
node['class'] = 'text-uppercase'
|
|
89
|
+
when 'boldunderline'
|
|
90
|
+
node.name = 'strong'
|
|
91
|
+
node['class'] = 'text-underline'
|
|
92
|
+
when 'doublequote'
|
|
93
|
+
node.name = 'span'
|
|
94
|
+
node.prepend_child '"'
|
|
95
|
+
node.add_child '"'
|
|
96
|
+
when 'italic', 'nonproport'
|
|
97
|
+
node.name = 'em'
|
|
98
|
+
when 'singlequote'
|
|
99
|
+
node.name = 'span'
|
|
100
|
+
node.prepend_child '\''
|
|
101
|
+
node.add_child '\''
|
|
102
|
+
when 'smcaps'
|
|
103
|
+
node.name = 'small'
|
|
104
|
+
node['class'] = 'text-uppercase'
|
|
105
|
+
when 'sub'
|
|
106
|
+
node.name = 'sub'
|
|
107
|
+
when 'super'
|
|
108
|
+
node.name = 'sup'
|
|
109
|
+
when 'underline'
|
|
110
|
+
node.name = 'span'
|
|
111
|
+
node['class'] = 'text-underline'
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def format_links(node)
|
|
116
|
+
node.remove_attribute('target')
|
|
117
|
+
node.remove_attribute('type')
|
|
118
|
+
if %w[extptr extref extrefloc].include? node.name
|
|
119
|
+
node['target'] = '_blank'
|
|
120
|
+
node['class'] = 'external-link'
|
|
121
|
+
end
|
|
122
|
+
node.content = node['title'] if (%w[extptr ptr].include? node.name) && node['title'].present?
|
|
123
|
+
node.name = 'a' if node['href'].present?
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def format_lists(node)
|
|
127
|
+
format_simple_lists(node) if node.name == 'list' && node['type'] != 'deflist'
|
|
128
|
+
format_deflists(node) if node.name == 'list' && node['type'] == 'deflist'
|
|
129
|
+
format_chronlists(node) if node.name == 'chronlist'
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def format_simple_lists(node)
|
|
133
|
+
node.name = 'ul' if (%w[simple marked].include? node['type']) || node['type'].blank?
|
|
134
|
+
node.name = 'ol' if node['type'] == 'ordered'
|
|
135
|
+
node.remove_attribute('type')
|
|
136
|
+
head_node = node.at_css('head')
|
|
137
|
+
format_list_head(head_node) if head_node.present?
|
|
138
|
+
items = node.css('item')
|
|
139
|
+
items.each { |item_node| item_node.name = 'li' }
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def format_list_head(node)
|
|
143
|
+
node['class'] = 'list-head'
|
|
144
|
+
node.name = 'div'
|
|
145
|
+
node.parent.previous = node # move it from within the list to above it
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def format_deflists(node)
|
|
149
|
+
listhead_node = node.at_css('listhead')
|
|
150
|
+
labels = node.css('label')
|
|
151
|
+
items = node.css('item')
|
|
152
|
+
defitems = node.css('defitem')
|
|
153
|
+
node.remove_attribute('type')
|
|
154
|
+
|
|
155
|
+
if listhead_node.present?
|
|
156
|
+
format_deflist_as_table(node, labels, items, defitems)
|
|
157
|
+
else
|
|
158
|
+
format_deflist_as_dl(node, labels, items, defitems)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def format_deflist_as_table(node, labels, items, defitems)
|
|
163
|
+
node.name = 'table'
|
|
164
|
+
node['class'] = 'table deflist'
|
|
165
|
+
listhead_node = node.at_css('listhead')
|
|
166
|
+
format_deflist_table_head(listhead_node)
|
|
167
|
+
node.at_css('thead').next = '<tbody/>'
|
|
168
|
+
labels.each { |label_node| label_node.name = 'td' }
|
|
169
|
+
items.each { |item_node| item_node.name = 'td' }
|
|
170
|
+
defitems.each do |defitem_node|
|
|
171
|
+
defitem_node.name = 'tr'
|
|
172
|
+
defitem_node.parent = node.at_css('tbody')
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def format_deflist_table_head(listhead_node)
|
|
177
|
+
listhead_node.at_css('head01').name = 'th'
|
|
178
|
+
listhead_node.at_css('head02').name = 'th'
|
|
179
|
+
listhead_node.name = 'tr'
|
|
180
|
+
listhead_node.wrap('<thead/>')
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def format_deflist_as_dl(node, labels, items, defitems)
|
|
184
|
+
node.name = 'dl'
|
|
185
|
+
node['class'] = 'deflist'
|
|
186
|
+
labels.each { |label_node| label_node.name = 'dt' }
|
|
187
|
+
items.each { |item_node| item_node.name = 'dd' }
|
|
188
|
+
defitems.each { |defitem_node| defitem_node.swap(defitem_node.children) } # unwrap
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def format_chronlists(node)
|
|
192
|
+
node.name = 'table'
|
|
193
|
+
node['class'] = 'table chronlist'
|
|
194
|
+
eventgrps = node.css('eventgrp')
|
|
195
|
+
single_events = node.css('chronitem > event')
|
|
196
|
+
multi_events = node.css('eventgrp > event')
|
|
197
|
+
format_chronlist_header(node)
|
|
198
|
+
node.at_css('thead').next = '<tbody/>'
|
|
199
|
+
format_chronlist_caption(node)
|
|
200
|
+
format_chronlist_chronitems(node)
|
|
201
|
+
format_chronlist_dates(node)
|
|
202
|
+
format_chronlist_events(eventgrps, single_events, multi_events)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def format_chronlist_header(node)
|
|
206
|
+
node.add_child('<thead><tr><th>Date</th><th>Event</th></tr></thead>')
|
|
207
|
+
table_head = node.at_css('thead')
|
|
208
|
+
node.children.first.add_previous_sibling(table_head)
|
|
209
|
+
listhead_node = node.at_css('listhead')
|
|
210
|
+
return if listhead_node.blank?
|
|
211
|
+
|
|
212
|
+
node.at_css('thead tr th:nth-of-type(1)').content = node.at_css('listhead/head01').content
|
|
213
|
+
node.at_css('thead tr th:nth-of-type(2)').content = node.at_css('listhead/head02').content
|
|
214
|
+
listhead_node.remove
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def format_chronlist_caption(node)
|
|
218
|
+
head_node = node.at_css('head')
|
|
219
|
+
return if head_node.blank?
|
|
220
|
+
|
|
221
|
+
head_node.name = 'caption'
|
|
222
|
+
head_node['class'] = 'chronlist-head'
|
|
223
|
+
node.children.first.add_previous_sibling(head_node) # make the caption first
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def format_chronlist_chronitems(node)
|
|
227
|
+
chronitems = node.css('chronitem')
|
|
228
|
+
chronitems.each do |chronitem_node|
|
|
229
|
+
chronitem_node.name = 'tr'
|
|
230
|
+
chronitem_node.parent = node.at_css('tbody')
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def format_chronlist_dates(node)
|
|
235
|
+
dates = node.css('date')
|
|
236
|
+
dates.each do |date_node|
|
|
237
|
+
date_node.name = 'td'
|
|
238
|
+
date_node['class'] = 'chronlist-item-date'
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def format_chronlist_events(eventgrps, single_events, multi_events)
|
|
243
|
+
eventgrps.each do |eventgrp_node|
|
|
244
|
+
eventgrp_node.name = 'td'
|
|
245
|
+
eventgrp_node['class'] = 'chronlist-item-event'
|
|
246
|
+
end
|
|
247
|
+
single_events.each do |event_node|
|
|
248
|
+
event_node.name = 'td'
|
|
249
|
+
event_node['class'] = 'chronlist-item-event'
|
|
250
|
+
end
|
|
251
|
+
multi_events.each { |event_node| event_node.name = 'div' }
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# Format EAD <index> elements
|
|
255
|
+
def format_indexes(node)
|
|
256
|
+
index_head = node.at_css('head')
|
|
257
|
+
index_head&.name = 'h3'
|
|
258
|
+
index_head&.add_class('index-head')
|
|
259
|
+
index_head['id'] = ['index-', index_head.text].join.parameterize if index_head.present?
|
|
260
|
+
format_indexentries(node)
|
|
261
|
+
node.name = 'div'
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
# Grab all of the <indexentry> children as a nodeset, move them into
|
|
265
|
+
# a <table>, wrap each entry in a <tr> & each value in a <td>.
|
|
266
|
+
def format_indexentries(node)
|
|
267
|
+
indexentries = node.css('indexentry')
|
|
268
|
+
return if indexentries.blank?
|
|
269
|
+
|
|
270
|
+
indexentries.first.previous = '<table class="table indexentries" />'
|
|
271
|
+
indexentries.map do |i|
|
|
272
|
+
i.parent = node.at_css('table.table.indexentries')
|
|
273
|
+
i.wrap('<tr/>')
|
|
274
|
+
i.element_children.map { |c| c.wrap('<td/>') }
|
|
275
|
+
# Assuming two columns in an index, create a blank cell for entries
|
|
276
|
+
# with a missing value.
|
|
277
|
+
i.add_child('<td/>') if i.element_children.count == 1
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
# Format EAD <table> elements, converting <tgroup> to HTML <table>.
|
|
282
|
+
# Ignoring <colspec>, @colname, @colwidth complex rendering
|
|
283
|
+
# logic for now.
|
|
284
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
285
|
+
def format_tables(node)
|
|
286
|
+
node.remove_attribute('frame')
|
|
287
|
+
node.name = 'div' if node.css('tgroup').present?
|
|
288
|
+
format_table_head(node)
|
|
289
|
+
tgroups = node.css('tgroup')
|
|
290
|
+
tgroups&.map do |t|
|
|
291
|
+
t.name = 'table'
|
|
292
|
+
t.remove_attribute('cols')
|
|
293
|
+
t.add_class('table')
|
|
294
|
+
t.css('row').map { |r| r.name = 'tr' }
|
|
295
|
+
t.css('thead entry').map { |e| e.name = 'th' }
|
|
296
|
+
t.css('tbody entry').map { |e| e.name = 'td' }
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
300
|
+
|
|
301
|
+
def format_table_head(node)
|
|
302
|
+
table_head = node.at_css('head')
|
|
303
|
+
return if table_head.blank?
|
|
304
|
+
|
|
305
|
+
table_head.name = 'h3'
|
|
306
|
+
table_head.add_class('table-head')
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
##
|
|
5
|
+
# A module to add configuration helpers for certain fields used by Arclight
|
|
6
|
+
module FieldConfigHelpers
|
|
7
|
+
include Arclight::EadFormatHelpers
|
|
8
|
+
|
|
9
|
+
def item_requestable?(document)
|
|
10
|
+
document.requestable?
|
|
11
|
+
end
|
|
12
|
+
Arclight.deprecation.deprecate_methods(self, item_requestable?: 'Call e.g. `document.requestable?` instead')
|
|
13
|
+
|
|
14
|
+
def link_to_name_facet(args)
|
|
15
|
+
options = args[:config]&.separator_options || {}
|
|
16
|
+
values = args[:value] || []
|
|
17
|
+
|
|
18
|
+
values.map do |value|
|
|
19
|
+
link_to(
|
|
20
|
+
value,
|
|
21
|
+
search_action_path(f: { names: [value] })
|
|
22
|
+
)
|
|
23
|
+
end.to_sentence(options).html_safe
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|