enju_loc 0.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +38 -0
  5. data/app/assets/javascripts/loc_search.js +2 -0
  6. data/app/assets/stylesheets/loc_search.css +4 -0
  7. data/app/controllers/loc_search_controller.rb +49 -0
  8. data/app/helpers/loc_search_helper.rb +18 -0
  9. data/app/models/loc_search.rb +97 -0
  10. data/app/views/loc_search/index.html.erb +49 -0
  11. data/config/locales/en.yml +13 -0
  12. data/config/locales/ja.yml +11 -0
  13. data/config/routes.rb +3 -0
  14. data/lib/enju_loc.rb +21 -0
  15. data/lib/enju_loc/engine.rb +7 -0
  16. data/lib/enju_loc/loc_search.rb +537 -0
  17. data/lib/enju_loc/version.rb +3 -0
  18. data/lib/tasks/enju_loc_tasks.rake +4 -0
  19. data/spec/cassette_library/LocSearch/_ModsRecord/should_parse_MODS_metadata.yml +111 -0
  20. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_create_a_valid_manifestation.yml +113 -0
  21. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_create_lcsh_subjects_only.yml +66 -0
  22. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_create_multiple_series_statements.yml +69 -0
  23. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_distinguish_title_information_with_subject.yml +67 -0
  24. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_import_a_manifestation_that_has_invalid_classification.yml +81 -0
  25. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_import_another_serial.yml +85 -0
  26. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_import_audio_book.yml +91 -0
  27. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_import_e-resource.yml +73 -0
  28. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_import_note_fields.yml +72 -0
  29. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_import_publication_year.yml +78 -0
  30. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_import_serial.yml +70 -0
  31. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_import_video_publication.yml +204 -0
  32. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_parse_title_information_properly.yml +80 -0
  33. data/spec/cassette_library/LocSearch/_import_from_sru_response/should_support_name_and_title_subjects.yml +77 -0
  34. data/spec/cassette_library/LocSearch/_search/should_return_a_search_result.yml +353 -0
  35. data/spec/cassette_library/LocSearchController/GET_index/should_get_index.yml +353 -0
  36. data/spec/cassette_library/LocSearchController/GET_index/should_get_index_with_page_parameter.yml +415 -0
  37. data/spec/cassette_library/LocSearchController/POST_create/should_create_a_bibliographic_record_if_lccn_is_set.yml +140 -0
  38. data/spec/cassette_library/LocSearchController/POST_create/should_not_create_a_bibliographic_record_if_lccn_is_not_set.yml +38 -0
  39. data/spec/controllers/loc_search_controller_spec.rb +44 -0
  40. data/spec/dummy/README.rdoc +28 -0
  41. data/spec/dummy/Rakefile +6 -0
  42. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  43. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  44. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  45. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  46. data/spec/dummy/app/models/setting.rb +4 -0
  47. data/spec/dummy/app/models/user.rb +8 -0
  48. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  49. data/spec/dummy/config.ru +4 -0
  50. data/spec/dummy/config/application.rb +47 -0
  51. data/spec/dummy/config/application.yml +38 -0
  52. data/spec/dummy/config/boot.rb +10 -0
  53. data/spec/dummy/config/database.yml +25 -0
  54. data/spec/dummy/config/environment.rb +5 -0
  55. data/spec/dummy/config/environments/development.rb +30 -0
  56. data/spec/dummy/config/environments/production.rb +60 -0
  57. data/spec/dummy/config/environments/test.rb +39 -0
  58. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  59. data/spec/dummy/config/initializers/devise.rb +207 -0
  60. data/spec/dummy/config/initializers/inflections.rb +16 -0
  61. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  62. data/spec/dummy/config/initializers/session_store.rb +3 -0
  63. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  64. data/spec/dummy/config/locales/en.yml +23 -0
  65. data/spec/dummy/config/routes.rb +58 -0
  66. data/spec/dummy/config/secrets.yml +22 -0
  67. data/spec/dummy/db/development.sqlite3 +0 -0
  68. data/spec/dummy/db/migrate/001_create_agents.rb +50 -0
  69. data/spec/dummy/db/migrate/002_devise_create_users.rb +46 -0
  70. data/spec/dummy/db/migrate/005_create_manifestations.rb +44 -0
  71. data/spec/dummy/db/migrate/006_create_items.rb +21 -0
  72. data/spec/dummy/db/migrate/012_create_owns.rb +12 -0
  73. data/spec/dummy/db/migrate/015_create_creates.rb +12 -0
  74. data/spec/dummy/db/migrate/029_create_subjects.rb +27 -0
  75. data/spec/dummy/db/migrate/041_create_roles.rb +13 -0
  76. data/spec/dummy/db/migrate/047_create_produces.rb +12 -0
  77. data/spec/dummy/db/migrate/059_create_libraries.rb +28 -0
  78. data/spec/dummy/db/migrate/069_create_shelves.rb +15 -0
  79. data/spec/dummy/db/migrate/073_create_carrier_types.rb +11 -0
  80. data/spec/dummy/db/migrate/077_create_user_groups.rb +12 -0
  81. data/spec/dummy/db/migrate/080_create_library_groups.rb +17 -0
  82. data/spec/dummy/db/migrate/112_create_frequencies.rb +12 -0
  83. data/spec/dummy/db/migrate/117_create_form_of_works.rb +12 -0
  84. data/spec/dummy/db/migrate/120_create_baskets.rb +12 -0
  85. data/spec/dummy/db/migrate/124_create_bookstores.rb +17 -0
  86. data/spec/dummy/db/migrate/125_create_donates.rb +12 -0
  87. data/spec/dummy/db/migrate/130_create_request_status_types.rb +12 -0
  88. data/spec/dummy/db/migrate/131_create_request_types.rb +12 -0
  89. data/spec/dummy/db/migrate/142_create_classifications.rb +19 -0
  90. data/spec/dummy/db/migrate/144_create_classification_types.rb +16 -0
  91. data/spec/dummy/db/migrate/145_create_subject_heading_types.rb +16 -0
  92. data/spec/dummy/db/migrate/146_create_subject_types.rb +16 -0
  93. data/spec/dummy/db/migrate/20080830154109_create_realizes.rb +13 -0
  94. data/spec/dummy/db/migrate/20080830172106_create_exemplifies.rb +13 -0
  95. data/spec/dummy/db/migrate/20080905191442_create_agent_types.rb +12 -0
  96. data/spec/dummy/db/migrate/20081006090811_create_subscriptions.rb +17 -0
  97. data/spec/dummy/db/migrate/20081006093246_create_subscribes.rb +14 -0
  98. data/spec/dummy/db/migrate/20081023092436_create_search_engines.rb +17 -0
  99. data/spec/dummy/db/migrate/20081025083323_create_countries.rb +28 -0
  100. data/spec/dummy/db/migrate/20081025083905_create_languages.rb +23 -0
  101. data/spec/dummy/db/migrate/20081027150907_create_picture_files.rb +15 -0
  102. data/spec/dummy/db/migrate/20081028083142_create_agent_import_files.rb +20 -0
  103. data/spec/dummy/db/migrate/20081028083208_create_resource_import_files.rb +20 -0
  104. data/spec/dummy/db/migrate/20090705133942_add_attachments_picture_to_picture_file.rb +15 -0
  105. data/spec/dummy/db/migrate/20090705212043_add_attachments_attachment_to_manifestation.rb +15 -0
  106. data/spec/dummy/db/migrate/20090719201843_create_extents.rb +12 -0
  107. data/spec/dummy/db/migrate/20090720091106_create_medium_of_performances.rb +12 -0
  108. data/spec/dummy/db/migrate/20090720091429_create_content_types.rb +12 -0
  109. data/spec/dummy/db/migrate/20090812151902_create_agent_relationship_types.rb +12 -0
  110. data/spec/dummy/db/migrate/20091012101112_add_dcndl_schema.rb +27 -0
  111. data/spec/dummy/db/migrate/20091025080447_create_licenses.rb +12 -0
  112. data/spec/dummy/db/migrate/20091202124834_create_versions.rb +18 -0
  113. data/spec/dummy/db/migrate/20091214131723_create_series_statements.rb +13 -0
  114. data/spec/dummy/db/migrate/20100129142347_create_import_requests.rb +14 -0
  115. data/spec/dummy/db/migrate/20100211105551_add_admin_networks_to_library_group.rb +9 -0
  116. data/spec/dummy/db/migrate/20100223121519_rename_series_statement_title_to_original_title.rb +13 -0
  117. data/spec/dummy/db/migrate/20100314190054_add_opening_hour_to_library.rb +9 -0
  118. data/spec/dummy/db/migrate/20100321235924_add_series_statement_identifier_to_series_statement.rb +10 -0
  119. data/spec/dummy/db/migrate/20100525124311_create_manifestation_relationships.rb +13 -0
  120. data/spec/dummy/db/migrate/20100606065209_create_user_has_roles.rb +12 -0
  121. data/spec/dummy/db/migrate/20100606073747_create_agent_relationships.rb +13 -0
  122. data/spec/dummy/db/migrate/20100607044753_create_manifestation_relationship_types.rb +12 -0
  123. data/spec/dummy/db/migrate/20100814091104_add_position_to_agent_relationship.rb +11 -0
  124. data/spec/dummy/db/migrate/20100925043847_create_resource_import_results.rb +15 -0
  125. data/spec/dummy/db/migrate/20100925074559_create_agent_import_results.rb +11 -0
  126. data/spec/dummy/db/migrate/20101212070145_add_acquired_at_to_item.rb +9 -0
  127. data/spec/dummy/db/migrate/20110222073537_add_url_to_library_group.rb +9 -0
  128. data/spec/dummy/db/migrate/20110301035123_add_pub_date_to_manifestation.rb +9 -0
  129. data/spec/dummy/db/migrate/20110301121550_add_birth_date_and_death_date_to_agent.rb +11 -0
  130. data/spec/dummy/db/migrate/20110318183304_add_valid_period_for_new_user_to_user_group.rb +11 -0
  131. data/spec/dummy/db/migrate/20110603184217_add_edit_mode_to_resource_import_file.rb +9 -0
  132. data/spec/dummy/db/migrate/20110619064807_add_edition_string_to_manifestation.rb +9 -0
  133. data/spec/dummy/db/migrate/20110620173525_add_bookstore_id_to_item.rb +11 -0
  134. data/spec/dummy/db/migrate/20110627034940_create_series_statement_merge_lists.rb +9 -0
  135. data/spec/dummy/db/migrate/20110627035057_create_series_statement_merges.rb +12 -0
  136. data/spec/dummy/db/migrate/20110913120629_add_lft_and_rgt_to_classification.rb +11 -0
  137. data/spec/dummy/db/migrate/20110916091020_add_volume_number_to_manifestation.rb +13 -0
  138. data/spec/dummy/db/migrate/20110916103953_add_manifestaiton_id_to_series_statement.rb +10 -0
  139. data/spec/dummy/db/migrate/20110918162329_add_note_to_series_statement.rb +9 -0
  140. data/spec/dummy/db/migrate/20111124110059_create_create_types.rb +12 -0
  141. data/spec/dummy/db/migrate/20111124110319_create_realize_types.rb +12 -0
  142. data/spec/dummy/db/migrate/20111124110355_create_produce_types.rb +12 -0
  143. data/spec/dummy/db/migrate/20111124112131_add_create_type_to_create.rb +7 -0
  144. data/spec/dummy/db/migrate/20120105074911_add_isil_to_library.rb +5 -0
  145. data/spec/dummy/db/migrate/20120125152919_add_title_subseries_transcription_to_series_statement.rb +6 -0
  146. data/spec/dummy/db/migrate/20120129014038_create_budget_types.rb +12 -0
  147. data/spec/dummy/db/migrate/20120129020544_add_budget_type_id_to_item.rb +6 -0
  148. data/spec/dummy/db/migrate/20120319120638_add_content_type_id_to_manifestation.rb +6 -0
  149. data/spec/dummy/db/migrate/20120319173203_create_accepts.rb +14 -0
  150. data/spec/dummy/db/migrate/20120406020752_add_url_to_subject.rb +5 -0
  151. data/spec/dummy/db/migrate/20120410104851_add_year_of_publication_to_manifestation.rb +5 -0
  152. data/spec/dummy/db/migrate/20120413072700_add_picture_meta_to_picture_file.rb +5 -0
  153. data/spec/dummy/db/migrate/20120413100352_add_fingerprint_to_picture_file.rb +5 -0
  154. data/spec/dummy/db/migrate/20120413161340_add_fingerprint_to_resource_import_file.rb +5 -0
  155. data/spec/dummy/db/migrate/20120413161403_add_fingerprint_to_agent_import_file.rb +5 -0
  156. data/spec/dummy/db/migrate/20120413170705_add_error_message_to_resource_import_file.rb +5 -0
  157. data/spec/dummy/db/migrate/20120413170720_add_error_message_to_agent_import_file.rb +5 -0
  158. data/spec/dummy/db/migrate/20120415164821_add_attachment_meta_to_manifestation.rb +5 -0
  159. data/spec/dummy/db/migrate/20120418081407_add_month_of_publication_to_manifestation.rb +5 -0
  160. data/spec/dummy/db/migrate/20120510140958_add_closed_to_shelf.rb +5 -0
  161. data/spec/dummy/db/migrate/20120511072422_add_agent_identifier_to_agent.rb +6 -0
  162. data/spec/dummy/db/migrate/20120602141129_add_edit_mode_to_agent_import_file.rb +5 -0
  163. data/spec/dummy/db/migrate/20121116031206_add_fulltext_content_to_manifestation.rb +5 -0
  164. data/spec/dummy/db/migrate/20121116033446_add_doi_to_manifestation.rb +6 -0
  165. data/spec/dummy/db/migrate/20130221154434_add_additional_attributes_to_user.rb +16 -0
  166. data/spec/dummy/db/migrate/20130412083556_add_latitude_and_longitude_to_library.rb +6 -0
  167. data/spec/dummy/db/migrate/20130421093852_add_periodical_to_manifestation.rb +5 -0
  168. data/spec/dummy/db/migrate/20130421155019_add_creator_string_to_series_statement.rb +7 -0
  169. data/spec/dummy/db/migrate/20130421164124_add_series_master_to_series_statement.rb +5 -0
  170. data/spec/dummy/db/migrate/20130429020822_add_root_manifestation_id_to_series_statement.rb +6 -0
  171. data/spec/dummy/db/migrate/20130504133816_add_manifestation_id_to_subject.rb +6 -0
  172. data/spec/dummy/db/migrate/20130504143515_add_manifestation_id_to_classification.rb +6 -0
  173. data/spec/dummy/db/migrate/20130504195916_add_subject_heading_type_id_to_subject.rb +5 -0
  174. data/spec/dummy/db/migrate/20130506175303_create_identifier_types.rb +12 -0
  175. data/spec/dummy/db/migrate/20130506175834_create_identifiers.rb +15 -0
  176. data/spec/dummy/db/migrate/20130509185724_add_statement_of_responsibility_to_manifestation.rb +5 -0
  177. data/spec/dummy/db/migrate/20140110122216_create_user_import_files.rb +18 -0
  178. data/spec/dummy/db/migrate/20140110131010_create_user_import_results.rb +11 -0
  179. data/spec/dummy/db/migrate/20140122054321_create_profiles.rb +20 -0
  180. data/spec/dummy/db/migrate/20140519170214_create_resource_import_file_transitions.rb +14 -0
  181. data/spec/dummy/db/migrate/20140519171220_create_import_request_transitions.rb +14 -0
  182. data/spec/dummy/db/migrate/20140524020735_create_agent_import_file_transitions.rb +14 -0
  183. data/spec/dummy/db/migrate/20140524074813_create_user_import_file_transitions.rb +14 -0
  184. data/spec/dummy/db/migrate/20140610123439_drop_email_unique_constraint_enju_leaf_rc10.rb +11 -0
  185. data/spec/dummy/db/migrate/20140614065404_create_resource_export_files.rb +11 -0
  186. data/spec/dummy/db/migrate/20140614141500_create_resource_export_file_transitions.rb +14 -0
  187. data/spec/dummy/db/migrate/20140628072217_add_user_encoding_to_user_import_file.rb +5 -0
  188. data/spec/dummy/db/migrate/20140628073524_add_user_encoding_to_agent_import_file.rb +5 -0
  189. data/spec/dummy/db/migrate/20140628073535_add_user_encoding_to_resource_import_file.rb +5 -0
  190. data/spec/dummy/db/migrate/20140709113413_create_user_export_files.rb +11 -0
  191. data/spec/dummy/db/migrate/20140709113905_create_user_export_file_transitions.rb +14 -0
  192. data/spec/dummy/db/migrate/20140720140916_add_binding_item_identifier_to_item.rb +8 -0
  193. data/spec/dummy/db/migrate/20140720170714_add_default_library_id_to_user_import_file.rb +5 -0
  194. data/spec/dummy/db/migrate/20140720170735_add_default_user_group_id_to_user_import_file.rb +5 -0
  195. data/spec/dummy/db/migrate/20140721151416_add_default_shelf_id_to_resource_import_file.rb +5 -0
  196. data/spec/dummy/db/migrate/20140802082007_add_manifestation_id_to_item.rb +6 -0
  197. data/spec/dummy/db/migrate/20140811031145_add_expired_at_to_profile.rb +5 -0
  198. data/spec/dummy/db/migrate/20140813182425_add_publication_place_to_manifestation.rb +5 -0
  199. data/spec/dummy/db/schema.rb +1008 -0
  200. data/spec/dummy/db/test.sqlite3 +0 -0
  201. data/spec/dummy/log/development.log +2139 -0
  202. data/spec/dummy/log/test.log +21513 -0
  203. data/spec/dummy/public/404.html +67 -0
  204. data/spec/dummy/public/422.html +67 -0
  205. data/spec/dummy/public/500.html +66 -0
  206. data/spec/dummy/public/favicon.ico +0 -0
  207. data/spec/dummy/script/rails +6 -0
  208. data/spec/fixtures/agent_types.yml +35 -0
  209. data/spec/fixtures/carrier_types.yml +51 -0
  210. data/spec/fixtures/classification_types.yml +13 -0
  211. data/spec/fixtures/content_types.yml +19 -0
  212. data/spec/fixtures/countries.yml +2059 -0
  213. data/spec/fixtures/frequencies.yml +76 -0
  214. data/spec/fixtures/identifier_types.yml +36 -0
  215. data/spec/fixtures/languages.yml +1901 -0
  216. data/spec/fixtures/roles.yml +35 -0
  217. data/spec/fixtures/subject_heading_types.yml +39 -0
  218. data/spec/fixtures/subject_types.yml +42 -0
  219. data/spec/fixtures/user_has_roles.yml +41 -0
  220. data/spec/fixtures/users.yml +51 -0
  221. data/spec/models/loc_search_spec.rb +195 -0
  222. data/spec/rails_helper.rb +43 -0
  223. data/spec/spec_helper.rb +47 -0
  224. data/spec/support/controller_macros.rb +25 -0
  225. data/spec/support/devise.rb +4 -0
  226. metadata +615 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 161a209a154952a583d5b7097b1d0095da0799dd
