hydra-head 3.0.0pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +71 -0
- data/.gitmodules +6 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +257 -0
- data/README.textile +150 -0
- data/README_RAILS3_CHANGES.textile +42 -0
- data/Rakefile +5 -0
- data/TESTING.textile +85 -0
- data/app/controllers/assets_controller.rb +117 -0
- data/app/controllers/contributors_controller.rb +54 -0
- data/app/controllers/file_assets_controller.rb +152 -0
- data/app/controllers/permissions_controller.rb +137 -0
- data/app/controllers/user_sessions_controller.rb +14 -0
- data/app/helpers/article_metadata_helper.rb +80 -0
- data/app/helpers/blacklight_helper.rb +192 -0
- data/app/helpers/downloads_helper.rb +19 -0
- data/app/helpers/generic_content_objects_helper.rb +16 -0
- data/app/helpers/hydra_assets_helper.rb +75 -0
- data/app/helpers/hydra_djatoka_helper.rb +23 -0
- data/app/helpers/hydra_fedora_metadata_helper.rb +365 -0
- data/app/helpers/hydra_helper.rb +155 -0
- data/app/helpers/hydra_uploader_helper.rb +18 -0
- data/app/helpers/inline_editable_metadata_helper.rb +15 -0
- data/app/helpers/javascript_includes_helper.rb +93 -0
- data/app/helpers/release_process_helper.rb +32 -0
- data/app/models/audio_asset.rb +8 -0
- data/app/models/file_asset.rb +111 -0
- data/app/models/generic_content.rb +21 -0
- data/app/models/generic_image.rb +62 -0
- data/app/models/image_asset.rb +8 -0
- data/app/models/mods_asset.rb +6 -0
- data/app/models/role_mapper.rb +22 -0
- data/app/models/superuser.rb +6 -0
- data/app/models/video_asset.rb +8 -0
- data/app/views/_add_assets_links.html.erb +13 -0
- data/app/views/_brown_sidebar.html +15 -0
- data/app/views/_user_util_links.html.erb +31 -0
- data/app/views/catalog/_citation.html.erb +11 -0
- data/app/views/catalog/_constraints_element.html.erb +34 -0
- data/app/views/catalog/_delete_partials/_default.html.erb +29 -0
- data/app/views/catalog/_document_list.html.erb +11 -0
- data/app/views/catalog/_edit_partials/_default.html.erb +64 -0
- data/app/views/catalog/_edit_partials/_default_details.html.erb +15 -0
- data/app/views/catalog/_email_form.html.erb +9 -0
- data/app/views/catalog/_facets.html.erb +37 -0
- data/app/views/catalog/_flash_msg.html.erb +17 -0
- data/app/views/catalog/_home.html.erb +6 -0
- data/app/views/catalog/_home_text.html.erb +10 -0
- data/app/views/catalog/_index_partials/_default.html.erb +20 -0
- data/app/views/catalog/_index_partials/_default_details.html.erb +11 -0
- data/app/views/catalog/_index_partials/_default_group.html.erb +15 -0
- data/app/views/catalog/_search_form.html.erb +12 -0
- data/app/views/catalog/_show_partials/_default.html.erb +23 -0
- data/app/views/catalog/_show_partials/_default_details.html.erb +12 -0
- data/app/views/catalog/_show_partials/_facets.html.erb +52 -0
- data/app/views/catalog/_sms_form.html.erb +21 -0
- data/app/views/catalog/_sort_and_per_page.html.erb +22 -0
- data/app/views/catalog/_uva_tabs.html.erb +10 -0
- data/app/views/catalog/about.html.erb +0 -0
- data/app/views/catalog/show.html.erb +48 -0
- data/app/views/contributors/_add_contributor_split_button.html.erb +10 -0
- data/app/views/contributors/_edit_conference.html.erb +29 -0
- data/app/views/contributors/_edit_organization.html.erb +29 -0
- data/app/views/contributors/_edit_person.html.erb +42 -0
- data/app/views/contributors/_index.html.erb +12 -0
- data/app/views/contributors/_new.html.erb +10 -0
- data/app/views/contributors/_show_conference.html.erb +22 -0
- data/app/views/contributors/_show_organization.html.erb +29 -0
- data/app/views/contributors/_show_person.html.erb +17 -0
- data/app/views/contributors/new.html.erb +13 -0
- data/app/views/downloads/index.html.erb +1 -0
- data/app/views/file_assets/_deletable_result.html.erb +5 -0
- data/app/views/file_assets/_index.html.erb +15 -0
- data/app/views/file_assets/_new.html.erb +2 -0
- data/app/views/file_assets/_result.html.erb +16 -0
- data/app/views/file_assets/index.html.erb +5 -0
- data/app/views/fluid_infusion/_uploader.html.erb +81 -0
- data/app/views/fluid_infusion/_uploader_generic_content_objects.js.erb +38 -0
- data/app/views/fluid_infusion/_uploader_js.erb +45 -0
- data/app/views/generic_content_objects/_edit_description.html.erb +50 -0
- data/app/views/generic_content_objects/_new.html.erb +0 -0
- data/app/views/generic_content_objects/_show_description.html.erb +68 -0
- data/app/views/generic_content_objects/contributors/_edit_conference.html.erb +29 -0
- data/app/views/generic_content_objects/contributors/_edit_organization.html.erb +29 -0
- data/app/views/generic_content_objects/contributors/_edit_person.html.erb +37 -0
- data/app/views/generic_content_objects/contributors/_new.html.erb +10 -0
- data/app/views/generic_content_objects/contributors/_show_conference.html.erb +22 -0
- data/app/views/generic_content_objects/contributors/_show_organization.html.erb +22 -0
- data/app/views/generic_content_objects/contributors/_show_person.html.erb +38 -0
- data/app/views/generic_contents/_edit.html.erb +59 -0
- data/app/views/generic_contents/_index.html.erb +23 -0
- data/app/views/generic_contents/_show.html.erb +18 -0
- data/app/views/generic_contents/_show_content.html.erb +4 -0
- data/app/views/generic_images/_edit.html.erb +59 -0
- data/app/views/generic_images/_index.html.erb +24 -0
- data/app/views/generic_images/_show.html.erb +18 -0
- data/app/views/generic_images/_show_all.html.erb +14 -0
- data/app/views/generic_images/_show_content.html.erb +7 -0
- data/app/views/layouts/application.html.erb +57 -0
- data/app/views/layouts/hydra-head.html.erb +12 -0
- data/app/views/mods_assets/_edit.html.erb +49 -0
- data/app/views/mods_assets/_edit_description.html.erb +82 -0
- data/app/views/mods_assets/_edit_journal.html.erb +72 -0
- data/app/views/mods_assets/_index.html.erb +1 -0
- data/app/views/mods_assets/_index_list.html.erb +37 -0
- data/app/views/mods_assets/_index_table.html.erb +7 -0
- data/app/views/mods_assets/_progress_box.html.erb +82 -0
- data/app/views/mods_assets/_show.html.erb +44 -0
- data/app/views/mods_assets/_show_description.html.erb +44 -0
- data/app/views/mods_assets/_show_journal.html.erb +42 -0
- data/app/views/mods_assets/_show_permissions.html.erb +14 -0
- data/app/views/permissions/_edit_person_permissions.html.erb +35 -0
- data/app/views/permissions/_index.html.erb +55 -0
- data/app/views/permissions/_new.html.erb +18 -0
- data/app/views/permissions/index.html.erb +1 -0
- data/app/views/permissions/new.html.erb +1 -0
- data/app/views/shared/_delete_asset_confirmation.html.erb +17 -0
- data/app/views/user_sessions/_login_form.html.erb +10 -0
- data/app/views/user_sessions/logged_out.html.erb +1 -0
- data/config/routes.rb +12 -0
- data/fedora_conf/conf/fedora.fcfg +1021 -0
- data/hydra-head.gemspec +70 -0
- data/lib/application_controller.rb +25 -0
- data/lib/application_helper.rb +2 -0
- data/lib/engine.rb +30 -0
- data/lib/generators/hydra/head_generator.rb +152 -0
- data/lib/generators/hydra/templates/config/fedora.yml +17 -0
- data/lib/generators/hydra/templates/config/initializers/blacklight_config.rb +246 -0
- data/lib/generators/hydra/templates/config/initializers/fedora_config.rb +23 -0
- data/lib/generators/hydra/templates/config/initializers/hydra_config.rb +29 -0
- data/lib/generators/hydra/templates/config/role_map_cucumber.yml +10 -0
- data/lib/generators/hydra/templates/config/role_map_development.yml +12 -0
- data/lib/generators/hydra/templates/config/role_map_production.yml +2 -0
- data/lib/generators/hydra/templates/config/role_map_test.yml +15 -0
- data/lib/generators/hydra/templates/config/solr.yml +10 -0
- data/lib/generators/hydra/templates/config/solr_mappings.yml +22 -0
- data/lib/generators/hydra/templates/fedora_conf/conf/fedora.fcfg +1021 -0
- data/lib/generators/hydra/templates/migrations/add_user_attributes_table.rb +15 -0
- data/lib/generators/hydra/templates/migrations/create_superusers.rb +12 -0
- data/lib/generators/hydra/templates/solr_conf/conf/schema.xml +118 -0
- data/lib/generators/hydra/templates/solr_conf/conf/solrconfig.xml +332 -0
- data/lib/generators/hydra/templates/solr_conf/solr.xml +35 -0
- data/lib/hydra-head.rb +29 -0
- data/lib/hydra-head/engine.rb +9 -0
- data/lib/hydra-head/routes.rb +87 -0
- data/lib/hydra-head/version.rb +4 -0
- data/lib/hydra.rb +22 -0
- data/lib/hydra/access_controls_enforcement.rb +236 -0
- data/lib/hydra/access_controls_evaluation.rb +97 -0
- data/lib/hydra/assets_controller_helper.rb +144 -0
- data/lib/hydra/catalog.rb +64 -0
- data/lib/hydra/common_mods_index_methods.rb +42 -0
- data/lib/hydra/controller.rb +7 -0
- data/lib/hydra/file_assets_helper.rb +144 -0
- data/lib/hydra/fixtures.rb +43 -0
- data/lib/hydra/generic_content.rb +113 -0
- data/lib/hydra/generic_image.rb +100 -0
- data/lib/hydra/image.rb +177 -0
- data/lib/hydra/model_methods.rb +95 -0
- data/lib/hydra/model_mixins.rb +2 -0
- data/lib/hydra/model_mixins/common_metadata.rb +24 -0
- data/lib/hydra/model_mixins/mods_object.rb +16 -0
- data/lib/hydra/mods_article.rb +505 -0
- data/lib/hydra/mods_dataset.rb +165 -0
- data/lib/hydra/mods_generic_content.rb +494 -0
- data/lib/hydra/mods_image.rb +494 -0
- data/lib/hydra/repository_controller.rb +102 -0
- data/lib/hydra/rights_metadata.rb +189 -0
- data/lib/hydra/superuser_attributes.rb +12 -0
- data/lib/hydra/testing_server.rb +183 -0
- data/lib/hydra/user.rb +22 -0
- data/lib/mediashelf/active_fedora_helper.rb +72 -0
- data/lib/railties/all_tests.rake +23 -0
- data/lib/railties/hydra-fixtures.rake +184 -0
- data/lib/railties/hydra_jetty.rake +79 -0
- data/lib/railties/hyhead_cucumber.rake +127 -0
- data/lib/railties/hyhead_rspec.rake +137 -0
- data/lib/stanford/searchworks_helper.rb +1338 -0
- data/lib/stanford/solr_helper.rb +108 -0
- data/lib/uva/mods_index_methods.rb +24 -0
- data/solr_conf/conf/schema.xml +122 -0
- data/solr_conf/conf/solrconfig.xml +332 -0
- data/solr_conf/solr.xml +35 -0
- data/tasks/hydra-head-fixtures.rake +54 -0
- data/tasks/hydra-head.rake +247 -0
- data/tasks/hydra_jetty.rake +79 -0
- data/tasks/replicator.rake +27 -0
- data/tasks/solrizer-fedora.rake +53 -0
- data/tasks/solrizer.rake +13 -0
- data/test_support/etc/Gemfile +29 -0
- data/test_support/etc/rvmrc +32 -0
- data/test_support/features/button_add_assets.feature +22 -0
- data/test_support/features/button_add_generic_content.feature +11 -0
- data/test_support/features/button_add_image.feature +11 -0
- data/test_support/features/button_add_mods_asset.feature +11 -0
- data/test_support/features/contributor_add.feature +39 -0
- data/test_support/features/file_assets_list.feature +32 -0
- data/test_support/features/file_upload.feature +40 -0
- data/test_support/features/home_page.feature +9 -0
- data/test_support/features/html_validity.feature +47 -0
- data/test_support/features/mods_asset_contributors_edit.feature +80 -0
- data/test_support/features/mods_asset_create.feature +12 -0
- data/test_support/features/mods_asset_edit.feature +33 -0
- data/test_support/features/mods_asset_edit_without_permission.feature +10 -0
- data/test_support/features/mods_asset_search_result.feature +13 -0
- data/test_support/features/mods_asset_show.feature +39 -0
- data/test_support/features/permissions_add.feature +15 -0
- data/test_support/features/permissions_edit.feature +63 -0
- data/test_support/features/step_definitions/catalog_index_steps.rb +14 -0
- data/test_support/features/step_definitions/create_asset_steps.rb +7 -0
- data/test_support/features/step_definitions/edit_metadata_steps.rb +73 -0
- data/test_support/features/step_definitions/file_list_steps.rb +28 -0
- data/test_support/features/step_definitions/hydra_metadata_steps.rb +3 -0
- data/test_support/features/step_definitions/hydra_steps.rb +8 -0
- data/test_support/features/step_definitions/inline_editable_edit_steps.rb +77 -0
- data/test_support/features/step_definitions/search_steps.rb +88 -0
- data/test_support/features/step_definitions/searching_steps.rb +22 -0
- data/test_support/features/step_definitions/show_document_steps.rb +85 -0
- data/test_support/features/step_definitions/user_steps.rb +36 -0
- data/test_support/features/step_definitions/web_steps.rb +219 -0
- data/test_support/features/support/env.rb +55 -0
- data/test_support/features/support/paths.rb +80 -0
- data/test_support/features/switch_users.feature +14 -0
- data/test_support/features/view_catalog_index.feature +18 -0
- data/test_support/fixtures/empty_file.txt +0 -0
- data/test_support/fixtures/hydrangea_fixture_archivist_only_mods_article.foxml.xml +1212 -0
- data/test_support/fixtures/hydrangea_fixture_file_asset1.foxml.xml +4946 -0
- data/test_support/fixtures/hydrangea_fixture_mods_article1.foxml.xml +234 -0
- data/test_support/fixtures/hydrangea_fixture_mods_article2.foxml.xml +177 -0
- data/test_support/fixtures/hydrangea_fixture_mods_article3.foxml.xml +170 -0
- data/test_support/fixtures/hydrangea_fixture_mods_dataset1.foxml.xml +187 -0
- data/test_support/fixtures/hydrangea_fixture_uploaded_svg1.foxml.xml +676 -0
- data/test_support/fixtures/image.jp2 +0 -0
- data/test_support/fixtures/libra-oa_1.foxml.xml +2324 -0
- data/test_support/fixtures/libra-oa_2.foxml.xml +2422 -0
- data/test_support/spec/controllers/assets_controller_spec.rb +113 -0
- data/test_support/spec/controllers/catalog_controller_spec.rb +148 -0
- data/test_support/spec/controllers/catalog_controller_viewing_context_spec.rb +62 -0
- data/test_support/spec/controllers/contributors_controller_spec.rb +47 -0
- data/test_support/spec/controllers/file_assets_controller_spec.rb +189 -0
- data/test_support/spec/controllers/hydra_controller_spec.rb +15 -0
- data/test_support/spec/controllers/permissions_controller_spec.rb +80 -0
- data/test_support/spec/controllers/user_sessions_controller_spec.rb +35 -0
- data/test_support/spec/generators/hydra-head_generator_spec.rb +14 -0
- data/test_support/spec/helpers/access_controls_enforcement_spec.rb +212 -0
- data/test_support/spec/helpers/access_controls_evaluation_spec.rb +35 -0
- data/test_support/spec/helpers/assets_controller_helper_spec.rb +71 -0
- data/test_support/spec/helpers/blacklight_helper_spec.rb +64 -0
- data/test_support/spec/helpers/file_assets_helper_spec.rb +107 -0
- data/test_support/spec/helpers/hydra-repository_controller_spec.rb +32 -0
- data/test_support/spec/helpers/hydra_assets_helper_spec.rb +195 -0
- data/test_support/spec/helpers/hydra_djatoka_helper_spec.rb +32 -0
- data/test_support/spec/helpers/hydra_fedora_metadata_helper_spec.rb +215 -0
- data/test_support/spec/helpers/hydra_helper_spec.rb +73 -0
- data/test_support/spec/helpers/hydra_model_methods_spec.rb +95 -0
- data/test_support/spec/helpers/hydra_uploader_helper_spec.rb +18 -0
- data/test_support/spec/helpers/javascript_includes_helper_spec.rb +43 -0
- data/test_support/spec/integration/file_asset_spec.rb +150 -0
- data/test_support/spec/lib/active_fedora_helper_spec.rb +56 -0
- data/test_support/spec/lib/catalog_spec.rb +16 -0
- data/test_support/spec/lib/common_mods_index_methods_spec.rb +28 -0
- data/test_support/spec/models/audio_asset_spec.rb +23 -0
- data/test_support/spec/models/file_asset_spec.rb +42 -0
- data/test_support/spec/models/generic_content_spec.rb +29 -0
- data/test_support/spec/models/generic_image_spec.rb +58 -0
- data/test_support/spec/models/hydra_rights_metadata_spec.rb +162 -0
- data/test_support/spec/models/image_asset_spec.rb +23 -0
- data/test_support/spec/models/mods_asset_spec.rb +29 -0
- data/test_support/spec/models/role_mapper_spec.rb +22 -0
- data/test_support/spec/models/user_spec.rb +52 -0
- data/test_support/spec/models/video_asset_spec.rb +23 -0
- data/test_support/spec/rcov.opts +3 -0
- data/test_support/spec/spec.opts +4 -0
- data/test_support/spec/spec_helper.rb +44 -0
- data/test_support/spec/support/matchers/helper_matcher.rb +14 -0
- data/test_support/spec/support/matchers/solr_matchers.rb +60 -0
- data/test_support/spec/unit/hydra-head-engine_spec.rb +8 -0
- data/test_support/spec/unit/hydra-head_spec.rb +8 -0
- data/test_support/spec/utilities/hydra_testing_server_spec.rb +49 -0
- data/test_support/spec/views/uploader.html.erb_spec.rb +30 -0
- data/vendor/cache/RedCloth-4.2.3.gem +0 -0
- data/vendor/cache/abstract-1.0.0.gem +0 -0
- data/vendor/cache/actionmailer-3.0.9.gem +0 -0
- data/vendor/cache/actionpack-3.0.9.gem +0 -0
- data/vendor/cache/active-fedora-2.3.3.gem +0 -0
- data/vendor/cache/activemodel-3.0.9.gem +0 -0
- data/vendor/cache/activerecord-3.0.9.gem +0 -0
- data/vendor/cache/activeresource-3.0.9.gem +0 -0
- data/vendor/cache/activesupport-3.0.9.gem +0 -0
- data/vendor/cache/arel-2.0.10.gem +0 -0
- data/vendor/cache/blacklight-3.0.0.gem +0 -0
- data/vendor/cache/block_helpers-0.3.3.gem +0 -0
- data/vendor/cache/builder-2.1.2.gem +0 -0
- data/vendor/cache/capybara-1.0.0.gem +0 -0
- data/vendor/cache/childprocess-0.2.0.gem +0 -0
- data/vendor/cache/columnize-0.3.4.gem +0 -0
- data/vendor/cache/crack-0.1.8.gem +0 -0
- data/vendor/cache/cucumber-1.0.2.gem +0 -0
- data/vendor/cache/cucumber-rails-1.0.2.gem +0 -0
- data/vendor/cache/curb-0.7.15.gem +0 -0
- data/vendor/cache/daemons-1.1.4.gem +0 -0
- data/vendor/cache/database_cleaner-0.6.7.gem +0 -0
- data/vendor/cache/diff-lcs-1.1.2.gem +0 -0
- data/vendor/cache/equivalent-xml-0.2.7.gem +0 -0
- data/vendor/cache/erubis-2.6.6.gem +0 -0
- data/vendor/cache/facets-2.8.4.gem +0 -0
- data/vendor/cache/factory_girl-1.3.3.gem +0 -0
- data/vendor/cache/fastercsv-1.5.4.gem +0 -0
- data/vendor/cache/ffi-1.0.9.gem +0 -0
- data/vendor/cache/gherkin-2.4.5.gem +0 -0
- data/vendor/cache/haml-3.1.2.gem +0 -0
- data/vendor/cache/httparty-0.7.8.gem +0 -0
- data/vendor/cache/i18n-0.5.0.gem +0 -0
- data/vendor/cache/jettywrapper-0.0.10.gem +0 -0
- data/vendor/cache/json-1.5.3.gem +0 -0
- data/vendor/cache/json_pure-1.5.3.gem +0 -0
- data/vendor/cache/kaminari-0.12.4.gem +0 -0
- data/vendor/cache/launchy-2.0.3.gem +0 -0
- data/vendor/cache/linecache-0.46.gem +0 -0
- data/vendor/cache/logger-1.2.8.gem +0 -0
- data/vendor/cache/mail-2.2.19.gem +0 -0
- data/vendor/cache/marc-0.4.3.gem +0 -0
- data/vendor/cache/mediashelf-loggable-0.4.2.gem +0 -0
- data/vendor/cache/mime-types-1.16.gem +0 -0
- data/vendor/cache/mocha-0.9.12.gem +0 -0
- data/vendor/cache/multipart-post-1.1.2.gem +0 -0
- data/vendor/cache/nokogiri-1.5.0.gem +0 -0
- data/vendor/cache/om-1.2.5.gem +0 -0
- data/vendor/cache/polyglot-0.3.1.gem +0 -0
- data/vendor/cache/rack-1.2.3.gem +0 -0
- data/vendor/cache/rack-mount-0.6.14.gem +0 -0
- data/vendor/cache/rack-test-0.5.7.gem +0 -0
- data/vendor/cache/rails-3.0.9.gem +0 -0
- data/vendor/cache/railties-3.0.9.gem +0 -0
- data/vendor/cache/rake-0.9.2.gem +0 -0
- data/vendor/cache/rbx-require-relative-0.0.5.gem +0 -0
- data/vendor/cache/rcov-0.9.9.gem +0 -0
- data/vendor/cache/rdoc-3.8.gem +0 -0
- data/vendor/cache/rsolr-1.0.2.gem +0 -0
- data/vendor/cache/rsolr-ext-1.0.3.gem +0 -0
- data/vendor/cache/rspec-2.6.0.gem +0 -0
- data/vendor/cache/rspec-core-2.6.4.gem +0 -0
- data/vendor/cache/rspec-expectations-2.6.0.gem +0 -0
- data/vendor/cache/rspec-mocks-2.6.0.gem +0 -0
- data/vendor/cache/rspec-rails-2.6.1.gem +0 -0
- data/vendor/cache/ruby-debug-0.10.4.gem +0 -0
- data/vendor/cache/ruby-debug-base-0.10.4.gem +0 -0
- data/vendor/cache/rubyzip-0.9.4.gem +0 -0
- data/vendor/cache/sanitize-2.0.3.gem +0 -0
- data/vendor/cache/selenium-webdriver-0.2.2.gem +0 -0
- data/vendor/cache/solr-ruby-0.0.8.gem +0 -0
- data/vendor/cache/solrizer-1.1.0.gem +0 -0
- data/vendor/cache/solrizer-fedora-1.1.0.gem +0 -0
- data/vendor/cache/sqlite3-ruby-1.2.5.gem +0 -0
- data/vendor/cache/stomp-1.1.9.gem +0 -0
- data/vendor/cache/term-ansicolor-1.0.5.gem +0 -0
- data/vendor/cache/thor-0.14.6.gem +0 -0
- data/vendor/cache/treetop-1.4.9.gem +0 -0
- data/vendor/cache/trollop-1.16.2.gem +0 -0
- data/vendor/cache/tzinfo-0.3.29.gem +0 -0
- data/vendor/cache/unicode-0.4.0.gem +0 -0
- data/vendor/cache/will_paginate-2.3.15.gem +0 -0
- data/vendor/cache/xml-simple-1.1.0.gem +0 -0
- data/vendor/cache/xpath-0.1.4.gem +0 -0
- data/vendor/cache/yard-0.7.2.gem +0 -0
- metadata +1110 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
# Blacklight customization of the Rake tasks that come with rspec-2, to run
|
2
|
+
# specs located in alternate location (inside BL plugin), and to provide
|
3
|
+
# rake tasks for jetty/solr wrapping.
|
4
|
+
#
|
5
|
+
# Same tasks as in ordinary rspec, but prefixed with blacklight:.
|
6
|
+
#
|
7
|
+
# rspec2 keeps it's rake tasks inside it's own code, it doesn't generate them.
|
8
|
+
# We had to copy them from there and modify, may have to be done again
|
9
|
+
# if rspec2 changes a lot, but this code looks relatively cleanish.
|
10
|
+
begin
|
11
|
+
require 'rspec/core'
|
12
|
+
require 'rspec/core/rake_task'
|
13
|
+
Rake.application.instance_variable_get('@tasks')['default'].prerequisites.delete('test')
|
14
|
+
|
15
|
+
spec_prereq = Rails.configuration.generators.options[:rails][:orm] == :active_record ? "db:test:prepare" : :noop
|
16
|
+
task :noop do; end
|
17
|
+
#task :default => :spec
|
18
|
+
|
19
|
+
hyhead_spec = File.expand_path("./test_support/spec", HydraHead.root)
|
20
|
+
|
21
|
+
# Set env variable to tell our spec/spec_helper.rb where we really are,
|
22
|
+
# so it doesn't have to guess with relative path, which will be wrong
|
23
|
+
# since we allow spec_dir to be in a remote location. spec_helper.rb
|
24
|
+
# needs it before Rails.root is defined there, even though we can
|
25
|
+
# oddly get it here, i dunno.
|
26
|
+
ENV['RAILS_ROOT'] = Rails.root.to_s
|
27
|
+
|
28
|
+
namespace :hyhead do
|
29
|
+
|
30
|
+
desc "Run all specs in spec directory (excluding plugin specs)"
|
31
|
+
RSpec::Core::RakeTask.new(:spec => spec_prereq) do |t|
|
32
|
+
# the user might not have run rspec generator because they don't
|
33
|
+
# actually need it, but without an ./.rspec they won't get color,
|
34
|
+
# let's insist.
|
35
|
+
t.rspec_opts = "--colour"
|
36
|
+
|
37
|
+
# pattern directory name defaults to ./**/*_spec.rb, but has a more concise command line echo
|
38
|
+
t.pattern = "#{hyhead_spec}"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Don't understand what this does or how to make it use our remote stats_directory
|
42
|
+
#task :stats => "spec:statsetup"
|
43
|
+
|
44
|
+
namespace :spec do
|
45
|
+
[:requests, :models, :controllers, :views, :helpers, :mailers, :lib, :routing, :generators, :utilities].each do |sub|
|
46
|
+
desc "Run the code examples in spec/#{sub}"
|
47
|
+
RSpec::Core::RakeTask.new(sub => spec_prereq) do |t|
|
48
|
+
# the user might not have run rspec generator because they don't
|
49
|
+
# actually need it, but without an ./.rspec they won't get color,
|
50
|
+
# let's insist.
|
51
|
+
t.rspec_opts = "--colour"
|
52
|
+
|
53
|
+
# pattern directory name defaults to ./**/*_spec.rb, but has a more concise command line echo
|
54
|
+
t.pattern = "#{hyhead_spec}/#{sub}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Run all specs"
|
59
|
+
task :run => spec_prereq do
|
60
|
+
[:models, :controllers, :helpers, :lib, :generators, :utilities].each do |sub|
|
61
|
+
puts "invoking: hyhead:spec:#{sub}"
|
62
|
+
Rake::Task["hyhead:spec:#{sub}"].invoke
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "Run all specs with rcov"
|
67
|
+
RSpec::Core::RakeTask.new(:rcov => spec_prereq) do |t|
|
68
|
+
t.rcov = true
|
69
|
+
# pattern directory name defaults to ./**/*_spec.rb, but has a more concise command line echo
|
70
|
+
t.pattern = File.join(hyhead_spec, "/**/*_spec.rb")
|
71
|
+
t.rspec_opts = "--colour"
|
72
|
+
t.rcov_opts = '-o "' + HydraHead.root + '/coverage" --exclude /gems/,/Library/,/usr/,test_support,lib/tasks,.bundle,config,/lib/rspec/,/lib/rspec-'
|
73
|
+
end
|
74
|
+
|
75
|
+
# Blacklight. Solr wrapper. for now just for blacklight:spec, plan to
|
76
|
+
# provide it for all variants eventually.
|
77
|
+
# if you would like to see solr startup messages on STDERR
|
78
|
+
# when starting solr test server during functional tests use:
|
79
|
+
#
|
80
|
+
# rake SOLR_CONSOLE=true
|
81
|
+
require File.expand_path('../jetty_solr_server.rb', __FILE__)
|
82
|
+
desc "hyhead:solr with jetty/solr launch"
|
83
|
+
task :with_solr do
|
84
|
+
# wrap tests with a test-specific Solr server
|
85
|
+
# Need to look up where the test jetty is located
|
86
|
+
# from solr.yml, we don't hardcode it anymore.
|
87
|
+
|
88
|
+
solr_yml_path = locate_path("config", "solr.yml")
|
89
|
+
jetty_path = if ( File.exists?( solr_yml_path ))
|
90
|
+
solr_config = YAML::load(File.open(solr_yml_path))
|
91
|
+
solr_config["test"]["jetty_path"] if solr_config["test"]
|
92
|
+
end
|
93
|
+
raise Exception.new("Can't find jetty path to start test jetty. Expect a jetty_path key in config/solr.yml for test environment.") unless jetty_path
|
94
|
+
|
95
|
+
|
96
|
+
# wrap tests with a test-specific Solr server
|
97
|
+
JettySolrServer.new(
|
98
|
+
:jetty_home => File.expand_path(jetty_path, Rails.root),
|
99
|
+
:sleep_after_start => 2).wrap do
|
100
|
+
Rake::Task["hyhead:spec"].invoke
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
# Don't understand what this does or how to make it use our remote stats_directory.
|
106
|
+
# task :statsetup do
|
107
|
+
# require 'rails/code_statistics'
|
108
|
+
# ::STATS_DIRECTORIES << %w(Model\ specs spec/models) if File.exist?('spec/models')
|
109
|
+
# ::STATS_DIRECTORIES << %w(View\ specs spec/views) if File.exist?('spec/views')
|
110
|
+
# ::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers) if File.exist?('spec/controllers')
|
111
|
+
# ::STATS_DIRECTORIES << %w(Helper\ specs spec/helpers) if File.exist?('spec/helpers')
|
112
|
+
# ::STATS_DIRECTORIES << %w(Library\ specs spec/lib) if File.exist?('spec/lib')
|
113
|
+
# ::STATS_DIRECTORIES << %w(Mailer\ specs spec/mailers) if File.exist?('spec/mailers')
|
114
|
+
# ::STATS_DIRECTORIES << %w(Routing\ specs spec/routing) if File.exist?('spec/routing')
|
115
|
+
# ::STATS_DIRECTORIES << %w(Request\ specs spec/requests) if File.exist?('spec/requests')
|
116
|
+
# ::CodeStatistics::TEST_TYPES << "Model specs" if File.exist?('spec/models')
|
117
|
+
# ::CodeStatistics::TEST_TYPES << "View specs" if File.exist?('spec/views')
|
118
|
+
# ::CodeStatistics::TEST_TYPES << "Controller specs" if File.exist?('spec/controllers')
|
119
|
+
# ::CodeStatistics::TEST_TYPES << "Helper specs" if File.exist?('spec/helpers')
|
120
|
+
# ::CodeStatistics::TEST_TYPES << "Library specs" if File.exist?('spec/lib')
|
121
|
+
# ::CodeStatistics::TEST_TYPES << "Mailer specs" if File.exist?('spec/mailers')
|
122
|
+
# ::CodeStatistics::TEST_TYPES << "Routing specs" if File.exist?('spec/routing')
|
123
|
+
# ::CodeStatistics::TEST_TYPES << "Request specs" if File.exist?('spec/requests')
|
124
|
+
# end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
rescue LoadError
|
128
|
+
# This rescue pattern stolen from cucumber; rspec didn't need it before since
|
129
|
+
# tasks only lived in rspec gem itself, but for Blacklight since we're copying
|
130
|
+
# these tasks into BL, we use the rescue so you can still run BL (without
|
131
|
+
# these tasks) even if you don't have rspec installed.
|
132
|
+
desc 'rspec rake tasks not available (rspec not installed)'
|
133
|
+
task :spec do
|
134
|
+
abort 'Rspec rake tasks not available. Be sure to install rspec gems. '
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
@@ -0,0 +1,1338 @@
|
|
1
|
+
module Stanford::SearchworksHelper
|
2
|
+
|
3
|
+
require_plugin_dependency 'vendor/plugins/blacklight/app/helpers/application_helper.rb'
|
4
|
+
|
5
|
+
include Stanford::SolrHelper # for nearby on shelf lookups
|
6
|
+
|
7
|
+
# def application_name
|
8
|
+
# 'SearchWorks (SULAIR)'
|
9
|
+
# end
|
10
|
+
def vern_document_heading
|
11
|
+
@document[Blacklight.config[:show][:vern_heading]]
|
12
|
+
end
|
13
|
+
def home_facet_field_names
|
14
|
+
Blacklight.config[:home_facet][:solr]
|
15
|
+
end
|
16
|
+
def home_facet_field_labels
|
17
|
+
Blacklight.config[:home_facet][:labels]
|
18
|
+
end
|
19
|
+
# overriding because we need to escape the '< Previous' at the linking level
|
20
|
+
def link_to_previous_document(previous_document)
|
21
|
+
return if previous_document == nil
|
22
|
+
link_to_document previous_document, :label=>'« Previous', :counter => session[:search][:counter].to_i - 1
|
23
|
+
end
|
24
|
+
# overriding because we need to escape the 'Next >' at the linking level
|
25
|
+
def link_to_next_document(next_document)
|
26
|
+
return if next_document == nil
|
27
|
+
link_to_document next_document, :label=>'Next »', :counter => session[:search][:counter].to_i + 1
|
28
|
+
end
|
29
|
+
|
30
|
+
# copies the current params (or whatever is passed in as the 3rd arg)
|
31
|
+
# removes the field value from params[:f]
|
32
|
+
# removes the field if there are no more values in params[:f][field]
|
33
|
+
# removes additional params (page, id, etc..)
|
34
|
+
def remove_query_params(value, source_params=params)
|
35
|
+
p = source_params.dup.symbolize_keys!
|
36
|
+
# need to dup the facet values too,
|
37
|
+
# if the values aren't dup'd, then the values
|
38
|
+
# from the session will get remove in the show view...
|
39
|
+
p[:q] = p[:q].dup
|
40
|
+
p.delete :page
|
41
|
+
p.delete :id
|
42
|
+
p.delete :total
|
43
|
+
p.delete :counter
|
44
|
+
p.delete :commit
|
45
|
+
#return p unless p[field]
|
46
|
+
p[:q] = p[:q].gsub(value,"").strip
|
47
|
+
p.delete(:q) if p[:q].size == 0
|
48
|
+
p
|
49
|
+
end
|
50
|
+
|
51
|
+
# link_back_to_catalog(:label=>'Back to Search')
|
52
|
+
# Create a link back to the index screen, keeping the user's facet, query and paging choices intact by using session.
|
53
|
+
def link_back_to_catalog(opts={:label=>'Back to Search'})
|
54
|
+
query_params = session[:search].dup || {}
|
55
|
+
query_params.delete :counter
|
56
|
+
query_params.delete :total
|
57
|
+
link_url = root_path(query_params)
|
58
|
+
link_to opts[:label], link_url
|
59
|
+
end
|
60
|
+
|
61
|
+
# This is an updated +link_to+ that allows you to pass a +data+ hash along with the +html_options+
|
62
|
+
# which are then written to the generated form for non-GET requests. The key is the form element name
|
63
|
+
# and the value is the value:
|
64
|
+
#
|
65
|
+
# link_to_with_data('Name', some_path(some_id), :method => :post, :html)
|
66
|
+
def link_to_with_data(*args, &block)
|
67
|
+
if block_given?
|
68
|
+
options = args.first || {}
|
69
|
+
html_options = args.second
|
70
|
+
concat(link_to(capture(&block), options, html_options))
|
71
|
+
else
|
72
|
+
name = args.first
|
73
|
+
options = args.second || {}
|
74
|
+
html_options = args.third
|
75
|
+
|
76
|
+
url = url_for(options)
|
77
|
+
|
78
|
+
if html_options
|
79
|
+
html_options = html_options.stringify_keys
|
80
|
+
href = html_options['href']
|
81
|
+
convert_options_to_javascript_with_data!(html_options, url)
|
82
|
+
tag_options = tag_options(html_options)
|
83
|
+
else
|
84
|
+
tag_options = nil
|
85
|
+
end
|
86
|
+
|
87
|
+
href_attr = "href=\"#{url}\"" unless href
|
88
|
+
"<a #{href_attr}#{tag_options}>#{name || url}</a>"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
# Generate the # - # of # results text
|
92
|
+
def results_text(pp, p, result_num)
|
93
|
+
if pp.nil?
|
94
|
+
per_page = Blacklight.config[:index][:num_per_page].to_i
|
95
|
+
else
|
96
|
+
per_page = pp.to_i
|
97
|
+
end
|
98
|
+
|
99
|
+
if p.nil?
|
100
|
+
start_num = 1
|
101
|
+
p = 1
|
102
|
+
else
|
103
|
+
start_num = (p.to_i * per_page) - (per_page - 1)
|
104
|
+
end
|
105
|
+
|
106
|
+
if p == 1 and per_page < result_num
|
107
|
+
end_num = per_page
|
108
|
+
elsif ((per_page * p.to_i) > result_num)
|
109
|
+
end_num = result_num
|
110
|
+
else
|
111
|
+
end_num = per_page * p.to_i
|
112
|
+
end
|
113
|
+
"#{start_num} - #{end_num} of "
|
114
|
+
end
|
115
|
+
# Genrate dt/dd with a relevance
|
116
|
+
def get_relevance_bar(score,label)
|
117
|
+
score_mod = (score * 9).round(2)
|
118
|
+
if score_mod > 100
|
119
|
+
score_mod = 100
|
120
|
+
elsif score_mod == 0.0
|
121
|
+
score_mod = (score * 9).round(4)
|
122
|
+
end
|
123
|
+
text = "<dt>#{label}</dt>"
|
124
|
+
text += "<dd>"
|
125
|
+
text += "<div class='relevance_container'>"
|
126
|
+
text += "<span>#{score_mod}%</span>"
|
127
|
+
text += "<div class='relevance_bar' style='width:#{score_mod}%'>"
|
128
|
+
text += "</div>"
|
129
|
+
text += "</div>"
|
130
|
+
text += "</dd>"
|
131
|
+
end
|
132
|
+
|
133
|
+
# Generate a dt/dd pair given a Solr field
|
134
|
+
# If you provide a :default value in the opts hash,
|
135
|
+
# then when the solr field is empty, the default value will be used.
|
136
|
+
# If you don't provide a default value, this method will not generate html when the field is empty.
|
137
|
+
def get_data_with_label(doc, label, field_string, opts={})
|
138
|
+
if opts[:default] && !doc[field_string]
|
139
|
+
doc[field_string] = opts[:default]
|
140
|
+
end
|
141
|
+
|
142
|
+
if doc[field_string]
|
143
|
+
field = doc[field_string]
|
144
|
+
text = "<dt>#{label}</dt><dd>"
|
145
|
+
if field.is_a?(Array)
|
146
|
+
field.each do |l|
|
147
|
+
text += "#{h(l)}"
|
148
|
+
if l != h(field.last)
|
149
|
+
text += "<br/>"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
else
|
153
|
+
text += h(field)
|
154
|
+
end
|
155
|
+
#Does the field have a vernacular equivalent?
|
156
|
+
if doc["vern_#{field_string}"]
|
157
|
+
vern_field = doc["vern_#{field_string}"]
|
158
|
+
text += "<br/>"
|
159
|
+
if vern_field.is_a?(Array)
|
160
|
+
vern_field.each do |l|
|
161
|
+
text += "#{h(l)}"
|
162
|
+
if l != h(vern_field.last)
|
163
|
+
text += "<br/>"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
else
|
167
|
+
text += h(vern_field)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
text += "</dd>"
|
171
|
+
text
|
172
|
+
end
|
173
|
+
end
|
174
|
+
# generate an dt/dd pair given a marc field
|
175
|
+
def get_data_with_label_from_marc(doc,label,field,sFields=[])
|
176
|
+
if doc.marc[field]
|
177
|
+
text = "<dt>#{label}</dt><dd>"
|
178
|
+
doc.marc.find_all{|f| (field) === f.tag}.each do |l|
|
179
|
+
if sFields.length > 0
|
180
|
+
l.each{|sl| sFields.include?(sl.code) ? text << "#{h(sl.value)} " : ""}
|
181
|
+
else
|
182
|
+
temp_text = ""
|
183
|
+
# get_vern method should be here? In each loop below? After?
|
184
|
+
l.each {|sl| ['w','0', '5', '6', '8'].include?(sl.code) ? nil : temp_text += "#{sl.value} "}
|
185
|
+
vernacular = get_vernacular(doc,l)
|
186
|
+
text += h(temp_text)
|
187
|
+
end
|
188
|
+
vernacular = get_vernacular(doc,l)
|
189
|
+
text += "<br/>#{vernacular}" unless vernacular.nil?
|
190
|
+
text += "<br/>" unless l == doc.marc.find_all{|f| (field) === f.tag}.last
|
191
|
+
end
|
192
|
+
text += "</dd>"
|
193
|
+
text
|
194
|
+
else
|
195
|
+
|
196
|
+
# The below if statement is attempting to find unmatched vernacular fields that match the supplied field string
|
197
|
+
if doc.marc['880']
|
198
|
+
doc.marc.find_all{|f| ('880') === f.tag}.each do |l|
|
199
|
+
if l['6'].split("-")[1].gsub("//r","") == "00" and l['6'].split("-")[0] == field
|
200
|
+
text = "<dt>#{label}</dt><dd>"
|
201
|
+
l.each {|sl| ['w','0', '5', '6', '8'].include?(sl.code) ? nil : text += "#{sl.value} "}
|
202
|
+
text += "</dd>"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
text
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
209
|
+
end
|
210
|
+
# Generate a dt/dd pair with a comma separated list of formats given an array of format strings
|
211
|
+
def show_formats(field)
|
212
|
+
if field
|
213
|
+
text = "<dt>Format:</dt><dd>"
|
214
|
+
field.each do |l|
|
215
|
+
text += "<span class='iconSpan #{l.downcase.gsub(" ","").gsub("/","_")}'>"
|
216
|
+
text += h(l)
|
217
|
+
text += ", " unless l == field.last
|
218
|
+
text += "</span>"
|
219
|
+
end
|
220
|
+
text += "</dd>"
|
221
|
+
text
|
222
|
+
end
|
223
|
+
|
224
|
+
|
225
|
+
end
|
226
|
+
# Generate a dt/dd pair with a link with a label given a field in the SolrDocument
|
227
|
+
def link_to_data_with_label(doc,label,field_string,url)
|
228
|
+
if doc[field_string]
|
229
|
+
field = doc[field_string]
|
230
|
+
text = "<dt>#{label}</dt><dd>"
|
231
|
+
if field.is_a?(Array)
|
232
|
+
field.each do |l|
|
233
|
+
text += link_to l, url.merge!(:q => "\"#{l}\"")
|
234
|
+
if l != field.last
|
235
|
+
text += "<br/>"
|
236
|
+
end
|
237
|
+
end
|
238
|
+
else
|
239
|
+
text += link_to field, url.merge!(:q => "\"#{field}\"")
|
240
|
+
end
|
241
|
+
if doc["vern_#{field_string}"]
|
242
|
+
vern_field = doc["vern_#{field_string}"]
|
243
|
+
text += "<br/>"
|
244
|
+
if vern_field.is_a?(Array)
|
245
|
+
vern_field.each do |l|
|
246
|
+
text += link_to l, url.merge!(:q => "\"#{l}\"")
|
247
|
+
if l != vern_field.last
|
248
|
+
text += "<br/>"
|
249
|
+
end
|
250
|
+
end
|
251
|
+
else
|
252
|
+
text += link_to vern_field, url.merge!(:q => "\"#{vern_field}\"")
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
text += "</dd>"
|
257
|
+
text
|
258
|
+
end
|
259
|
+
end
|
260
|
+
# Generate dt/dd pair with an unordered list from the table of contents (IE marc 505s)
|
261
|
+
def get_toc(doc)
|
262
|
+
if doc.marc['505']
|
263
|
+
text = "<dt>Contents:</dt><dd>"
|
264
|
+
doc.marc.find_all{|f| ('505') === f.tag}.each do |l|
|
265
|
+
text << "<ul class='toc'><li>"
|
266
|
+
l.each{|sl| ['w','0', '5', '6', '8'].include?(sl.code) ? nil : text << "#{sl.value.gsub(' -- ','</li><li>')} " }
|
267
|
+
text << "</li></ul>"
|
268
|
+
text << "<ul class='toc'><li>#{get_vernacular(doc,l).gsub('--','</li><li>')}</li></ul>" unless get_vernacular(doc,l).nil?
|
269
|
+
end
|
270
|
+
text << "</dd>"
|
271
|
+
else
|
272
|
+
if doc.marc['880']
|
273
|
+
doc.marc.find_all{|f| ('880') === f.tag}.each do |l|
|
274
|
+
if l['6'].split("-")[1].gsub("//r","") == "00" and l['6'].split("-")[0] == "505"
|
275
|
+
text = "<dt>Contents:</dt><dd><ul class='toc'><li>"
|
276
|
+
l.each {|sl| ['w','0', '5', '6', '8'].include?(sl.code) ? nil : text << "#{sl.value.gsub('--','</li><li>')} "}
|
277
|
+
text << "</li></dd>"
|
278
|
+
end
|
279
|
+
end
|
280
|
+
text
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
# Generate dt/dd pair with a link with a label given a marc field
|
285
|
+
def link_to_data_with_label_from_marc(doc,label,field,url,sFields=[])
|
286
|
+
if doc.marc[field]
|
287
|
+
text = "<dt>#{label}</dt><dd>"
|
288
|
+
doc.marc.find_all{|f| (field) === f.tag}.each do |l|
|
289
|
+
if sFields.length > 0
|
290
|
+
link_text = ""
|
291
|
+
sFields.each do |sf|
|
292
|
+
if l.find{|s| s.code == sf.to_s}
|
293
|
+
link_text << "#{l.find{|s| s.code == sf.to_s}.value} "
|
294
|
+
end
|
295
|
+
end
|
296
|
+
text += link_to link_text, url.merge!(:q => "\"#{link_text}\"")
|
297
|
+
else
|
298
|
+
link_text = ''
|
299
|
+
l.each {|sl| ['w','0', '5', '6', '8'].include?(sl.code) ? nil : link_text += "#{sl.value} " unless (sl.code == 'a' and sl.value[0,1] == "%") }
|
300
|
+
text += link_to link_text, url.merge!(:q => "\"#{link_text}\"")
|
301
|
+
end
|
302
|
+
vernacular = get_vernacular(doc,l)
|
303
|
+
temp_vern = "\"#{vernacular}\""
|
304
|
+
text += "<br/>#{link_to vernacular, url.merge!(:q => temp_vern)}" unless vernacular.nil?
|
305
|
+
text += "<br/>" unless l == doc.marc.find_all{|f| (field) === f.tag}.last
|
306
|
+
end
|
307
|
+
text += "</dd>"
|
308
|
+
else
|
309
|
+
if doc.marc['880']
|
310
|
+
doc.marc.find_all{|f| ('880') === f.tag}.each do |l|
|
311
|
+
if l['6'].split("-")[1].gsub("//r","") == "00" and l['6'].split("-")[0] == field
|
312
|
+
text = "<dt>#{label}</dt><dd>"
|
313
|
+
link_text = ''
|
314
|
+
l.each {|sl| ['w','0', '5', '6', '8'].include?(sl.code) ? nil : link_text += "#{sl.value} "}
|
315
|
+
text += link_to link_text, url.merge!(:q => "\"#{link_text}\"")
|
316
|
+
text += "</dd>"
|
317
|
+
end
|
318
|
+
end
|
319
|
+
text
|
320
|
+
end
|
321
|
+
end
|
322
|
+
end
|
323
|
+
# Generate dt/dd pair of contributors with translations
|
324
|
+
def link_to_contributor_from_marc(doc)
|
325
|
+
text = "<dt>Contributor:</dt><dd>"
|
326
|
+
['700', '710', '711', '720'].each do |field|
|
327
|
+
if doc.marc[field]
|
328
|
+
doc.marc.find_all{|f| (field) === f.tag}.each do |l|
|
329
|
+
link_text = ''
|
330
|
+
relator_text = []
|
331
|
+
l.each {|sl| sl.code == '4' ? relator_text << " #{relator_terms[sl.value]}" : sl.code == '6' ? nil : link_text << "#{sl.value} "}
|
332
|
+
text << link_to(link_text.strip, :q => "\"#{link_text}\"", :controller => 'catalog', :action => 'index', :qt => 'search_author' )
|
333
|
+
text << relator_text.join(", ") unless relator_text.empty?
|
334
|
+
vernacular = get_vernacular(doc,l)
|
335
|
+
temp_vern = "\"#{vernacular}\""
|
336
|
+
text << "<br/>#{link_to vernacular, :q => temp_vern, :controller => 'catalog', :action => 'index', :qt => 'search_author'}" unless vernacular.nil?
|
337
|
+
text << "<br/>"
|
338
|
+
end
|
339
|
+
else
|
340
|
+
if doc.marc['880']
|
341
|
+
doc.marc.find_all{|f| ('880') === f.tag}.each do |l|
|
342
|
+
if l['6'].split("-")[1].gsub("//r","") == "00" and l['6'].split("-")[0] == field
|
343
|
+
text = "<dt>Contributor:</dt><dd>"
|
344
|
+
link_text = ''
|
345
|
+
relator_text = []
|
346
|
+
l.each {|sl| sl.code == '4' ? relator_text << " #{relator_terms[sl.value]}" : link_text << "#{sl.value} "}
|
347
|
+
text << link_to(link_text.strip,:q => "\"#{link_text}\"", :action => 'index', :qt => 'author_search')
|
348
|
+
text << relator_text.join(", ") unless relator_text.empty?
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|
354
|
+
text << "</dd>"
|
355
|
+
text unless text == "<dt>Contributor:</dt><dd></dd>"
|
356
|
+
end
|
357
|
+
|
358
|
+
def title_change_data_from_marc(doc)
|
359
|
+
if doc.marc['780'] or doc.marc['785']
|
360
|
+
text = ""
|
361
|
+
|
362
|
+
if doc.marc['780']
|
363
|
+
doc.marc.find_all{|f| ('780') === f.tag}.each do |field|
|
364
|
+
text << "<dt>#{name_change_780_translations[field.indicator2]}:</dt>"
|
365
|
+
temp_text = ""
|
366
|
+
field.each{|subfield|
|
367
|
+
if subfield.code == "w"
|
368
|
+
nil
|
369
|
+
elsif subfield.code == "t"
|
370
|
+
query = "\"#{subfield.value}\""
|
371
|
+
temp_text << "#{link_to(subfield.value, params.dup.merge!(:action=>'index', :qt=>'search_title', :q=>query))} "
|
372
|
+
elsif subfield.code == "x"
|
373
|
+
temp_text << "(#{link_to(subfield.value, params.dup.merge!(:action=>'index', :qt=>'search', :q=>subfield.value))}) "
|
374
|
+
else
|
375
|
+
temp_text << "#{subfield.value} "
|
376
|
+
end
|
377
|
+
}
|
378
|
+
text << "<dd>#{temp_text}</dd>"
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
if doc.marc['785']
|
383
|
+
special_handler = []
|
384
|
+
doc.marc.find_all{|f| ('785') === f.tag}.each do |field|
|
385
|
+
if field.indicator2 == "7"
|
386
|
+
special_handler << field
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
doc.marc.find_all{|f| ('785') === f.tag}.each do |field|
|
391
|
+
text << "<dt>"
|
392
|
+
if field.indicator2 == "7" and field == special_handler.first
|
393
|
+
text << "Merged with:"
|
394
|
+
elsif field.indicator2 == "7" and field == special_handler.last
|
395
|
+
text << "to form:"
|
396
|
+
elsif field.indicator2 == "7" and field != special_handler.first and field != special_handler.last
|
397
|
+
text << "and with:"
|
398
|
+
else
|
399
|
+
text << "#{name_change_785_translations[field.indicator2]}:"
|
400
|
+
end
|
401
|
+
text << "</dt>"
|
402
|
+
temp_text = ""
|
403
|
+
field.each{|subfield|
|
404
|
+
if subfield.code == "w"
|
405
|
+
nil
|
406
|
+
elsif subfield.code == "t"
|
407
|
+
query = "\"#{subfield.value}\""
|
408
|
+
temp_text << "#{link_to(subfield.value, params.dup.merge!(:action=>'index', :qt=>'search_title', :q=>query))} "
|
409
|
+
elsif subfield.code == "x"
|
410
|
+
temp_text << "(#{link_to(subfield.value, params.dup.merge!(:action=>'index', :qt=>'search', :q=>subfield.value))}) "
|
411
|
+
else
|
412
|
+
temp_text << "#{subfield.value} "
|
413
|
+
end
|
414
|
+
}
|
415
|
+
text << "<dd>#{temp_text}</dd>"
|
416
|
+
end
|
417
|
+
end
|
418
|
+
text
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
|
423
|
+
# Generate hierarchical structure of subject headings from marc
|
424
|
+
def get_subjects(doc)
|
425
|
+
text = "<ul id='related_subjects'>"
|
426
|
+
subs = ['600','610','611','630','650','651','653','654','655','656','657','658','690','691','693','696', '697','698','699']
|
427
|
+
data = []
|
428
|
+
subs.each do |s|
|
429
|
+
if doc.marc[s]
|
430
|
+
doc.marc.find_all{|f| (s) === f.tag }.each do |l|
|
431
|
+
multi_a = []
|
432
|
+
temp_data_array = []
|
433
|
+
temp_subs_text = ""
|
434
|
+
temp_xyv_array = []
|
435
|
+
unless (s == "690" and l['a'].downcase.include?("collection"))
|
436
|
+
l.each{|sf|
|
437
|
+
unless ['w','0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].include?(sf.code)
|
438
|
+
if sf.code == "a"
|
439
|
+
multi_a << sf.value unless sf.code == "a" and sf.value[0,1] == "%"
|
440
|
+
end
|
441
|
+
if ["v","x","y","z"].include?(sf.code)
|
442
|
+
temp_xyv_array << sf.value
|
443
|
+
else
|
444
|
+
temp_subs_text << "#{sf.value} " unless (sf.code == "a" or (sf.code == "a" and sf.value[0,1] == "%"))
|
445
|
+
end
|
446
|
+
end
|
447
|
+
}
|
448
|
+
if multi_a.length > 1
|
449
|
+
multi_a.each do |a|
|
450
|
+
data << [a]
|
451
|
+
end
|
452
|
+
elsif multi_a.length == 1
|
453
|
+
str = multi_a.to_s << " " << temp_subs_text unless (temp_subs_text.blank? and multi_a.empty?)
|
454
|
+
temp_data_array << str
|
455
|
+
else
|
456
|
+
temp_data_array << temp_subs_text unless temp_subs_text.blank?
|
457
|
+
end
|
458
|
+
temp_data_array.concat(temp_xyv_array) unless temp_xyv_array.empty?
|
459
|
+
data << temp_data_array unless temp_data_array.empty?
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
463
|
+
end
|
464
|
+
i = 0
|
465
|
+
|
466
|
+
data.each do |fields|
|
467
|
+
text << "<li>"
|
468
|
+
link_text = ""
|
469
|
+
title_text = "Search: "
|
470
|
+
fields.each do |field|
|
471
|
+
link_text << " " unless field == data[i].first
|
472
|
+
link_text << "\"#{field.strip}\""
|
473
|
+
title_text << " - " unless field == data[i].first
|
474
|
+
title_text << "#{field.strip}"
|
475
|
+
text << link_to(field.strip, {:controller => 'catalog', :action => 'index', :q => link_text, :qt => 'search_subject'}, :title => title_text)
|
476
|
+
text << " > " unless field == data[i].last
|
477
|
+
end
|
478
|
+
text << "</li>"
|
479
|
+
i += 1
|
480
|
+
end
|
481
|
+
text << "</ul>"
|
482
|
+
return text unless text == "<ul id='related_subjects'></ul>"
|
483
|
+
end
|
484
|
+
# Generate unordered list of Online Access Links (IE marc 856s)
|
485
|
+
def get_856(doc)
|
486
|
+
if doc.marc['856']
|
487
|
+
text = ''
|
488
|
+
int = 1
|
489
|
+
text += "<ul class='online'>"
|
490
|
+
text += "<li>"
|
491
|
+
text += "<ol>"
|
492
|
+
doc.marc.find_all{|f| ('856') === f.tag }.each do |field|
|
493
|
+
if !field['u'].nil?
|
494
|
+
# Not sure why I need this, but it fails on certain URLs w/o it. The link printed still has character in it
|
495
|
+
fixed_url = field['u'].gsub("^","").strip
|
496
|
+
url = URI.parse(fixed_url)
|
497
|
+
sub3 = ""
|
498
|
+
subz = []
|
499
|
+
suby = ""
|
500
|
+
field.each{|subfield|
|
501
|
+
if subfield.code == "3"
|
502
|
+
sub3 = subfield.value
|
503
|
+
elsif subfield.code == "z"
|
504
|
+
subz << subfield.value
|
505
|
+
elsif subfield.code == "y"
|
506
|
+
suby = subfield.value
|
507
|
+
end
|
508
|
+
}
|
509
|
+
if int > 3
|
510
|
+
text += "<li class='more' style='display:none;'>#{!sub3.blank? ? sub3 << ' ' : ''}#{!subz[0].blank? ? subz[0] << ' ' : ''}<a href='#{field['u']}'>#{(subz[1] and field['x'] == "eLoaderURL") ? subz[1] : !suby.blank? ? suby : url.host}</a></li>"
|
511
|
+
else
|
512
|
+
text += "<li>#{!sub3.blank? ? sub3 << ' ' : ''}#{!subz[0].blank? ? subz[0] << ' ' : ''}<a href='#{field['u']}'>#{(subz[1] and field['x'] == "eLoaderURL") ? subz[1] : !suby.blank? ? suby : url.host}</a></li>"
|
513
|
+
end
|
514
|
+
if int == 3 and field != doc.marc.find_all{|f| ('856') === f.tag }.last
|
515
|
+
text += "<li class='more_link' id='more_link'><a href=''>more<span class='off_screen'> links</span></a></li>"
|
516
|
+
end
|
517
|
+
int += 1
|
518
|
+
end
|
519
|
+
end
|
520
|
+
if int > 3
|
521
|
+
text += "<li id='less_link' class='less_link' style='display:none;'><a href=''>less<span class='off_screen'> links</span></a></li>"
|
522
|
+
end
|
523
|
+
text += "</ol>"
|
524
|
+
text += "</li>"
|
525
|
+
text += "</ul>"
|
526
|
+
text
|
527
|
+
end
|
528
|
+
end
|
529
|
+
|
530
|
+
def get_suppl_urls(doc)
|
531
|
+
text = ""
|
532
|
+
if doc['url_fulltext']
|
533
|
+
urls = doc['url_fulltext']
|
534
|
+
text << "<dt>Online:</dt><dd>"
|
535
|
+
#urls.each do |url|
|
536
|
+
fixed_url = urls[0].gsub("^","").strip
|
537
|
+
url_host = URI.parse(fixed_url).host
|
538
|
+
text << "<a href='#{urls[0].strip}'>#{url_host}</a>"
|
539
|
+
if urls.length > 1
|
540
|
+
text << " + #{pluralize(urls.length - 1, 'more source')}"
|
541
|
+
end
|
542
|
+
#end
|
543
|
+
text << "</dd>"
|
544
|
+
end
|
545
|
+
text
|
546
|
+
|
547
|
+
rescue URI::InvalidURIError
|
548
|
+
return ""
|
549
|
+
end
|
550
|
+
|
551
|
+
def get_vernacular(doc,field)
|
552
|
+
return_text = ""
|
553
|
+
if field['6']
|
554
|
+
field_original = field.tag
|
555
|
+
match_original = field['6'].split("-")[1]
|
556
|
+
doc.marc.find_all{|f| ('880') === f.tag}.each do |l|
|
557
|
+
if l['6']
|
558
|
+
field_880 = l['6'].split("-")[0]
|
559
|
+
match_880 = l['6'].split("-")[1].gsub("//r","")
|
560
|
+
if match_original == match_880 and field_original == field_880
|
561
|
+
return_text = ""
|
562
|
+
l.each{
|
563
|
+
|sl|
|
564
|
+
if !['w','0', '5', '6', '8'].include?(sl.code)
|
565
|
+
return_text += "#{sl.value} "
|
566
|
+
end
|
567
|
+
}
|
568
|
+
end
|
569
|
+
end
|
570
|
+
end
|
571
|
+
end
|
572
|
+
return nil if return_text.blank?
|
573
|
+
return_text
|
574
|
+
end
|
575
|
+
|
576
|
+
def get_callnum(doc)
|
577
|
+
test_hash = {}
|
578
|
+
if doc['item_display']
|
579
|
+
doc['item_display'].each do |item|
|
580
|
+
item_array = item.split(' -|- ')
|
581
|
+
if test_hash.has_key?(item_array[1])
|
582
|
+
if test_hash[item_array[1]].has_key?(item_array[2])
|
583
|
+
if params[:action] == 'index'
|
584
|
+
test_hash[item_array[1]][item_array[2]] << [item_array[3],item_array[0],item_array[6],item_array[4],item_array[7]] unless test_hash[item_array[1]][item_array[2]].flatten.include?(item_array[3])
|
585
|
+
else
|
586
|
+
test_hash[item_array[1]][item_array[2]] << [item_array[3],item_array[0],item_array[6],item_array[4],item_array[7]] #|Commenting out so that multiple copies show up on record view| unless test_hash[item_array[1]][item_array[2]].flatten.include?(item_array[6])
|
587
|
+
end
|
588
|
+
else
|
589
|
+
test_hash[item_array[1]][item_array[2]] = [[item_array[3],item_array[0],item_array[6],item_array[4],item_array[7]]]
|
590
|
+
end
|
591
|
+
else
|
592
|
+
test_hash[item_array[1]] = {item_array[2] => [[item_array[3],item_array[0],item_array[6],item_array[4],item_array[7]]]}
|
593
|
+
end
|
594
|
+
end
|
595
|
+
end
|
596
|
+
test_hash
|
597
|
+
end
|
598
|
+
|
599
|
+
def get_facet_tag_cloud(facet,response)
|
600
|
+
text = ""
|
601
|
+
display_facet = response.facets.detect {|f| f.name == facet }
|
602
|
+
facet_arr = []
|
603
|
+
display_facet.items.each do |item|
|
604
|
+
facet_arr << [item.hits,item.value]
|
605
|
+
end
|
606
|
+
facet_arr = facet_arr.sort_by {rand}
|
607
|
+
text += "<div class='cloud_div' id='cloud_#{facet}'>"
|
608
|
+
facet_arr.each do |l|
|
609
|
+
if l[0] > 500000
|
610
|
+
#font_size = "3"
|
611
|
+
font_size = "jumbo"
|
612
|
+
elsif l[0] > 100000
|
613
|
+
#font_size = "2.2"
|
614
|
+
font_size = "large"
|
615
|
+
elsif l[0] > 75000
|
616
|
+
#font_size = "1.8"
|
617
|
+
font_size = "medium"
|
618
|
+
elsif l[0] > 50000
|
619
|
+
#font_size = "1.4"
|
620
|
+
font_size = "small"
|
621
|
+
else
|
622
|
+
#font_size = "1"
|
623
|
+
font_size = "tiny"
|
624
|
+
end
|
625
|
+
if facet == 'building_facet' and translate_lib.has_key?(l[1])
|
626
|
+
value = translate_lib[l[1]]
|
627
|
+
else
|
628
|
+
value = l[1]
|
629
|
+
end
|
630
|
+
text += " <span class='tag_cloud #{font_size}'>#{link_to h(value), add_facet_params(facet, l[1])}</span> "
|
631
|
+
end
|
632
|
+
text += "</div>"
|
633
|
+
end
|
634
|
+
|
635
|
+
# given the solr field name of a *refinement* facet (e.g. lc_alpha_facet),
|
636
|
+
# return a string containing appropriate html to display the given facet
|
637
|
+
# heading and its values
|
638
|
+
def get_refine_facet(solr_fname, response)
|
639
|
+
text = ""
|
640
|
+
display_facet = response.facets.detect {|f| f.name == solr_fname}
|
641
|
+
if !display_facet.nil? && !display_facet.items.nil? && display_facet.items.length > 0
|
642
|
+
text = "<li>"
|
643
|
+
text << " <h3 class='facet_selected'>" + facet_field_labels[solr_fname] + "</h3>"
|
644
|
+
text << " <ul>"
|
645
|
+
item_count = 0
|
646
|
+
display_facet.items.each do |item|
|
647
|
+
if facet_in_params? solr_fname, item.value
|
648
|
+
text << "<li>"
|
649
|
+
text << "<span class='selected'>" + h(item.value) + " (" + item.hits.to_s + ")</span>"
|
650
|
+
text << "[#{link_to 'remove', remove_facet_params(solr_fname, item.value), :class=>'remove'}]"
|
651
|
+
text << "</li>"
|
652
|
+
# accommodate further call number levels
|
653
|
+
case solr_fname
|
654
|
+
when "lc_alpha_facet"
|
655
|
+
text << get_refine_facet("lc_b4cutter_facet", response)
|
656
|
+
when "dewey_2digit_facet"
|
657
|
+
text << get_refine_facet("dewey_b4cutter_facet", response)
|
658
|
+
when "dewey_1digit_facet"
|
659
|
+
text << get_refine_facet("dewey_2digit_facet", response)
|
660
|
+
end
|
661
|
+
else
|
662
|
+
# display the value as a link unless it is at the peer level of a selected call number facet -%>
|
663
|
+
if !( display_facet.name.match(/^(lc_|dewey_|gov_)/i) && params_facet_has_value?(display_facet.name) )
|
664
|
+
if item_count > 4
|
665
|
+
text << " <li class=\"more\">"
|
666
|
+
else
|
667
|
+
text << " <li>"
|
668
|
+
end
|
669
|
+
if params[:qt] == 'standard'
|
670
|
+
text << " #{h(item.value)} (" + item.hits.to_s + ")"
|
671
|
+
else
|
672
|
+
text << " #{link_to h(item.value), add_facet_params(solr_fname, item.value)} (" + item.hits.to_s + ")"
|
673
|
+
end
|
674
|
+
text << " </li>"
|
675
|
+
item_count += 1
|
676
|
+
end
|
677
|
+
end
|
678
|
+
end
|
679
|
+
if display_facet.items.length > 5
|
680
|
+
if !( display_facet.name.match(/^(lc_|dewey_|gov_)/i) && params_facet_has_value?(display_facet.name) )
|
681
|
+
text << "<li class='more_li'><a href='' class='more_link' alt='more' #{home_facet_field_labels[solr_fname]}>more...</a></li>"
|
682
|
+
text << "<li class='less_li' style='display:none;'><a href='' class='more_link' alt='less' #{home_facet_field_labels[solr_fname]}>less...</a></li>"
|
683
|
+
end
|
684
|
+
end
|
685
|
+
text << " </ul>"
|
686
|
+
text << "</li>"
|
687
|
+
end # have facet to display
|
688
|
+
text
|
689
|
+
end
|
690
|
+
|
691
|
+
# true or false, depending on whether the field and a value is in params[:f]
|
692
|
+
def params_facet_has_value?(field)
|
693
|
+
if params[:f] and params[:f][field]
|
694
|
+
!params[:f][field].compact.empty?
|
695
|
+
else
|
696
|
+
false
|
697
|
+
end
|
698
|
+
end
|
699
|
+
|
700
|
+
|
701
|
+
def get_search_breadcrumb_terms(q_param)
|
702
|
+
if q_param.scan(/"([^"\r\n]*)"/)
|
703
|
+
q_arr = []
|
704
|
+
old_q = q_param.dup
|
705
|
+
q_param.scan(/"([^"\r\n]*)"/).each{|t| q_arr << "\"#{h(t)}\""}
|
706
|
+
q_arr.each do |l|
|
707
|
+
old_q.gsub!(l,'')
|
708
|
+
end
|
709
|
+
unless old_q.blank?
|
710
|
+
old_q.split(' ').each {|q| q_arr << h(q) }
|
711
|
+
end
|
712
|
+
q_arr
|
713
|
+
else
|
714
|
+
q_arr = q_param.split(' ')
|
715
|
+
end
|
716
|
+
end
|
717
|
+
|
718
|
+
def get_advanced_search_query_terms(params)
|
719
|
+
# if using the standard query parser and have an actual query we need to modify the q param after the search results are requested to something more visually friendly
|
720
|
+
if params[:qt] == "standard" and params[:q] != "collection:sirsi"
|
721
|
+
str = []
|
722
|
+
fields = []
|
723
|
+
new_query = params[:q][1,params[:q].length-2]
|
724
|
+
new_query.gsub!(") AND (", " -|- ")
|
725
|
+
new_query.gsub!(") OR (", " -|- ")
|
726
|
+
new_query.gsub!(/\^\d+ OR /, " -|- ")
|
727
|
+
new_query.split(" -|- ").each do |query_string|
|
728
|
+
fields << query_string.split(":")[0]
|
729
|
+
query = query_string.split(":")[1][/\(.*\)/]
|
730
|
+
Blacklight.config[:advanced].each do |key,value|
|
731
|
+
if value.keys.collect{|x| x.to_s}.sort == fields.sort
|
732
|
+
str << "#{key.to_s == "description_checked" ? "Description-TOC" : key.to_s.capitalize} = #{query[1,query.length][0,query.length-2]}" unless str.include?("#{key.to_s == "description_checked" ? "Description-TOC" : key.to_s.capitalize} = #{query[1,query.length][0,query.length-2]}")
|
733
|
+
fields = []
|
734
|
+
end
|
735
|
+
end
|
736
|
+
end
|
737
|
+
h str.join(" #{params[:op]} ")
|
738
|
+
end
|
739
|
+
end
|
740
|
+
|
741
|
+
def get_advanced_search_filter_terms(params)
|
742
|
+
# Modifying the fq param to be what the UI is expecting from the f param, then setting the f param to this modified hash
|
743
|
+
# Note that the query to Solr has already been made, anything beyond this will just be modifying how the UI interperets the query
|
744
|
+
unless params[:fq].to_s.empty?
|
745
|
+
a_hash = {}
|
746
|
+
fq_params = params[:fq].split("), ")
|
747
|
+
fq_params.each do |fq_param|
|
748
|
+
fq_fields = fq_param.split(":")
|
749
|
+
fq_field = fq_fields[0]
|
750
|
+
fq_values = fq_fields[1][1,fq_fields[1].length][0,fq_fields[1].length-2].split('" OR "')
|
751
|
+
fq_values.each do |value|
|
752
|
+
if a_hash.has_key?("#{fq_field}")
|
753
|
+
a_hash["#{fq_field}"] << value.gsub('"',"")
|
754
|
+
else
|
755
|
+
a_hash["#{fq_field}"] = [value.gsub('"',"")]
|
756
|
+
end
|
757
|
+
end
|
758
|
+
end
|
759
|
+
a_hash
|
760
|
+
end
|
761
|
+
end
|
762
|
+
|
763
|
+
def previous_search_is_referrer?
|
764
|
+
# If the referrer params are empty and there is no search history return false (User went directly to the record w/o a search session)
|
765
|
+
if referrer_params.empty? and url_back_to_catalog.empty?
|
766
|
+
false
|
767
|
+
# If the search history == the referrer params return true.
|
768
|
+
elsif url_back_to_catalog == referrer_params
|
769
|
+
true
|
770
|
+
# If the referrer includes the base URL (ie, <Prev | Next> links on record view) then return true
|
771
|
+
elsif request.referrer.include?(url_for({:controller => 'catalog', :only_path => false}))
|
772
|
+
true
|
773
|
+
else
|
774
|
+
false
|
775
|
+
end
|
776
|
+
end
|
777
|
+
|
778
|
+
def referrer_params
|
779
|
+
request_params = {}
|
780
|
+
if request.referrer.to_s.include?("&") or request.referrer.to_s.include?("?")
|
781
|
+
request.referrer.to_s[/\/\?.*/].split("&").each do |paramater|
|
782
|
+
unless paramater == "/?"
|
783
|
+
key = CGI::unescape(paramater.split("=")[0].gsub(/\/\?/,"")).to_sym
|
784
|
+
key.to_s[0,2] == "/?" ? key.to_s.gsub!("/?","").to_sym : ""
|
785
|
+
value = paramater.split("=").length > 1 ? h(paramater.split("=")[1].gsub("+"," ")) : ""
|
786
|
+
if request_params.has_key?(key)
|
787
|
+
request_params[key] << CGI::unescape(value)
|
788
|
+
else
|
789
|
+
request_params[key] = CGI::unescape(value)
|
790
|
+
end
|
791
|
+
end
|
792
|
+
end
|
793
|
+
end
|
794
|
+
request_params
|
795
|
+
end
|
796
|
+
|
797
|
+
# url back to catalog
|
798
|
+
# show the url back to the search result, keeping the user's facet, query and paging choices intact by using session.
|
799
|
+
# this is to match against the http.referrer
|
800
|
+
def url_back_to_catalog
|
801
|
+
query_params = session[:search].dup || {}
|
802
|
+
query_params.delete :counter
|
803
|
+
query_params.delete :total
|
804
|
+
if query_params.has_key?(:f)
|
805
|
+
query_params[:f].each do |key,val|
|
806
|
+
query_params["f[#{key}][]".to_sym] = val.to_s
|
807
|
+
end
|
808
|
+
query_params.delete(:f)
|
809
|
+
end
|
810
|
+
query_params
|
811
|
+
end
|
812
|
+
|
813
|
+
|
814
|
+
# Generate display text for "nearby" selections according to call number
|
815
|
+
def get_nearby_items(document, response, how_many)
|
816
|
+
text = "<ul id='nearby_objects'>"
|
817
|
+
|
818
|
+
# TODO: how choose if there are multiple call numbers for this document?
|
819
|
+
# 1. VALID call numbers only
|
820
|
+
# 2. if only one, use it
|
821
|
+
# 3. if only one LC, use it
|
822
|
+
# 4. if multiple LC, do someting
|
823
|
+
# 5. if no LC, do something
|
824
|
+
|
825
|
+
if !document[:callnum_sort].nil?
|
826
|
+
=begin
|
827
|
+
num = document[:callnum_sort].length
|
828
|
+
if num == 1
|
829
|
+
this_item_shelfkey = document[:callnum_sort][0].downcase
|
830
|
+
elsif
|
831
|
+
# only one LC, use it
|
832
|
+
elsif
|
833
|
+
# mult LC, use ... one of them?
|
834
|
+
else
|
835
|
+
# no LC ... do something
|
836
|
+
|
837
|
+
end
|
838
|
+
=end
|
839
|
+
|
840
|
+
#puts('DEBUG: document has callnum_sort ' + document[:callnum_sort].to_s)
|
841
|
+
this_item_shelfkey = document[:callnum_sort][0].downcase
|
842
|
+
# this_item_reverse_shelfkey = reverse_alphanum(this_item_shelfkey)
|
843
|
+
# FIXME: don't have the right conversion yet ..
|
844
|
+
this_item_reverse_shelfkey = document[:callnum_reverse_sort][0].downcase
|
845
|
+
|
846
|
+
# TODO: need to take all the returned <li> and sort them by shelfkey, then by title, then by author
|
847
|
+
|
848
|
+
# get preceding bookspines
|
849
|
+
|
850
|
+
# terms is array of one element hashes with key=term and value=count
|
851
|
+
terms_array = get_next_terms(this_item_reverse_shelfkey, "callnum_reverse_sort", how_many+1)
|
852
|
+
reverse_shelfkeys_b4 = []
|
853
|
+
num_docs = 0
|
854
|
+
puts "num rev terms is " + terms_array.length.to_s
|
855
|
+
terms_array.each { |term_hash|
|
856
|
+
reverse_shelfkeys_b4 << term_hash.keys[0] unless term_hash.keys[0] == this_item_reverse_shelfkey
|
857
|
+
num_docs = num_docs + term_hash.values[0]
|
858
|
+
}
|
859
|
+
text << get_spines_from_field(reverse_shelfkeys_b4, "callnum_reverse_sort").join
|
860
|
+
|
861
|
+
=begin
|
862
|
+
# preceding shelfkeys are in the reverse order of what we need to display -
|
863
|
+
# they are returned as closest, next closest, ... , furthest
|
864
|
+
# but b/c they are displayed BEFORE the current result, they
|
865
|
+
# need to be ordered furthest to closest
|
866
|
+
# also, don't display THIS document's stuff yet.
|
867
|
+
# reverse_shelfkeys_b4.reverse_each do |r_shelfkey|
|
868
|
+
reverse_shelfkeys_b4.each do |r_shelfkey|
|
869
|
+
if r_shelfkey != reverse_shelfkeys_b4.first
|
870
|
+
# text << get_spines_from_field(reverse_shelfkeys_b4, "callnum_reverse_sort").join
|
871
|
+
text << get_spines_from_field([r_shelfkey], "callnum_reverse_sort").join
|
872
|
+
end
|
873
|
+
end
|
874
|
+
=end
|
875
|
+
|
876
|
+
# display spine for THIS doc's shelfkey
|
877
|
+
text << "<br/>"
|
878
|
+
if terms_array[0].values[0] == 1
|
879
|
+
# orig document is only instance of its shelfkey
|
880
|
+
spines = get_spines_from_doc(document, [this_item_shelfkey])
|
881
|
+
unless spines.nil?
|
882
|
+
spines.each { |spine|
|
883
|
+
text << spine unless text.include?(spine)
|
884
|
+
}
|
885
|
+
end
|
886
|
+
else
|
887
|
+
text << get_spines_from_field([this_item_shelfkey], "callnum_sort").join
|
888
|
+
end
|
889
|
+
text << "<br/>"
|
890
|
+
|
891
|
+
# get following bookspines
|
892
|
+
terms_array = get_next_terms(this_item_shelfkey, "callnum_sort", how_many+1)
|
893
|
+
shelfkeys_after = []
|
894
|
+
num_docs = 0
|
895
|
+
puts "num terms is " + terms_array.length.to_s
|
896
|
+
terms_array.each { |term_hash|
|
897
|
+
shelfkeys_after << term_hash.keys[0] unless term_hash.keys[0] == this_item_shelfkey
|
898
|
+
num_docs = num_docs + term_hash.values[0]
|
899
|
+
}
|
900
|
+
|
901
|
+
text << get_spines_from_field(shelfkeys_after, "callnum_sort").join
|
902
|
+
|
903
|
+
=begin
|
904
|
+
shelfkeys_after.each do |shelfkey|
|
905
|
+
if shelfkey != shelfkeys_after.first
|
906
|
+
# text << get_spines_from_field(shelfkeys_after, "callnum_sort").join
|
907
|
+
text << get_spines_from_field(shelfkey[0], "callnum_sort").join
|
908
|
+
end
|
909
|
+
end
|
910
|
+
=end
|
911
|
+
end
|
912
|
+
|
913
|
+
text << "</ul>"
|
914
|
+
return text unless text == "<ul id='nearby_objects'><br/><br/></ul>"
|
915
|
+
end
|
916
|
+
|
917
|
+
|
918
|
+
protected
|
919
|
+
# create an array of sorted html list items containing the appropriate display text
|
920
|
+
# (analogous to what would be visible if you were looking at the spine of
|
921
|
+
# a book on a shelf) from relevant solr docs, given a particular solr
|
922
|
+
# field and value for which to retrieve spine info.
|
923
|
+
# The shelf key in each html list item must match a desired shelf key in the
|
924
|
+
# desired_shelfkeys array
|
925
|
+
def get_spines_from_field(values, field)
|
926
|
+
|
927
|
+
# FIXME: I think we want to deal with reversing and the like in the calling
|
928
|
+
# method. This should get spines given a particular list of shelf keys
|
929
|
+
# in each doc, we look for item display matches for shelfkeys, not reverse shelfkeys
|
930
|
+
desired_shelfkeys = []
|
931
|
+
if (field == "callnum_reverse_sort")
|
932
|
+
values.each { |rev_shelfkey|
|
933
|
+
# turn it back into a shelfkey
|
934
|
+
desired_shelfkeys << reverse_alphanum(rev_shelfkey)
|
935
|
+
}
|
936
|
+
else
|
937
|
+
desired_shelfkeys = values
|
938
|
+
end
|
939
|
+
|
940
|
+
unsorted_result = []
|
941
|
+
docs = get_docs_for_field_values(values, field)
|
942
|
+
docs.each do |doc|
|
943
|
+
# FIXME!!! "desired_shelfkeys" is call numbers, but we have shelfkeys ...
|
944
|
+
unsorted_result = unsorted_result | get_spines_from_doc(doc, desired_shelfkeys)
|
945
|
+
end
|
946
|
+
unsorted_result.uniq!
|
947
|
+
# result is: title [(pub year)] [<br/> author] <br/> callnum
|
948
|
+
|
949
|
+
# need to sort results by callnum asc, then by title asc, then by pub date desc
|
950
|
+
sort_hash = {}
|
951
|
+
unsorted_result.each_index { |i|
|
952
|
+
line_array = unsorted_result[i].split("<br/>")
|
953
|
+
callnum = line_array.last
|
954
|
+
# need to get rid of <li> and link stuff
|
955
|
+
title_year = line_array.first.sub(/<li>.*<a.*">/, '')
|
956
|
+
title = title_year.sub(/\(\d.*\)/, '')
|
957
|
+
year = title_year.sub(/.*\(/, '')
|
958
|
+
sort_hash[i]= callnum + ' ' + title + ' ' + reverse_alphanum(year)
|
959
|
+
}
|
960
|
+
# sort by values, then order result (then lift and separate?)
|
961
|
+
sorted_array = sort_hash.sort { |a,b| a[1] <=> b[1]}
|
962
|
+
sorted_result = []
|
963
|
+
sorted_array.each_index { |i|
|
964
|
+
# sort_array is array of [unsorted_result_ix, sort_val]
|
965
|
+
sort_ix = sorted_array[i][0]
|
966
|
+
sorted_result[i]= unsorted_result[sorted_array[i][0]]
|
967
|
+
}
|
968
|
+
|
969
|
+
sorted_result
|
970
|
+
end
|
971
|
+
|
972
|
+
# create an array of html list items containing the appropriate display text
|
973
|
+
# (analogous to what would be visible if you were looking at the spine of
|
974
|
+
# a book on a shelf) from a solr doc.
|
975
|
+
# The shelf key in each html list item must match a desired shelf key in the
|
976
|
+
# desired_shelfkeys array
|
977
|
+
def get_spines_from_doc(doc, desired_shelfkeys, max_len=30)
|
978
|
+
result = []
|
979
|
+
return if doc[:item_display].nil?
|
980
|
+
doc[:item_display].each { |item_disp|
|
981
|
+
callnum = item_disp.split(" -|- ")[3]
|
982
|
+
# if desired_shelfkeys.include?(callnum)
|
983
|
+
if true
|
984
|
+
id = doc[:id]
|
985
|
+
title = doc[:title_245a_display]
|
986
|
+
author = case
|
987
|
+
when doc[:author_person_display] : doc[:author_person_display]
|
988
|
+
when doc[:author_corp_display] : doc[:author_corp_display]
|
989
|
+
when doc[:author_meeting_display] : doc[:author_meeting_display]
|
990
|
+
else nil
|
991
|
+
end
|
992
|
+
pub_year = doc[:pub_date]
|
993
|
+
|
994
|
+
spine_text = "<li>"
|
995
|
+
spine_text << link_to_document(doc, :label=>title[0,max_len])
|
996
|
+
spine_text << " (" + pub_year + ")" unless pub_year.nil? || pub_year.length == 0
|
997
|
+
spine_text << "<br/>" + author[0,max_len] unless author.nil?
|
998
|
+
spine_text << "<br/>" + callnum
|
999
|
+
spine_text << "</li>"
|
1000
|
+
result << spine_text unless result.include?(spine_text)
|
1001
|
+
end
|
1002
|
+
}
|
1003
|
+
return result
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
def reverse_alphanum(str)
|
1007
|
+
rev_str = String.new(str)
|
1008
|
+
last = str.length-1
|
1009
|
+
for i in 0..last
|
1010
|
+
case rev_str[i,1]
|
1011
|
+
when '~': rev_str[i]= ' '
|
1012
|
+
when '0': rev_str[i]= 'z'
|
1013
|
+
when '1': rev_str[i]= 'y'
|
1014
|
+
when '2': rev_str[i]= 'x'
|
1015
|
+
when '3': rev_str[i]= 'w'
|
1016
|
+
when '4': rev_str[i]= 'v'
|
1017
|
+
when '5': rev_str[i]= 'u'
|
1018
|
+
when '6': rev_str[i]= 't'
|
1019
|
+
when '7': rev_str[i]= 's'
|
1020
|
+
when '8': rev_str[i]= 'r'
|
1021
|
+
when '9': rev_str[i]= 'q'
|
1022
|
+
when 'a': rev_str[i]= 'p'
|
1023
|
+
when 'b': rev_str[i]= 'o'
|
1024
|
+
when 'c': rev_str[i]= 'n'
|
1025
|
+
when 'd': rev_str[i]= 'm'
|
1026
|
+
when 'e': rev_str[i]= 'l'
|
1027
|
+
when 'f': rev_str[i]= 'k'
|
1028
|
+
when 'g': rev_str[i]= 'j'
|
1029
|
+
when 'h': rev_str[i]= 'i'
|
1030
|
+
when 'i': rev_str[i]= 'h'
|
1031
|
+
when 'j': rev_str[i]= 'g'
|
1032
|
+
when 'k': rev_str[i]= 'f'
|
1033
|
+
when 'l': rev_str[i]= 'e'
|
1034
|
+
when 'm': rev_str[i]= 'd'
|
1035
|
+
when 'n': rev_str[i]= 'c'
|
1036
|
+
when 'o': rev_str[i]= 'b'
|
1037
|
+
when 'p': rev_str[i]= 'a'
|
1038
|
+
when 'q','Q': rev_str[i]= '9'
|
1039
|
+
when 'r','R': rev_str[i]= '8'
|
1040
|
+
when 's','S': rev_str[i]= '7'
|
1041
|
+
when 't','T': rev_str[i]= '6'
|
1042
|
+
when 'u','U': rev_str[i]= '5'
|
1043
|
+
when 'v','V': rev_str[i]= '4'
|
1044
|
+
when 'w','W': rev_str[i]= '3'
|
1045
|
+
when 'x','X': rev_str[i]= '2'
|
1046
|
+
when 'y','Y': rev_str[i]= '1'
|
1047
|
+
when 'z','Z': rev_str[i]= '0'
|
1048
|
+
when 'A': rev_str[i]= 'P'
|
1049
|
+
when 'B': rev_str[i]= 'O'
|
1050
|
+
when 'C': rev_str[i]= 'N'
|
1051
|
+
when 'D': rev_str[i]= 'M'
|
1052
|
+
when 'E': rev_str[i]= 'L'
|
1053
|
+
when 'F': rev_str[i]= 'K'
|
1054
|
+
when 'G': rev_str[i]= 'J'
|
1055
|
+
when 'H': rev_str[i]= 'I'
|
1056
|
+
when 'I': rev_str[i]= 'H'
|
1057
|
+
when 'J': rev_str[i]= 'G'
|
1058
|
+
when 'K': rev_str[i]= 'F'
|
1059
|
+
when 'L': rev_str[i]= 'E'
|
1060
|
+
when 'M': rev_str[i]= 'D'
|
1061
|
+
when 'N': rev_str[i]= 'C'
|
1062
|
+
when 'O': rev_str[i]= 'B'
|
1063
|
+
when 'P': rev_str[i]= 'A'
|
1064
|
+
end
|
1065
|
+
end
|
1066
|
+
rev_str
|
1067
|
+
end
|
1068
|
+
|
1069
|
+
def translate_lib
|
1070
|
+
{"Archive of Recorded Sound" => "Archive of Recorded Sound",
|
1071
|
+
"Art & Architecture" => "Art",
|
1072
|
+
"Branner (Earth Sciences & Maps)" => "Earth Sciences",
|
1073
|
+
"Classics" => "Classics",
|
1074
|
+
"Cubberley (Education)" => "Education",
|
1075
|
+
"Crown (Law)" => "Law",
|
1076
|
+
"East Asia" => "East Asia",
|
1077
|
+
"Engineering" => "Engineering",
|
1078
|
+
"Falconer (Biology)" => "Biology",
|
1079
|
+
"Green (Humanities & Social Sciences)" => "Green Library",
|
1080
|
+
"Hoover Library" => "Hoover Library",
|
1081
|
+
"Hoover Archives" => "Hoover Archives",
|
1082
|
+
"Jackson (Business)" => "Business",
|
1083
|
+
"Jonsson (Government Documents)" => "GovDocs",
|
1084
|
+
"Lane (Medical)" => "Medicine",
|
1085
|
+
"Miller (Hopkins Marine Station)" => "Hopkins Marine",
|
1086
|
+
"Math & Computer Science" => "Math & CompSci",
|
1087
|
+
"Meyer" => "",
|
1088
|
+
"Music" => "Music",
|
1089
|
+
"SAL3 (Off-campus)" => "",
|
1090
|
+
"SAL Newark (Off-campus)" => "",
|
1091
|
+
"Physics" => "Physics",
|
1092
|
+
"Stanford Auxiliary Library (On-campus)" => "",
|
1093
|
+
"Special Collections & Archives" => "Special Collections",
|
1094
|
+
"Stanford University Libraries" => "",
|
1095
|
+
"Swain (Chemistry & Chem. Engineering)" => "Chemistry",
|
1096
|
+
"Tanner (Philosophy Dept.)" => "Philosophy",
|
1097
|
+
"Applied Physics Department" => ""}
|
1098
|
+
end
|
1099
|
+
|
1100
|
+
def relator_terms
|
1101
|
+
{"acp" => "Art copyist",
|
1102
|
+
"act" => "Actor",
|
1103
|
+
"adp" => "Adapter",
|
1104
|
+
"aft" => "Author of afterword, colophon, etc.",
|
1105
|
+
"anl" => "Analyst",
|
1106
|
+
"anm" => "Animator",
|
1107
|
+
"ann" => "Annotator",
|
1108
|
+
"ant" => "Bibliographic antecedent",
|
1109
|
+
"app" => "Applicant",
|
1110
|
+
"aqt" => "Author in quotations or text abstracts",
|
1111
|
+
"arc" => "Architect",
|
1112
|
+
"ard" => "Artistic director ",
|
1113
|
+
"arr" => "Arranger",
|
1114
|
+
"art" => "Artist",
|
1115
|
+
"asg" => "Assignee",
|
1116
|
+
"asn" => "Associated name",
|
1117
|
+
"att" => "Attributed name",
|
1118
|
+
"auc" => "Auctioneer",
|
1119
|
+
"aud" => "Author of dialog",
|
1120
|
+
"aui" => "Author of introduction",
|
1121
|
+
"aus" => "Author of screenplay",
|
1122
|
+
"aut" => "Author",
|
1123
|
+
"bdd" => "Binding designer",
|
1124
|
+
"bjd" => "Bookjacket designer",
|
1125
|
+
"bkd" => "Book designer",
|
1126
|
+
"bkp" => "Book producer",
|
1127
|
+
"bnd" => "Binder",
|
1128
|
+
"bpd" => "Bookplate designer",
|
1129
|
+
"bsl" => "Bookseller",
|
1130
|
+
"ccp" => "Conceptor",
|
1131
|
+
"chr" => "Choreographer",
|
1132
|
+
"clb" => "Collaborator",
|
1133
|
+
"cli" => "Client",
|
1134
|
+
"cll" => "Calligrapher",
|
1135
|
+
"clt" => "Collotyper",
|
1136
|
+
"cmm" => "Commentator",
|
1137
|
+
"cmp" => "Composer",
|
1138
|
+
"cmt" => "Compositor",
|
1139
|
+
"cng" => "Cinematographer",
|
1140
|
+
"cnd" => "Conductor",
|
1141
|
+
"cns" => "Censor",
|
1142
|
+
"coe" => "Contestant -appellee",
|
1143
|
+
"col" => "Collector",
|
1144
|
+
"com" => "Compiler",
|
1145
|
+
"cos" => "Contestant",
|
1146
|
+
"cot" => "Contestant -appellant",
|
1147
|
+
"cov" => "Cover designer",
|
1148
|
+
"cpc" => "Copyright claimant",
|
1149
|
+
"cpe" => "Complainant-appellee",
|
1150
|
+
"cph" => "Copyright holder",
|
1151
|
+
"cpl" => "Complainant",
|
1152
|
+
"cpt" => "Complainant-appellant",
|
1153
|
+
"cre" => "Creator",
|
1154
|
+
"crp" => "Correspondent",
|
1155
|
+
"crr" => "Corrector",
|
1156
|
+
"csl" => "Consultant",
|
1157
|
+
"csp" => "Consultant to a project",
|
1158
|
+
"cst" => "Costume designer",
|
1159
|
+
"ctb" => "Contributor",
|
1160
|
+
"cte" => "Contestee-appellee",
|
1161
|
+
"ctg" => "Cartographer",
|
1162
|
+
"ctr" => "Contractor",
|
1163
|
+
"cts" => "Contestee",
|
1164
|
+
"ctt" => "Contestee-appellant",
|
1165
|
+
"cur" => "Curator",
|
1166
|
+
"cwt" => "Commentator for written text",
|
1167
|
+
"dfd" => "Defendant",
|
1168
|
+
"dfe" => "Defendant-appellee",
|
1169
|
+
"dft" => "Defendant-appellant",
|
1170
|
+
"dgg" => "Degree grantor",
|
1171
|
+
"dis" => "Dissertant",
|
1172
|
+
"dln" => "Delineator",
|
1173
|
+
"dnc" => "Dancer",
|
1174
|
+
"dnr" => "Donor",
|
1175
|
+
"dpc" => "Depicted",
|
1176
|
+
"dpt" => "Depositor",
|
1177
|
+
"drm" => "Draftsman",
|
1178
|
+
"drt" => "Director",
|
1179
|
+
"dsr" => "Designer",
|
1180
|
+
"dst" => "Distributor",
|
1181
|
+
"dtc" => "Data contributor ",
|
1182
|
+
"dte" => "Dedicatee",
|
1183
|
+
"dtm" => "Data manager ",
|
1184
|
+
"dto" => "Dedicator",
|
1185
|
+
"dub" => "Dubious author",
|
1186
|
+
"edt" => "Editor",
|
1187
|
+
"egr" => "Engraver",
|
1188
|
+
"elg" => "Electrician ",
|
1189
|
+
"elt" => "Electrotyper",
|
1190
|
+
"eng" => "Engineer",
|
1191
|
+
"etr" => "Etcher",
|
1192
|
+
"exp" => "Expert",
|
1193
|
+
"fac" => "Facsimilist",
|
1194
|
+
"fld" => "Field director ",
|
1195
|
+
"flm" => "Film editor",
|
1196
|
+
"fmo" => "Former owner",
|
1197
|
+
"fpy" => "First party",
|
1198
|
+
"fnd" => "Funder",
|
1199
|
+
"frg" => "Forger",
|
1200
|
+
"gis" => "Geographic information specialist ",
|
1201
|
+
"grt" => "Graphic technician",
|
1202
|
+
"hnr" => "Honoree",
|
1203
|
+
"hst" => "Host",
|
1204
|
+
"ill" => "Illustrator",
|
1205
|
+
"ilu" => "Illuminator",
|
1206
|
+
"ins" => "Inscriber",
|
1207
|
+
"inv" => "Inventor",
|
1208
|
+
"itr" => "Instrumentalist",
|
1209
|
+
"ive" => "Interviewee",
|
1210
|
+
"ivr" => "Interviewer",
|
1211
|
+
"lbr" => "Laboratory ",
|
1212
|
+
"lbt" => "Librettist",
|
1213
|
+
"ldr" => "Laboratory director ",
|
1214
|
+
"led" => "Lead",
|
1215
|
+
"lee" => "Libelee-appellee",
|
1216
|
+
"lel" => "Libelee",
|
1217
|
+
"len" => "Lender",
|
1218
|
+
"let" => "Libelee-appellant",
|
1219
|
+
"lgd" => "Lighting designer",
|
1220
|
+
"lie" => "Libelant-appellee",
|
1221
|
+
"lil" => "Libelant",
|
1222
|
+
"lit" => "Libelant-appellant",
|
1223
|
+
"lsa" => "Landscape architect",
|
1224
|
+
"lse" => "Licensee",
|
1225
|
+
"lso" => "Licensor",
|
1226
|
+
"ltg" => "Lithographer",
|
1227
|
+
"lyr" => "Lyricist",
|
1228
|
+
"mcp" => "Music copyist",
|
1229
|
+
"mfr" => "Manufacturer",
|
1230
|
+
"mdc" => "Metadata contact",
|
1231
|
+
"mod" => "Moderator",
|
1232
|
+
"mon" => "Monitor",
|
1233
|
+
"mrk" => "Markup editor",
|
1234
|
+
"msd" => "Musical director",
|
1235
|
+
"mte" => "Metal-engraver",
|
1236
|
+
"mus" => "Musician",
|
1237
|
+
"nrt" => "Narrator",
|
1238
|
+
"opn" => "Opponent",
|
1239
|
+
"org" => "Originator",
|
1240
|
+
"orm" => "Organizer of meeting",
|
1241
|
+
"oth" => "Other",
|
1242
|
+
"own" => "Owner",
|
1243
|
+
"pat" => "Patron",
|
1244
|
+
"pbd" => "Publishing director",
|
1245
|
+
"pbl" => "Publisher",
|
1246
|
+
"pdr" => "Project director",
|
1247
|
+
"pfr" => "Proofreader",
|
1248
|
+
"pht" => "Photographer",
|
1249
|
+
"plt" => "Platemaker",
|
1250
|
+
"pma" => "Permitting agency",
|
1251
|
+
"pmn" => "Production manager",
|
1252
|
+
"pop" => "Printer of plates",
|
1253
|
+
"ppm" => "Papermaker",
|
1254
|
+
"ppt" => "Puppeteer",
|
1255
|
+
"prc" => "Process contact",
|
1256
|
+
"prd" => "Production personnel",
|
1257
|
+
"prf" => "Performer",
|
1258
|
+
"prg" => "Programmer",
|
1259
|
+
"prm" => "Printmaker",
|
1260
|
+
"pro" => "Producer",
|
1261
|
+
"prt" => "Printer",
|
1262
|
+
"pta" => "Patent applicant",
|
1263
|
+
"pte" => "Plaintiff -appellee",
|
1264
|
+
"ptf" => "Plaintiff",
|
1265
|
+
"pth" => "Patent holder",
|
1266
|
+
"ptt" => "Plaintiff-appellant",
|
1267
|
+
"rbr" => "Rubricator",
|
1268
|
+
"rce" => "Recording engineer",
|
1269
|
+
"rcp" => "Recipient",
|
1270
|
+
"red" => "Redactor",
|
1271
|
+
"ren" => "Renderer",
|
1272
|
+
"res" => "Researcher",
|
1273
|
+
"rev" => "Reviewer",
|
1274
|
+
"rps" => "Repository",
|
1275
|
+
"rpt" => "Reporter",
|
1276
|
+
"rpy" => "Responsible party",
|
1277
|
+
"rse" => "Respondent-appellee",
|
1278
|
+
"rsg" => "Restager",
|
1279
|
+
"rsp" => "Respondent",
|
1280
|
+
"rst" => "Respondent-appellant",
|
1281
|
+
"rth" => "Research team head",
|
1282
|
+
"rtm" => "Research team member",
|
1283
|
+
"sad" => "Scientific advisor",
|
1284
|
+
"sce" => "Scenarist",
|
1285
|
+
"scl" => "Sculptor",
|
1286
|
+
"scr" => "Scribe",
|
1287
|
+
"sds" => "Sound designer",
|
1288
|
+
"sec" => "Secretary",
|
1289
|
+
"sgn" => "Signer",
|
1290
|
+
"sht" => "Supporting host",
|
1291
|
+
"sng" => "Singer",
|
1292
|
+
"spk" => "Speaker",
|
1293
|
+
"spn" => "Sponsor",
|
1294
|
+
"spy" => "Second party",
|
1295
|
+
"srv" => "Surveyor",
|
1296
|
+
"std" => "Set designer",
|
1297
|
+
"stl" => "Storyteller",
|
1298
|
+
"stm" => "Stage manager",
|
1299
|
+
"stn" => "Standards body",
|
1300
|
+
"str" => "Stereotyper",
|
1301
|
+
"tcd" => "Technical director",
|
1302
|
+
"tch" => "Teacher",
|
1303
|
+
"ths" => "Thesis advisor",
|
1304
|
+
"trc" => "Transcriber",
|
1305
|
+
"trl" => "Translator",
|
1306
|
+
"tyd" => "Type designer",
|
1307
|
+
"tyg" => "Typographer",
|
1308
|
+
"vdg" => "Videographer",
|
1309
|
+
"voc" => "Vocalist",
|
1310
|
+
"wam" => "Writer of accompanying material",
|
1311
|
+
"wdc" => "Woodcutter",
|
1312
|
+
"wde" => "Wood -engraver",
|
1313
|
+
"wit" => "Witness"}
|
1314
|
+
end
|
1315
|
+
|
1316
|
+
def name_change_780_translations
|
1317
|
+
{"0" => "Continues",
|
1318
|
+
"1" => "Continues in part",
|
1319
|
+
"2" => "Supersedes",
|
1320
|
+
"3" => "Supersedes in part",
|
1321
|
+
"4" => "Merged from",
|
1322
|
+
"5" => "Absorbed",
|
1323
|
+
"6" => "Absorbed in part",
|
1324
|
+
"7" => "Separated from"}
|
1325
|
+
end
|
1326
|
+
|
1327
|
+
def name_change_785_translations
|
1328
|
+
{"0" => "Continued by",
|
1329
|
+
"1" => "Continued in part by",
|
1330
|
+
"2" => "Superseded by",
|
1331
|
+
"3" => "Superseded in part by",
|
1332
|
+
"4" => "Absorbed by",
|
1333
|
+
"5" => "Absorbed in part by",
|
1334
|
+
"6" => "Split into",
|
1335
|
+
"7" => "Merged with ... to form ...",
|
1336
|
+
"8" => "Changed back to"}
|
1337
|
+
end
|
1338
|
+
end
|