newspaper_works 0.1.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.
Files changed (461) hide show
  1. checksums.yaml +7 -0
  2. data/.fcrepo_wrapper +4 -0
  3. data/.gitignore +43 -0
  4. data/.rubocop.yml +143 -0
  5. data/.solr_wrapper +8 -0
  6. data/.travis.yml +50 -0
  7. data/Gemfile +47 -0
  8. data/LICENSE +203 -0
  9. data/README.md +159 -0
  10. data/Rakefile +38 -0
  11. data/app/actors/hyrax/actors/newspaper_article_actor.rb +8 -0
  12. data/app/actors/hyrax/actors/newspaper_container_actor.rb +8 -0
  13. data/app/actors/hyrax/actors/newspaper_issue_actor.rb +8 -0
  14. data/app/actors/hyrax/actors/newspaper_page_actor.rb +8 -0
  15. data/app/actors/hyrax/actors/newspaper_title_actor.rb +8 -0
  16. data/app/actors/newspaper_works/actors/newspaper_works_upload_actor.rb +88 -0
  17. data/app/assets/config/newspaper_works_manifest.js +2 -0
  18. data/app/assets/images/newspaper_works/.keep +0 -0
  19. data/app/assets/javascripts/newspaper_works/autocomplete_fix.js +33 -0
  20. data/app/assets/javascripts/newspaper_works/ocr_search.js.erb +6 -0
  21. data/app/assets/javascripts/newspaper_works/thumbnail_highlights.js.erb +102 -0
  22. data/app/assets/javascripts/newspaper_works.js +4 -0
  23. data/app/assets/stylesheets/newspaper_works/_issue_search.scss +13 -0
  24. data/app/assets/stylesheets/newspaper_works/_issues_calendar.scss +18 -0
  25. data/app/assets/stylesheets/newspaper_works/_newspaper_works.scss +4 -0
  26. data/app/assets/stylesheets/newspaper_works/_newspapers_search.scss +38 -0
  27. data/app/assets/stylesheets/newspaper_works/_search_results.scss +12 -0
  28. data/app/controllers/hyrax/newspaper_articles_controller.rb +14 -0
  29. data/app/controllers/hyrax/newspaper_containers_controller.rb +14 -0
  30. data/app/controllers/hyrax/newspaper_issues_controller.rb +14 -0
  31. data/app/controllers/hyrax/newspaper_pages_controller.rb +14 -0
  32. data/app/controllers/hyrax/newspaper_titles_controller.rb +13 -0
  33. data/app/controllers/newspaper_works/newspapers_controller.rb +117 -0
  34. data/app/controllers/newspaper_works/newspapers_search_controller.rb +26 -0
  35. data/app/forms/hyrax/newspaper_article_form.rb +11 -0
  36. data/app/forms/hyrax/newspaper_container_form.rb +11 -0
  37. data/app/forms/hyrax/newspaper_issue_form.rb +11 -0
  38. data/app/forms/hyrax/newspaper_page_form.rb +15 -0
  39. data/app/forms/hyrax/newspaper_title_form.rb +12 -0
  40. data/app/forms/newspaper_works/newspaper_core_form_data.rb +17 -0
  41. data/app/helpers/hyrax/newspaper_articles_helper.rb +5 -0
  42. data/app/helpers/hyrax/newspaper_containers_helper.rb +5 -0
  43. data/app/helpers/hyrax/newspaper_issues_helper.rb +5 -0
  44. data/app/helpers/hyrax/newspaper_pages_helper.rb +5 -0
  45. data/app/helpers/newspaper_works/application_helper.rb +5 -0
  46. data/app/helpers/newspaper_works/breadcrumb_helper.rb +92 -0
  47. data/app/helpers/newspaper_works/newspaper_works_helper_behavior.rb +103 -0
  48. data/app/helpers/newspaper_works/newspapers_helper.rb +5 -0
  49. data/app/indexers/concerns/newspaper_works/indexes_full_text.rb +17 -0
  50. data/app/indexers/concerns/newspaper_works/indexes_place_of_publication.rb +67 -0
  51. data/app/indexers/concerns/newspaper_works/indexes_publication_date_range.rb +35 -0
  52. data/app/indexers/concerns/newspaper_works/indexes_relationships.rb +125 -0
  53. data/app/indexers/newspaper_article_indexer.rb +16 -0
  54. data/app/indexers/newspaper_container_indexer.rb +18 -0
  55. data/app/indexers/newspaper_issue_indexer.rb +26 -0
  56. data/app/indexers/newspaper_page_indexer.rb +9 -0
  57. data/app/indexers/newspaper_title_indexer.rb +19 -0
  58. data/app/indexers/newspaper_works/newspaper_core_indexer.rb +21 -0
  59. data/app/jobs/newspaper_works/application_job.rb +4 -0
  60. data/app/jobs/newspaper_works/compose_issue_pdf_job.rb +13 -0
  61. data/app/jobs/newspaper_works/create_issue_pages_job.rb +19 -0
  62. data/app/mailers/newspaper_works/application_mailer.rb +8 -0
  63. data/app/models/concerns/newspaper_works/blacklight_iiif_search/annotation_behavior.rb +82 -0
  64. data/app/models/concerns/newspaper_works/blacklight_iiif_search/search_behavior.rb +27 -0
  65. data/app/models/concerns/newspaper_works/newspaper_core_metadata.rb +67 -0
  66. data/app/models/concerns/newspaper_works/place_of_publication_behavior.rb +15 -0
  67. data/app/models/concerns/newspaper_works/scanned_media_metadata.rb +43 -0
  68. data/app/models/concerns/newspaper_works/solr/document.rb +25 -0
  69. data/app/models/file_set.rb +10 -0
  70. data/app/models/newspaper_article.rb +158 -0
  71. data/app/models/newspaper_container.rb +86 -0
  72. data/app/models/newspaper_issue.rb +115 -0
  73. data/app/models/newspaper_page.rb +70 -0
  74. data/app/models/newspaper_title.rb +111 -0
  75. data/app/models/newspaper_works/application_record.rb +6 -0
  76. data/app/models/newspaper_works/derivative_attachment.rb +8 -0
  77. data/app/models/newspaper_works/ingest_file_relation.rb +14 -0
  78. data/app/presenters/hyrax/newspaper_article_presenter.rb +38 -0
  79. data/app/presenters/hyrax/newspaper_container_presenter.rb +11 -0
  80. data/app/presenters/hyrax/newspaper_issue_presenter.rb +62 -0
  81. data/app/presenters/hyrax/newspaper_page_presenter.rb +72 -0
  82. data/app/presenters/hyrax/newspaper_title_presenter.rb +86 -0
  83. data/app/presenters/newspaper_works/iiif_manifest_presenter_behavior.rb +29 -0
  84. data/app/presenters/newspaper_works/issue_info_presenter.rb +29 -0
  85. data/app/presenters/newspaper_works/newspaper_core_presenter.rb +9 -0
  86. data/app/presenters/newspaper_works/persistent_url_presenter_behavior.rb +16 -0
  87. data/app/presenters/newspaper_works/place_of_publication_presenter_behavior.rb +8 -0
  88. data/app/presenters/newspaper_works/scanned_media_presenter.rb +7 -0
  89. data/app/presenters/newspaper_works/title_info_presenter.rb +13 -0
  90. data/app/search_builders/concerns/newspaper_works/exclude_models.rb +16 -0
  91. data/app/search_builders/concerns/newspaper_works/highlight_search_params.rb +14 -0
  92. data/app/search_builders/newspaper_works/newspapers_search_builder.rb +26 -0
  93. data/app/services/hyrax/article_genre_service.rb +9 -0
  94. data/app/services/newspaper_works/jp2_derivative_service.rb +120 -0
  95. data/app/services/newspaper_works/newspaper_page_derivative_service.rb +91 -0
  96. data/app/services/newspaper_works/pdf_derivative_service.rb +45 -0
  97. data/app/services/newspaper_works/pluggable_derivative_service.rb +114 -0
  98. data/app/services/newspaper_works/text_extraction_derivative_service.rb +56 -0
  99. data/app/services/newspaper_works/text_formats_from_alto_service.rb +77 -0
  100. data/app/services/newspaper_works/tiff_derivative_service.rb +54 -0
  101. data/app/validators/newspaper_works/publication_date_start_end_validator.rb +48 -0
  102. data/app/validators/newspaper_works/publication_date_validator.rb +16 -0
  103. data/app/views/catalog/_index_gallery_newspaper_article_wrapper.html.erb +9 -0
  104. data/app/views/catalog/_index_gallery_newspaper_page_wrapper.html.erb +9 -0
  105. data/app/views/catalog/_index_header_gallery_newspaper_article.html.erb +23 -0
  106. data/app/views/catalog/_index_header_gallery_newspaper_page.html.erb +23 -0
  107. data/app/views/catalog/_index_header_list_newspaper_article.html.erb +7 -0
  108. data/app/views/catalog/_index_header_list_newspaper_page.html.erb +7 -0
  109. data/app/views/catalog/_snippets_more.html.erb +16 -0
  110. data/app/views/catalog/_thumbnail_list_newspaper_article.html.erb +6 -0
  111. data/app/views/catalog/_thumbnail_list_newspaper_page.html.erb +6 -0
  112. data/app/views/hyrax/file_sets/_actions.html.erb +45 -0
  113. data/app/views/hyrax/newspaper_articles/_newspaper_article.html.erb +2 -0
  114. data/app/views/hyrax/newspaper_articles/show.html.erb +1 -0
  115. data/app/views/hyrax/newspaper_containers/_newspaper_container.html.erb +2 -0
  116. data/app/views/hyrax/newspaper_containers/show.html.erb +1 -0
  117. data/app/views/hyrax/newspaper_issues/_newspaper_issue.html.erb +2 -0
  118. data/app/views/hyrax/newspaper_issues/show.html.erb +1 -0
  119. data/app/views/hyrax/newspaper_pages/_newspaper_page.html.erb +2 -0
  120. data/app/views/hyrax/newspaper_pages/show.html.erb +1 -0
  121. data/app/views/hyrax/newspaper_titles/_all_front_pages_form.html.erb +5 -0
  122. data/app/views/hyrax/newspaper_titles/_issue_search_form.html.erb +33 -0
  123. data/app/views/hyrax/newspaper_titles/_issues_calendar.html.erb +63 -0
  124. data/app/views/hyrax/newspaper_titles/_newspaper_title.html.erb +2 -0
  125. data/app/views/hyrax/newspaper_titles/show.html.erb +54 -0
  126. data/app/views/newspaper_works/base/_attribute_rows.html.erb +42 -0
  127. data/app/views/newspaper_works/base/_attributes.html.erb +16 -0
  128. data/app/views/newspaper_works/base/_metadata.html.erb +6 -0
  129. data/app/views/newspaper_works/base/_newspaper_hierarchy.html.erb +14 -0
  130. data/app/views/newspaper_works/base/_persistent_url.html.erb +1 -0
  131. data/app/views/newspaper_works/base/_show.html.erb +45 -0
  132. data/app/views/newspaper_works/newspapers_search/_date_fields.html.erb +29 -0
  133. data/app/views/newspaper_works/newspapers_search/_facet_layout.html.erb +8 -0
  134. data/app/views/newspaper_works/newspapers_search/_facet_limit.html.erb +17 -0
  135. data/app/views/newspaper_works/newspapers_search/_front_pages_input.html.erb +5 -0
  136. data/app/views/newspaper_works/newspapers_search/_keyword_input.html.erb +18 -0
  137. data/app/views/newspaper_works/newspapers_search/_newspapers_facets.html.erb +5 -0
  138. data/app/views/newspaper_works/newspapers_search/_newspapers_search_form.html.erb +13 -0
  139. data/app/views/newspaper_works/newspapers_search/_newspapers_search_help.html.erb +8 -0
  140. data/app/views/newspaper_works/newspapers_search/search.html.erb +13 -0
  141. data/app/views/records/edit_fields/_alternate_title.html.erb +4 -0
  142. data/app/views/records/edit_fields/_genre.html.erb +4 -0
  143. data/app/views/records/edit_fields/_place_of_publication.html.erb +14 -0
  144. data/app/views/records/edit_fields/_subtitle.html.erb +4 -0
  145. data/bin/rails +13 -0
  146. data/config/fcrepo_wrapper_test.yml +5 -0
  147. data/config/initializers/assets.rb +2 -0
  148. data/config/locales/newspaper_article.de.yml +12 -0
  149. data/config/locales/newspaper_article.en.yml +12 -0
  150. data/config/locales/newspaper_article.es.yml +12 -0
  151. data/config/locales/newspaper_article.fr.yml +12 -0
  152. data/config/locales/newspaper_article.it.yml +12 -0
  153. data/config/locales/newspaper_article.pt-BR.yml +12 -0
  154. data/config/locales/newspaper_article.zh.yml +12 -0
  155. data/config/locales/newspaper_container.de.yml +8 -0
  156. data/config/locales/newspaper_container.en.yml +8 -0
  157. data/config/locales/newspaper_container.es.yml +8 -0
  158. data/config/locales/newspaper_container.fr.yml +8 -0
  159. data/config/locales/newspaper_container.it.yml +8 -0
  160. data/config/locales/newspaper_container.pt-BR.yml +8 -0
  161. data/config/locales/newspaper_container.zh.yml +8 -0
  162. data/config/locales/newspaper_issue.de.yml +8 -0
  163. data/config/locales/newspaper_issue.en.yml +8 -0
  164. data/config/locales/newspaper_issue.es.yml +8 -0
  165. data/config/locales/newspaper_issue.fr.yml +8 -0
  166. data/config/locales/newspaper_issue.it.yml +8 -0
  167. data/config/locales/newspaper_issue.pt-BR.yml +8 -0
  168. data/config/locales/newspaper_issue.zh.yml +8 -0
  169. data/config/locales/newspaper_page.de.yml +15 -0
  170. data/config/locales/newspaper_page.en.yml +15 -0
  171. data/config/locales/newspaper_page.es.yml +15 -0
  172. data/config/locales/newspaper_page.fr.yml +15 -0
  173. data/config/locales/newspaper_page.it.yml +15 -0
  174. data/config/locales/newspaper_page.pt-BR.yml +15 -0
  175. data/config/locales/newspaper_page.zh.yml +15 -0
  176. data/config/locales/newspaper_title.de.yml +8 -0
  177. data/config/locales/newspaper_title.en.yml +8 -0
  178. data/config/locales/newspaper_title.es.yml +8 -0
  179. data/config/locales/newspaper_title.fr.yml +8 -0
  180. data/config/locales/newspaper_title.it.yml +8 -0
  181. data/config/locales/newspaper_title.pt-BR.yml +8 -0
  182. data/config/locales/newspaper_title.zh.yml +8 -0
  183. data/config/locales/newspaper_works.de.yml +50 -0
  184. data/config/locales/newspaper_works.en.yml +52 -0
  185. data/config/locales/newspaper_works.es.yml +52 -0
  186. data/config/locales/newspaper_works.fr.yml +52 -0
  187. data/config/locales/newspaper_works.it.yml +52 -0
  188. data/config/locales/newspaper_works.pt-BR.yml +52 -0
  189. data/config/locales/newspaper_works.zh.yml +52 -0
  190. data/config/routes.rb +9 -0
  191. data/config/solr_wrapper_test.yml +9 -0
  192. data/config/test-fixture/solr-config/_rest_managed.json +3 -0
  193. data/config/test-fixture/solr-config/admin-extra.html +31 -0
  194. data/config/test-fixture/solr-config/elevate.xml +36 -0
  195. data/config/test-fixture/solr-config/mapping-ISOLatin1Accent.txt +246 -0
  196. data/config/test-fixture/solr-config/protwords.txt +21 -0
  197. data/config/test-fixture/solr-config/schema.xml +366 -0
  198. data/config/test-fixture/solr-config/scripts.conf +24 -0
  199. data/config/test-fixture/solr-config/solrconfig.xml +322 -0
  200. data/config/test-fixture/solr-config/spellings.txt +2 -0
  201. data/config/test-fixture/solr-config/stopwords.txt +58 -0
  202. data/config/test-fixture/solr-config/stopwords_en.txt +58 -0
  203. data/config/test-fixture/solr-config/synonyms.txt +31 -0
  204. data/config/test-fixture/solr-config/xslt/example.xsl +132 -0
  205. data/config/test-fixture/solr-config/xslt/example_atom.xsl +67 -0
  206. data/config/test-fixture/solr-config/xslt/example_rss.xsl +66 -0
  207. data/config/test-fixture/solr-config/xslt/luke.xsl +337 -0
  208. data/config/vendor/imagemagick-6-policy.xml +76 -0
  209. data/db/migrate/20181214181358_create_newspaper_works_derivative_attachments.rb +12 -0
  210. data/db/migrate/20190107165909_create_newspaper_works_ingest_file_relations.rb +11 -0
  211. data/lib/generators/newspaper_works/assets_generator.rb +29 -0
  212. data/lib/generators/newspaper_works/blacklight_advanced_search_generator.rb +44 -0
  213. data/lib/generators/newspaper_works/blacklight_iiif_search_generator.rb +41 -0
  214. data/lib/generators/newspaper_works/catalog_controller_generator.rb +60 -0
  215. data/lib/generators/newspaper_works/install_generator.rb +97 -0
  216. data/lib/generators/newspaper_works/templates/annotation_behavior.rb +6 -0
  217. data/lib/generators/newspaper_works/templates/config/authorities/newspaper_article_genres.yml +86 -0
  218. data/lib/generators/newspaper_works/templates/config/initializers/newspaper_works.rb +12 -0
  219. data/lib/generators/newspaper_works/templates/config/initializers/patch_blacklight_advanced_search.rb +74 -0
  220. data/lib/generators/newspaper_works/templates/custom_search_builder.rb +23 -0
  221. data/lib/generators/newspaper_works/templates/newspaper_works.scss +1 -0
  222. data/lib/generators/newspaper_works/templates/newspaper_works_helper.rb +3 -0
  223. data/lib/generators/newspaper_works/templates/search_behavior.rb +6 -0
  224. data/lib/newspaper_works/configuration.rb +14 -0
  225. data/lib/newspaper_works/data/fileset_helper.rb +25 -0
  226. data/lib/newspaper_works/data/path_helper.rb +40 -0
  227. data/lib/newspaper_works/data/work_derivatives.rb +314 -0
  228. data/lib/newspaper_works/data/work_file.rb +92 -0
  229. data/lib/newspaper_works/data/work_files.rb +181 -0
  230. data/lib/newspaper_works/data.rb +35 -0
  231. data/lib/newspaper_works/engine.rb +42 -0
  232. data/lib/newspaper_works/errors.rb +14 -0
  233. data/lib/newspaper_works/ingest/base_ingest.rb +69 -0
  234. data/lib/newspaper_works/ingest/base_publication_info.rb +35 -0
  235. data/lib/newspaper_works/ingest/batch_ingest_helper.rb +44 -0
  236. data/lib/newspaper_works/ingest/batch_issue_ingester.rb +129 -0
  237. data/lib/newspaper_works/ingest/chronam_publication_info.rb +133 -0
  238. data/lib/newspaper_works/ingest/from_command.rb +52 -0
  239. data/lib/newspaper_works/ingest/image_ingest_issues.rb +43 -0
  240. data/lib/newspaper_works/ingest/issue_images.rb +51 -0
  241. data/lib/newspaper_works/ingest/lc_publication_info.rb +144 -0
  242. data/lib/newspaper_works/ingest/named_issue_metadata.rb +60 -0
  243. data/lib/newspaper_works/ingest/ndnp/batch_ingester.rb +64 -0
  244. data/lib/newspaper_works/ingest/ndnp/batch_xml_ingest.rb +72 -0
  245. data/lib/newspaper_works/ingest/ndnp/container_ingest.rb +99 -0
  246. data/lib/newspaper_works/ingest/ndnp/container_ingester.rb +84 -0
  247. data/lib/newspaper_works/ingest/ndnp/container_metadata.rb +87 -0
  248. data/lib/newspaper_works/ingest/ndnp/issue_ingest.rb +81 -0
  249. data/lib/newspaper_works/ingest/ndnp/issue_ingester.rb +101 -0
  250. data/lib/newspaper_works/ingest/ndnp/issue_metadata.rb +96 -0
  251. data/lib/newspaper_works/ingest/ndnp/ndnp_asset_helper.rb +20 -0
  252. data/lib/newspaper_works/ingest/ndnp/ndnp_mets_helper.rb +70 -0
  253. data/lib/newspaper_works/ingest/ndnp/page_ingest.rb +47 -0
  254. data/lib/newspaper_works/ingest/ndnp/page_ingester.rb +157 -0
  255. data/lib/newspaper_works/ingest/ndnp/page_metadata.rb +112 -0
  256. data/lib/newspaper_works/ingest/ndnp.rb +21 -0
  257. data/lib/newspaper_works/ingest/newspaper_issue_ingest.rb +56 -0
  258. data/lib/newspaper_works/ingest/newspaper_page_ingest.rb +6 -0
  259. data/lib/newspaper_works/ingest/page_image.rb +52 -0
  260. data/lib/newspaper_works/ingest/path_enumeration.rb +52 -0
  261. data/lib/newspaper_works/ingest/pdf_images.rb +85 -0
  262. data/lib/newspaper_works/ingest/pdf_issue.rb +20 -0
  263. data/lib/newspaper_works/ingest/pdf_issues.rb +39 -0
  264. data/lib/newspaper_works/ingest/pdf_pages.rb +114 -0
  265. data/lib/newspaper_works/ingest/pub_finder.rb +89 -0
  266. data/lib/newspaper_works/ingest/publication_info.rb +44 -0
  267. data/lib/newspaper_works/ingest.rb +90 -0
  268. data/lib/newspaper_works/issue_pdf_composer.rb +111 -0
  269. data/lib/newspaper_works/logging.rb +54 -0
  270. data/lib/newspaper_works/page_finder.rb +62 -0
  271. data/lib/newspaper_works/resource_fetcher.rb +78 -0
  272. data/lib/newspaper_works/text_extraction/alto_reader.rb +122 -0
  273. data/lib/newspaper_works/text_extraction/page_ocr.rb +100 -0
  274. data/lib/newspaper_works/text_extraction/render_alto.rb +84 -0
  275. data/lib/newspaper_works/text_extraction/word_coords_builder.rb +30 -0
  276. data/lib/newspaper_works/text_extraction.rb +10 -0
  277. data/lib/newspaper_works/version.rb +3 -0
  278. data/lib/newspaper_works.rb +19 -0
  279. data/lib/tasks/newspaper_works_tasks.rake +39 -0
  280. data/newspaper_works.gemspec +49 -0
  281. data/spec/.keep.txt +1 -0
  282. data/spec/actors/newspaper_works/actors/newspaper_works_upload_actor_spec.rb +69 -0
  283. data/spec/controllers/catalog_controller_spec.rb +63 -0
  284. data/spec/controllers/newspaper_works/newspapers_controller_spec.rb +114 -0
  285. data/spec/controllers/newspaper_works/newspapers_search_controller_spec.rb +21 -0
  286. data/spec/factories/ability.rb +6 -0
  287. data/spec/factories/newspaper_issue.rb +7 -0
  288. data/spec/factories/newspaper_issue_ingest.rb +6 -0
  289. data/spec/factories/newspaper_page.rb +7 -0
  290. data/spec/factories/newspaper_page_ingest.rb +6 -0
  291. data/spec/factories/newspaper_page_solr_document.rb +12 -0
  292. data/spec/factories/newspaper_title.rb +8 -0
  293. data/spec/factories/uploaded_pdf_file.rb +9 -0
  294. data/spec/factories/user.rb +13 -0
  295. data/spec/features/front_pages_for_title_spec.rb +19 -0
  296. data/spec/features/newspaper_title_search_spec.rb +30 -0
  297. data/spec/features/newspapers_search_spec.rb +49 -0
  298. data/spec/features/search_results_thumbnail_highlights_spec.rb +33 -0
  299. data/spec/features_shared.rb +71 -0
  300. data/spec/fixtures/files/4.1.07.jp2 +0 -0
  301. data/spec/fixtures/files/4.1.07.tiff +0 -0
  302. data/spec/fixtures/files/README.md +7 -0
  303. data/spec/fixtures/files/alto-2-0.xsd +714 -0
  304. data/spec/fixtures/files/broken-truncated.pdf +0 -0
  305. data/spec/fixtures/files/credits.md +16 -0
  306. data/spec/fixtures/files/lowres-gray-via-ndnp-sample.tiff +0 -0
  307. data/spec/fixtures/files/minimal-1-page.pdf +0 -0
  308. data/spec/fixtures/files/minimal-2-page.pdf +0 -0
  309. data/spec/fixtures/files/minimal-alto.xml +31 -0
  310. data/spec/fixtures/files/ndnp-alto-sample.xml +24 -0
  311. data/spec/fixtures/files/ndnp-sample1-json.json +1 -0
  312. data/spec/fixtures/files/ndnp-sample1-txt.txt +1 -0
  313. data/spec/fixtures/files/ndnp-sample1.pdf +0 -0
  314. data/spec/fixtures/files/ocr_alto.xml +202 -0
  315. data/spec/fixtures/files/ocr_alto_scaled_4pts_per_px.xml +202 -0
  316. data/spec/fixtures/files/ocr_color.tiff +0 -0
  317. data/spec/fixtures/files/ocr_gray.jp2 +0 -0
  318. data/spec/fixtures/files/ocr_gray.tiff +0 -0
  319. data/spec/fixtures/files/ocr_mono.tiff +0 -0
  320. data/spec/fixtures/files/page1.tiff +0 -0
  321. data/spec/fixtures/files/resource_mocks/chronam/http404-expected +0 -0
  322. data/spec/fixtures/files/resource_mocks/chronam/sn84038814.rdf +1028 -0
  323. data/spec/fixtures/files/resource_mocks/chronam/sn93059126.rdf +36 -0
  324. data/spec/fixtures/files/resource_mocks/chronam/sn94051019.rdf +37 -0
  325. data/spec/fixtures/files/resource_mocks/geonames/Chicopee +1104 -0
  326. data/spec/fixtures/files/resource_mocks/geonames/Denver +1104 -0
  327. data/spec/fixtures/files/resource_mocks/geonames/Marysville +279 -0
  328. data/spec/fixtures/files/resource_mocks/geonames/Marysville2 +279 -0
  329. data/spec/fixtures/files/resource_mocks/geonames/SLC +1104 -0
  330. data/spec/fixtures/files/resource_mocks/lccn/sn2099999999 +1 -0
  331. data/spec/fixtures/files/resource_mocks/lccn/sn82014496 +2 -0
  332. data/spec/fixtures/files/resource_mocks/lccn/sn83020109 +1 -0
  333. data/spec/fixtures/files/resource_mocks/lccn/sn83021453 +2 -0
  334. data/spec/fixtures/files/resource_mocks/lccn/sn83045396 +2 -0
  335. data/spec/fixtures/files/resource_mocks/lccn/sn84038814 +2 -0
  336. data/spec/fixtures/files/resource_mocks/lccn/sn93059126 +1 -0
  337. data/spec/fixtures/files/resource_mocks/lccn/sn94051019 +1 -0
  338. data/spec/fixtures/files/resource_mocks/lccn/sn99999999 +1 -0
  339. data/spec/fixtures/files/resource_mocks/urls.json +82 -0
  340. data/spec/fixtures/files/sample-4page-issue.pdf +0 -0
  341. data/spec/fixtures/files/sample-color-newsletter.pdf +0 -0
  342. data/spec/fixtures/files/thumbnail.jpg +0 -0
  343. data/spec/forms/hyrax/newspaper_article_form_spec.rb +33 -0
  344. data/spec/forms/hyrax/newspaper_container_form_spec.rb +30 -0
  345. data/spec/forms/hyrax/newspaper_issue_form_spec.rb +31 -0
  346. data/spec/forms/hyrax/newspaper_page_form_spec.rb +28 -0
  347. data/spec/forms/hyrax/newspaper_title_form_spec.rb +31 -0
  348. data/spec/forms/newspaper_works/newspaper_core_form_data_spec.rb +12 -0
  349. data/spec/helpers/newspaper_works/breadcrumb_helper_spec.rb +82 -0
  350. data/spec/helpers/newspaper_works_helper_spec.rb +57 -0
  351. data/spec/indexers/concerns/newspaper_works/indexes_full_text_spec.rb +31 -0
  352. data/spec/indexers/concerns/newspaper_works/indexes_place_of_publication_spec.rb +53 -0
  353. data/spec/indexers/concerns/newspaper_works/indexes_publication_date_range_spec.rb +39 -0
  354. data/spec/indexers/concerns/newspaper_works/indexes_relationships_spec.rb +86 -0
  355. data/spec/indexers/newspaper_article_indexer_spec.rb +29 -0
  356. data/spec/indexers/newspaper_issue_indexer_spec.rb +19 -0
  357. data/spec/indexers/newspaper_title_indexer_spec.rb +22 -0
  358. data/spec/indexers/newspaper_works/newspaper_core_indexer_spec.rb +23 -0
  359. data/spec/lib/newspaper_works/configuration_spec.rb +18 -0
  360. data/spec/lib/newspaper_works/data/work_derivatives_spec.rb +245 -0
  361. data/spec/lib/newspaper_works/data/work_file_spec.rb +99 -0
  362. data/spec/lib/newspaper_works/data/work_files_spec.rb +224 -0
  363. data/spec/lib/newspaper_works/ingest/batch_issue_ingester_spec.rb +158 -0
  364. data/spec/lib/newspaper_works/ingest/chronam_publication_info_spec.rb +35 -0
  365. data/spec/lib/newspaper_works/ingest/from_command_spec.rb +75 -0
  366. data/spec/lib/newspaper_works/ingest/image_ingest_issues_spec.rb +62 -0
  367. data/spec/lib/newspaper_works/ingest/ingest_shared.rb +75 -0
  368. data/spec/lib/newspaper_works/ingest/issue_images_spec.rb +65 -0
  369. data/spec/lib/newspaper_works/ingest/lc_publication_info_spec.rb +34 -0
  370. data/spec/lib/newspaper_works/ingest/ndnp/batch_ingester_spec.rb +131 -0
  371. data/spec/lib/newspaper_works/ingest/ndnp/batch_xml_ingest_spec.rb +64 -0
  372. data/spec/lib/newspaper_works/ingest/ndnp/container_ingest_spec.rb +44 -0
  373. data/spec/lib/newspaper_works/ingest/ndnp/container_ingester_spec.rb +126 -0
  374. data/spec/lib/newspaper_works/ingest/ndnp/container_metadata_spec.rb +36 -0
  375. data/spec/lib/newspaper_works/ingest/ndnp/issue_ingest_spec.rb +108 -0
  376. data/spec/lib/newspaper_works/ingest/ndnp/issue_ingester_spec.rb +155 -0
  377. data/spec/lib/newspaper_works/ingest/ndnp/issue_metadata_spec.rb +84 -0
  378. data/spec/lib/newspaper_works/ingest/ndnp/page_ingest_spec.rb +79 -0
  379. data/spec/lib/newspaper_works/ingest/ndnp/page_ingester_spec.rb +184 -0
  380. data/spec/lib/newspaper_works/ingest/ndnp/page_metadata_spec.rb +85 -0
  381. data/spec/lib/newspaper_works/ingest/newspaper_issue_ingest_spec.rb +83 -0
  382. data/spec/lib/newspaper_works/ingest/newspaper_page_ingest_spec.rb +77 -0
  383. data/spec/lib/newspaper_works/ingest/page_image_spec.rb +29 -0
  384. data/spec/lib/newspaper_works/ingest/pdf_images_spec.rb +32 -0
  385. data/spec/lib/newspaper_works/ingest/pdf_issue_spec.rb +29 -0
  386. data/spec/lib/newspaper_works/ingest/pdf_issues_spec.rb +62 -0
  387. data/spec/lib/newspaper_works/ingest/pdf_pages_spec.rb +110 -0
  388. data/spec/lib/newspaper_works/ingest/pub_finder_spec.rb +58 -0
  389. data/spec/lib/newspaper_works/ingest/publication_info_spec.rb +61 -0
  390. data/spec/lib/newspaper_works/ingest_spec.rb +45 -0
  391. data/spec/lib/newspaper_works/issue_pdf_composer_spec.rb +101 -0
  392. data/spec/lib/newspaper_works/logging_spec.rb +53 -0
  393. data/spec/lib/newspaper_works/page_finder_spec.rb +53 -0
  394. data/spec/lib/newspaper_works/resource_fetcher_spec.rb +65 -0
  395. data/spec/lib/newspaper_works/text_extraction/alto_reader_spec.rb +49 -0
  396. data/spec/lib/newspaper_works/text_extraction/page_ocr_spec.rb +84 -0
  397. data/spec/lib/newspaper_works/text_extraction/render_alto_spec.rb +54 -0
  398. data/spec/lib/newspaper_works/text_extraction/word_coords_builder_spec.rb +30 -0
  399. data/spec/lib/tasks/newspaper_works_rake_spec.rb +124 -0
  400. data/spec/misc_shared.rb +109 -0
  401. data/spec/model_shared.rb +134 -0
  402. data/spec/models/concerns/newspaper_works/blacklight_iiif_search/annotation_behavior_spec.rb +45 -0
  403. data/spec/models/concerns/newspaper_works/blacklight_iiif_search/search_behavior_spec.rb +27 -0
  404. data/spec/models/concerns/newspaper_works/newspaper_core_metadata_spec.rb +45 -0
  405. data/spec/models/concerns/newspaper_works/place_of_publication_behavior_spec.rb +17 -0
  406. data/spec/models/concerns/newspaper_works/scanned_media_metadata_spec.rb +35 -0
  407. data/spec/models/newspaper_article_spec.rb +73 -0
  408. data/spec/models/newspaper_container_spec.rb +111 -0
  409. data/spec/models/newspaper_issue_spec.rb +91 -0
  410. data/spec/models/newspaper_page_spec.rb +44 -0
  411. data/spec/models/newspaper_title_spec.rb +116 -0
  412. data/spec/models/newspaper_works/derivative_attachment_spec.rb +37 -0
  413. data/spec/models/newspaper_works/ingest_file_relation_spec.rb +56 -0
  414. data/spec/models/solr_document_spec.rb +14 -0
  415. data/spec/ndnp_shared.rb +48 -0
  416. data/spec/presenters/hyrax/newspaper_article_presenter_spec.rb +53 -0
  417. data/spec/presenters/hyrax/newspaper_container_presenter_spec.rb +20 -0
  418. data/spec/presenters/hyrax/newspaper_issue_presenter_spec.rb +65 -0
  419. data/spec/presenters/hyrax/newspaper_page_presenter_spec.rb +75 -0
  420. data/spec/presenters/hyrax/newspaper_title_presenter_spec.rb +153 -0
  421. data/spec/presenters/newspaper_works/iiif_manifest_presenter_behavior_spec.rb +32 -0
  422. data/spec/presenters/newspaper_works/issue_info_presenter_spec.rb +51 -0
  423. data/spec/presenters/newspaper_works/newspaper_core_presenter_spec.rb +22 -0
  424. data/spec/presenters/newspaper_works/persistent_url_presenter_behavior_spec.rb +24 -0
  425. data/spec/presenters/newspaper_works/place_of_publication_presenter_behavior_spec.rb +17 -0
  426. data/spec/presenters/newspaper_works/scanned_media_presenter_spec.rb +18 -0
  427. data/spec/presenters/newspaper_works/title_info_presenter_spec.rb +23 -0
  428. data/spec/routing/route_spec.rb +52 -0
  429. data/spec/search_builders/custom_search_builder_spec.rb +34 -0
  430. data/spec/search_builders/newspaper_works/newspapers_search_builder_spec.rb +33 -0
  431. data/spec/services/hyrax/article_genre_service_spec.rb +12 -0
  432. data/spec/services/hyrax/resource_types_service_spec.rb +12 -0
  433. data/spec/services/newspaper_works/jp2_derivative_service_spec.rb +62 -0
  434. data/spec/services/newspaper_works/newspaper_page_derivative_service_spec.rb +125 -0
  435. data/spec/services/newspaper_works/pdf_derivative_service_spec.rb +62 -0
  436. data/spec/services/newspaper_works/pluggable_derivative_service_spec.rb +204 -0
  437. data/spec/services/newspaper_works/text_extraction_derivative_service_spec.rb +82 -0
  438. data/spec/services/newspaper_works/text_formats_from_alto_service_spec.rb +129 -0
  439. data/spec/services/newspaper_works/tiff_derivative_service_spec.rb +58 -0
  440. data/spec/spec_helper.rb +261 -0
  441. data/spec/support/controller_level_helpers.rb +28 -0
  442. data/spec/test_app_templates/lib/generators/test_app_generator.rb +22 -0
  443. data/spec/views/catalog/_index_gallery_newspaper_page_wrapper.html.erb_spec.rb +36 -0
  444. data/spec/views/catalog/_index_header_list_newspaper_page.html.erb_spec.rb +26 -0
  445. data/spec/views/catalog/_thumbnail_list_newspaper_page.html.erb_spec.rb +35 -0
  446. data/spec/views/hyrax/newspaper_titles/_all_front_pages_form.html.erb_spec.rb +16 -0
  447. data/spec/views/hyrax/newspaper_titles/_issue_search_form.html.erb_spec.rb +33 -0
  448. data/spec/views/hyrax/newspaper_titles/_issues_calendar.html.erb_spec.rb +37 -0
  449. data/spec/views/hyrax/newspaper_titles/show.html.erb_spec.rb +87 -0
  450. data/spec/views/newspaper_works/base/_attribute_rows.html.erb_spec.rb +60 -0
  451. data/spec/views/newspaper_works/base/_newspaper_hierarchy.html.erb_spec.rb +80 -0
  452. data/spec/views/newspaper_works/base/_show.html.erb_spec.rb +78 -0
  453. data/spec/views/newspaper_works/newspapers_search/search.html.erb_spec.rb +54 -0
  454. data/spec/views/records/edit_fields/_place_of_publication.html.erb_spec.rb +26 -0
  455. data/tasks/newspaperworks_dev.rake +26 -0
  456. data/test/integration/navigation_test.rb +7 -0
  457. data/test/lib/generators/newspaper_works/install_generator_test.rb +16 -0
  458. data/test/newspaper_works_test.rb +7 -0
  459. data/test/test_helper.rb +17 -0
  460. data/tmp/.keep +0 -0
  461. metadata +1037 -0
