ScholarChart

A charting userscript for Google Scholar distinguishing articles by the publication year and the number of citations

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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);