Class: Scopus

Inherits:
Service show all
Includes:
ActionView::Helpers::SanitizeHelper, MetadataHelper, UmlautHttp
Defined in:
app/service_adaptors/scopus.rb

Overview

Service adapter plug-in.

NOTE: This is based on deprecated Scopus API's, Scopus will take them away 31 December 2014. Please see scopus2.rb instead which uses new Scopus API's.

PURPOSE: Includes "cited by", "similar articles" and "more by these authors" links from scopus. Also will throw in an abstract from Scopus if found.

LIMTATIONS: You must be a Scopus customer for these links generated to work for your users at all! Off-campus users should be going through ezproxy, see the EZProxy plug-in. Must find a match in scopus, naturally. "cited by" will only be included if Scopus has non-0 "cited by" links. But there's no good way to precheck similar/more-by for this, so they are provided blind and may result in 0 hits. You can turn them off if you like, with @include_similar, and @include_more_by_authors.

REGISTERING: This plug in actually has to use two seperate Scopus APIs. For the first, the scopus 'json' search api, you must regsiter and get an api key from scopus, which you can do here: http://searchapi.scopus.com Then include as @json_api_key in service config.

For the second Scopus API, you theoretically need a Scopus "PartnerID" and corresponding "release number", in @partner_id and @scopus_release There's no real easy way to get one. Scopus says:

"To obtain a partner ID or release number, contact your nearest regional
Scopus office. A list of Scopus contacts is available at
http://www.info.scopus.com/contactus/index.shtml"

Bah! But fortunately, using the "partnerID" assigned to the Scopus Json API, 65, seems to work, and is coded here as the default. You could try going with that. When you register a partnerID, you also get a 'salt key', which is currently not used by this code, but @link_salt_key is reserved for it in case added functionality does later.

Constant Summary

Constants inherited from Service

Service::LinkOutFilterTask, Service::StandardTask

Instance Attribute Summary

Attributes inherited from Service

#group, #name, #priority, #request, #service_id, #status, #task, #url

Instance Method Summary collapse

Methods included from UmlautHttp

#http_fetch, #proxy_like_headers

Methods included from MetadataHelper

#get_doi, #get_epage, #get_gpo_item_nums, #get_identifier, #get_isbn, #get_issn, #get_lccn, #get_month, #get_oclcnum, #get_pmid, #get_search_creator, #get_search_terms, #get_search_title, #get_spage, #get_sudoc, #get_top_level_creator, #get_year, #normalize_lccn, #normalize_title, #raw_search_title, title_is_serial?

Methods included from MarcHelper

#add_856_links, #edition_statement, #get_title, #get_years, #gmd_values, #service_type_for_856, #should_skip_856_link?, #strip_gmd

Methods inherited from Service

#credits, #display_name, #handle_wrapper, #link_out_filter, #preempted_by, required_config_params, #response_url, #translate

Constructor Details

#initialize(config) ⇒ Scopus

Returns a new instance of Scopus.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'app/service_adaptors/scopus.rb', line 59

def initialize(config)
  #defaults
  @display_name = "Scopus"
  @registered_referer
  @scopus_search_base = 'http://www.scopus.com/scsearchapi/search.url'
  
  @include_abstract = true
  @include_cited_by = true
  @include_similar = true
  @include_more_by_authors = true
  @more_by_authors_type = "similar"

  @inward_cited_by_url = "http://www.scopus.com/scopus/inward/citedby.url"
  #@partner_id = "E5wmcMWC"
  @partner_id = 65
  @link_salt_key = nil
  @scopus_release = "R6.0.0"

  # Scopus offers two algorithms for finding similar items.
  # This variable can be:
  # "key" => keyword based similarity 
  # "ref" => reference based similiarity (cites similar refs?) Seems to offer 0 hits quite often, so we use keyword instead. 
  # "aut" => author. More docs by same authors. Incorporated as seperate link usually. 
  @more_like_this_type = "key"
  @inward_more_like_url = "http://www.scopus.com/scopus/inward/mlt.url"
  
  @credits = {
    @display_name => "http://www.scopus.com/home.url"
  }
  
  super(config)
end

Instance Method Details

#add_abstract(first_hit, request) ⇒ Object



240
241
242
243
244
245
246
247
248
249
250
251
# File 'app/service_adaptors/scopus.rb', line 240

