// ==UserScript== // @name Fanfiction.net ratio // @description Adds score ratio to fanfics // @author 1233Echo // @version 1.0 // @grant none // @include https://www.fanfiction.net/* // @include https://www.fanfiction.net//* // @namespace https://greasyfork.org/users/728828 // @downloadURL none // ==/UserScript== // My first and probably last script // Shout out to Min "AO3: Kudos/hits ratio" for inspiring this script // Colors of the Ratio div var border_color = "#cdcdcd"; var green_color = "#b7e1cd"; var yellow_color = "#fce8b2"; var orange_color = "#f8d8ba"; var red_color = "#f4c7c3"; (function($) { var countable = true; countRatio(); // I don't know why this div exist but hiding it hopefully doesn't break anything $('div[style*="width:160px"]').hide(); function countRatio() { if (countable) { $('div.z-list.zhover.zpointer ').each(function() { var hits_value = $(this).find('div.z-padtop2.xgray'); var wrevi = $(this).find('a.stitle'); var text = hits_value.text(); var split = text.split(' '); var words_index = $.inArray("Words:",split); var words_string = split[words_index+1]; var w = words_string.replace(/\,/g, ''); var words = parseInt(w); var review_index = $.inArray("Reviews:",split); var reviews_string = split[review_index+1]; var reviews = parseInt(reviews_string); /* var favs_index = $.inArray("Favs:",split); var favs_string = split[favs_index+1]; var f = favs_string.replace(/\,/g, ''); var favs = parseInt(f); var follows_index = $.inArray("Follows:",split); var follows_string = split[follows_index+1]; var fa = follows_string.replace(/\,/g, ''); var follows = parseInt(fa); */ var rated_index = $.inArray("Rated:",split); var rated_string = split[rated_index+1]; var wordsAndReviews = ((10*reviews/Math.log(words))/10).toFixed(2); //var favsAndReviews = ((10*favs/Math.log(words))/10).toFixed(2); //var followsAndReviews = ((10*follows/Math.log(words))/10).toFixed(2); var score = wordsAndReviews; var score_muliplayer = 0; var counter = 0; // This is optional I thought of adjusting score based on general popularity of genres // or depending on what I want to read at the moment if(text.includes("Adventure")){ score_muliplayer += 0.87*score; counter++; } if(text.includes("Angst")){ score_muliplayer += 0.91*score; counter++; } if(text.includes("Crime")){ score_muliplayer += 0.99*score; counter++; } if(text.includes("Drama")){ score_muliplayer += 0.84*score; counter++; } if(text.includes("Family")){ score_muliplayer += 0.95*score; counter++; } if(text.includes("Fantasy")){ score_muliplayer += 0.98*score; counter++; } if(text.includes("Friendship")){ score_muliplayer += 0.92*score; counter++; } if(text.includes("General")){ score_muliplayer += 0.72*score; counter++; } if(text.includes("Horror")){ score_muliplayer += 0.99*score; counter++; } if(text.includes("Humor")){ score_muliplayer += 0.78*score; counter++; } if(text.includes("Hurt")){ score_muliplayer += 0.91*score; counter++; } if(text.includes("Mystery")){ score_muliplayer += 0.98*score; counter++; } if(text.includes("Parody")){ score_muliplayer += 0.98*score; counter++; } if(text.includes("Poetry")){ score_muliplayer += 0.99*score; counter++; } if(text.includes("Romance")){ score_muliplayer += 0.40*score; counter++; } if(text.includes("Sci-Fi")){ score_muliplayer += 1.00*score; counter++; } if(text.includes("Spiritual")){ score_muliplayer += 1.00*score; counter++; } if(text.includes("Supernatual")){ score_muliplayer += 0.98*score; counter++; } if(text.includes("Suspense")){ score_muliplayer += 0.99*score; counter++; } if(text.includes("Tragedy")){ score_muliplayer += 0.96*score; counter++; } if(text.includes("Western")){ score_muliplayer += 1.00*score; counter++; } if(counter !== 0){ score = score_muliplayer/counter; } // This is also optional I adjusted this based on popularity of mature fics if(rated_string=="M"){ score *= 3; } score = (score*2).toFixed(2); if (score < 0.1) { score = 0; } if (score > 100) { score = 100; } if (review_index !== -1) { var hits_count = parseInt(hits_value.text()); var ratio_label = $('
').text("Ratio: "+score+"%"); wrevi.after(ratio_label ,'\n'); } else{ var zero = $('
').text("Ratio: 0%"); wrevi.after(zero ,'\n'); zero.css("background-color", red_color); } $(".ratio").css("width","110px"); $(".ratio").css("text-align","center"); $(".ratio").css("float","right"); $(".ratio").css("border-radius","3px"); $(".ratio").css("border-style","solid"); $(".ratio").css("border-width","thin"); $(".ratio").css("border-color",border_color); // Ratio div background color // Green if(score>75){ ratio_label.css("background-color", green_color); } // Yellow else if(score>50){ ratio_label.css("background-color", yellow_color); } // Orange else if(score>25){ ratio_label.css("background-color", orange_color); } // Red else if(score>=0){ ratio_label.css("background-color", red_color); } }); } } })(jQuery);