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,430 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Written for use with Blacklight::Solr::Document::Marc, but you can use
3
+ # it for your own custom Blacklight document Marc extension too -- just
4
+ # include this module in any document extension (or any other class)
5
+ # that provides a #to_marc returning a ruby-marc object. This module will add
6
+ # in export_as translation methods for a variety of formats.
7
+ module Blacklight::Solr::Document::MarcExport
8
+
9
+ def self.register_export_formats(document)
10
+ document.will_export_as(:xml)
11
+ document.will_export_as(:marc, "application/marc")
12
+ # marcxml content type:
13
+ # http://tools.ietf.org/html/draft-denenberg-mods-etc-media-types-00
14
+ document.will_export_as(:marcxml, "application/marcxml+xml")
15
+ document.will_export_as(:openurl_ctx_kev, "application/x-openurl-ctx-kev")
16
+ document.will_export_as(:refworks_marc_txt, "text/plain")
17
+ document.will_export_as(:endnote, "application/x-endnote-refer")
18
+ end
19
+
20
+
21
+ def export_as_marc
22
+ to_marc.to_marc
23
+ end
24
+
25
+ def export_as_marcxml
26
+ to_marc.to_xml.to_s
27
+ end
28
+ alias_method :export_as_xml, :export_as_marcxml
29
+
30
+
31
+ # TODO This exporting as formatted citation thing should be re-thought
32
+ # redesigned at some point to be more general purpose, but this
33
+ # is in-line with what we had before, but at least now attached
34
+ # to the document extension where it belongs.
35
+ def export_as_apa_citation_txt
36
+ apa_citation( to_marc )
37
+ end
38
+
39
+ def export_as_mla_citation_txt
40
+ mla_citation( to_marc )
41
+ end
42
+
43
+ # Exports as an OpenURL KEV (key-encoded value) query string.
44
+ # For use to create COinS, among other things. COinS are
45
+ # for Zotero, among other things. TODO: This is wierd and fragile
46
+ # code, it should use ruby OpenURL gem instead to work a lot
47
+ # more sensibly. The "format" argument was in the old marc.marc.to_zotero
48
+ # call, but didn't neccesarily do what it thought it did anyway. Left in
49
+ # for now for backwards compatibilty, but should be replaced by
50
+ # just ruby OpenURL.
51
+ def export_as_openurl_ctx_kev(format = nil)
52
+ title = to_marc.find{|field| field.tag == '245'}
53
+ author = to_marc.find{|field| field.tag == '100'}
54
+ corp_author = to_marc.find{|field| field.tag == '110'}
55
+ publisher_info = to_marc.find{|field| field.tag == '260'}
56
+ edition = to_marc.find{|field| field.tag == '250'}
57
+ isbn = to_marc.find{|field| field.tag == '020'}
58
+ issn = to_marc.find{|field| field.tag == '022'}
59
+ unless format.nil?
60
+ format.is_a?(Array) ? format = format[0].downcase.strip : format = format.downcase.strip
61
+ end
62
+ export_text = ""
63
+ if format == 'book'
64
+ export_text << "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;"
65
+ export_text << "rft.btitle=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;"
66
+ export_text << "rft.title=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;"
67
+ export_text << "rft.au=#{(author.nil? or author['a'].nil?) ? "" : CGI::escape(author['a'])}&amp;"
68
+ export_text << "rft.aucorp=#{CGI::escape(corp_author['a']) if corp_author['a']}+#{CGI::escape(corp_author['b']) if corp_author['b']}&amp;" unless corp_author.blank?
69
+ export_text << "rft.date=#{(publisher_info.nil? or publisher_info['c'].nil?) ? "" : CGI::escape(publisher_info['c'])}&amp;"
70
+ export_text << "rft.place=#{(publisher_info.nil? or publisher_info['a'].nil?) ? "" : CGI::escape(publisher_info['a'])}&amp;"
71
+ export_text << "rft.pub=#{(publisher_info.nil? or publisher_info['b'].nil?) ? "" : CGI::escape(publisher_info['b'])}&amp;"
72
+ export_text << "rft.edition=#{(edition.nil? or edition['a'].nil?) ? "" : CGI::escape(edition['a'])}&amp;"
73
+ export_text << "rft.isbn=#{(isbn.nil? or isbn['a'].nil?) ? "" : isbn['a']}"
74
+ elsif (format =~ /journal/i) # checking using include because institutions may use formats like Journal or Journal/Magazine
75
+ export_text << "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;"
76
+ export_text << "rft.title=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;"
77
+ export_text << "rft.atitle=#{(title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a'])}+#{(title.nil? or title['b'].nil?) ? "" : CGI::escape(title['b'])}&amp;"
78
+ export_text << "rft.aucorp=#{CGI::escape(corp_author['a']) if corp_author['a']}+#{CGI::escape(corp_author['b']) if corp_author['b']}&amp;" unless corp_author.blank?
79
+ export_text << "rft.date=#{(publisher_info.nil? or publisher_info['c'].nil?) ? "" : CGI::escape(publisher_info['c'])}&amp;"
80
+ export_text << "rft.issn=#{(issn.nil? or issn['a'].nil?) ? "" : issn['a']}"
81
+ else
82
+ export_text << "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;"
83
+ export_text << "rft.title=" + ((title.nil? or title['a'].nil?) ? "" : CGI::escape(title['a']))
84
+ export_text << ((title.nil? or title['b'].nil?) ? "" : CGI.escape(" ") + CGI::escape(title['b']))
85
+ export_text << "&amp;rft.creator=" + ((author.nil? or author['a'].nil?) ? "" : CGI::escape(author['a']))
86
+ export_text << "&amp;rft.aucorp=#{CGI::escape(corp_author['a']) if corp_author['a']}+#{CGI::escape(corp_author['b']) if corp_author['b']}" unless corp_author.blank?
87
+ export_text << "&amp;rft.date=" + ((publisher_info.nil? or publisher_info['c'].nil?) ? "" : CGI::escape(publisher_info['c']))
88
+ export_text << "&amp;rft.place=" + ((publisher_info.nil? or publisher_info['a'].nil?) ? "" : CGI::escape(publisher_info['a']))
89
+ export_text << "&amp;rft.pub=" + ((publisher_info.nil? or publisher_info['b'].nil?) ? "" : CGI::escape(publisher_info['b']))
90
+ export_text << "&amp;rft.format=" + (format.nil? ? "" : CGI::escape(format))
91
+ end
92
+ export_text unless export_text.blank?
93
+ end
94
+
95
+
96
+ # This format used to be called 'refworks', which wasn't really
97
+ # accurate, sounds more like 'refworks tagged format'. Which this
98
+ # is not, it's instead some weird under-documented Refworks
99
+ # proprietary marc-ish in text/plain format. See
100
+ # http://robotlibrarian.billdueber.com/sending-marcish-data-to-refworks/
101
+ def export_as_refworks_marc_txt
102
+ # plugin/gem weirdness means we do need to manually require
103
+ # here.
104
+ # As of 11 May 2010, Refworks has a problem with UTF-8 if it's decomposed,
105
+ # it seems to want C form normalization, although RefWorks support
106
+ # couldn't tell me that. -jrochkind
107
+ # DHF: moved this require a little lower in the method.
108
+ # require 'unicode'
109
+
110
+ fields = to_marc.find_all { |f| ('000'..'999') === f.tag }
111
+ text = "LEADER #{to_marc.leader}"
112
+ fields.each do |field|
113
+ unless ["940","999"].include?(field.tag)
114
+ if field.is_a?(MARC::ControlField)
115
+ text << "#{field.tag} #{field.value}\n"
116
+ else
117
+ text << "#{field.tag} "
118
+ text << (field.indicator1 ? field.indicator1 : " ")
119
+ text << (field.indicator2 ? field.indicator2 : " ")
120
+ text << " "
121
+ field.each {|s| s.code == 'a' ? text << "#{s.value}" : text << " |#{s.code}#{s.value}"}
122
+ text << "\n"
123
+ end
124
+ end
125
+ end
126
+
127
+ if Blacklight.jruby?
128
+ require 'java'
129
+ java_import java.text.Normalizer
130
+ Normalizer.normalize(text, Normalizer::Form::NFC).to_s
131
+ else
132
+ require 'unicode'
133
+ Unicode.normalize_C(text)
134
+ end
135
+ end
136
+
137
+ # Endnote Import Format. See the EndNote User Guide at:
138
+ # http://www.endnote.com/support/enx3man-terms-win.asp
139
+ # Chapter 7: Importing Reference Data into EndNote / Creating a Tagged “EndNote Import” File
140
+ #
141
+ # Note: This code is copied from what used to be in the previous version
142
+ # in ApplicationHelper#render_to_endnote. It does NOT produce very good
143
+ # endnote import format; the %0 is likely to be entirely illegal, the
144
+ # rest of the data is barely correct but messy. TODO, a new version of this,
145
+ # or better yet just an export_as_ris instead, which will be more general
146
+ # purpose.
147
+ def export_as_endnote()
148
+ end_note_format = {
149
+ "%A" => "100.a",
150
+ "%C" => "260.a",
151
+ "%D" => "260.c",
152
+ "%E" => "700.a",
153
+ "%I" => "260.b",
154
+ "%J" => "440.a",
155
+ "%@" => "020.a",
156
+ "%_@" => "022.a",
157
+ "%T" => "245.a,245.b",
158
+ "%U" => "856.u",
159
+ "%7" => "250.a"
160
+ }
161
+ marc_obj = to_marc
162
+
163
+ # TODO. This was inherited functionality (although refactored),
164
+ # but it wasn't actually clear that :display_type would
165
+ # be used this way. This should be rewritten to guess
166
+ # from actual Marc instead, probably.
167
+ format_str = Blacklight.config[:show][:display_type]
168
+ format_str = format_str[0] if format_str.kind_of?(Array)
169
+ format_str = format_str.titlecase
170
+
171
+ text = ''
172
+ text << "%0 #{ format_str }\n"
173
+ # If there is some reliable way of getting the language of a record we can add it here
174
+ #text << "%G #{record['language'].first}\n"
175
+ end_note_format.each do |key,value|
176
+ values = value.split(",")
177
+ first_value = values[0].split('.')
178
+ if values.length > 1
179
+ second_value = values[1].split('.')
180
+ else
181
+ second_value = []
182
+ end
183
+
184
+ if marc_obj[first_value[0].to_s]
185
+ marc_obj.find_all{|f| (first_value[0].to_s) === f.tag}.each do |field|
186
+ if field[first_value[1]].to_s or field[second_value[1]].to_s
187
+ text << "#{key.gsub('_','')}"
188
+ if field[first_value[1]].to_s
189
+ text << " #{field[first_value[1]].to_s}"
190
+ end
191
+ if field[second_value[1]].to_s
192
+ text << " #{field[second_value[1]].to_s}"
193
+ end
194
+ text << "\n"
195
+ end
196
+ end
197
+ end
198
+ end
199
+ text
200
+ end
201
+
202
+ ## DEPRECATED stuff left in for backwards compatibility, but should
203
+ # be gotten rid of eventually.
204
+
205
+ def to_zotero(format)
206
+ warn("[DEPRECATION] Simply call document.export_as_openurl_kev to get an openURL kev context object suitable for including in a COinS; then have view code make the span for the COinS. ")
207
+ "<span class=\"Z3988\" title=\"#{export_as_openurl_kev(format)}\"></span>"
208
+ end
209
+
210
+ def to_apa
211
+ warn("[DEPRECATION] Call document.export_as_apa_citation instead.")
212
+ export_as_apa_citation
213
+ end
214
+
215
+ def to_mla
216
+ warn("[DEPRECATION] Call document.export_as_mla_citation instead.")
217
+ end
218
+
219
+
220
+
221
+ protected
222
+
223
+ def mla_citation(record)
224
+ text = ''
225
+ authors_final = []
226
+
227
+ #setup formatted author list
228
+ authors = get_author_list(record)
229
+
230
+ if authors.length < 4
231
+ authors.each do |l|
232
+ if l == authors.first #first
233
+ authors_final.push(l)
234
+ elsif l == authors.last #last
235
+ authors_final.push(", and " + name_reverse(l) + ".")
236
+ else #all others
237
+ authors_final.push(", " + name_reverse(l))
238
+ end
239
+ end
240
+ text += authors_final.join
241
+ unless text.blank?
242
+ if text[-1,1] != "."
243
+ text += ". "
244
+ else
245
+ text += " "
246
+ end
247
+ end
248
+ else
249
+ text += authors.first + ", et al. "
250
+ end
251
+ # setup title
252
+ title = setup_title_info(record)
253
+ if !title.nil?
254
+ text += "<i>" + mla_citation_title(title) + "</i> "
255
+ end
256
+
257
+ # Edition
258
+ edition_data = setup_edition(record)
259
+ text += edition_data + " " unless edition_data.nil?
260
+
261
+ # Publication
262
+ text += setup_pub_info(record) + ", " unless setup_pub_info(record).nil?
263
+
264
+ # Get Pub Date
265
+ text += setup_pub_date(record) unless setup_pub_date(record).nil?
266
+ if text[-1,1] != "."
267
+ text += "." unless text.nil? or text.blank?
268
+ end
269
+ text
270
+ end
271
+
272
+ def apa_citation(record)
273
+ text = ''
274
+ authors_list = []
275
+ authors_list_final = []
276
+
277
+ #setup formatted author list
278
+ authors = get_author_list(record)
279
+ authors.each do |l|
280
+ authors_list.push(abbreviate_name(l)) unless l.blank?
281
+ end
282
+ authors_list.each do |l|
283
+ if l == authors_list.first #first
284
+ authors_list_final.push(l.strip)
285
+ elsif l == authors_list.last #last
286
+ authors_list_final.push(", &amp; " + l.strip)
287
+ else #all others
288
+ authors_list_final.push(", " + l.strip)
289
+ end
290
+ end
291
+ text += authors_list_final.join
292
+ unless text.blank?
293
+ if text[-1,1] != "."
294
+ text += ". "
295
+ else
296
+ text += " "
297
+ end
298
+ end
299
+ # Get Pub Date
300
+ text += "(" + setup_pub_date(record) + "). " unless setup_pub_date(record).nil?
301
+
302
+ # setup title info
303
+ title = setup_title_info(record)
304
+ text += "<i>" + title + "</i> " unless title.nil?
305
+
306
+ # Edition
307
+ edition_data = setup_edition(record)
308
+ text += edition_data + " " unless edition_data.nil?
309
+
310
+ # Publisher info
311
+ text += setup_pub_info(record) unless setup_pub_info(record).nil?
312
+ unless text.blank?
313
+ if text[-1,1] != "."
314
+ text += "."
315
+ end
316
+ end
317
+ text
318
+ end
319
+ def setup_pub_date(record)
320
+ if !record.find{|f| f.tag == '260'}.nil?
321
+ pub_date = record.find{|f| f.tag == '260'}
322
+ if pub_date.find{|s| s.code == 'c'}
323
+ 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?
324
+ end
325
+ return nil unless !date_value.nil?
326
+ end
327
+ date_value
328
+ end
329
+ def setup_pub_info(record)
330
+ text = ''
331
+ pub_info_field = record.find{|f| f.tag == '260'}
332
+ if !pub_info_field.nil?
333
+ a_pub_info = pub_info_field.find{|s| s.code == 'a'}
334
+ b_pub_info = pub_info_field.find{|s| s.code == 'b'}
335
+ a_pub_info = clean_end_punctuation(a_pub_info.value.strip) unless a_pub_info.nil?
336
+ b_pub_info = b_pub_info.value.strip unless b_pub_info.nil?
337
+ text += a_pub_info.strip unless a_pub_info.nil?
338
+ if !a_pub_info.nil? and !b_pub_info.nil?
339
+ text += ": "
340
+ end
341
+ text += b_pub_info.strip unless b_pub_info.nil?
342
+ end
343
+ return nil if text.strip.blank?
344
+ clean_end_punctuation(text.strip)
345
+ end
346
+
347
+ def mla_citation_title(text)
348
+ no_upcase = ["a","an","and","but","by","for","it","of","the","to","with"]
349
+ new_text = []
350
+ word_parts = text.split(" ")
351
+ word_parts.each do |w|
352
+ if !no_upcase.include? w
353
+ new_text.push(w.capitalize)
354
+ else
355
+ new_text.push(w)
356
+ end
357
+ end
358
+ new_text.join(" ")
359
+ end
360
+
361
+ def setup_title_info(record)
362
+ text = ''
363
+ title_info_field = record.find{|f| f.tag == '245'}
364
+ if !title_info_field.nil?
365
+ a_title_info = title_info_field.find{|s| s.code == 'a'}
366
+ b_title_info = title_info_field.find{|s| s.code == 'b'}
367
+ a_title_info = clean_end_punctuation(a_title_info.value.strip) unless a_title_info.nil?
368
+ b_title_info = clean_end_punctuation(b_title_info.value.strip) unless b_title_info.nil?
369
+ text += a_title_info unless a_title_info.nil?
370
+ if !a_title_info.nil? and !b_title_info.nil?
371
+ text += ": "
372
+ end
373
+ text += b_title_info unless b_title_info.nil?
374
+ end
375
+
376
+ return nil if text.strip.blank?
377
+ clean_end_punctuation(text.strip) + "."
378
+
379
+ end
380
+
381
+ def clean_end_punctuation(text)
382
+ if [".",",",":",";","/"].include? text[-1,1]
383
+ return text[0,text.length-1]
384
+ end
385
+ text
386
+ end
387
+
388
+ def setup_edition(record)
389
+ edition_field = record.find{|f| f.tag == '250'}
390
+ edition_code = edition_field.find{|s| s.code == 'a'} unless edition_field.nil?
391
+ edition_data = edition_code.value unless edition_code.nil?
392
+ if edition_data.nil? or edition_data == '1st ed.'
393
+ return nil
394
+ else
395
+ return edition_data
396
+ end
397
+ end
398
+
399
+ def get_author_list(record)
400
+ author_list = []
401
+ authors_primary = record.find{|f| f.tag == '100'}
402
+ author_primary = authors_primary.find{|s| s.code == 'a'}.value unless authors_primary.nil? rescue ''
403
+ author_list.push(clean_end_punctuation(author_primary)) unless author_primary.nil?
404
+ authors_secondary = record.find_all{|f| ('700') === f.tag}
405
+ if !authors_secondary.nil?
406
+ authors_secondary.each do |l|
407
+ author_list.push(clean_end_punctuation(l.find{|s| s.code == 'a'}.value)) unless l.find{|s| s.code == 'a'}.value.nil?
408
+ end
409
+ end
410
+
411
+ author_list.uniq!
412
+ author_list
413
+ end
414
+
415
+ def abbreviate_name(name)
416
+ name_parts = name.split(", ")
417
+ first_name_parts = name_parts.last.split(" ")
418
+ temp_name = name_parts.first + ", " + first_name_parts.first[0,1] + "."
419
+ first_name_parts.shift
420
+ temp_name += " " + first_name_parts.join(" ") unless first_name_parts.empty?
421
+ temp_name
422
+ end
423
+
424
+ def name_reverse(name)
425
+ name = clean_end_punctuation(name)
426
+ temp_name = name.split(", ")
427
+ return temp_name.last + " " + temp_name.first
428
+ end
429
+
430
+ end
@@ -0,0 +1,13 @@
1
+ # This module provides the body of an email export based on the document's semantic values
2
+ module Blacklight::Solr::Document::Sms
3
+
4
+ # Return a text string that will be the body of the email
5
+ def to_sms_text
6
+ semantics = self.to_semantic_values
7
+ body = ""
8
+ body << semantics[:title].first unless semantics[:title].blank?
9
+ body << " by #{semantics[:author].first}" unless semantics[:author].blank?
10
+ return body unless body.blank?
11
+ end
12
+
13
+ end
@@ -0,0 +1,93 @@
1
+ module Blacklight::Solr
2
+
3
+
4
+ # Pagination for facet values -- works by setting the limit to max
5
+ # displayable. You have to ask Solr for limit+1, to get enough
6
+ # results to see if 'more' are available'. That is, the all_facet_values
7
+ # arg in constructor should be the result of asking solr for limit+1
8
+ # values.
9
+ # This is a workaround for the fact that Solr itself can't compute
10
+ # the total values for a given facet field,
11
+ # so we cannot know how many "pages" there are.
12
+ #
13
+ class FacetPaginator
14
+ # What request keys will we use for the parameters need. Need to
15
+ # make sure they do NOT conflict with catalog/index request params,
16
+ # and need to make them accessible in a list so we can easily
17
+ # strip em out before redirecting to catalog/index.
18
+ # class variable (via class-level ivar)
19
+ @request_keys = {:sort => :'catalog_facet.sort', :offset => :'catalog_facet.offset', :limit => :'catalog_facet.limit'}
20
+ class << self; attr_accessor :request_keys end # create a class method
21
+ def request_keys ; self.class.request_keys ; end # shortcut
22
+
23
+ attr_reader :total, :items, :offset, :limit, :sort
24
+
25
+ # all_facet_values is a list of facet value objects returned by solr,
26
+ # asking solr for n+1 facet values.
27
+ # options:
28
+ # :limit => number to display per page, or (default) nil. Nil means
29
+ # display all with no previous or next.
30
+ # :offset => current item offset, default 0
31
+ # :sort => 'count' or 'index', solr tokens for facet value sorting, default 'count'.
32
+ def initialize(all_facet_values, arguments)
33
+ # to_s.to_i will conveniently default to 0 if nil
34
+ @offset = arguments[:offset].to_s.to_i
35
+ @limit = arguments[:limit].to_s.to_i if arguments[:limit]
36
+ # count is solr's default
37
+ @sort = arguments[:sort] || "count"
38
+
39
+ total = all_facet_values.size
40
+ if (@limit)
41
+ @items = all_facet_values.slice(0, @limit)
42
+ @has_next = total > @limit
43
+ @has_previous = @offset > 0
44
+ else # nil limit
45
+ @items = all_facet_values
46
+ @has_next = false
47
+ @has_previous = false
48
+ end
49
+ end
50
+
51
+ def has_next?
52
+ @has_next
53
+ end
54
+
55
+ # Pass in your current request params, returns a param hash
56
+ # suitable to passing to an ActionHelper method (resource-based url_for, or
57
+ # link_to or url_for) navigating to the next facet value batch. Returns nil
58
+ # if there is no has_next?
59
+ def params_for_next_url(params)
60
+ return nil unless has_next?
61
+
62
+ return params.merge(request_keys[:offset] => offset + limit )
63
+ end
64
+
65
+ def has_previous?
66
+ @has_previous
67
+ end
68
+
69
+ # Pass in your current request params, returns a param hash
70
+ # suitable to passing to an ActionHelper method (resource-based url_for, or
71
+ # link_to or url_for) navigating to the previous facet value batch. Returns
72
+ # nil if there is no has_previous?
73
+ def params_for_previous_url(params)
74
+ return nil unless has_previous?
75
+
76
+ return params.merge(request_keys[:offset] => offset - limit )
77
+ end
78
+
79
+ # Pass in a desired solr facet solr key ('count' or 'index', see
80
+ # http://wiki.apache.org/solr/SimpleFacetParameters#facet.limit
81
+ # under facet.sort ), and your current request params.
82
+ # Get back params suitable to passing to an ActionHelper method for
83
+ # creating a url, to resort by that method.
84
+ def params_for_resort_url(sort_method, params)
85
+ # When resorting, we've got to reset the offset to start at beginning,
86
+ # no way to make it make sense otherwise.
87
+ return params.merge(request_keys[:sort] => sort_method,
88
+ request_keys[:offset] => 0)
89
+ end
90
+
91
+ end
92
+
93
+ end