@@ -0,0 +1,60 @@
1
+ # adds controller-scope behavior to the implementing application
2
+ require 'rails/generators'
3
+
4
+ module NewspaperWorks
5
+ class CatalogControllerGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ desc "
9
+ This generator makes the following changes to your app:
10
+ 1. Adds index fields in CatalogController
11
+ 2. Adds facet fields in CatalogController
12
+ 3. Adds sort fields in CatalogController
13
+ "
14
+
15
+ def add_index_fields_to_catalog_controller
16
+ marker = 'configure_blacklight do |config|'
17
+ inject_into_file 'app/controllers/catalog_controller.rb', after: marker do
18
+ "\n\n # NewspaperWorks index fields\n"\
19
+ " config.add_index_field 'publication_title_ssi', label: I18n.t('newspaper_works.attributes.publication_title.label'), link_to_search: 'publication_title_ssi'\n"\
20
+ " config.add_index_field solr_name('publication_date', :stored_sortable, type: :date), label: 'Publication date', helper_method: :human_readable_date\n"\
21
+ " config.add_index_field solr_name('place_of_publication_label', :stored_searchable), label: I18n.t('newspaper_works.attributes.place_of_publication.label'), link_to_search: solr_name('place_of_publication_label', :facetable)\n"\
22
+ " config.add_index_field solr_name('publication_date_start', :stored_sortable, type: :date), label: 'Publication date (start)', helper_method: :human_readable_date\n"\
23
+ " config.add_index_field solr_name('publication_date_end', :stored_sortable, type: :date), label: 'Publication date (end)', helper_method: :human_readable_date\n"\
24
+ " config.add_index_field 'all_text_tsimv', highlight: true, helper_method: :render_ocr_snippets\n"
25
+ end
26
+ end
27
+
28
+ def add_facets_to_catalog_controller
29
+ marker = 'configure_blacklight do |config|'
30
+ inject_into_file 'app/controllers/catalog_controller.rb', after: marker do
31
+ "\n\n # NewspaperWorks facet fields\n"\
32
+ " config.add_facet_field solr_name('place_of_publication_city', :facetable), label: 'Place of publication', limit: 5\n"\
33
+ " config.add_facet_field 'publication_title_ssi', label: 'Publication title', limit: 5\n"\
34
+ " config.add_facet_field solr_name('genre', :facetable), label: 'Article type', limit: 5\n\n"\
35
+ " # additional NewspaperWorks fields not displayed in the facet list,\n"\
36
+ " # but below definitions give labels to filters for linked metadata\n"\
37
+ " config.add_facet_field solr_name('place_of_publication_label', :facetable), label: 'Place of publication', if: false\n"\
38
+ " config.add_facet_field solr_name('issn', :facetable), label: 'ISSN', if: false\n"\
39
+ " config.add_facet_field solr_name('lccn', :facetable), label: 'LCCN', if: false\n"\
40
+ " config.add_facet_field solr_name('oclcnum', :facetable), label: 'OCLC #', if: false\n"\
41
+ " config.add_facet_field solr_name('held_by', :facetable), label: 'Held by', if: false\n"\
42
+ " config.add_facet_field solr_name('author', :facetable), label: 'Author', if: false\n"\
43
+ " config.add_facet_field solr_name('photographer', :facetable), label: 'Photographer', if: false\n"\
44
+ " config.add_facet_field solr_name('geographic_coverage', :facetable), label: 'Geographic coverage', if: false\n"\
45
+ " config.add_facet_field solr_name('preceded_by', :facetable), label: 'Preceded by', if: false\n"\
46
+ " config.add_facet_field solr_name('succeeded_by', :facetable), label: 'Succeeded by', if: false\n"\
47
+ " config.add_facet_field 'first_page_bsi', label: 'First page', if: false\n"
48
+ end
49
+ end
50
+
51
+ def add_pubdate_sort_to_catalog_controller
52
+ marker = 'config.add_sort_field "#{modified_field} asc", label: "date modified \u25B2"'
53
+ inject_into_file 'app/controllers/catalog_controller.rb', after: marker do
54
+ "\n\n # NewspaperWorks sort fields\n"\
55
+ ' config.add_sort_field "publication_date_dtsi desc", label: "publication date \u25BC"
56
+ config.add_sort_field "publication_date_dtsi asc", label: "publication date \u25B2"'
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,97 @@
1
+ require 'rails/generators'
2
+
3
+ module NewspaperWorks
4
+ # Install Generator Class
5
+ class InstallGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def copy_migrations
9
+ rake "newspaper_works:install:migrations"
10
+ end
11
+
12
+ def register_worktypes
13
+ inject_into_file 'config/initializers/hyrax.rb',
14
+ after: "Hyrax.config do |config|\n" do
15
+ " # Configuration generated by `rails g newspaper_works:install`\n" \
16
+ " config.register_curation_concern :newspaper_article\n" \
17
+ " config.register_curation_concern :newspaper_container\n" \
18
+ " config.register_curation_concern :newspaper_issue\n" \
19
+ " config.register_curation_concern :newspaper_page\n" \
20
+ " config.register_curation_concern :newspaper_title\n" \
21
+ " config.callback.set(:after_create_fileset) do |file_set, user|\n" \
22
+ " require 'newspaper_works'\n" \
23
+ " NewspaperWorks::Data.handle_after_create_fileset(file_set, user)\n" \
24
+ " end\n" \
25
+ " #== END GENERATED newspaper_works CONFIG ==\n\n"
26
+ end
27
+ end
28
+
29
+ def inject_routes
30
+ inject_into_file 'config/routes.rb',
31
+ after: "Rails.application.routes.draw do\n" do
32
+ "\n mount NewspaperWorks::Engine => '/'\n"
33
+ end
34
+ end
35
+
36
+ def add_solr_doc
37
+ inject_into_file 'app/models/solr_document.rb',
38
+ after: "include Hyrax::SolrDocumentBehavior" do
39
+ "\n include NewspaperWorks::Solr::Document\n"
40
+ end
41
+ end
42
+
43
+ def verify_biiif_installed
44
+ return if IO.read('app/controllers/catalog_controller.rb').include?('include BlacklightIiifSearch::Controller')
45
+ say_status('info',
46
+ 'BLACKLIGHT IIIF SEARCH NOT INSTALLED; INSTALLING BLACKLIGHT IIIF SEARCH',
47
+ :blue)
48
+ generate 'blacklight_iiif_search:install'
49
+ end
50
+
51
+ def iiif_configuration
52
+ generate 'newspaper_works:blacklight_iiif_search'
53
+ end
54
+
55
+ # NOTE: BlacklightAdvancedSearch generator installs a view partial by default,
56
+ # remove it after install, unless app has already customized that view partial
57
+ def verify_blacklight_adv_search_installed
58
+ return if IO.read('app/controllers/catalog_controller.rb').include?('include BlacklightAdvancedSearch::Controller')
59
+ say_status('info', 'INSTALLING BLACKLIGHT ADVANCED SEARCH', :blue)
60
+ search_form_path = 'app/views/catalog/_search_form.html.erb'
61
+ existing_search_form = File.exist?(search_form_path) ? true : false
62
+ generate 'blacklight_advanced_search:install', '--force'
63
+ remove_file search_form_path unless existing_search_form
64
+ end
65
+
66
+ def advanced_search_configuration
67
+ generate 'newspaper_works:blacklight_advanced_search'
68
+ end
69
+
70
+ def inject_authorities
71
+ inject_into_file 'config/authorities/resource_types.yml',
72
+ after: "term: Masters Thesis\n" do
73
+ " - id: Microfilm\n" \
74
+ " term: Microfilm\n" \
75
+ " - id: Newspaper\n" \
76
+ " term: Newspaper\n"
77
+ end
78
+ copy_file "config/authorities/newspaper_article_genres.yml"
79
+ end
80
+
81
+ def catalog_controller_configuration
82
+ generate 'newspaper_works:catalog_controller'
83
+ end
84
+
85
+ def inject_configuration
86
+ copy_file 'config/initializers/newspaper_works.rb'
87
+ end
88
+
89
+ def add_helper
90
+ copy_file "newspaper_works_helper.rb", "app/helpers/newspaper_works_helper.rb"
91
+ end
92
+
93
+ def inject_assets
94
+ generate 'newspaper_works:assets'
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,6 @@
1
+ # customizable behavior for IiifSearch
2
+ module BlacklightIiifSearch
3
+ module AnnotationBehavior
4
+ include NewspaperWorks::BlacklightIiifSearch::AnnotationBehavior
5
+ end
6
+ end
@@ -0,0 +1,86 @@
1
+ # based on hyrax/lib/generators/hyrax/templates/conifg/authorities/resource_types.yml
2
+ terms:
3
+ - id: http://id.loc.gov/vocabulary/graphicMaterials/tgm000098
4
+ term: "Advertisement"
5
+ active: true
6
+ - id: http://cv.iptc.org/newscodes/genre/Advice
7
+ term: "Advice"
8
+ active: true
9
+ - id: http://cv.iptc.org/newscodes/genre/almanac
10
+ term: "Almanac"
11
+ active: true
12
+ - id: http://vocab.getty.edu/aat/300048715
13
+ term: "Article"
14
+ active: true
15
+ - id: http://vocab.getty.edu/aat/300265772
16
+ term: "Birth announcement"
17
+ active: true
18
+ - id: http://vocab.getty.edu/aat/300191074
19
+ term: "Caption"
20
+ active: true
21
+ - id: http://id.loc.gov/vocabulary/graphicMaterials/tgm001739
22
+ term: "Cartoon (editorial)"
23
+ active: true
24
+ - id: http://id.loc.gov/vocabulary/graphicMaterials/tgm002334
25
+ term: "Comics"
26
+ active: true
27
+ - id: http://vocab.getty.edu/aat/300026441
28
+ term: "Column"
29
+ active: true
30
+ - id: http://vocab.getty.edu/aat/300026284
31
+ term: "Editorial"
32
+ active: true
33
+ - id: http://cv.iptc.org/newscodes/genre/Feature
34
+ term: "Feature"
35
+ active: true
36
+ - id: http://cv.iptc.org/newscodes/genre/Forecast
37
+ term: "Forecast"
38
+ active: true
39
+ - id: http://cv.iptc.org/newscodes/genre/horoscope
40
+ term: "Horoscope"
41
+ active: true
42
+ - id: http://id.loc.gov/authorities/genreForms/gf2014026110
43
+ term: "Humor"
44
+ active: true
45
+ - id: http://id.loc.gov/vocabulary/graphicMaterials/tgm005314
46
+ term: "Illustration"
47
+ active: true
48
+ - id: http://vocab.getty.edu/aat/300027757
49
+ term: "Legal notice"
50
+ active: true
51
+ - id: http://vocab.getty.edu/aat/300343729
52
+ term: "Letter to the editor"
53
+ active: true
54
+ - id: http://id.loc.gov/authorities/genreForms/gf2014026415
55
+ term: "Literature"
56
+ active: true
57
+ - id: http://vocab.getty.edu/aat/300311565
58
+ term: "Masthead"
59
+ active: true
60
+ - id: http://schema.org/NewsArticle
61
+ term: "News article"
62
+ active: true
63
+ - id: http://cv.iptc.org/newscodes/genre/Obituary
64
+ term: "Obituary/Death announcement"
65
+ active: true
66
+ - id: http://cv.iptc.org/newscodes/genre/Opinion
67
+ term: "Opinion"
68
+ active: true
69
+ - id: http://id.loc.gov/vocabulary/graphicMaterials/tgm007721
70
+ term: "Photograph"
71
+ active: true
72
+ - id: http://id.loc.gov/authorities/genreForms/gf2014026158
73
+ term: "Puzzle/Game"
74
+ active: true
75
+ - id: http://id.loc.gov/authorities/genreForms/gf2014026168
76
+ term: "Review"
77
+ active: true
78
+ - id: http://id.loc.gov/vocabulary/graphicMaterials/tgm009217
79
+ term: "Schedule/Timetable"
80
+ active: true
81
+ - id: http://vocab.getty.edu/aat/300136681
82
+ term: "Shipping record"
83
+ active: true
84
+ - id: http://vocab.getty.edu/aat/300310119
85
+ term: "Wedding/Engagement announcement"
86
+ active: true
@@ -0,0 +1,12 @@
1
+ NewspaperWorks.config do |config|
2
+ # 'publication_unique_id' configs used for Chronicling America style linking
3
+ # e.g. First page of an issue from publication with LCCN sn86069873, from Jan. 15, 1897
4
+ # https://host/newspapers/sn86069873/1897-01-15/ed-1/seq-1
5
+ # the property that represents a unique identifier for a NewspaperTitle
6
+ # defaults to :lccn
7
+ # config.publication_unique_id_property = :lccn
8
+
9
+ # the Solr field that represents a unique identifier for a NewspaperTitle
10
+ # defaults to 'lccn_tesim'
11
+ # config.publication_unique_id_field = 'lccn_tesim'
12
+ end
@@ -0,0 +1,74 @@
1
+ # have to override some methods from BlacklightAdvancedSearch classes/modules
2
+ # to provide date range search functionality
3
+ require BlacklightAdvancedSearch::Engine.root.join(Rails.root, 'config', 'initializers',
4
+ 'patch_blacklight_advanced_search')
5
+
6
+ class BlacklightAdvancedSearch::QueryParser
7
+ # override to add date range to query
8
+ def process_query(params, config)
9
+ queries = keyword_queries.map do |field, query|
10
+ ParsingNesting::Tree.parse(query,
11
+ config.advanced_search[:query_parser]).to_query(local_param_hash(field,
12
+ config))
13
+ end
14
+ queries.join(" #{keyword_op} ")
15
+ return queries if params[:date_start].blank? && params[:date_end].blank?
16
+ if queries.blank?
17
+ add_date_range_to_queries(params)
18
+ else
19
+ [queries, add_date_range_to_queries(params)].join(' AND ')
20
+ end
21
+ end
22
+
23
+ # format date input for Solr
24
+ def add_date_range_to_queries(params)
25
+ range_start = if params[:date_start].blank? || params[:date_start].match(/[\D]+/)
26
+ '*'
27
+ else
28
+ params[:date_start] + '-01-01T00:00:00.000Z'
29
+ end
30
+ range_end = if params[:date_end].blank? || params[:date_end].match(/[\D]+/)
31
+ '*'
32
+ else
33
+ params[:date_end] + '-12-31T23:59:59.999Z'
34
+ end
35
+ '(publication_date_dtsi:[' + range_start + ' TO ' + range_end + '])'
36
+ end
37
+ end
38
+
39
+ module BlacklightAdvancedSearch::RenderConstraintsOverride
40
+ # override to add date range to constraints rendering
41
+ def render_constraints_filters(my_params = params)
42
+ # these lines are copied from source
43
+ content = super(my_params)
44
+ if advanced_query
45
+ advanced_query.filters.each_pair do |field, value_list|
46
+ label = facet_field_label(field)
47
+ content << render_constraint_element(label,
48
+ safe_join(Array(value_list), " <strong class='text-muted constraint-connector'>OR</strong> ".html_safe),
49
+ remove: search_action_path(remove_advanced_filter_group(field, my_params).except(:controller, :action)))
50
+ end
51
+ # this is our new line
52
+ content << render_advanced_date_query(my_params)
53
+ end
54
+ content
55
+ end
56
+
57
+ # render the advanced search date query constraints
58
+ def render_advanced_date_query(localized_params = params)
59
+ return ''.html_safe if localized_params[:date_start].blank? && localized_params[:date_end].blank?
60
+ render_constraint_element(t('blacklight.advanced_search.constraints.date'),
61
+ date_range_constraints_to_s(localized_params),
62
+ classes: ['date_range'],
63
+ remove: remove_constraint_url(localized_params.merge(date_start: nil,
64
+ date_end: nil,
65
+ action: 'index')))
66
+ end
67
+
68
+ # render date range constraint text from Advanced Search form
69
+ def date_range_constraints_to_s(params)
70
+ return "#{params[:date_end]} or before" if params[:date_start].blank?
71
+ return "#{params[:date_start]} or later" if params[:date_end].blank?
72
+ "#{params[:date_start]}-#{params[:date_end]}"
73
+ end
74
+ end
@@ -0,0 +1,23 @@
1
+ # custom SearchBuilder generated by NewspaperWorks; adds behavior to Hyrax::CatalogSearchBuilder:
2
+ # - BlacklightAdvancedSearch::AdvancedSearchBuilder, to support /newspapers_search
3
+ # - NewspaperWorks::HighlightSearchParams, to support highlighting and snippets in results
4
+ # - NewspaperWorks::ExcludeModels, to remove NewspaperTitle, NewspaperContainer,
5
+ # and NewspaperIssue objects from keyword searches
6
+ class CustomSearchBuilder < Hyrax::CatalogSearchBuilder
7
+ include BlacklightAdvancedSearch::AdvancedSearchBuilder
8
+ include NewspaperWorks::HighlightSearchParams
9
+ include NewspaperWorks::ExcludeModels
10
+
11
+ # :exclude_models and :highlight_search_params must be added after advanced_search
12
+ # so keyword query input can be properly eval'd
13
+ self.default_processor_chain += [:add_advanced_parse_q_to_solr, :add_advanced_search_to_solr,
14
+ :exclude_models, :highlight_search_params]
15
+
16
+ # add logic to BlacklightAdvancedSearch::AdvancedSearchBuilder
17
+ # so that date range params are recognized as advanced search
18
+ # rubocop:disable Naming/PredicateName
19
+ def is_advanced_search?
20
+ blacklight_params[:date_start].present? || blacklight_params[:date_end].present? || super
21
+ end
22
+ # rubocop:enable Naming/PredicateName
23
+ end
@@ -0,0 +1 @@
1
+ @import 'newspaper_works/newspaper_works';
@@ -0,0 +1,3 @@
1
+ module NewspaperWorksHelper
2
+ include NewspaperWorks::NewspaperWorksHelperBehavior
3
+ end
@@ -0,0 +1,6 @@
1
+ # customizable behavior for IiifSearch
2
+ module BlacklightIiifSearch
3
+ module SearchBehavior
4
+ include NewspaperWorks::BlacklightIiifSearch::SearchBehavior
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ module NewspaperWorks
2
+ class Configuration
3
+ # 'publication_unique_id' configs used for Chronicling America style linking
4
+ attr_writer :publication_unique_id_property
5
+ def publication_unique_id_property
6
+ @publication_unique_id_property || :lccn
7
+ end
8
+
9
+ attr_writer :publication_unique_id_field
10
+ def publication_unique_id_field
11
+ @publication_unique_id_field || 'lccn_tesim'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ module NewspaperWorks
2
+ module Data
3
+ # Mixin module for fileset methods for work, presumes an @work
4
+ # instance attribute refering to a work object
5
+ module FilesetHelper
6
+ def fileset_id
7
+ # if context is itself a string, presume it is a file set id
8
+ return @work if @work.class == String
9
+ # if context is not a String, presume a work or fileset context:
10
+ fileset.nil? ? nil : fileset.id
11
+ end
12
+
13
+ def first_fileset
14
+ # if context is fileset id (e.g. caller is view partial) string,
15
+ # get the fileset from that id
16
+ return FileSet.find(@work) if @work.class == String
17
+ # if "work" context is a FileSet, not actual work, return it
18
+ return @work if @work.class == FileSet
19
+ # in most cases, get from work's members:
20
+ filesets = @work.members.select { |m| m.class == FileSet }
21
+ filesets.empty? ? nil : filesets[0]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,40 @@
1
+ require 'uri'
2
+
3
+ module NewspaperWorks
4
+ module Data
5
+ # Mixin for methods related to paths on filesystem
6
+ module PathHelper
7
+ def normalize_path(path)
8
+ path = path.to_s
9
+ isuri?(path) ? path : File.expand_path(path)
10
+ end
11
+
12
+ def isuri?(path)
13
+ !path.scan(URI.regexp).empty?
14
+ end
15
+
16
+ def path_to_uri(path)
17
+ isuri?(path) ? path : "file://#{path}"
18
+ end
19
+
20
+ def whitelisted_path(path)
21
+ Hyrax.config.whitelisted_ingest_dirs.any? do |dir|
22
+ path.start_with?(dir) && path.length > dir.length
23
+ end
24
+ end
25
+
26
+ def validate_path(path)
27
+ # treat file URIs equivalent to local paths
28
+ path = File.expand_path(path.sub(/^file:\/\//, ''))
29
+ # make sure file exists
30
+ raise IOError, "Not found: #{path}" unless File.exist?(path)
31
+ return if whitelisted_path(path)
32
+ # we cannot use path if it is not whitelisted for Hyrax ingest, we
33
+ # would prefer to fail early vs. later+silently
34
+ raise SecurityError,
35
+ "Path specified is not configured in Hyrax ingest whitelist: " \
36
+ "#{path}"
37
+ end
38
+ end
39
+ end
40
+ end