Greasy Fork is available in English.

VNDB Cover Preview

Previews covers in vndb.org searches when hovering over the respective hyperlinks.

// ==UserScript==
// @name        VNDB Cover Preview
// @namespace   https://twitter.com/Kuroonehalf
// @namespace   https://kuroonehalf.com
// @include     https://vndb.org*
// @include     https://vndb.org/v*
// @include     https://vndb.org/g*
// @include     https://vndb.org/p*
// @include     https://vndb.org/u*
// @include     https://vndb.org/s*
// @include     https://vndb.org/r*
// @include     https://vndb.org/c*
// @include     https://vndb.org/t*
// @version     2.0.2
// @description Previews covers in vndb.org searches when hovering over the respective hyperlinks.
// @grant       GM_setValue
// @grant       GM_getValue
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js 
// @license     http://creativecommons.org/licenses/by-nc-sa/4.0/
// @inject-into content
// ==/UserScript==

// For testing what kind of page we're on
var TagLinkTest = /^https:\/\/vndb.org\/g\/links/;
var UserLinkTest = /^https:\/\/vndb.org\/u[0-9]+/;
var VNLinkTest = /^https:\/\/vndb.org\/v[0-9]+/;
var CharacterLinkTest = /^https:\/\/vndb.org\/c[0-9]+/;
var pageURL = document.URL;

// Disable tooltips on links
$('[title]').mouseover( function() {
    var $this = $(this);
    $this.data('title',$this.attr('title'));
    $this.removeAttr('title');
});

// Image positioning function
jQuery.fn.center = function (leftoffset, topoffset) {
    // Vertical displacement. Puts the image next to the link, and keeps it in bounds
    this.css("top", Math.max($(window).scrollTop(), Math.min($(window).height() + $(window).scrollTop() - $(this).outerHeight() , topoffset - $(this).outerHeight()/2 + $(window).scrollTop() ) ));
    // Horizontal displacement
    // On some pages place the cover to the left of the link
    if (pageURL.search(TagLinkTest) != -1 || pageURL.search(UserLinkTest) != -1 || pageURL.search(VNLinkTest) != -1)
      this.css("left", leftoffset + $(window).scrollLeft() - $(this).outerWidth() - 25);
    // On others display on the right
    else
      this.css("left", Math.max(0, $(window).width() * 0.6 + $(window).scrollLeft() - $(this).outerWidth()/2 ));
    
    $('#popover img').css('display','block');
    return this;
};

// Add box where the image will sit
$('body').append('<div ID="popover"></div>');
$('#popover').css('position', 'absolute');
$('#popover').css('z-index', '10');
$('#popover').css('box-shadow','0px 0px 5px black');


$('tr a').mouseover(function () {
  $(this).css('font-weight', 'bold'); // Bolds hovered links

  var leftoffset = this.getBoundingClientRect().left;
  var topoffset =  this.getBoundingClientRect().top;
  var VNnumber = $(this).attr('href');
  var pagelink = 'https://vndb.org' + VNnumber;
  
  if (GM_getValue(pagelink)){
       var retrievedLink = GM_getValue(pagelink);
    
       // Replace image being displayed with new one hovered
       $('#popover').empty();
       $('#popover').append('<img src="' + retrievedLink + '"></img>');
       $('#popover img').load(function() {  
         $('#popover').center(leftoffset, topoffset);  
       });  
       //console.log(pagelink + " has been found and retrieved from the cache."); // for debug purposes
  }
  else{
  $.ajax({
     url: pagelink,
     dataType: 'text',
     success: function (data) {
       // Convert the HTML string into a document object
       var parser = new DOMParser();
       let dataDOC = parser.parseFromString(data, 'text/html');
       var imagelink;
       // Grab character image
       if (pagelink.search(CharacterLinkTest) != -1)
           imagelink = dataDOC.querySelector(".charimg img").src;
       // Grab visual novel cover
       else
           imagelink = dataDOC.querySelector(".vnimg img").src
       // clear what's inside #popover and put the new image in there
       $('#popover').empty();
       $('#popover').append('<img src="' + imagelink + '"></img>');
       $('#popover img').load(function() {  
         $('#popover').center();  
       }); 
       // cache info
       GM_setValue(pagelink, imagelink);
       //console.log("(" + pagelink + ", "+ imagelink + ") successfully cached.") // for testing purposes
     }
   });
   }
});
 
// Clear image on unhover
$('tr a').mouseleave(function(){
  $('#popover').empty();  
});