diff --git a/_bibliography/papers.bib b/_bibliography/papers.bib index ce201ffac77e..a3ed37574e8a 100644 --- a/_bibliography/papers.bib +++ b/_bibliography/papers.bib @@ -44,6 +44,7 @@ @article{PhysRev.47.777 pdf={example_pdf.pdf}, altmetric={248277}, dimensions={true}, + google_scholar_id={qyhmnyLat1gC}, selected={true} } diff --git a/_config.yml b/_config.yml index 6c3f3cedd943..f91271f93931 100644 --- a/_config.yml +++ b/_config.yml @@ -73,7 +73,7 @@ x_username: # your X handle mastodon_username: # your mastodon instance+username in the format instance.tld/@username linkedin_username: # your LinkedIn user name telegram_username: # your Telegram user name -scholar_userid: # your Google Scholar ID +scholar_userid: qc6CJjYAAAAJ # your Google Scholar ID semanticscholar_id: # your Semantic Scholar ID whatsapp_number: # your WhatsApp number (full phone number in international format. Omit any zeroes, brackets, or dashes when adding the phone number in international format.) orcid_id: # your ORCID ID @@ -311,6 +311,7 @@ scholar: enable_publication_badges: altmetric: true # Altmetric badge (https://www.altmetric.com/products/altmetric-badges/) dimensions: true # Dimensions badge (https://badge.dimensions.ai/) + google_scholar: true # Google Scholar badge (https://scholar.google.com/intl/en/scholar/citations.html) # Filter out certain bibtex entry keywords used internally from the bib output filtered_bibtex_keywords: diff --git a/_layouts/bib.liquid b/_layouts/bib.liquid index 72df52f1ee63..e4d0d148f165 100644 --- a/_layouts/bib.liquid +++ b/_layouts/bib.liquid @@ -211,7 +211,8 @@ {% if site.enable_publication_badges %} {% assign entry_has_altmetric_badge = entry.altmetric or entry.doi or entry.eprint or entry.pmid or entry.isbn %} {% assign entry_has_dimensions_badge = entry.dimensions or entry.doi or entry.pmid %} - {% if entry_has_altmetric_badge or entry_has_dimensions_badge %} + {% assign entry_has_google_scholar_badge = entry.google_scholar_id %} + {% if entry_has_altmetric_badge or entry_has_dimensions_badge or entry_has_google_scholar_badge %}
{% if site.enable_publication_badges.altmetric and entry_has_altmetric_badge %} {% endif %} + {% if site.enable_publication_badges.google_scholar and entry_has_google_scholar_badge %} + + + + {% endif %}
{% endif %} {% endif %} diff --git a/_plugins/google-scholar-citations.rb b/_plugins/google-scholar-citations.rb new file mode 100644 index 000000000000..78dd1a1ce32a --- /dev/null +++ b/_plugins/google-scholar-citations.rb @@ -0,0 +1,78 @@ +require "active_support/all" +require 'nokogiri' +require 'open-uri' + +module Helpers + extend ActiveSupport::NumberHelper +end + +module Jekyll + class GoogleScholarCitationsTag < Liquid::Tag + Citations = { } + + def initialize(tag_name, params, tokens) + super + splitted = params.split(" ").map(&:strip) + @scholar_id = splitted[0] + @article_id = splitted[1] + end + + def render(context) + article_id = context[@article_id.strip] + scholar_id = context[@scholar_id.strip] + article_url = "https://scholar.google.com/citations?view_op=view_citation&hl=en&user=#{scholar_id}&citation_for_view=#{scholar_id}:#{article_id}" + + begin + # If the citation count has already been fetched, return it + if GoogleScholarCitationsTag::Citations[article_id] + return GoogleScholarCitationsTag::Citations[article_id] + end + + # Sleep for a random amount of time to avoid being blocked + sleep(rand(1.5..3.5)) + + # Fetch the article page + doc = Nokogiri::HTML(URI.open(article_url, "User-Agent" => "Ruby/#{RUBY_VERSION}")) + + # Attempt to extract the "Cited by n" string from the meta tags + citation_count = 0 + + # Look for meta tags with "name" attribute set to "description" + description_meta = doc.css('meta[name="description"]') + og_description_meta = doc.css('meta[property="og:description"]') + + if !description_meta.empty? + cited_by_text = description_meta[0]['content'] + matches = cited_by_text.match(/Cited by (\d+[,\d]*)/) + + if matches + citation_count = matches[1].to_i + end + + elsif !og_description_meta.empty? + cited_by_text = og_description_meta[0]['content'] + matches = cited_by_text.match(/Cited by (\d+[,\d]*)/) + + if matches + citation_count = matches[1].to_i + end + end + + citation_count = Helpers.number_to_human(citation_count, :format => '%n%u', :precision => 2, :units => { :thousand => 'K', :million => 'M', :billion => 'B' }) + + rescue Exception => e + # Handle any errors that may occur during fetching + citation_count = "N/A" + + # Print the error message including the exception class and message + puts "Error fetching citation count for #{article_id}: #{e.class} - #{e.message}" + end + + + GoogleScholarCitationsTag::Citations[article_id] = citation_count + return "#{citation_count}" + end + end +end + +Liquid::Template.register_tag('google_scholar_citations', Jekyll::GoogleScholarCitationsTag) \ No newline at end of file