def add_abstract(first_hit, request)

  return if first_hit["abstract"].blank?
  
  request.add_service_response( 
    :service=>self, 
    :display_text => "Abstract from #{@display_name}", 
    :content => sanitize(first_hit["abstract"]), 
    :content_html_safe => true,
    :url => detail_url(first_hit), 
    :service_type_value => :abstract)
end

#add_cited_by_response(result, request) ⇒ Object

Input is a ruby hash that came from the scopus JSON, representing a single hit. We're going to add this as a result.



219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'app/service_adaptors/scopus.rb', line 219

def add_cited_by_response(result, request)
  # While scopus provides an "inwardurl" in the results, this just takes
  # us to the record detail page. We actually want to go RIGHT to the
  # list of cited-by items. So we create our own, based on Scopus's
  # reversed engineered predictable URLs. 

  count = result["citedbycount"]
  label = ServiceTypeValue[:cited_by].display_name_pluralize.downcase.capitalize    
    if count && count == 1
      label = ServiceTypeValue[:cited_by].display_name.downcase.capitalize
    end
  cited_by_url = cited_by_url( result )
  
  request.add_service_response(:service=>self, 
    :display_text => "#{count} #{label}", 
    :count=> count, 
    :url => cited_by_url, 
    :service_type_value => :cited_by)

end

#check_for_hits(url) ⇒ Object

