NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name ScholarChart // @namespace ScholarChartNameSpace // @description A charting userscript for Google Scholar distinguishing articles by the publication year and the number of citations // @include http://scholar.google.ca/* // @include https://scholar.google.ca/* // @include http://scholar.google.com/* // @include https://scholar.google.com/* // @version 1.0 // @license Creative Commons Attribution-NonCommercial-ShareAlike 3.0; http://creativecommons.org/licenses/by-nc-sa/3.0/ // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js // @require http://code.highcharts.com/highcharts.js // @require http://code.highcharts.com/highcharts-more.js // @require http://code.highcharts.com/modules/exporting.js // @grant none // ==/UserScript== document.body.style.background = '#F8F8FF'; // Code to remove User Profile h3 if searching for people by adding an id if ($("h3").first().text().substring(0, 17) == "User profiles for") { $("h3").first().attr('id', 'UserProfile'); } // end user profile code var elemNumber = 0; $("h3[id!='UserProfile']").each(function() { elemNumber++; }); var resultObject = new Array(elemNumber); var resultObjectYear = new Array(elemNumber); var resultObjectCitation = new Array(elemNumber); var resultObjectCitationLink = new Array(elemNumber); var resultObjectUrl = new Array(elemNumber); $("h3[id!='UserProfile']").each(function(i, l) { resultObject[i]=$(l).text(); resultObjectUrl[i] = $(this).find('a[href]').first().attr('href'); }); var yearLessArticleFound = false; $(".gs_a").each(function(i , l) { try { resultObjectYear[i] = parseInt($(this).text().match(/\s(19|20)\d\d/)[0]);//replace(/[^0-9$]/gi, '')); } catch(err) { // if no year is found yearLessArticleFound = true; yearToUseInstead = new Date().getFullYear() + 5; resultObjectYear[i] = yearToUseInstead; } resultObjectYear[i] = resultObjectYear[i] + ((Math.random()/4)-0.125); }); var chartSubtitleText = ""; if (yearLessArticleFound == true) chartSubtitleText = "No year is found for one or more articles. The year " + (yearToUseInstead.toString()) + " is used instead."; $(".gs_fl:not(.gs_ggs)").each(function(i, l) { if($(this).find( "a:contains('Cited by')").html() != null) { resultObjectCitation[i] = parseInt($(this).find( "a:contains('Cited by')").html().replace(/[^0-9]/gi, '')); resultObjectCitationLink[i] = window.location.host + $(this).find( "a:contains('Cited by')").attr( "href" ); } else { resultObjectCitation[i] = 0; } }); var resultObjectCombined = new Array(elemNumber); for (i = 0; i < elemNumber; i++) { resultObjectCombined[i]= {"x": resultObjectYear[i], "y": resultObjectCitation[i], "name": resultObject[i], "url" : resultObjectUrl[i], "url_citation" : resultObjectCitationLink[i] } }; //Cloning google navigation to the top below the chart var itm = document.getElementById("gs_n"); if (itm != null) { var cln = itm.cloneNode(true); $("#gs_ccl").prepend(cln); } //end clone $("#gs_ccl").prepend("<div id='container'> text to be replaced </div>"); // the div for the chart document.getElementById("container").style.border = "thin solid #000000"; //setting border for the chart chart = new Highcharts.Chart({ chart: { renderTo:'container', defaultSeriesType: 'scatter', zoomType: 'xy' }, legend: { align: 'left', backgroundColor: '#FFFFFF', borderWidth: 1, floating: true, layout: 'vertical', verticalAlign: 'top', x: 100, y: 50 }, plotOptions: { series: { cursor: 'pointer', point: { events: { click: function (event) { //alert(this.name + ' clicked\n' + // 'Alt: ' + event.altKey + '\n' + // 'Control: ' + event.ctrlKey + '\n' + //'Shift: ' + event.shiftKey + '\n'); if(event.altKey) { if (typeof this.options.url_citation != "undefined") { window.location.href = this.options.url_citation; } else { alert("no citation"); } } else if (event.ctrlKey) { var linksForScroll = $('a[href="'+ this.options.url +'"]').first(); linksForScroll.get(0).scrollIntoView(); // "get" to get DOM element instead of JQuery $('a[href="'+ this.options.url +'"]').each(function() { $(this).parent().parent().fadeOut("slow"); $(this).parent().parent().fadeIn("slow"); } ); // Changed because PDF links were the same as the one on the right //linksForScroll.fadeOut("slow"); //linksForScroll.fadeIn("slow"); } else { window.location.href = this.options.url; } } } } }, scatter: { marker: { radius: 5, states: { hover: { enabled: true, lineColor: '#646464' } } }, states: { hover: { enabled: false } } } }, subtitle: { text: chartSubtitleText}, title: { text: 'Click for the paper, alt+click for citations, ctrl+click for scroll' }, tooltip: { style: { padding: 10, fontWeight: 'bold', fontSize: '14px', }, formatter: function() {return this.point.name +', year: '+ Math.round(this.x) +', citation: '+ this.y +' ' + ' ' ; } }, Axis: { allowDecimals : false, endOnTick: true, showLastLabel: true, startOnTick: true, title: { text: 'year ' } }, yAxis: { min : 0, title: { text: 'Citation' }, allowDecimals : false, labels: { style: { color: '#525151', font: '14px Helvetica', fontWeight: 'bold' }, formatter: function () { return this.value; } }, }, //, type: 'logarithmic' }, series: [{ data: [{ name: 'OQLC Extending C with an Object Query Capability', x: 1995, y: 14 }, { name: 'Transaction Management in Multidatabase Systems', x: 1995, y: 22 }, { name: 'Overview of the ADDS System', x: 1995, y: 0 }, { name: 'Multimedia Information Systems Issues and Approaches', x: 1995, y: 25 }, { name: 'Active Database Systems', x: 1995, y: 0 }], name: 'Cat1', color: 'rgba(0, 100, 0, .5)' }]//'rgba(223, 83, 83, .5)' }] }); chart.series[0].setData(resultObjectCombined);