4
+ data.tar.gz: 28c269f6d80449a75cafc7222fc7e9d0dbab9d47
5
+ SHA512:
6
+ metadata.gz: 5f0159d182e91d36adafde8eacd5cba7a9f3a030e16f786d1863372c4dc2c05fb613ecf7f87c11d77a74a898bd4fe5ff0d93c1ee5ea244f10c8ccc44b0f6fec8
7
+ data.tar.gz: 9f510d2b528a306917ccedd6d824bffa495b0c1529ac4a14e0a3b26a7fd813c66ee30532f59a04594404373e2ed6e8c0b9b50e3948fbf290c24acacee6cf792c
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = EnjuLoc
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'EnjuLoc'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+
28
+ Bundler::GemHelper.install_tasks
29
+
30
+ require 'rspec/core'
31
+ require 'rspec/core/rake_task'
32
+
33
+ RSpec::Core::RakeTask.new(:spec) do |spec|
34
+ spec.pattern = FileList['spec/**/*_spec.rb']
35
+ end
36
+
37
+
38
+ task :default => :spec
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,49 @@
1
+ class LocSearchController < ApplicationController
2
+ before_filter :authenticate_user!
3
+ before_filter :check_librarian
4
+
5
+ def index
6
+ if params[:page].to_i <= 0
7
+ page = 1
8
+ else
9
+ page = params[:page].to_i
10
+ end
11
+ @query = params[ :query ].to_s.strip
12
+ books = LocSearch.search( @query, { :page => page } )
13
+ @books = Kaminari.paginate_array(
14
+ books[:items],
15
+ :total_count => books[ :total_entries ],
16
+ :page => page
17
+ ).page( page ).per( 10 )
18
+ respond_to do |format|
19
+ format.html
20
+ end
21
+ end
22
+
23
+ def create
24
+ begin
25
+ @manifestation = LocSearch.import_from_sru_response(params[:book][:lccn])
26
+ rescue EnjuLoc::RecordNotFound
27
+ end
28
+ respond_to do |format|
29
+ if @manifestation.try(:save)
30
+ flash[:notice] = t('controller.successfully_created', :model => t('activerecord.models.manifestation'))
31
+ format.html { redirect_to manifestation_url(@manifestation) }
32
+ else
33
+ if @manifestation and not @manifestation.valid?
34
+ flash[:notice] = @manifestation.errors.messages
35
+ else
36
+ flash[:notice] = t('enju_loc.record_not_found')
37
+ end
38
+ format.html { redirect_to loc_search_index_url }
39
+ end
40
+ end
41
+ end
42
+
43
+ private
44
+ def check_librarian
45
+ unless current_user.try(:has_role?, 'Librarian')
46
+ access_denied
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,18 @@
1
+ module LocSearchHelper
2
+ def link_to_import_from_loc(lccn)
3
+ if lccn.blank?
4
+ t('enju_loc.not_available')
5
+ else
6
+ identifier_type = IdentifierType.where(:name => 'lccn').first
7
+ if identifier_type
8
+ manifestation = Identifier.where(:body => lccn, :identifier_type_id => identifier_type
9
+ .id).first.try(:manifestation)
10
+ end
11
+ unless manifestation
12
+ link_to t('enju_loc.add'), loc_search_index_path(:book => {:lccn => lccn}), :method => :post
13
+ else
14
+ link_to t('enju_loc.already_exists'), manifestation
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,97 @@
1
+ class LocSearch
2
+ def initialize( node )
3
+ @node = node
4
+ end
5
+ class ModsRecord < LocSearch
6
+ MODS_NS = { "mods" => "http://www.loc.gov/mods/v3" }
7
+ def title
8
+ title = @node.xpath( './/mods:titleInfo/mods:title', MODS_NS ).first.content
9
+ subtitle = @node.xpath( './/mods:titleInfo/mods:subTitle', MODS_NS ).first
10
+ title += " : #{ subtitle.content }" if subtitle
11
+ title
12
+ end
13
+ def lccn
14
+ @node.xpath( './/mods:mods/mods:identifier[@type="lccn"]', MODS_NS ).first.try( :content )
15
+ end
16
+ def creator
17
+ statement_of_responsibility = @node.at('.//mods:note[@type="statement of responsibility"]',MODS_NS).try(:content)
18
+ if statement_of_responsibility
19
+ statement_of_responsibility
20
+ else
21
+ names = @node.xpath( './/mods:name', MODS_NS )
22
+ creator = names.map do |name|
23
+ name.xpath( './/mods:namePart', MODS_NS ).map do |part|
24
+ if part.content
25
+ part.content
26
+ else
27
+ nil
28
+ end
29
+ end.compact.join( ", " )
30
+ end.join( " ; " )
31
+ creator
32
+ end
33
+ end
34
+ def publisher
35
+ names = @node.xpath( './/mods:publisher', MODS_NS ).map do |e|
36
+ e.content
37
+ end.join( ", " )
38
+ end
39
+ def pubyear
40
+ @node.xpath( './/mods:dateIssued', MODS_NS ).first.try(:content)
41
+ end
42
+ end
43
+
44
+ class DCRecord < LocSearch
45
+ DC_NS = { "dc" => "http://purl.org/dc/elements/1.1/" }
46
+ def title
47
+ title = @node.xpath( './/dc:title', DC_NS ).first.content
48
+ end
49
+ def lccn
50
+ @node.xpath( './/dc:identifier[@type="lccn"]', DC_NS ).first.content
51
+ end
52
+ def creator
53
+ end
54
+ end
55
+
56
+ # http://www.loc.gov/z3950/lcserver.html
57
+ LOC_SRU_BASEURL = "http://lx2.loc.gov:210/LCDB"
58
+ def self.make_sru_request_uri( query, options = {} )
59
+ if options[ :page ]
60
+ page = options[ :page ].to_i
61
+ options[ :startRecord ] = ( page - 1 ) * 10 + 1
62
+ options.delete :page
63
+ end
64
+ options = { :maximumRecords => 10, :recordSchema => :mods }.merge( options )
65
+ options = options.merge( { :query => query, :version => "1.1", :operation => "searchRetrieve" } )
66
+ params = options.map do |k, v|
67
+ "#{ URI.escape( k.to_s ) }=#{ URI.escape( v.to_s ) }"
68
+ end.join( '&' )
69
+ uri = "#{ LOC_SRU_BASEURL }?#{ params }"
70
+ end
71
+
72
+ def self.search( query, options = {} )
73
+ if query and not query.empty?
74
+ doc = nil
75
+ results = {}
76
+ url = make_sru_request_uri( query, options )
77
+ doc = Nokogiri::XML( open(url) )
78
+ items = doc.search( '//zs:record' ).map{|e| ModsRecord.new e }
79
+ @results = { :items => items,
80
+ :total_entries => doc.xpath( '//zs:numberOfRecords' ).first.try(:content).to_i }
81
+ else
82
+ { :items => [], :total_entries => 0 }
83
+ end
84
+ end
85
+
86
+ def self.import_from_sru_response( lccn )
87
+ identifier = Identifier.where(:body => lccn, :identifier_type_id => IdentifierType.where(:name => 'lccn').first_or_create.id).first
88
+ return if identifier
89
+ url = make_sru_request_uri( "bath.lccn=#{ lccn }" )
90
+ response = Nokogiri::XML( open(url) ).at( '//zs:recordData', {"zs"=>"http://www.loc.gov/zing/srw/"} )
91
+ return unless response.try( :content )
92
+ doc = Nokogiri::XML::Document.new
93
+ doc << response.at( "//mods:mods", { "mods" => "http://www.loc.gov/mods/v3" } )
94
+ Manifestation.import_record_from_loc( doc )
95
+ end
96
+ end
97
+
@@ -0,0 +1,49 @@
1
+ <div id="content_detail" class="ui-corner-all ui-widget-content">
2
+ <h1 class="title"><%= t('enju_loc.import_from_loc_search') %></h1>
3
+ <div id="content_list">
4
+ <p id="notice"><%= notice %></p>
5
+ <%= form_for :loc_search, :url => loc_search_index_path, :html => {:method => 'get'} do -%>
6
+ <p>
7
+ <%= label_tag :search_form_top, t('page.search_term') -%>:
8
+ <%= search_field_tag 'query', h(@query), {:id => 'search_form_top', :class => 'search_form'} -%>
9
+ <%= submit_tag t('page.search') -%>
10
+ </p>
11
+ <%- end -%>
12
+ <% if @query.present? %>
13
+ <p><%= t('enju_loc.number_of_search_results', :count => @books.total_count) %></p>
14
+ <table class="table table-striped index">
15
+ <tr>
16
+ <th></th>
17
+ <th><%= t('activerecord.attributes.manifestation.original_title') %></th>
18
+ </tr>
19
+ <% @books.each do |book| -%>
20
+ <tr class="line<%= cycle("0", "1") -%>">
21
+ <td>
22
+ <%= link_to_import_from_loc(book.lccn) %>
23
+ </td>
24
+ <td>
25
+ <strong><%= link_to_unless( book.lccn.blank?, book.title, "http://lccn.loc.gov/#{ book.lccn }" ) do book.title end %></strong><br />
26
+ <%=h book.creator -%><br />
27
+ <%=h book.publisher -%>,
28
+ <%=h book.pubyear -%>
29
+ </td>
30
+ </tr>
31
+ <% end -%>
32
+ </table>
33
+ <br />
34
+ <%= paginate(@books) %>
35
+
36
+ <% else %>
37
+ <%= javascript_tag("$('#search_form_top').focus()") -%>
38
+ <% end %>
39
+
40
+ </div>
41
+ </div>
42
+
43
+ <div id="submenu" class="ui-corner-all ui-widget-content">
44
+ <% if defined?(EnjuNdl) %>
45
+ <ul>
46
+ <li><%= link_to t('enju_ndl.import_from_ndl_search'), ndl_books_path( :query => @query ) %></li>
47
+ </ul>
48
+ <% end %>
49
+ </div>
@@ -0,0 +1,13 @@
1
+ en:
2
+ enju_loc:
3
+ import_from_loc_search: Import from LoC Search
4
+ record_not_found: Record not found.
5
+ not_available: Not available
6
+ add: Add
7
+ already_exists: Already exists
8
+ number_of_search_results:
9
+ one: "1 record found."
10
+ other: "%{count} records found."
11
+ activerecord:
12
+ models:
13
+ loc_search: LoC Catalog Search
@@ -0,0 +1,11 @@
1
+ ja:
2
+ enju_loc:
3
+ import_from_loc_search: 米国議会図書館検索によるインポート
4
+ record_not_found: 資料が見つかりません。
5
+ not_available: 利用不可
6
+ add: 追加
7
+ already_exists: 登録済み
8
+ number_of_search_results: "%{count} 件の資料が見つかりました。"
9
+ activerecord:
10
+ models:
11
+ loc_search: 米国議会図書館(LoC)蔵書検索
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ resources :loc_search, :only => [:index, :create]
3
+ end
data/lib/enju_loc.rb ADDED
@@ -0,0 +1,21 @@
1
+ require "enju_loc/engine"
2
+ require "enju_loc/loc_search"
3
+
4
+ module EnjuLoc
5
+ module ActsAsMethods
6
+ def self.included(base)
7
+ base.extend ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ def enju_loc_search
12
+ include EnjuLoc::LocSearch
13
+ end
14
+ end
15
+ end
16
+
17
+ class RecordNotFound < StandardError; end
18
+ class InvalidIsbn < StandardError; end
19
+ end
20
+
21
+ ActiveRecord::Base.send :include, EnjuLoc::ActsAsMethods
@@ -0,0 +1,7 @@
1
+ require 'enju_seed'
2
+ require 'nokogiri'
3
+
4
+ module EnjuLoc
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
@@ -0,0 +1,537 @@
1
+ module EnjuLoc
2
+ module LocSearch
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def loc_search(query, options = {})
9
+ options = {}.merge(options)
10
+ doc = nil
11
+ results = {}
12
+ startrecord = options[:idx].to_i
13
+ if startrecord == 0
14
+ startrecord = 1
15
+ end
16
+ url = LOC_SRU_BASEURL + "?operation=searchRetrieve&version=1.1&=query=#{ URI.escape(query) }"
17
+ cont = open( url ){|io| io.read }
18
+ parser = LibXML::XML::Parser.string( cont )
19
+ doc = parser.parse
20
+ end
21
+
22
+ def import_record_from_loc_isbn(options)
23
+ #if options[:isbn]
24
+ lisbn = Lisbn.new(options[:isbn])
25
+ raise EnjuLoc::InvalidIsbn unless lisbn.valid?
26
+ #end
27
+
28
+ manifestation = Manifestation.find_by_isbn(lisbn.isbn)
29
+ return manifestation.first if manifestation.present?
30
+
31
+ doc = return_xml(lisbn.isbn)
32
+ raise EnjuLoc::RecordNotFound unless doc
33
+ import_record_from_loc(doc)
34
+ end
35
+
36
+ NS = {"mods"=>"http://www.loc.gov/mods/v3"}
37
+ def import_record_from_loc( doc )
38
+ record_identifier = doc.at( '//mods:recordInfo/mods:recordIdentifier', NS ).try(:content)
39
+ loc_identifier = Identifier.where(:body => record_identifier, :identifier_type_id => IdentifierType.where(:name => 'loc_identifier').first_or_create.id).first
40
+ return loc_identifier.manifestation if loc_identifier
41
+
42
+ publishers = []
43
+ doc.xpath('//mods:publisher',NS).each do |publisher|
44
+ publishers << {
45
+ :full_name => publisher.content,
46
+ #:agent_identifier => publisher.attributes["about"].try(:content)
47
+ }
48
+ end
49
+
50
+ creators = get_creators(doc)
51
+
52
+ # title
53
+ titles = get_titles(doc)
54
+
55
+ # date of publication
56
+ date = get_date_of_publication(doc)
57
+
58
+ language = Language.where(:iso_639_2 => get_language(doc)).first
59
+ if language
60
+ language_id = language.id
61
+ else
62
+ language_id = 1
63
+ end
64
+
65
+ isbn = Lisbn.new(doc.at('/mods:mods/mods:identifier[@type="isbn"]',NS).try(:content).to_s).try(:isbn)
66
+ lccn = StdNum::LCCN.normalize(doc.at('/mods:mods/mods:identifier[@type="lccn"]',NS).try(:content).to_s)
67
+ issn = StdNum::ISSN.normalize(doc.at('/mods:mods/mods:identifier[@type="issn"]',NS).try(:content).to_s)
68
+ issn_l = StdNum::ISSN.normalize(doc.at('/mods:mods/mods:identifier[@type="issn-l"]',NS).try(:content).to_s)
69
+
70
+ types = get_carrier_and_content_types( doc )
71
+ content_type = types[ :content_type ]
72
+ carrier_type = types[ :carrier_type ]
73
+
74
+ record_identifier = doc.at('//mods:recordInfo/mods:recordIdentifier',NS).try(:content)
75
+ description = doc.xpath('//mods:abstract',NS).collect(&:content).join("\n")
76
+ edition_string = doc.at('//mods:edition',NS).try(:content)
77
+ extent = get_extent(doc)
78
+ note = get_note(doc)
79
+ frequency = get_frequency(doc)
80
+ issuance = doc.at('//mods:issuance',NS).try(:content)
81
+ is_serial = true if issuance == "serial"
82
+ statement_of_responsibility = get_statement_of_responsibility(doc)
83
+ access_address = get_access_address(doc)
84
+ publication_place = get_publication_place(doc)
85
+
86
+ manifestation = nil
87
+ Agent.transaction do
88
+ creator_agents = Agent.import_agents(creators)
89
+ publisher_agents = Agent.import_agents(publishers)
90
+
91
+ manifestation = Manifestation.new(
92
+ :manifestation_identifier => record_identifier,
93
+ :original_title => titles[:original_title],
94
+ :title_alternative => titles[:title_alternative],
95
+ :language_id => language_id,
96
+ :pub_date => date,
97
+ :description => description,
98
+ :edition_string => edition_string,
99
+ :statement_of_responsibility => statement_of_responsibility,
100
+ :start_page => extent[:start_page],
101
+ :end_page => extent[:end_page],
102
+ :height => extent[:height],
103
+ :access_address => access_address,
104
+ :note => note,
105
+ :publication_place => publication_place,
106
+ :periodical => is_serial,
107
+ )
108
+ identifier = {}
109
+ if isbn
110
+ identifier[:isbn] = Identifier.new(:body => isbn)
111
+ identifier[:isbn].identifier_type = IdentifierType.where(:name => 'isbn').first_or_create
112
+ end
113
+ if loc_identifier
114
+ identifier[:loc_identifier] = Identifier.new(:body => loc_identifier)
115
+ identifier[:loc_identifier].identifier_type = IdentifierType.where(:name => 'loc_identifier').first_or_create
116
+ end
117
+ if lccn
118
+ identifier[:lccn] = Identifier.new(:body => lccn)
119
+ identifier[:lccn].identifier_type = IdentifierType.where(:name => 'lccn').first_or_create
120
+ end
121
+ if issn
122
+ identifier[:issn] = Identifier.new(:body => issn)
123
+ identifier[:issn].identifier_type = IdentifierType.where(:name => 'issn').first_or_create
124
+ end
125
+ if issn_l
126
+ identifier[:issn_l] = Identifier.new(:body => issn_l)
127
+ identifier[:issn_l].identifier_type = IdentifierType.where(:name => 'issn_l').first_or_create
128
+ end
129
+ manifestation.carrier_type = carrier_type if carrier_type
130
+ manifestation.manifestation_content_type = content_type if content_type
131
+ manifestation.frequency = frequency if frequency
132
+ if manifestation.save
133
+ identifier.each do |k, v|
134
+ manifestation.identifiers << v if v.valid?
135
+ end
136
+ manifestation.publishers << publisher_agents
137
+ manifestation.creators << creator_agents
138
+ create_subject_related_elements(doc, manifestation)
139
+ create_series_statement(doc, manifestation)
140
+ if is_serial
141
+ create_series_master(doc, manifestation)
142
+ end
143
+ end
144
+ end
145
+ return manifestation
146
+ end
147
+
148
+ private
149
+ def create_subject_related_elements(doc, manifestation)
150
+ subjects = get_subjects(doc)
151
+ classifications = get_classifications(doc)
152
+ if defined?(EnjuSubject)
153
+ subject_heading_type = SubjectHeadingType.where(:name => 'lcsh').first_or_create
154
+ subjects.each do |term|
155
+ subject = Subject.where(:term => term[:term]).first
156
+ unless subject
157
+ subject = Subject.new(term)
158
+ subject.subject_heading_type = subject_heading_type
159
+ subject.subject_type = SubjectType.where(:name => 'concept').first_or_create
160
+ end
161
+ manifestation.subjects << subject
162
+ end
163
+ if classifications
164
+ classification_type = ClassificationType.where(:name => 'ddc').first_or_create
165
+ classifications.each do |ddc|
166
+ classification = Classification.where(:category => ddc).first
167
+ unless classification
168
+ classification = Classification.new(:category => ddc)
169
+ classification.classification_type = classification_type
170
+ end
171
+ manifestation.classifications << classification if classification.valid?
172
+ end
173
+ end
174
+ end
175
+ end
176
+
177
+ def create_series_statement(doc, manifestation)
178
+ doc.xpath('//mods:relatedItem[@type="series"]/mods:titleInfo/mods:title',NS).each do |series|
179
+ series_title = title = series.try(:content)
180
+ if title
181
+ series_title = title.split(';')[0].strip
182
+ end
183
+ if series_title
184
+ series_statement = SeriesStatement.where(:original_title => series_title).first_or_create
185
+ if series_statement.try(:save)
186
+ manifestation.series_statements << series_statement
187
+ end
188
+ end
189
+ end
190
+ end
191
+
192
+ def create_series_master(doc, manifestation)
193
+ titles = get_titles(doc)
194
+ series_statement = SeriesStatement.new(
195
+ :original_title => titles[:original_title],
196
+ :title_alternative => titles[:title_alternative],
197
+ :series_master => true,
198
+ )
199
+ if series_statement.try(:save)
200
+ manifestation.series_statements << series_statement
201
+ end
202
+ end
203
+
204
+ def get_titles(doc)
205
+ original_title = ""
206
+ title_alternatives = []
207
+ doc.xpath('//mods:mods/mods:titleInfo',NS).each do |e|
208
+ type = e.attributes["type"].try(:content)
209
+ case type
210
+ when "alternative", "translated", "abbreviated", "uniform"
211
+ title_alternatives << e.at('./mods:title',NS).content
212
+ else
213
+ nonsort = e.at('./mods:nonSort',NS).try(:content)
214
+ original_title << nonsort if nonsort
215
+ original_title << e.at('./mods:title',NS).try(:content)
216
+ subtitle = e.at('./mods:subTitle',NS).try(:content)
217
+ original_title << " : #{ subtitle }" if subtitle
218
+ partnumber = e.at('./mods:partNumber',NS).try(:content)
219
+ partname = e.at('./mods:partName',NS).try(:content)
220
+ partname = [ partnumber, partname ].compact.join( ": " )
221
+ original_title << ". #{ partname }" unless partname.blank?
222
+ end
223
+ end
224
+ { :original_title => original_title, :title_alternative => title_alternatives.join( " ; " ) }
225
+ end
226
+
227
+ def get_language(doc)
228
+ language = doc.at('//mods:language/mods:languageTerm[@authority="iso639-2b"]',NS).try(:content)
229
+ end
230
+
231
+ def get_access_address(doc)
232
+ access_address = nil
233
+ url = doc.at('//mods:location/mods:url',NS)
234
+ if url
235
+ usage = url.attributes["usage"].try(:content)
236
+ case usage
237
+ when "primary display", "primary"
238
+ access_address = url.try(:content)
239
+ end
240
+ end
241
+ access_address
242
+ end
243
+
244
+ def get_publication_place(doc)
245
+ place = doc.at('//mods:originInfo/mods:place/mods:placeTerm[@type="text"]',NS).try(:content)
246
+ end
247
+
248
+ def get_extent(doc)
249
+ extent = doc.at('//mods:extent',NS).try(:content)
250
+ value = {:start_page => nil, :end_page => nil, :height => nil}
251
+ if extent
252
+ extent = extent.split(';')
253
+ page = extent[0].try(:strip)
254
+ if page =~ /(\d+)\s*(p|page)/
255
+ value[:start_page] = 1
256
+ value[:end_page] = $1.dup.to_i
257
+ end
258
+ height = extent[1].try(:strip)
259
+ if height =~ /(\d+)\s*cm/
260
+ value[:height] = $1.dup.to_i
261
+ end
262
+ end
263
+ value
264
+ end
265
+
266
+ def get_statement_of_responsibility(doc)
267
+ note = doc.at('//mods:note[@type="statement of responsibility"]',NS).try(:content)
268
+ if note
269
+ note
270
+ else
271
+ doc.xpath('/mods:mods/mods:name',NS).map do |n|
272
+ n.at('./mods:namePart',NS).try(:content)
273
+ end.join( "; " )
274
+ end
275
+ end
276
+ def get_note(doc)
277
+ notes = []
278
+ doc.xpath('//mods:note',NS).each do |note|
279
+ type = note.attributes['type'].try(:content)
280
+ next if type == "statement of responsibility"
281
+ note_s = note.try( :content )
282
+ notes << note_s unless note_s.blank?
283
+ end
284
+ if notes.empty?
285
+ nil
286
+ else
287
+ notes.join( ";\n" )
288
+ end
289
+ end
290
+ def get_date_of_publication(doc)
291
+ dates = []
292
+ doc.xpath('//mods:dateIssued',NS).each do |pub_date|
293
+ pub_date = pub_date.content.sub( /\A[cp]/, '' )
294
+ next unless pub_date =~ /^\d+(-\d\d?){0,2}$/
295
+ date = pub_date.split('-')
296
+ if date[0] and date[1]
297
+ dates << sprintf("%04d-%02d", date[0], date[1])
298
+ else
299
+ dates << pub_date
300
+ end
301
+ end
302
+ dates.compact.first
303
+ end
304
+
305
+ # derived from marcfrequency: http://www.loc.gov/standards/valuelist/marcfrequency.html
306
+ MARCFREQUENCY = [
307
+ "Continuously updated",
308
+ "Daily",
309
+ "Semiweekly",
310
+ "Three times a week",
311
+ "Weekly",
312
+ "Biweekly",
313
+ "Three times a month",
314
+ "Semimonthly",
315
+ "Monthly",
316
+ "Bimonthly",
317
+ "Quarterly",
318
+ "Three times a year",
319
+ "Semiannual",
320
+ "Annual",
321
+ "Biennial",
322
+ "Triennial",
323
+ "Completely irregular",
324
+ ]
325
+ def get_frequency(doc)
326
+ frequencies = []
327
+ doc.xpath('//mods:frequency',NS).each do |freq|
328
+ frequency = freq.try(:content)
329
+ MARCFREQUENCY.each do |freq_regex|
330
+ if /\A(#{freq_regex})/ =~ frequency
331
+ frequency_name = freq_regex.downcase.gsub( /\s+/, "_" )
332
+ frequencies << Frequency.where( :name => frequency_name ).first
333
+ end
334
+ end
335
+ end
336
+ frequencies.compact.first
337
+ end
338
+
339
+ def get_creators(doc)
340
+ creators = []
341
+ doc.xpath('/mods:mods/mods:name',NS).each do |creator|
342
+ creators << {
343
+ :full_name => creator.xpath('./mods:namePart',NS).collect(&:content).join( ", " ),
344
+ }
345
+ end
346
+ creators.uniq
347
+ end
348
+
349
+ # TODO:only LCSH-based parsing...
350
+ def get_subjects(doc)
351
+ subjects = []
352
+ doc.xpath('//mods:subject[@authority="lcsh"]',NS).each do |s|
353
+ subject = []
354
+ s.xpath('./*',NS).each do |subelement|
355
+ type = subelement.name
356
+ case subelement.name
357
+ when "topic", "geographic", "genre", "temporal"
358
+ subject << { :type => type , :term => subelement.try(:content) }
359
+ when "titleInfo"
360
+ subject << { :type => type, :term => subelement.at('./mods:title',NS).try(:content) }
361
+ when "name"
362
+ name = subelement.xpath('./mods:namePart',NS).map{|e| e.try(:content) }.join( ", " )
363
+ subject << { :type => type, :term => name }
364
+ end
365
+ end
366
+ next if subject.compact.empty?
367
+ if subject.size > 1 and subject[0][:type] == "name" and subject[1][:type] == "titleInfo"
368
+ subject[0..1] = { :term => subject[0..1].map{|e|e[:term]}.join( ". " ) }
369
+ end
370
+ subjects << {
371
+ :term => subject.map{|e|e[:term]}.compact.join( "--" )
372
+ }
373
+ end
374
+ subjects
375
+ end
376
+
377
+ # TODO:support only DDC.
378
+ def get_classifications(doc)
379
+ classifications = []
380
+ doc.xpath('//mods:classification[@authority="ddc"]',NS).each do|c|
381
+ ddc = c.content
382
+ if ddc
383
+ classifications << ddc.split(/[^\d\.]/).first.try(:strip)
384
+ end
385
+ end
386
+ classifications.compact
387
+ end
388
+
389
+ def get_carrier_and_content_types(doc)
390
+ carrier_type = content_type = nil
391
+ doc.xpath('//mods:form',NS).each do |e|
392
+ authority = e.attributes['authority'].try(:content)
393
+ case authority
394
+ when "gmd"
395
+ case e.content
396
+ when "electronic resource"
397
+ carrier_type = CarrierType.where(:name => 'file').first
398
+ when "videorecording"
399
+ content_type = ContentType.where(:name => 'video').first
400
+ #TODO: Enju needs more specific mappings...
401
+ when "art original"
402
+ when "microscope slides"
403
+ when "art reproduction"
404
+ when "model"
405
+ when "chart"
406
+ when "motion picture"
407
+ when "diorama"
408
+ when "picture"
409
+ when "realia"
410
+ when "filmstrip"
411
+ when "slide"
412
+ when "flash card"
413
+ when "sound recording"
414
+ when "game"
415
+ when "technical drawing"
416
+ when "graphic"
417
+ when "toy"
418
+ when "kit"
419
+ when "transparency"
420
+ when "microform"
421
+ end
422
+ when "marcsmd" # cf.http://www.loc.gov/standards/valuelist/marcsmd.html
423
+ case e.content
424
+ when "text", "braille", "large print", "regular print", "text in looseleaf binder"
425
+ carrier_type = CarrierType.where(:name => 'print').first
426
+ content_type = ContentType.where(:name => 'text').first
427
+ when "videorecording", "videocartridge", "videocassette", "videodisc", "videoreel"
428
+ content_type = ContentType.where(:name => 'video').first
429
+ when "electronic resource", "chip cartridge", "computer optical disc cartridge", "magnetic disk", "magneto-optical disc", "optical disc", "remote", "tape cartridge", "tape cassette", "tape reel"
430
+ carrier_type = CarrierType.where(:name => 'file').first
431
+ when "motion picture", "film cartridge", "film cassette", "film reel"
432
+ content_type = ContentType.where(:name => 'video').first
433
+ when "sound recording", "cylinder", "roll ", "sound cartridge", "sound cassette ", "sound disc ", "sound-tape reel", "sound-track film ", "wire recording"
434
+ conrent_type = ContentType.where(:name => 'audio').first
435
+ #when "nonprojected graphic", "chart", "collage", "drawing", "flash card", "painting", "photomechanical print", "photonegative", "photoprint", "picture", "print", "technical drawing", "projected graphic", "filmslip", "filmstrip cartridge", "filmstrip roll", "other filmstrip type ", "slide", "transparency"
436
+ # content_type = ContentType.where(:name => 'image').first
437
+ #TODO: Enju needs more specific mappings...
438
+ when "globe"
439
+ when "celestial globe"
440
+ when "earth moon globe"
441
+ when "planetary or lunar globe"
442
+ when "terrestrial globe"
443
+ when "map"
444
+ when "atlas"
445
+ when "diagram"
446
+ when "map"
447
+ when "model"
448
+ when "profile "
449
+ when "remote-sensing image"
450
+ when "section"
451
+ when "view"
452
+ when "microform"
453
+ when "aperture card"
454
+ when "microfiche"
455
+ when "microfiche cassette"
456
+ when "microfilm cartridge"
457
+ when "microfilm cassette"
458
+ when "microfilm reel"
459
+ when "microopaque"
460
+ when "tactile material"
461
+ when "braille"
462
+ when "combination"
463
+ when "moon"
464
+ when "tactile, with no writing system"
465
+ end
466
+ when "marcform" # cf. http://www.loc.gov/standards/valuelist/marcform.html
467
+ case e.content
468
+ when "print", "large print"
469
+ carrier_type = CarrierType.where(:name => 'print').first
470
+ content_type = ContentType.where(:name => 'text').first
471
+ when "electronic"
472
+ carrier_type = CarrierType.where(:name => 'file').first
473
+ #TODO: Enju needs more specific mappings...
474
+ when "microfiche"
475
+ when "braille"
476
+ when "microfilm"
477
+ end
478
+ end
479
+ end
480
+ doc.xpath('//mods:genre',NS).each do |e|
481
+ authority = e.attributes['authority'].try(:content)
482
+ case authority
483
+ when "rdacontent"
484
+ case e.content
485
+ when "computer dataset", "computer program"
486
+ content_type = ContentType.where(:name => 'file').first
487
+ when "sounds", "spoken word"
488
+ content_type = ContentType.where(:name => 'audio').first
489
+ when "text"
490
+ content_type = ContentType.where(:name => 'text').first
491
+ when "two-dimensional moving image"
492
+ content_type = ContentType.where(:name => 'video').first
493
+ #TODO: Enju needs more specific mappings...
494
+ when "cartographic dataset"
495
+ when "cartographic image"
496
+ when "cartographic moving image"
497
+ when "cartographic tactile image"
498
+ when "cartographic tactile three-dimensional form"
499
+ when "cartographic three-dimensional form"
500
+ when "notated movement"
501
+ when "notated music"
502
+ when "performed music"
503
+ when "still image"
504
+ when "tactile image"
505
+ when "tactile notated music"
506
+ when "tactile notated movement"
507
+ when "tactile text"
508
+ when "tactile three-dimensional form"
509
+ when "three-dimensional form"
510
+ when "three-dimensional moving image"
511
+ when "other"
512
+ when "unspecified"
513
+ end
514
+ end
515
+ end
516
+ type = doc.at('//mods:typeOfResource',NS).try(:content)
517
+ case type
518
+ when "text"
519
+ content_type = ContentType.where(:name => 'text').first
520
+ when "sound recording", "sound recording-musical", "sound recording-nonmusical"
521
+ content_type = ContentType.where(:name => 'audio').first
522
+ when "moving image"
523
+ content_type = ContentType.where(:name => 'video').first
524
+ when "software, multimedia"
525
+ carrier_type = ContentType.where(:name => 'file').first
526
+ #TODO: Enju needs more specific mappings...
527
+ when "cartographic "
528
+ when "notated music"
529
+ when "still image"
530
+ when "three dimensional object"
531
+ when "mixed material"
532
+ end
533
+ { :carrier_type => carrier_type, :content_type => content_type }
534
+ end
535
+ end
536
+ end
537
+ end