Greasy Fork

Fanfiction.net ratio

Adds score ratio to fics

目前为 2021-01-19 提交的版本。查看 最新版本

// ==UserScript==
// @name        Fanfiction.net ratio
// @description Adds score ratio to fics
// @author	1233Echo
// @version	1.0
// @grant       none
// @include     https://www.fanfiction.net/*
// @include     https://www.fanfiction.net//*
// @namespace https://greasyfork.org/users/728828
// ==/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 = $('<div class="ratio"></div>').text("Ratio: "+score+"%");
                    wrevi.after(ratio_label ,'\n');
				}
                else{
                   var zero = $('<div class="ratio"></div>').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);