blacklight 3.0pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/.gitignore +17 -0
  2. data/.gitmodules +6 -0
  3. data/.yardopts +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +14 -0
  6. data/README.rdoc +168 -0
  7. data/Rakefile +9 -0
  8. data/app/controllers/bookmarks_controller.rb +98 -0
  9. data/app/controllers/feedback_controller.rb +37 -0
  10. data/app/controllers/folder_controller.rb +49 -0
  11. data/app/controllers/saved_searches_controller.rb +45 -0
  12. data/app/controllers/search_history_controller.rb +25 -0
  13. data/app/helpers/blacklight_helper.rb +606 -0
  14. data/app/helpers/bookmarks_helper.rb +3 -0
  15. data/app/helpers/catalog_helper.rb +65 -0
  16. data/app/helpers/feedback_helper.rb +2 -0
  17. data/app/helpers/hash_as_hidden_fields.rb +57 -0
  18. data/app/helpers/render_constraints_helper.rb +120 -0
  19. data/app/helpers/saved_searches_helper.rb +2 -0
  20. data/app/helpers/search_history_helper.rb +2 -0
  21. data/app/models/bookmark.rb +6 -0
  22. data/app/models/record_mailer.rb +43 -0
  23. data/app/models/search.rb +19 -0
  24. data/app/views/_flash_msg.html.erb +6 -0
  25. data/app/views/_user_util_links.html.erb +13 -0
  26. data/app/views/bookmarks/index.html.erb +33 -0
  27. data/app/views/catalog/_bookmark_control.html.erb +25 -0
  28. data/app/views/catalog/_bookmark_form.html.erb +8 -0
  29. data/app/views/catalog/_citation.html.erb +15 -0
  30. data/app/views/catalog/_constraints.html.erb +7 -0
  31. data/app/views/catalog/_constraints_element.html.erb +33 -0
  32. data/app/views/catalog/_did_you_mean.html.erb +10 -0
  33. data/app/views/catalog/_document_list.html.erb +30 -0
  34. data/app/views/catalog/_email_form.html.erb +11 -0
  35. data/app/views/catalog/_facet_limit.html.erb +33 -0
  36. data/app/views/catalog/_facet_pagination.html.erb +28 -0
  37. data/app/views/catalog/_facets.html.erb +9 -0
  38. data/app/views/catalog/_folder_control.html.erb +12 -0
  39. data/app/views/catalog/_home.html.erb +6 -0
  40. data/app/views/catalog/_home_text.html.erb +6 -0
  41. data/app/views/catalog/_index_partials/_default.erb +11 -0
  42. data/app/views/catalog/_marc_view.html.erb +33 -0
  43. data/app/views/catalog/_opensearch_response_metadata.html.erb +3 -0
  44. data/app/views/catalog/_previous_next_doc.html.erb +6 -0
  45. data/app/views/catalog/_refworks_form.html.erb +7 -0
  46. data/app/views/catalog/_results_pagination.html.erb +11 -0
  47. data/app/views/catalog/_search_form.html.erb +14 -0
  48. data/app/views/catalog/_show_partials/_default.html.erb +9 -0
  49. data/app/views/catalog/_show_sidebar.html.erb +1 -0
  50. data/app/views/catalog/_show_tools.html.erb +46 -0
  51. data/app/views/catalog/_sms_form.html.erb +23 -0
  52. data/app/views/catalog/_solr_request.html.erb +5 -0
  53. data/app/views/catalog/_sort_and_per_page.html.erb +20 -0
  54. data/app/views/catalog/_unapi_microformat.html.erb +1 -0
  55. data/app/views/catalog/citation.html.erb +1 -0
  56. data/app/views/catalog/email.erb +1 -0
  57. data/app/views/catalog/endnote.endnote.erb +1 -0
  58. data/app/views/catalog/facet.html.erb +28 -0
  59. data/app/views/catalog/index.atom.builder +108 -0
  60. data/app/views/catalog/index.html.erb +37 -0
  61. data/app/views/catalog/index.rss.builder +19 -0
  62. data/app/views/catalog/librarian_view.html.erb +3 -0
  63. data/app/views/catalog/opensearch.json.erb +0 -0
  64. data/app/views/catalog/opensearch.xml.erb +11 -0
  65. data/app/views/catalog/send_email_record.erb +0 -0
  66. data/app/views/catalog/show.endnote.erb +1 -0
  67. data/app/views/catalog/show.html.erb +42 -0
  68. data/app/views/catalog/show.refworks.erb +1 -0
  69. data/app/views/catalog/sms.erb +1 -0
  70. data/app/views/catalog/unapi.xml.builder +6 -0
  71. data/app/views/feedback/complete.html.erb +3 -0
  72. data/app/views/feedback/show.html.erb +20 -0
  73. data/app/views/folder/_tools.html.erb +23 -0
  74. data/app/views/folder/index.html.erb +44 -0
  75. data/app/views/layouts/blacklight.html.erb +49 -0
  76. data/app/views/record_mailer/email_record.erb +6 -0
  77. data/app/views/record_mailer/sms_record.erb +4 -0
  78. data/app/views/saved_searches/index.html.erb +27 -0
  79. data/app/views/search_history/index.html.erb +23 -0
  80. data/blacklight.gemspec +50 -0
  81. data/config.ru +4 -0
  82. data/config/routes.rb +54 -0
  83. data/db/seeds.rb +7 -0
  84. data/features/generators.feature +77 -0
  85. data/features/support/aruba.rb +9 -0
  86. data/install.rb +0 -0
  87. data/install/solr.yml +8 -0
  88. data/lib/blacklight.rb +121 -0
  89. data/lib/blacklight/catalog.rb +311 -0
  90. data/lib/blacklight/comma_link_renderer.rb +27 -0
  91. data/lib/blacklight/configurable.rb +46 -0
  92. data/lib/blacklight/controller.rb +121 -0
  93. data/lib/blacklight/engine.rb +32 -0
  94. data/lib/blacklight/exceptions.rb +13 -0
  95. data/lib/blacklight/marc.rb +46 -0
  96. data/lib/blacklight/marc/citation.rb +251 -0
  97. data/lib/blacklight/search_fields.rb +107 -0
  98. data/lib/blacklight/solr.rb +7 -0
  99. data/lib/blacklight/solr/document.rb +239 -0
  100. data/lib/blacklight/solr/document/dublin_core.rb +40 -0
  101. data/lib/blacklight/solr/document/email.rb +15 -0
  102. data/lib/blacklight/solr/document/marc.rb +84 -0
  103. data/lib/blacklight/solr/document/marc_export.rb +430 -0
  104. data/lib/blacklight/solr/document/sms.rb +13 -0
  105. data/lib/blacklight/solr/facet_paginator.rb +93 -0
  106. data/lib/blacklight/solr_helper.rb +413 -0
  107. data/lib/blacklight/user.rb +55 -0
  108. data/lib/blacklight/version.rb +3 -0
  109. data/lib/colorize.rb +196 -0
  110. data/lib/generators/blacklight/blacklight_generator.rb +134 -0
  111. data/lib/generators/blacklight/templates/SolrMarc.jar +0 -0
  112. data/lib/generators/blacklight/templates/catalog_controller.rb +8 -0
  113. data/lib/generators/blacklight/templates/config/SolrMarc/config-test.properties +37 -0
  114. data/lib/generators/blacklight/templates/config/SolrMarc/config.properties +37 -0
  115. data/lib/generators/blacklight/templates/config/SolrMarc/index.properties +97 -0
  116. data/lib/generators/blacklight/templates/config/SolrMarc/index_scripts/dewey.bsh +47 -0
  117. data/lib/generators/blacklight/templates/config/SolrMarc/index_scripts/format.bsh +126 -0
  118. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/README_MAPS +1 -0
  119. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/callnumber_map.properties +407 -0
  120. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/composition_era_map.properties +56 -0
  121. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/country_map.properties +379 -0
  122. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/format_map.properties +50 -0
  123. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/instrument_map.properties +101 -0
  124. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/language_map.properties +490 -0
  125. data/lib/generators/blacklight/templates/config/blacklight_config.rb +245 -0
  126. data/lib/generators/blacklight/templates/config/solr.yml +6 -0
  127. data/lib/generators/blacklight/templates/migrations/add_user_types_to_bookmarks_searches.rb +11 -0
  128. data/lib/generators/blacklight/templates/migrations/create_bookmarks.rb +17 -0
  129. data/lib/generators/blacklight/templates/migrations/create_searches.rb +15 -0
  130. data/lib/generators/blacklight/templates/migrations/remove_editable_fields_from_bookmarks.rb +11 -0
  131. data/lib/generators/blacklight/templates/public/images/blacklight/bg.png +0 -0
  132. data/lib/generators/blacklight/templates/public/images/blacklight/border.png +0 -0
  133. data/lib/generators/blacklight/templates/public/images/blacklight/bul_sq_gry.gif +0 -0
  134. data/lib/generators/blacklight/templates/public/images/blacklight/checkmark.gif +0 -0
  135. data/lib/generators/blacklight/templates/public/images/blacklight/logo.png +0 -0
  136. data/lib/generators/blacklight/templates/public/images/blacklight/magnifying_glass.gif +0 -0
  137. data/lib/generators/blacklight/templates/public/images/blacklight/remove.gif +0 -0
  138. data/lib/generators/blacklight/templates/public/images/blacklight/separator.gif +0 -0
  139. data/lib/generators/blacklight/templates/public/images/blacklight/start_over.gif +0 -0
  140. data/lib/generators/blacklight/templates/public/javascripts/blacklight.js +485 -0
  141. data/lib/generators/blacklight/templates/public/javascripts/jquery-1.4.2.min.js +154 -0
  142. data/lib/generators/blacklight/templates/public/javascripts/jquery-ui-1.8.1.custom.min.js +756 -0
  143. data/lib/generators/blacklight/templates/public/stylesheets/blacklight.css +487 -0
  144. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  145. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  146. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  147. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  148. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  149. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  150. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_gloss-wave_35_558fd0_500x100.png +0 -0
  151. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  152. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  153. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  154. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  155. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_2e4f81_256x240.png +0 -0
  156. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  157. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  158. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
  159. data/lib/generators/blacklight/templates/public/stylesheets/yui.css +31 -0
  160. data/lib/generators/blacklight/templates/solr_document.rb +30 -0
  161. data/lib/railties/blacklight.rake +66 -0
  162. data/lib/railties/cucumber.rake +53 -0
  163. data/lib/railties/rspec.rake +188 -0
  164. data/lib/railties/solr_marc.rake +148 -0
  165. data/lib/railties/test_solr_server.rb +130 -0
  166. data/spec/helpers/catalog_helper_spec.rb +111 -0
  167. data/spec/views/catalog/_sms_form.html.erb_spec.rb +19 -0
  168. data/tasks/blacklight_tasks.rake +4 -0
  169. data/uninstall.rb +1 -0
  170. metadata +431 -0