NOT currently working. Scopus doesn't make this easy. Takes a scopus direct url for which we're not sure if there will be results or not, and requests it and html screen-scrapes to get hit count. (We can conveniently find this just in the html at least). Works for cited_by and more_like_this searches at present. May break if Scopus changes their html title!</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300</pre> </td> <td> <pre class="code"><span class="info file"># File 'app/service_adaptors/scopus.rb', line 283</span> <span class='kw'>def</span> <span class='id identifier rubyid_check_for_hits'>check_for_hits</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='id identifier rubyid_response'>response</span> <span class='op'>=</span> <span class='id identifier rubyid_http_fetch'>http_fetch</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='id identifier rubyid_response_html'>response_html</span> <span class='op'>=</span> <span class='const'>Nokogiri</span><span class='op'>::</span><span class='const'>HTML</span><span class='lparen'>(</span><span class='id identifier rubyid_response'>response</span><span class='rparen'>)</span> <span class='id identifier rubyid_title'>title</span> <span class='op'>=</span> <span class='id identifier rubyid_response_xml'>response_xml</span><span class='period'>.</span><span class='id identifier rubyid_at'>at</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>title</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_inner_text'>inner_text</span> <span class='comment'># title is "X documents" (or 'Documents') if there are hits. </span> <span class='comment'># It's annoyingly "Search Error" if there are either 0 hits, or </span> <span class='comment'># if there was an actual error. So we can't easily log actual </span> <span class='comment'># errors, sorry. </span> <span class='id identifier rubyid_title'>title</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span> <span class='op'>=~</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^\s*(\d+)?\s+document</span><span class='regexp_end'>/</span></span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='id identifier rubyid_hits'>hits</span> <span class='op'>=</span> <span class='backref'>$1</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_hits'>hits</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span> <span class='kw'>else</span> <span class='kw'>return</span> <span class='int'>0</span> <span class='kw'>end</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="cited_by_url-instance_method"> #<strong>cited_by_url</strong>(result) ⇒ <tt>Object</tt> </h3><script> document.getElementById("cited_by_url-instance_method").insertAdjacentHTML( "afterbegin", '<a class="permalink" href="/gems/umlaut/Scopus:cited_by_url">permalink</a>' ); </script> <table class="source_code"> <tr> <td> <pre class="lines"> 262 263 264 265 266 267 268</pre> </td> <td> <pre class="code"><span class="info file"># File 'app/service_adaptors/scopus.rb', line 262</span> <span class='kw'>def</span> <span class='id identifier rubyid_cited_by_url'>cited_by_url</span><span class='lparen'>(</span><span class='id identifier rubyid_result'>result</span><span class='rparen'>)</span> <span class='id identifier rubyid_eid'>eid</span> <span class='op'>=</span> <span class='const'>CGI</span><span class='period'>.</span><span class='id identifier rubyid_escape'>escape</span><span class='lparen'>(</span><span class='id identifier rubyid_result'>result</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>eid</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='comment'>#return "#{@scopus_cited_by_base}?eid=#{eid}&src=s&origin=recordpage" </span> <span class='comment'># Use the new scopus direct link format! </span> <span class='kw'>return</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='ivar'>@inward_cited_by_url</span><span class='embexpr_end'>}</span><span class='tstring_content'>?partnerID=</span><span class='embexpr_beg'>#{</span><span class='ivar'>@partner_id</span><span class='embexpr_end'>}</span><span class='tstring_content'>&rel=</span><span class='embexpr_beg'>#{</span><span class='ivar'>@scopus_release</span><span class='embexpr_end'>}</span><span class='tstring_content'>&eid=</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_eid'>eid</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span> <span class='kw'>return</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="detail_url-instance_method"> #<strong>detail_url</strong>(hash) ⇒ <tt>Object</tt> </h3><script> document.getElementById("detail_url-instance_method").insertAdjacentHTML( "afterbegin", '<a class="permalink" href="/gems/umlaut/Scopus:detail_url">permalink</a>' ); </script> <table class="source_code"> <tr> <td> <pre class="lines"> 253 254 255 256 257 258 259 260</pre> </td> <td> <pre class="code"><span class="info file"># File 'app/service_adaptors/scopus.rb', line 253</span> <span class='kw'>def</span> <span class='id identifier rubyid_detail_url'>detail_url</span><span class='lparen'>(</span><span class='id identifier rubyid_hash'>hash</span><span class='rparen'>)</span> <span class='id identifier rubyid_url'>url</span> <span class='op'>=</span> <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>inwardurl</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span> <span class='comment'># for some reason ampersand's in query string have wound up double escaped </span> <span class='comment'># and need to be fixed. </span> <span class='id identifier rubyid_url'>url</span> <span class='op'>=</span> <span class='id identifier rubyid_url'>url</span><span class='period'>.</span><span class='id identifier rubyid_gsub'>gsub</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>\&amp\;</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>&</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_url'>url</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="handle-instance_method"> #<strong>handle</strong>(request) ⇒ <tt>Object</tt> </h3><script> document.getElementById("handle-instance_method").insertAdjacentHTML( "afterbegin", '<a class="permalink" href="/gems/umlaut/Scopus:handle">permalink</a>' ); </script> <table class="source_code"> <tr> <td> <pre class="lines"> 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171</pre> </td> <td> <pre class="code"><span class="info file"># File 'app/service_adaptors/scopus.rb', line 92</span> <span class='kw'>def</span> <span class='id identifier rubyid_handle'>handle</span><span class='lparen'>(</span><span class='id identifier rubyid_request'>request</span><span class='rparen'>)</span> <span class='id identifier rubyid_scopus_search'>scopus_search</span> <span class='op'>=</span> <span class='id identifier rubyid_scopus_search'>scopus_search</span><span class='lparen'>(</span><span class='id identifier rubyid_request'>request</span><span class='rparen'>)</span> <span class='comment'># we can't make a good query, nevermind. </span> <span class='kw'>return</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_dispatched'>dispatched</span><span class='lparen'>(</span><span class='kw'>self</span><span class='comma'>,</span> <span class='kw'>true</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_scopus_search'>scopus_search</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span> <span class='comment'># The default fields returned dont' include the eid (Scopus unique id) that we need, so we'll supply our own exhaustive list of &fields= </span> <span class='id identifier rubyid_url'>url</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='ivar'>@scopus_search_base</span><span class='embexpr_end'>}</span><span class='tstring_content'>?devId=</span><span class='embexpr_beg'>#{</span><span class='ivar'>@json_api_key</span><span class='embexpr_end'>}</span><span class='tstring_content'>&search=</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_scopus_search'>scopus_search</span><span class='embexpr_end'>}</span><span class='tstring_content'>&callback=findit_callback&fields=title,doctype,citedbycount,inwardurl,sourcetitle,issn,vol,issue,page,pubdate,eid,scp,doi,firstAuth,authlist,affiliations,abstract</span><span class='tstring_end'>"</span></span><span class='semicolon'>;</span> <span class='comment'># Make the call. </span> <span class='id identifier rubyid_headers'>headers</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span> <span class='id identifier rubyid_headers'>headers</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Referer</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='ivar'>@registered_referer</span> <span class='kw'>if</span> <span class='ivar'>@registered_referer</span> <span class='id identifier rubyid_response'>response</span> <span class='op'>=</span> <span class='id identifier rubyid_open'>open</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='comma'>,</span> <span class='id identifier rubyid_headers'>headers</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_read'>read</span> <span class='comment'># Okay, Scopus insists on using a jsonp technique to embed the json array in </span> <span class='comment'># a procedure call. We don't want that, take the actual content out of it's </span> <span class='comment'># jsonp wrapper. </span> <span class='id identifier rubyid_response'>response</span> <span class='op'>=~</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^\w*findit_callback\((.*)\);?$</span><span class='regexp_end'>/</span></span> <span class='id identifier rubyid_response'>response</span> <span class='op'>=</span> <span class='backref'>$1</span><span class='semicolon'>;</span> <span class='comment'># Take the first hit from scopus's results, hope they relevancy ranked it </span> <span class='comment'># well. For DOI/pmid search, there should ordinarly be only one hit! </span> <span class='id identifier rubyid_results'>results</span> <span class='op'>=</span> <span class='const'>MultiJson</span><span class='period'>.</span><span class='id identifier rubyid_load'>load</span><span class='lparen'>(</span><span class='id identifier rubyid_response'>response</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='id identifier rubyid_results'>results</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>ERROR</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_error'>error</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Error from Scopus API: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_results'>results</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>ERROR</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_content'> openurl: ?</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_referent'>referent</span><span class='period'>.</span><span class='id identifier rubyid_to_context_object'>to_context_object</span><span class='period'>.</span><span class='id identifier rubyid_kev'>kev</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_dispatched'>dispatched</span><span class='lparen'>(</span><span class='kw'>self</span><span class='comma'>,</span> <span class='kw'>false</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='comment'># For reasons not clear to me, the JSON data structures vary. </span> <span class='id identifier rubyid_first_hit'>first_hit</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='id identifier rubyid_results'>results</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>PartOK</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='id identifier rubyid_first_hit'>first_hit</span> <span class='op'>=</span> <span class='id identifier rubyid_results'>results</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>PartOK</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Results</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='kw'>elsif</span> <span class='lparen'>(</span> <span class='id identifier rubyid_results'>results</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>OK</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span> <span class='rparen'>)</span> <span class='id identifier rubyid_first_hit'>first_hit</span> <span class='op'>=</span> <span class='id identifier rubyid_results'>results</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>OK</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Results</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='kw'>else</span> <span class='comment'># error. </span> <span class='kw'>end</span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='id identifier rubyid_first_hit'>first_hit</span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='ivar'>@include_cited_by</span> <span class='op'>&&</span> <span class='id identifier rubyid_first_hit'>first_hit</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>citedbycount</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span> <span class='op'>></span> <span class='int'>0</span><span class='rparen'>)</span> <span class='id identifier rubyid_add_cited_by_response'>add_cited_by_response</span><span class='lparen'>(</span><span class='id identifier rubyid_first_hit'>first_hit</span><span class='comma'>,</span> <span class='id identifier rubyid_request'>request</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='ivar'>@include_abstract</span> <span class='op'>&&</span> <span class='id identifier rubyid_first_hit'>first_hit</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>abstract</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='id identifier rubyid_add_abstract'>add_abstract</span><span class='lparen'>(</span><span class='id identifier rubyid_first_hit'>first_hit</span><span class='comma'>,</span> <span class='id identifier rubyid_request'>request</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='ivar'>@include_similar</span><span class='rparen'>)</span> <span class='id identifier rubyid_url'>url</span> <span class='op'>=</span> <span class='id identifier rubyid_more_like_this_url'>more_like_this_url</span><span class='lparen'>(</span><span class='id identifier rubyid_first_hit'>first_hit</span><span class='rparen'>)</span> <span class='comment'># Pre-checking for actual hits not currently working, disabled. </span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>true</span> <span class='op'>||</span> <span class='lparen'>(</span> <span class='id identifier rubyid_hits'>hits</span> <span class='op'>=</span> <span class='id identifier rubyid_check_for_hits'>check_for_hits</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='rparen'>)</span> <span class='op'>></span> <span class='int'>0</span> <span class='rparen'>)</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_add_service_response'>add_service_response</span><span class='lparen'>(</span> <span class='symbol'>:service</span><span class='op'>=></span><span class='kw'>self</span><span class='comma'>,</span> <span class='symbol'>:display_text</span> <span class='op'>=></span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_hits'>hits</span><span class='embexpr_end'>}</span><span class='tstring_content'> </span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="/gems/umlaut/ServiceTypeValue" title="ServiceTypeValue (class)">ServiceTypeValue</a></span></span><span class='lbracket'>[</span><span class='symbol'>:similar</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_display_name_pluralize'>display_name_pluralize</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span><span class='period'>.</span><span class='id identifier rubyid_capitalize'>capitalize</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='symbol'>:url</span> <span class='op'>=></span> <span class='id identifier rubyid_url'>url</span><span class='comma'>,</span> <span class='symbol'>:service_type_value</span> <span class='op'>=></span> <span class='symbol'>:similar</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='ivar'>@include_more_by_authors</span><span class='rparen'>)</span> <span class='id identifier rubyid_url'>url</span> <span class='op'>=</span> <span class='id identifier rubyid_more_like_this_url'>more_like_this_url</span><span class='lparen'>(</span><span class='id identifier rubyid_first_hit'>first_hit</span><span class='comma'>,</span> <span class='symbol'>:type</span> <span class='op'>=></span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>aut</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span> <span class='comment'># Pre-checking for actual hits not currently working, disabled. </span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='kw'>true</span> <span class='op'>||</span> <span class='lparen'>(</span> <span class='id identifier rubyid_hits'>hits</span> <span class='op'>=</span> <span class='id identifier rubyid_check_for_hits'>check_for_hits</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='rparen'>)</span> <span class='op'>></span> <span class='int'>0</span> <span class='rparen'>)</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_add_service_response'>add_service_response</span><span class='lparen'>(</span> <span class='symbol'>:service</span><span class='op'>=></span><span class='kw'>self</span><span class='comma'>,</span> <span class='symbol'>:display_text</span> <span class='op'>=></span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_hits'>hits</span><span class='embexpr_end'>}</span><span class='tstring_content'> More from these authors</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='symbol'>:url</span> <span class='op'>=></span> <span class='id identifier rubyid_url'>url</span><span class='comma'>,</span> <span class='symbol'>:service_type_value</span> <span class='op'>=></span> <span class='symbol'>:similar</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='kw'>return</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_dispatched'>dispatched</span><span class='lparen'>(</span><span class='kw'>self</span><span class='comma'>,</span> <span class='kw'>true</span><span class='rparen'>)</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="more_like_this_url-instance_method"> #<strong>more_like_this_url</strong>(result, options = {}) ⇒ <tt>Object</tt> </h3><script> document.getElementById("more_like_this_url-instance_method").insertAdjacentHTML( "afterbegin", '<a class="permalink" href="/gems/umlaut/Scopus:more_like_this_url">permalink</a>' ); </script> <table class="source_code"> <tr> <td> <pre class="lines"> 270 271 272 273 274 275</pre> </td> <td> <pre class="code"><span class="info file"># File 'app/service_adaptors/scopus.rb', line 270</span> <span class='kw'>def</span> <span class='id identifier rubyid_more_like_this_url'>more_like_this_url</span><span class='lparen'>(</span><span class='id identifier rubyid_result'>result</span><span class='comma'>,</span> <span class='id identifier rubyid_options'>options</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span><span class='rparen'>)</span> <span class='id identifier rubyid_options'>options</span><span class='lbracket'>[</span><span class='symbol'>:type</span><span class='rbracket'>]</span> <span class='op'>||=</span> <span class='ivar'>@more_like_this_type</span> <span class='id identifier rubyid_eid'>eid</span> <span class='op'>=</span> <span class='const'>CGI</span><span class='period'>.</span><span class='id identifier rubyid_escape'>escape</span><span class='lparen'>(</span><span class='id identifier rubyid_result'>result</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>eid</span><span class='tstring_end'>"</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='ivar'>@inward_more_like_url</span><span class='embexpr_end'>}</span><span class='tstring_content'>?partnerID=</span><span class='embexpr_beg'>#{</span><span class='ivar'>@partner_id</span><span class='embexpr_end'>}</span><span class='tstring_content'>&rel=</span><span class='embexpr_beg'>#{</span><span class='ivar'>@scopus_release</span><span class='embexpr_end'>}</span><span class='tstring_content'>&eid=</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_eid'>eid</span><span class='embexpr_end'>}</span><span class='tstring_content'>&mltType=</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_options'>options</span><span class='lbracket'>[</span><span class='symbol'>:type</span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="phrase-instance_method"> #<strong>phrase</strong>(str) ⇒ <tt>Object</tt> </h3><script> document.getElementById("phrase-instance_method").insertAdjacentHTML( "afterbegin", '<a class="permalink" href="/gems/umlaut/Scopus:phrase">permalink</a>' ); </script> <div class="docstring"> <div class="discussion"> <p>backslash escapes any double quotes, and embeds string in scopus phrase search double quotes. Does NOT uri-escape.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 213 214 215</pre> </td> <td> <pre class="code"><span class="info file"># File 'app/service_adaptors/scopus.rb', line 213</span> <span class='kw'>def</span> <span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_str'>str</span><span class='rparen'>)</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>"</span><span class='tstring_end'>'</span></span> <span class='op'>+</span> <span class='id identifier rubyid_str'>str</span><span class='period'>.</span><span class='id identifier rubyid_gsub'>gsub</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>"</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>\\"</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='op'>+</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>"</span><span class='tstring_end'>'</span></span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="scopus_search-instance_method"> #<strong>scopus_search</strong>(request) ⇒ <tt>Object</tt> </h3><script> document.getElementById("scopus_search-instance_method").insertAdjacentHTML( "afterbegin", '<a class="permalink" href="/gems/umlaut/Scopus:scopus_search">permalink</a>' ); </script> <div class="docstring"> <div class="discussion"> <p>Comes up with a scopus advanced search query intended to find the exact known item identified by this citation.</p> <p>Will try to use DOI or PMID if available. Otherwise will use issn/year/vol/iss/start page if available. In some cases may resort to author/title.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209</pre> </td> <td> <pre class="code"><span class="info file"># File 'app/service_adaptors/scopus.rb', line 179</span> <span class='kw'>def</span> <span class='id identifier rubyid_scopus_search'>scopus_search</span><span class='lparen'>(</span><span class='id identifier rubyid_request'>request</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_doi'>doi</span> <span class='op'>=</span> <span class='id identifier rubyid_get_doi'>get_doi</span><span class='lparen'>(</span><span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_referent'>referent</span><span class='rparen'>)</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='const'>CGI</span><span class='period'>.</span><span class='id identifier rubyid_escape'>escape</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>DOI(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_doi'>doi</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>)</span><span class='tstring_end'>"</span></span> <span class='rparen'>)</span> <span class='kw'>elsif</span> <span class='lparen'>(</span><span class='id identifier rubyid_pmid'>pmid</span> <span class='op'>=</span> <span class='id identifier rubyid_get_pmid'>get_pmid</span><span class='lparen'>(</span><span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_referent'>referent</span><span class='rparen'>)</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='const'>CGI</span><span class='period'>.</span><span class='id identifier rubyid_escape'>escape</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>PMID(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_pmid'>pmid</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>)</span><span class='tstring_end'>"</span></span> <span class='rparen'>)</span> <span class='kw'>elsif</span> <span class='lparen'>(</span><span class='id identifier rubyid_isbn'>isbn</span> <span class='op'>=</span> <span class='id identifier rubyid_get_isbn'>get_isbn</span><span class='lparen'>(</span><span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_referent'>referent</span><span class='rparen'>)</span><span class='rparen'>)</span> <span class='comment'># I don't think scopus has a lot of ISBN-holding citations, but </span> <span class='comment'># it allows search so we might as well try. </span> <span class='kw'>return</span> <span class='const'>CGI</span><span class='period'>.</span><span class='id identifier rubyid_escape'>escape</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>ISBN(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_isbn'>isbn</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>)</span><span class='tstring_end'>"</span></span> <span class='rparen'>)</span> <span class='kw'>else</span> <span class='comment'># Okay, we're going to try to do it on issn/vol/issue/page. </span> <span class='comment'># If we don't have issn, we'll reluctantly use journal title </span> <span class='comment'># (damn you google scholar). </span> <span class='id identifier rubyid_metadata'>metadata</span> <span class='op'>=</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_referent'>referent</span><span class='period'>.</span><span class='id identifier rubyid_metadata'>metadata</span> <span class='id identifier rubyid_issn'>issn</span> <span class='op'>=</span> <span class='id identifier rubyid_request'>request</span><span class='period'>.</span><span class='id identifier rubyid_referent'>referent</span><span class='period'>.</span><span class='id identifier rubyid_issn'>issn</span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='lparen'>(</span><span class='id identifier rubyid_issn'>issn</span> <span class='op'>||</span> <span class='op'>!</span> <span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>jtitle</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span> <span class='rparen'>)</span> <span class='op'>&&</span> <span class='op'>!</span> <span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>volume</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span> <span class='op'>&&</span> <span class='op'>!</span> <span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>issue</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span> <span class='op'>&&</span> <span class='op'>!</span> <span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>spage</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span> <span class='rparen'>)</span> <span class='id identifier rubyid_query'>query</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>VOLUME(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>volume</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>) AND ISSUE(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>issue</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>) AND PAGEFIRST(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>spage</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>) </span><span class='tstring_end'>"</span></span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='id identifier rubyid_issn'>issn</span> <span class='rparen'>)</span> <span class='id identifier rubyid_query'>query</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'> AND (ISSN(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_issn'>issn</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>) OR EISSN(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_issn'>issn</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>))</span><span class='tstring_end'>"</span></span> <span class='kw'>else</span> <span class='id identifier rubyid_query'>query</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'> AND EXACTSRCTITLE(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_phrase'>phrase</span><span class='lparen'>(</span><span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>jtitle</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>)</span><span class='tstring_end'>"</span></span> <span class='kw'>end</span> <span class='kw'>return</span> <span class='const'>CGI</span><span class='period'>.</span><span class='id identifier rubyid_escape'>escape</span><span class='lparen'>(</span><span class='id identifier rubyid_query'>query</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="service_types_generated-instance_method"> #<strong>service_types_generated</strong> ⇒ <tt>Object</tt> </h3><script> document.getElementById("service_types_generated-instance_method").insertAdjacentHTML( "afterbegin", '<a class="permalink" href="/gems/umlaut/Scopus:service_types_generated">permalink</a>' ); </script> <table class="source_code"> <tr> <td> <pre class="lines"> 48 49 50 51 52 53 54 55 56 57</pre> </td> <td> <pre class="code"><span class="info file"># File 'app/service_adaptors/scopus.rb', line 48</span> <span class='kw'>def</span> <span class='id identifier rubyid_service_types_generated'>service_types_generated</span> <span class='id identifier rubyid_types'>types</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span> <span class='id identifier rubyid_types'>types</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span><span class='lparen'>(</span> <span class='const'><span class='object_link'><a href="/gems/umlaut/ServiceTypeValue" title="ServiceTypeValue (class)">ServiceTypeValue</a></span></span><span class='lbracket'>[</span><span class='symbol'>:abstract</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='ivar'>@include_abstract</span> <span class='id identifier rubyid_types'>types</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span><span class='lparen'>(</span> <span class='const'><span class='object_link'><a href="/gems/umlaut/ServiceTypeValue" title="ServiceTypeValue (class)">ServiceTypeValue</a></span></span><span class='lbracket'>[</span><span class='symbol'>:cited_by</span><span class='rbracket'>]</span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='ivar'>@include_cited_by</span> <span class='id identifier rubyid_types'>types</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span><span class='lparen'>(</span> <span class='const'><span class='object_link'><a href="/gems/umlaut/ServiceTypeValue" title="ServiceTypeValue (class)">ServiceTypeValue</a></span></span><span class='lbracket'>[</span><span class='symbol'>:abstract</span><span class='rbracket'>]</span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='ivar'>@include_abstract</span> <span class='id identifier rubyid_types'>types</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span><span class='lparen'>(</span> <span class='const'><span class='object_link'><a href="/gems/umlaut/ServiceTypeValue" title="ServiceTypeValue (class)">ServiceTypeValue</a></span></span><span class='lbracket'>[</span><span class='symbol'>:similar</span><span class='rbracket'>]</span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='ivar'>@include_similar</span> <span class='id identifier rubyid_types'>types</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span><span class='lparen'>(</span> <span class='const'><span class='object_link'><a href="/gems/umlaut/ServiceTypeValue" title="ServiceTypeValue (class)">ServiceTypeValue</a></span></span><span class='lbracket'>[</span><span class='ivar'>@more_by_authors_type</span><span class='rbracket'>]</span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='ivar'>@include_more_by_authors</span> <span class='kw'>return</span> <span class='id identifier rubyid_types'>types</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> </div> </div> <div id="footer"> Generated on Mon Oct 19 16:20:53 2026 by <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a> 0.9.45 (ruby-4.0.7). </div> </div> </body> </html>