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
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ # Require the gems listed in Gemfile, including any gems
2
+ # you've limited to :test, :development, or :production.
3
+
4
+ require 'rspec/core/rake_task'
5
+ require 'bundler/gem_tasks'
6
+ require 'engine_cart/rake_task'
7
+
8
+ # Bundler.require(*Rails.groups)
9
+
10
+ # Rails.application.load_tasks
11
+
12
+ begin
13
+ require 'bundler/setup'
14
+ rescue LoadError
15
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
16
+ end
17
+
18
+ Bundler::GemHelper.install_tasks
19
+
20
+ # task :ci => ['engine_cart:generate'] do
21
+ # run the tests
22
+ # end
23
+
24
+ # RSpec::Core::RakeTask.new(:spec)
25
+
26
+ # task :default => :spec
27
+ # RSpec::Core::RakeTask.new
28
+
29
+ # Set up the test application prior to running jasmine tasks.
30
+ task :setup_test_server do
31
+ require 'engine_cart'
32
+ EngineCart.load_application!
33
+ end
34
+
35
+ Dir.glob('tasks/*.rake').each { |r| import r }
36
+ Dir.glob('lib/tasks/*.rake').each { |r| import r }
37
+
38
+ task default: :ci
@@ -0,0 +1,8 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperArticle`
3
+ module Hyrax
4
+ module Actors
5
+ class NewspaperArticleActor < Hyrax::Actors::BaseActor
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperContainer`
3
+ module Hyrax
4
+ module Actors
5
+ class NewspaperContainerActor < Hyrax::Actors::BaseActor
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperIssue`
3
+ module Hyrax
4
+ module Actors
5
+ class NewspaperIssueActor < Hyrax::Actors::BaseActor
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperPage`
3
+ module Hyrax
4
+ module Actors
5
+ class NewspaperPageActor < Hyrax::Actors::BaseActor
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperTitle`
3
+ module Hyrax
4
+ module Actors
5
+ class NewspaperTitleActor < Hyrax::Actors::BaseActor
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,88 @@
1
+ module NewspaperWorks
2
+ module Actors
3
+ class NewspaperWorksUploadActor < Hyrax::Actors::AbstractActor
4
+ def create(env)
5
+ # Ensure that work has title, set from form data if present
6
+ ensure_title(env)
7
+ # If NewspaperIssue, we might have a PDF to split; make a list of
8
+ # paths to PDF uploads before next_actor removes them
9
+ # from env.attributes, with state kept in instance variable
10
+ # until late in "heading back up" phase of the actor stack, where
11
+ # correct depositor value is already set on the issue (only
12
+ # at that point should we queue the job to create child pages).
13
+ @pdf_paths = []
14
+ hold_upload_paths(env) if env.curation_concern.class == NewspaperIssue
15
+ # pass to next actor, then handle issue uploads after other actors
16
+ # that are lower on the stack
17
+ next_actor.create(env) && after_other_actors(env)
18
+ end
19
+
20
+ def after_other_actors(env)
21
+ handle_issue_upload(env) if env.curation_concern.class == NewspaperIssue
22
+ # needs to return true to not break actor stack traversal
23
+ true
24
+ end
25
+
26
+ # Work must have a title to save, and this actor's .create/.update
27
+ # methods run prior to the setting of form data. This ensures
28
+ # appropriate title is set on model.
29
+ def ensure_title(env)
30
+ form_title = env.attributes['title']
31
+ return if form_title.nil?
32
+ env.curation_concern.title = form_title
33
+ end
34
+
35
+ def update(env)
36
+ # Ensure that work has title, set from form data if present
37
+ ensure_title(env)
38
+ @pdf_paths = []
39
+ hold_upload_paths(env) if env.curation_concern.class == NewspaperIssue
40
+ # pass to next actor, then handle issue uploads after other actors
41
+ # that are lower on the stack
42
+ next_actor.update(env) && after_other_actors(env)
43
+ end
44
+
45
+ def default_admin_set
46
+ AdminSet.find_or_create_default_admin_set_id
47
+ end
48
+
49
+ def queue_job(work, paths, user, admin_set_id)
50
+ NewspaperWorks::CreateIssuePagesJob.perform_later(
51
+ work,
52
+ paths,
53
+ user,
54
+ admin_set_id
55
+ )
56
+ end
57
+
58
+ def hold_upload_paths(env)
59
+ return unless env.attributes.keys.include? 'uploaded_files'
60
+ upload_ids = filter_file_ids(env.attributes['uploaded_files'])
61
+ return if upload_ids.empty?
62
+ uploads = Hyrax::UploadedFile.find(upload_ids)
63
+ paths = uploads.map(&method(:upload_path))
64
+ @pdf_paths = paths.select { |path| path.end_with?('.pdf') }
65
+ end
66
+
67
+ def handle_issue_upload(env)
68
+ return if @pdf_paths.empty?
69
+ work = env.curation_concern
70
+ # must persist work to serialize job using it
71
+ work.save!(validate: false)
72
+ user = env.current_ability.current_user.user_key
73
+ env.attributes[:admin_set_id] ||= default_admin_set
74
+ queue_job(work, @pdf_paths, user, env.attributes[:admin_set_id])
75
+ end
76
+
77
+ # Given Hyrax::Upload object, return path to file on local filesystem
78
+ def upload_path(upload)
79
+ # so many layers to this onion:
80
+ upload.file.file.file
81
+ end
82
+
83
+ def filter_file_ids(input)
84
+ Array.wrap(input).select(&:present?)
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/newspaper_works .js
2
+ //= link_directory ../stylesheets/newspaper_works .css
File without changes
@@ -0,0 +1,33 @@
1
+ /*jshint browser: true, nomen: false, eqnull: true, es5:true, trailing:true */
2
+
3
+ (function () {
4
+ "use strict";
5
+ var work_form = $("form[data-behavior='work-form']"),
6
+ Autocomplete = require('hyrax/autocomplete'),
7
+ LinkedData = require('hyrax/autocomplete/linked_data');
8
+
9
+ function patch_autocomplete() {
10
+ var method = Autocomplete.prototype.setup;
11
+ if (!window._autocomplete_patched) {
12
+ Autocomplete.prototype.setup = function (element, fieldName, url) {
13
+ // defer to original method for relevant BasicMetadata fields:
14
+ var defer = ['based_near', 'language', 'work'],
15
+ autourl = element.attr('data-autocomplete-url'),
16
+ declared = (element.attr('data-autocomplete') === fieldName),
17
+ ld = (declared && autourl && autourl.indexOf('authorities') !== -1),
18
+ additionalField = element.context === undefined;
19
+ if (additionalField || (ld && defer.indexOf(fieldName) == -1)) {
20
+ new LinkedData(element, url);
21
+ console.log('Using patched autocomplete for field', fieldName);
22
+ } else {
23
+ method(element, fieldName, url);
24
+ }
25
+ };
26
+ window._autocomplete_patched = true;
27
+ }
28
+ }
29
+
30
+ if (work_form.length && work_form.attr('id').indexOf('newspaper_') != -1) {
31
+ patch_autocomplete();
32
+ }
33
+ }());
@@ -0,0 +1,6 @@
1
+ /* toggle the ocr snippets collapse link text */
2
+ $(document).ready(function(){
3
+ $('.ocr_snippets_expand').click(function() {
4
+ $(this).text($(this).text() == '<%= I18n.t('blacklight.search.results.snippets.more') %>' ? '<%= I18n.t('blacklight.search.results.snippets.less') %>' : '<%= I18n.t('blacklight.search.results.snippets.more') %>');
5
+ });
6
+ });
@@ -0,0 +1,102 @@
1
+ /* highlight the query term on the search result thumbnail */
2
+ /* heavily based on https://github.com/mlibrary/fishrappr -> results_page_highlighting.js */
3
+
4
+ $().ready(function() {
5
+ // we use dummy value so we can use rails url_helper for URL (have to pass id)
6
+ var coordsUrl = '<%= Hyrax::Engine.routes.url_helpers.download_path("xyz", file: "json") %>';
7
+ var $thumbs = $("#documents .thumbnail img, #search-results .list-thumbnail img");
8
+
9
+ if ( $thumbs.length == 0 ) { return ; }
10
+
11
+ var viewType = 'list';
12
+ if ($('#documents.gallery').length) {
13
+ viewType = 'gallery';
14
+ }
15
+
16
+ $thumbs.each(function() {
17
+ var $thumb = $(this);
18
+ $thumb.on('load', function() {
19
+ addHighlights($(this));
20
+ });
21
+ })
22
+
23
+ var addHighlights = function($thumb) {
24
+ var $div = $thumb.closest(".thumbnail, .list-thumbnail");
25
+ var filesetId = $div.data('fileset');
26
+ var query = $div.data('query');
27
+ if ( query === undefined || query.length == 0 || filesetId === undefined || filesetId.length == 0 ) {
28
+ return ;
29
+ }
30
+
31
+ $.ajax({
32
+ url: coordsUrl.replace("xyz", filesetId),
33
+ method: 'GET',
34
+ dataType: 'json',
35
+ success: function (data) {
36
+
37
+ var thumbWidth = $thumb.width();
38
+ var thumbHeight = $thumb.height();
39
+ var trueWidth = data['width'];
40
+ var trueHeight = data['height'];
41
+ var hScale = thumbWidth / trueWidth;
42
+ var vScale = thumbHeight / trueHeight;
43
+ var paddingLeft, paddingTop;
44
+
45
+ // check if this is gallery or list view
46
+ if (viewType === 'gallery') {
47
+ var offset = $thumb.position();
48
+ paddingTop = offset.top;
49
+ var thumbOuterWidth = $thumb.outerWidth(true);
50
+ var thumbPaddingLeft = parseInt($div.css("padding-left"));
51
+ var documentPaddingLeft = parseInt($div.closest(".document").css("padding-left"));
52
+ paddingLeft = Math.round(((thumbOuterWidth - thumbWidth) / 2) + thumbPaddingLeft + documentPaddingLeft);
53
+ } else {
54
+ paddingLeft = parseInt($div.closest(".search-result-wrapper .col-md-2").css("padding-left"));
55
+ paddingTop = 0;
56
+ }
57
+
58
+ var queries = query.split(' ');
59
+
60
+ $.each(data['coords'], function (k, v) {
61
+ if (!inTerms(k, queries)) {
62
+ return;
63
+ }
64
+
65
+ for (var i=0; i < v.length; i++) {
66
+ var coords = v[i];
67
+ if ( coords == null ) { return; }
68
+
69
+ // decrease left, top; increase height, width
70
+ // so that highlight surrounds image with a bit of padding
71
+ var left = Math.round(coords[0] * hScale) + paddingLeft - 2;
72
+ var top = Math.round(coords[1] * vScale) + paddingTop - 2;
73
+ var width = Math.round(coords[2] * hScale) + 3;
74
+ var height = Math.round(coords[3] * vScale) + 3;
75
+ var unit = 'px';
76
+
77
+ // make sure highlight div isn't too small, else won't be visible
78
+ if ( height < 5 ) { height = 5; }
79
+ if ( width < 10 ) { width = 10; }
80
+
81
+ var $span = $('<div class="thumbnail_highlight"></div>').css({ top: top + unit, left: left + unit, width: width + unit, height: height + unit });
82
+ $span.appendTo($div);
83
+ }
84
+ })
85
+ }
86
+ });
87
+ };
88
+ })
89
+
90
+ function matchesTerm(ocr_string, query) {
91
+ var key = ocr_string.toLocaleLowerCase();
92
+ return key.indexOf(query.toLocaleLowerCase()) > -1;
93
+ }
94
+
95
+ function inTerms(ocr_string, queries) {
96
+ for (var i = 0; i < queries.length; i++) {
97
+ if (matchesTerm(ocr_string, queries[i])) {
98
+ return true;
99
+ }
100
+ }
101
+ return false;
102
+ }
@@ -0,0 +1,4 @@
1
+ // this file gets included in downstream application.js by installer
2
+
3
+ //= require newspaper_works/thumbnail_highlights
4
+ //= require newspaper_works/ocr_search
@@ -0,0 +1,13 @@
1
+ #issue_search_form_wrapper {
2
+ #q_issues {
3
+ width: 250px;
4
+ }
5
+
6
+ .input-group {
7
+ margin-bottom: 5px;
8
+ }
9
+ }
10
+
11
+ #front_page_search_form {
12
+ margin-top: 20px;
13
+ }
@@ -0,0 +1,18 @@
1
+ .calendar_day {
2
+ display: inline-block;
3
+ width: 17px;
4
+ height: 10px;
5
+ text-align: center;
6
+ }
7
+
8
+ .calendar_day_inactive {
9
+ color: gray;
10
+ }
11
+
12
+ .issues_calendar {
13
+ margin-bottom: 25px;
14
+ }
15
+
16
+ #issues_calendar_title h2 select {
17
+ font-size: 0.6em;
18
+ }
@@ -0,0 +1,4 @@
1
+ @import 'issues_calendar';
2
+ @import 'issue_search';
3
+ @import 'newspapers_search';
4
+ @import 'search_results';
@@ -0,0 +1,38 @@
1
+ #newspapers_search_form_wrapper {
2
+
3
+ #newspapers_search_form{
4
+ margin-top: 25px;
5
+
6
+ #keyword_input {
7
+ padding-bottom: 20px;
8
+ }
9
+
10
+ #date_range_limit_wrapper {
11
+ padding-bottom: 10px;
12
+
13
+ .date_input {
14
+ float: left;
15
+ margin-right: 20px;
16
+ }
17
+ }
18
+
19
+ .facet_scrollbox_wrapper {
20
+ margin-left: 15px;
21
+ }
22
+ }
23
+
24
+ }
25
+
26
+ #newspapers_search_help_wrapper {
27
+
28
+ ul.newspapers_help {
29
+ font-size: 12px;
30
+ padding-left: 24px;
31
+
32
+ li {
33
+ padding-bottom:10px;
34
+ }
35
+
36
+ }
37
+
38
+ }
@@ -0,0 +1,12 @@
1
+ $highlight-background-color: rgba(5,166,86,0.36);
2
+
3
+ #search-results .thumbnail_highlight, #documents .thumbnail_highlight {
4
+ background-color: $highlight-background-color;
5
+ z-index: 1000;
6
+ position: absolute;
7
+ }
8
+
9
+ .metadata em {
10
+ background-color: $highlight-background-color;
11
+ font-weight: bold;
12
+ }
@@ -0,0 +1,14 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperArticle`
3
+
4
+ module Hyrax
5
+ class NewspaperArticlesController < ApplicationController
6
+ # Adds Hyrax behaviors to the controller.
7
+ include Hyrax::WorksControllerBehavior
8
+ include Hyrax::BreadcrumbsForWorks
9
+ self.curation_concern_type = ::NewspaperArticle
10
+
11
+ # Use this line if you want to use a custom presenter
12
+ self.show_presenter = Hyrax::NewspaperArticlePresenter
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperContainer`
3
+
4
+ module Hyrax
5
+ class NewspaperContainersController < ApplicationController
6
+ # Adds Hyrax behaviors to the controller.
7
+ include Hyrax::WorksControllerBehavior
8
+ include Hyrax::BreadcrumbsForWorks
9
+ self.curation_concern_type = ::NewspaperContainer
10
+
11
+ # Use this line if you want to use a custom presenter
12
+ self.show_presenter = Hyrax::NewspaperContainerPresenter
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperIssue`
3
+
4
+ module Hyrax
5
+ class NewspaperIssuesController < ApplicationController
6
+ # Adds Hyrax behaviors to the controller.
7
+ include Hyrax::WorksControllerBehavior
8
+ include Hyrax::BreadcrumbsForWorks
9
+ self.curation_concern_type = ::NewspaperIssue
10
+
11
+ # Use this line if you want to use a custom presenter
12
+ self.show_presenter = Hyrax::NewspaperIssuePresenter
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperPage`
3
+
4
+ module Hyrax
5
+ class NewspaperPagesController < ApplicationController
6
+ # Adds Hyrax behaviors to the controller.
7
+ include Hyrax::WorksControllerBehavior
8
+ include Hyrax::BreadcrumbsForWorks
9
+ self.curation_concern_type = ::NewspaperPage
10
+
11
+ # Use this line if you want to use a custom presenter
12
+ self.show_presenter = Hyrax::NewspaperPagePresenter
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperTitle`
3
+ module Hyrax
4
+ class NewspaperTitlesController < ApplicationController
5
+ # Adds Hyrax behaviors to the controller.
6
+ include Hyrax::WorksControllerBehavior
7
+ include Hyrax::BreadcrumbsForWorks
8
+ self.curation_concern_type = ::NewspaperTitle
9
+
10
+ # Use this line if you want to use a custom presenter
11
+ self.show_presenter = Hyrax::NewspaperTitlePresenter
12
+ end
13
+ end
@@ -0,0 +1,117 @@
1
+ module NewspaperWorks
2
+ class NewspapersController < ApplicationController
3
+ # Adds Hyrax behaviors to the controller.
4
+ include Hyrax::WorksControllerBehavior
5
+ include Hyrax::BreadcrumbsForWorks
6
+
7
+ include NewspaperWorks::PageFinder
8
+
9
+ before_action :find_title
10
+ before_action :find_issue, only: [:issue, :page]
11
+ before_action :build_breadcrumbs
12
+
13
+ def title
14
+ if @title
15
+ params[:id] = @title['id']
16
+ @presenter = Hyrax::NewspaperTitlePresenter.new(@title, current_ability, request)
17
+ render 'hyrax/newspaper_titles/show'
18
+ else
19
+ bad_url_handler
20
+ end
21
+ end
22
+
23
+ def issue
24
+ if @issue
25
+ params[:id] = @issue['id']
26
+ @presenter = Hyrax::NewspaperIssuePresenter.new(@issue, current_ability, request)
27
+ render 'hyrax/newspaper_issues/show'
28
+ else
29
+ bad_url_handler
30
+ end
31
+ end
32
+
33
+ def page
34
+ @page = find_page
35
+ if @page
36
+ params[:id] = @page['id']
37
+ @presenter = Hyrax::NewspaperPagePresenter.new(@page, current_ability, request)
38
+ render 'hyrax/newspaper_pages/show'
39
+ else
40
+ bad_url_handler
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ # override from Hyrax::WorksControllerBehavior
47
+ # or else this evals to 'dashboard'
48
+ def decide_layout
49
+ File.join(theme, '1_column')
50
+ end
51
+
52
+ # override from Hyrax::BreadcrumbsForWorks; copy of Hyrax::Breadcrumbs
53
+ # so method gets called despite action_name != 'show'
54
+ def build_breadcrumbs
55
+ if request.referer
56
+ trail_from_referer
57
+ else
58
+ default_trail
59
+ end
60
+ end
61
+
62
+ def bad_url_handler
63
+ raise(ActionController::RoutingError, 'Not Found')
64
+ end
65
+
66
+ def find_title
67
+ unique_id_field = NewspaperWorks.config.publication_unique_id_field
68
+ solr_params = ["has_model_ssim:\"NewspaperTitle\""]
69
+ solr_params << "#{unique_id_field}:\"#{params[:unique_id]}\""
70
+ @title = find_object(solr_params.join(' AND '))
71
+ end
72
+
73
+ def find_issue
74
+ return nil unless @title
75
+ solr_params = ["has_model_ssim:\"NewspaperIssue\""]
76
+ solr_params << "publication_id_ssi:\"#{@title['id']}\""
77
+ solr_params << "publication_date_dtsi:\"#{params[:date]}T00:00:00Z\""
78
+ solr_params << "edition_number_tesim:\"#{edition_for_search}\""
79
+ @issue = find_object(solr_params.join(' AND '))
80
+ end
81
+
82
+ def find_page
83
+ return nil unless @issue
84
+ page_index = pagenum_to_index
85
+ pages = pages_for_issue(@issue['id'])
86
+ return nil if pages.blank? || pages[page_index].blank?
87
+ search_result_document(id: pages[page_index]['id'])
88
+ end
89
+
90
+ def find_object(solr_params)
91
+ begin
92
+ solr_resp = Blacklight.default_index.search(fq: solr_params)
93
+ rescue # in case of RSolr::Error, etc.
94
+ return nil
95
+ end
96
+ return nil unless solr_resp.documents.count == 1
97
+ object_id = solr_resp.documents.first['id']
98
+ # we run the search again, to add permissions/access filters
99
+ # invoked by Hyrax::WorkSearchBuilder
100
+ search_result_document(id: object_id)
101
+ end
102
+
103
+ def edition_for_search
104
+ edition = params[:edition]
105
+ default = '1'
106
+ return default if edition.nil?
107
+ edition = edition.gsub(/\Aed-/, '')
108
+ return default unless edition.to_i.positive?
109
+ edition
110
+ end
111
+
112
+ def pagenum_to_index
113
+ page_i = params[:page].gsub(/\Aseq-/, '').to_i
114
+ (page_i - 1).negative? ? 0 : (page_i - 1)
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,26 @@
1
+ # based heavily on BlacklightAdvancedSearch::AdvancedController
2
+ module NewspaperWorks
3
+ class NewspapersSearchController < CatalogController
4
+ def search_builder_class
5
+ NewspaperWorks::NewspapersSearchBuilder
6
+ end
7
+
8
+ def search
9
+ @response = newspaper_search_facets
10
+ end
11
+
12
+ private
13
+
14
+ # we need this for proper routing of search forms/links
15
+ def search_action_url(*args)
16
+ main_app.search_catalog_url(*args)
17
+ end
18
+
19
+ def newspaper_search_facets
20
+ response, = search_results(params) do |search_builder|
21
+ search_builder.except(:add_advanced_search_to_solr)
22
+ end
23
+ response
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperArticle`
3
+ module Hyrax
4
+ class NewspaperArticleForm < ::NewspaperWorks::NewspaperCoreFormData
5
+ self.model_class = ::NewspaperArticle
6
+ self.terms += [:alternative_title, :genre, :author, :photographer,
7
+ :publication_date, :volume, :edition_number, :edition_name,
8
+ :issue_number, :geographic_coverage, :extent, :page_number,
9
+ :section]
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperContainer`
3
+ module Hyrax
4
+ # Newspaper Container Form Class
5
+ class NewspaperContainerForm < ::NewspaperWorks::NewspaperCoreFormData
6
+ self.model_class = ::NewspaperContainer
7
+ self.terms += [:alternative_title, :extent, :publication_date_start,
8
+ :publication_date_end]
9
+ self.terms -= [:creator, :contributor, :description, :subject]
10
+ end
11
+ end