@@ -0,0 +1,27 @@
1
+ require 'will_paginate/view_helpers/link_renderer'
2
+
3
+ # Custom link renderer for WillPaginate
4
+ # Inserts commas into large page numbers
5
+ # example: 443719 becomes 443,719
6
+ #
7
+ # Note: To use this class, please call:
8
+ # <%= will_paginate(@users, :renderer => CommaLinkRenderer) %>
9
+
10
+ module Blacklight
11
+
12
+ class CommaLinkRenderer < WillPaginate::ViewHelpers::LinkRenderer
13
+
14
+ protected
15
+ # Just overriding the page_number method, so that large numbers are
16
+ # contain appropriate commas.
17
+ def page_number(page)
18
+ unless page == current_page
19
+ text = @template.number_with_delimiter(page)
20
+ link(text, page, :rel => rel_value(page))
21
+ else
22
+ tag(:em, page)
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,46 @@
1
+ module Blacklight::Configurable
2
+
3
+ # The config environment name used by the #config method
4
+ #
5
+ # Example:
6
+ # class MyThing
7
+ # extend Blacklight::Configurable
8
+ # end
9
+ #
10
+ # Now MyThing.config will be the result of:
11
+ # MyThing.configure(:production) {|config|}
12
+ #
13
+ # You set shared attributes by leaving the first argument blank or passing the :shared value:
14
+ # MyThing.configure {|config|}
15
+ # or
16
+ # MyThing.cofigure(:shared) {|config|}
17
+
18
+ # sets the @configs variable to a new Hash with empty Hash for :shared key and @config to nil
19
+ def reset_configs!
20
+ @config = nil
21
+ @configs = {:shared=>{}}
22
+ end
23
+
24
+ # A hash of all environment configs
25
+ # The key is the environment name, the value a Hash
26
+ def configs
27
+ @configs ? @configs : (reset_configs! and @configs)
28
+ end
29
+
30
+ # The main config accessor. It merges the current configs[::Rails.env]
31
+ # with configs[:shared] and lazy-loads @config to the result.
32
+ def config
33
+ @config ||= configs[:shared].merge(configs[::Rails.env] ||= {})
34
+ end
35
+
36
+ # Accepts a value for the environment to configure and a block
37
+ # A hash is yielded to the block
38
+ # If the "env" != :shared,
39
+ # the hash is created by deep cloning the :shared environment config.
40
+ # This makes it possible to create defaults in the :shared config
41
+ def configure(env = :shared, &blk)
42
+ configs[env] = {}
43
+ yield configs[env]
44
+ end
45
+
46
+ end
@@ -0,0 +1,121 @@
1
+ #
2
+ # Filters added to this controller apply to all controllers in the hosting application
3
+ # as this module is mixed-in to the application controller in the hosting app on installation.
4
+ module Blacklight::Controller
5
+
6
+ def self.included(base)
7
+ base.send :before_filter, :default_html_head # add JS/stylesheet stuff
8
+ # now in application.rb file under config.filter_parameters
9
+ # filter_parameter_logging :password, :password_confirmation
10
+ base.send :helper_method, :current_user_session, :current_user
11
+ base.send :after_filter, :discard_flash_if_xhr
12
+
13
+ # handle basic authorization exception with #access_denied
14
+ base.send :rescue_from, Blacklight::Exceptions::AccessDenied, :with => :access_denied
15
+
16
+ base.send :helper_method, [:request_is_for_user_resource?]#, :user_logged_in?]
17
+
18
+ base.send :layout, :choose_layout
19
+
20
+ # extra head content
21
+ base.send :helper_method, :extra_head_content
22
+ base.send :helper_method, :stylesheet_links
23
+ base.send :helper_method, :javascript_includes
24
+ end
25
+
26
+
27
+ # test for exception notifier plugin
28
+ def error
29
+ raise RuntimeError, "Generating a test error..."
30
+ end
31
+
32
+ #############
33
+ # Display-related methods.
34
+ #############
35
+
36
+ # before filter to set up our default html HEAD content. Sub-class
37
+ # controllers can over-ride this method, or instead turn off the before_filter
38
+ # if they like. See:
39
+ # http://api.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html
40
+ # for how to turn off a filter in a sub-class and such.
41
+ def default_html_head
42
+ stylesheet_links << ['yui', 'jquery/ui-lightness/jquery-ui-1.8.1.custom.css', 'blacklight', {:plugin=>:blacklight, :media=>'all'}]
43
+
44
+ javascript_includes << ['jquery-1.4.2.min.js', 'jquery-ui-1.8.1.custom.min.js', 'blacklight', { :plugin=>:blacklight } ]
45
+ end
46
+
47
+
48
+ # An array of strings to be added to HTML HEAD section of view.
49
+ # See ApplicationHelper#render_head_content for details.
50
+ def extra_head_content
51
+ @extra_head_content ||= []
52
+ end
53
+
54
+
55
+ # Array, where each element is an array of arguments to
56
+ # Rails stylesheet_link_tag helper. See
57
+ # ApplicationHelper#render_head_content for details.
58
+ def stylesheet_links
59
+ @stylesheet_links ||= []
60
+ end
61
+
62
+ # Array, where each element is an array of arguments to
63
+ # Rails javascript_include_tag helper. See
64
+ # ApplicationHelper#render_head_content for details.
65
+ def javascript_includes
66
+ @javascript_includes ||= []
67
+ end
68
+
69
+ protected
70
+
71
+ # Returns a list of Searches from the ids in the user's history.
72
+ def searches_from_history
73
+ session[:history].blank? ? [] : Search.find(session[:history]) rescue []
74
+ end
75
+
76
+ #
77
+ # Controller and view helper for determining if the current url is a request for a user resource
78
+ #
79
+ def request_is_for_user_resource?
80
+ request.env['PATH_INFO'] =~ /\/?users\/?/
81
+ end
82
+
83
+ #
84
+ # If a param[:no_layout] is set OR
85
+ # request.env['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'
86
+ # don't use a layout, otherwise use the "application.html.erb" layout
87
+ #
88
+ def choose_layout
89
+ 'blacklight' unless request.xml_http_request? || ! params[:no_layout].blank?
90
+ end
91
+
92
+ def current_user_session
93
+ puts "DEPRICATED: Please use Devise, Authlogic or other authentication system."
94
+ user_session # method provided by devise
95
+ end
96
+
97
+ # Should be provided by devise
98
+ # def current_user
99
+ # end
100
+
101
+ ##
102
+ # We discard flash messages generated by the xhr requests to avoid
103
+ # confusing UX.
104
+ def discard_flash_if_xhr
105
+ flash.discard if request.xhr?
106
+ end
107
+
108
+ ##
109
+ # To handle failed authorization attempts, redirect the user to the
110
+ # login form and persist the current request uri as a parameter
111
+ def access_denied
112
+ # send the user home if the access was previously denied by the same
113
+ # request to avoid sending the user back to the login page
114
+ # (e.g. protected page -> logout -> returned to protected page -> home)
115
+ redirect_to root_url and flash.discard and return if request.referer and request.referer.ends_with? request.fullpath
116
+
117
+ redirect_to new_user_session_url(:referer => request.fullpath)
118
+ end
119
+
120
+ end
121
+
@@ -0,0 +1,32 @@
1
+ # lib/blacklight/engine.rb
2
+ require "blacklight"
3
+ require "rails"
4
+
5
+ module Blackight
6
+ class Engine < Rails::Engine
7
+
8
+ # BlacklightHelper is needed by all helpers, so we inject it
9
+ # into action view base here.
10
+ initializer 'blacklight.helpers' do |app|
11
+ ActionView::Base.send :include, BlacklightHelper
12
+ end
13
+
14
+ # Go ahead and innitialize Blacklight at the very end of the rails
15
+ # innitilization process.
16
+ # See: http://www.cowboycoded.com/2010/08/02/hooking-in-your-rails-3-engine-or-railtie-initializer-in-the-right-place/
17
+ initializer 'blacklight.init', :after=> :disable_dependency_loading do |app|
18
+ # Note, check for configuration files before calling init,
19
+ # otherwise we can't generate these files with the Generator
20
+ # and we can't tell at this point if we are begin run as a generator
21
+ # or not (at least, I didn't see a way)
22
+ Blacklight.init if File.exists?(Blacklight.solr_file)
23
+ end
24
+
25
+ # This makes our rake tasks visible.
26
+ rake_tasks do
27
+ load "railties/blacklight.rake"
28
+ load "railties/solr_marc.rake"
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,13 @@
1
+ module Blacklight
2
+ module Exceptions
3
+
4
+ class AccessDenied < Exception
5
+ end
6
+
7
+ # When a request for a single solr document by id
8
+ # is not successful, raise this:
9
+ class InvalidSolrID < RuntimeError
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+
2
+ ## This module and the ::Document class in it is DEPRECATED, and will go away.
3
+ # It has been replaced by
4
+ # code using the new document extension framework. See
5
+ # Blacklight::Solr::Document::Marc and Blacklight::Solr::Document::MarcExport
6
+ # This code should not really be changed, or used anymore. It is frozen
7
+ # and deprecated until removed.
8
+ module Blacklight::Marc
9
+
10
+ autoload :Citation, 'blacklight/marc/citation.rb'
11
+
12
+ class UnsupportedMarcFormatType < RuntimeError; end
13
+
14
+ class Document
15
+
16
+ attr_reader :marc
17
+
18
+ include Citation
19
+
20
+ def initialize(marc_data, marc_type)
21
+ case marc_type.to_s
22
+ when 'marcxml'
23
+ reader = MARC::XMLReader.new(StringIO.new(marc_data)).to_a
24
+ @marc = reader[0]
25
+ when 'marc21'
26
+ reader = MARC::Record.new_from_marc(marc_data)
27
+ @marc = reader
28
+ else
29
+ raise UnsupportedMarcFormatType.new("Only marcxml and marc21 are supported.")
30
+ end
31
+ end
32
+
33
+ def marc_xml
34
+ @marc.to_xml.to_s
35
+ end
36
+
37
+ def to_xml
38
+ if @marc
39
+ self.marc_xml
40
+ else
41
+ "<not-implemented/>"
42
+ end
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,251 @@
1
+ ## This module is DEPRECATED, and will go away. It has been replaced by
2
+ # code using the new document extension framework. See
3
+ # Blacklight::Solr::Document::Marc and Blacklight::Solr::Document::MarcExport
4
+ # This code should not really be changed, or used anymore. It is frozen
5
+ # and deprecated until removed.
6
+ module Blacklight::Marc::Citation
7
+
8
+ def to_apa
9
+ return nil if self.marc.blank?
10
+ apa_citation(self.marc)
11
+ end
12
+
13
+ def to_mla
14
+ return nil if self.marc.blank?
15
+ mla_citation(self.marc)
16
+ end
17
+
18
+ def to_zotero(format)
19
+ return nil if self.marc.blank?
20
+ z3988_span(self.marc, format)
21
+ end
22
+
23
+ protected
24
+
25
+ def mla_citation(record)
26
+ text = ''
27
+ authors_final = []
28
+
29
+ #setup formatted author list
30
+ authors = get_author_list(record)
31
+
32
+ if authors.length < 4
33
+ authors.each do |l|
34
+ if l == authors.first #first
35
+ authors_final.push(l)
36
+ elsif l == authors.last #last
37
+ authors_final.push(", and " + name_reverse(l) + ".")
38
+ else #all others
39
+ authors_final.push(", " + name_reverse(l))
40
+ end
41
+ end
42
+ text += authors_final.join
43
+ unless text.blank?
44
+ if text[-1,1] != "."
45
+ text += ". "
46
+ else
47
+ text += " "
48
+ end
49
+ end
50
+ else
51
+ text += authors.first + ", et al. "
52
+ end
53
+ # setup title
54
+ title = setup_title_info(record)
55
+ if !title.nil?
56
+ text += "<i>" + mla_citation_title(title) + "</i> "
57
+ end
58
+
59
+ # Edition
60
+ edition_data = setup_edition(record)
61
+ text += edition_data + " " unless edition_data.nil?
62
+
63
+ # Publication
64
+ text += setup_pub_info(record) + ", " unless setup_pub_info(record).nil?
65
+
66
+ # Get Pub Date
67
+ text += setup_pub_date(record) unless setup_pub_date(record).nil?
68
+ if text[-1,1] != "."
69
+ text += "." unless text.nil? or text.blank?
70
+ end
71
+ text
72
+ end
73
+
74
+ def apa_citation(record)
75
+ text = ''
76
+ authors_list = []
77
+ authors_list_final = []
78
+
79
+ #setup formatted author list
80
+ authors = get_author_list(record)
81
+ authors.each do |l|
82
+ authors_list.push(abbreviate_name(l)) unless l.nil?
83
+ end
84
+ authors_list.each do |l|
85
+ if l == authors_list.first #first
86
+ authors_list_final.push(l.strip)
87
+ elsif l == authors_list.last #last
88
+ authors_list_final.push(", &amp; " + l.strip)
89
+ else #all others
90
+ authors_list_final.push(", " + l.strip)
91
+ end
92
+ end
93
+ text += authors_list_final.join
94
+ unless text.blank?
95
+ if text[-1,1] != "."
96
+ text += ". "
97
+ else
98
+ text += " "
99
+ end
100
+ end
101
+ # Get Pub Date
102
+ text += "(" + setup_pub_date(record) + "). " unless setup_pub_date(record).nil?
103
+
104
+ # setup title info
105
+ title = setup_title_info(record)
106
+ text += "<i>" + title + "</i> " unless title.nil?
107
+
108
+ # Edition
109
+ edition_data = setup_edition(record)
110
+ text += edition_data + " " unless edition_data.nil?
111
+
112
+ # Publisher info
113
+ text += setup_pub_info(record) unless setup_pub_info(record).nil?
114
+ unless text.blank?
115
+ if text[-1,1] != "."
116
+ text += "."
117
+ end
118
+ end
119
+ text
120
+ end
121
+ def setup_pub_date(record)
122
+ if !record.find{|f| f.tag == '260'}.nil?
123
+ pub_date = record.find{|f| f.tag == '260'}
124
+ if pub_date.find{|s| s.code == 'c'}
125
+ date_value = pub_date.find{|s| s.code == 'c'}.value.gsub(/[^0-9]/, "") unless pub_date.find{|s| s.code == 'c'}.value.gsub(/[^0-9]/, "").blank?
126
+ end
127
+ return nil unless !date_value.nil?
128
+ end
129
+ date_value
130
+ end
131
+ def setup_pub_info(record)
132
+ text = ''
133
+ pub_info_field = record.find{|f| f.tag == '260'}
134
+ if !pub_info_field.nil?
135
+ a_pub_info = pub_info_field.find{|s| s.code == 'a'}
136
+ b_pub_info = pub_info_field.find{|s| s.code == 'b'}
137
+ a_pub_info = clean_end_punctuation(a_pub_info.value.strip) unless a_pub_info.nil?
138
+ b_pub_info = b_pub_info.value.strip unless b_pub_info.nil?
139
+ text += a_pub_info.strip unless a_pub_info.nil?
140
+ if !a_pub_info.nil? and !b_pub_info.nil?
141
+ text += ": "
142
+ end
143
+ text += b_pub_info.strip unless b_pub_info.nil?
144
+ end
145
+ return nil if text.strip.blank?
146
+ clean_end_punctuation(text.strip)
147
+ end
148
+
149
+ def mla_citation_title(text)
150
+ no_upcase = ["a","an","and","but","by","for","it","of","the","to","with"]
151
+ new_text = []
152
+ word_parts = text.split(" ")
153
+ word_parts.each do |w|
154
+ if !no_upcase.include? w
155
+ new_text.push(w.capitalize)
156
+ else
157
+ new_text.push(w)
158
+ end
159
+ end
160
+ new_text.join(" ")
161
+ end
162
+
163
+ def setup_title_info(record)
164
+ text = ''
165
+ title_info_field = record.find{|f| f.tag == '245'}
166
+ if !title_info_field.nil?
167
+ a_title_info = title_info_field.find{|s| s.code == 'a'}
168
+ b_title_info = title_info_field.find{|s| s.code == 'b'}
169
+ a_title_info = clean_end_punctuation(a_title_info.value.strip) unless a_title_info.nil?
170
+ b_title_info = clean_end_punctuation(b_title_info.value.strip) unless b_title_info.nil?
171
+ text += a_title_info unless a_title_info.nil?
172
+ if !a_title_info.nil? and !b_title_info.nil?
173
+ text += ": "
174
+ end
175
+ text += b_title_info unless b_title_info.nil?
176
+ end
177
+
178
+ return nil if text.strip.blank?
179
+ clean_end_punctuation(text.strip) + "."
180
+
181
+ end
182
+
183
+ def clean_end_punctuation(text)
184
+ if [".",",",":",";","/"].include? text[-1,1]
185
+ return text[0,text.length-1]
186
+ end
187
+ text
188
+ end
189
+
190
+ def setup_edition(record)
191
+ edition_field = record.find{|f| f.tag == '250'}
192
+ edition_code = edition_field.find{|s| s.code == 'a'} unless edition_field.nil?
193
+ edition_data = edition_code.value unless edition_code.nil?
194
+ if edition_data.nil? or edition_data == '1st ed.'
195
+ return nil
196
+ else
197
+ return edition_data
198
+ end
199
+ end
200
+
201
+ def get_author_list(record)
202
+ author_list = []
203
+ authors_primary = record.find{|f| f.tag == '100'}
204
+ author_primary = authors_primary.find{|s| s.code == 'a'}.value unless authors_primary.nil?
205
+ author_list.push(clean_end_punctuation(author_primary)) unless author_primary.nil?
206
+ authors_secondary = record.find_all{|f| ('700') === f.tag}
207
+ if !authors_secondary.nil?
208
+ authors_secondary.each do |l|
209
+ author_list.push(clean_end_punctuation(l.find{|s| s.code == 'a'}.value)) unless l.find{|s| s.code == 'a'}.value.nil?
210
+ end
211
+ end
212
+
213
+ author_list.uniq!
214
+ author_list
215
+ end
216
+
217
+ def abbreviate_name(name)
218
+ name_parts = name.split(", ")
219
+ first_name_parts = name_parts.last.split(" ")
220
+ temp_name = name_parts.first + ", " + first_name_parts.first[0,1] + "."
221
+ first_name_parts.shift
222
+ temp_name += " " + first_name_parts.join(" ") unless first_name_parts.empty?
223
+ temp_name
224
+ end
225
+
226
+ def name_reverse(name)
227
+ name = clean_end_punctuation(name)
228
+ temp_name = name.split(", ")
229
+ return temp_name.last + " " + temp_name.first
230
+ end
231
+
232
+ # Genrates a Z39.88 span element to pass the COinS metadata to Zotero
233
+ def z3988_span(record,format)
234
+ title = record.find{|field| field.tag == '245'}
235
+ author = record.find{|field| field.tag == '100'}
236
+ publisher_info = record.find{|field| field.tag == '260'}
237
+ edition = record.find{|field| field.tag == '250'}
238
+ isbn = record.find{|field| field.tag == '020'}
239
+ issn = record.find{|field| field.tag == '022'}
240
+ format.is_a?(Array) ? format = format[0].downcase.strip : format = format.downcase.strip
241
+ text = "<span class='Z3988' "
242
+ if format == 'book'
243
+ text << "title='ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info%3Asid%2Fblacklight.rubyforge.org%3Agenerator&amp;rft.genre=book&amp;rft.btitle=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;rft.title=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;rft.au=#{(author.nil? or author['a'].nil?) ? "" : CGI::escape(author['a'])}&amp;rft.date=#{(publisher_info.nil? or publisher_info['c'].nil?) ? "" : CGI::escape(publisher_info['c'])}&amp;rft.pub=#{(publisher_info.nil? or publisher_info['a'].nil?) ? "" : CGI::escape(publisher_info['a'])}&amp;rft.edition=#{(edition.nil? or edition['a'].nil?) ? "" : CGI::escape(edition['a'])}&amp;rft.isbn=#{(isbn.nil? or isbn['a'].nil?) ? "" : isbn['a']}'"
244
+ elsif format.include?('journal') # checking using include because institutions may use formats like Journal or Journal/Magazine
245
+ text << "title='ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&amp;rfr_id=info%3Asid%2Fblacklight.rubyforge.org%3Agenerator&amp;rft.genre=article&amp;rft.title=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;rft.atitle=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;rft.date=#{(publisher_info.nil? or publisher_info['c'].nil?) ? "" : CGI::escape(publisher_info['c'])}&amp;rft.issn=#{(issn.nil? or issn['a'].nil?) ? "" : issn['a']}'"
246
+ else
247
+ text << "title='ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fblacklight.rubyforge.org%3Agenerator&amp;rft.title=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;rft.creator=#{(author.nil? or author['a'].nil?) ? "" : CGI::escape(author['a'])}&amp;rft.date=#{(publisher_info.nil? or publisher_info['c'].nil?) ? "" : CGI::escape(publisher_info['c'])}&amp;rft.pub=#{(publisher_info.nil? or publisher_info['a'].nil?) ? "" : CGI::escape(publisher_info['a'])}&amp;rft.format=#{CGI::escape(format)}'"
248
+ end
249
+ text << "></span>"
250
+ end
251
+ end