ccc

ccc


// ==UserScript==

// @name        Shiki Rating

// @namespace   http://shikimori.org/

// @version     2.2

// @description Rating from shiki users

// @author      ImoutoChan

// @match       http://shikimori.org/*

// @match       https://shikimori.org/*

// @license     MIT

// @grant       none

// ==/UserScript==


var debug = false;


function log(message) {

   if (!debug) {

       return;

   }


   console.log('ShikiRating: ' + message);

}


function getLocale() {

   return document.querySelector('body').getAttribute('data-locale');

}


function needAddRating() {

   return urlpart === "/animes" ||

          urlpart === "/mangas" ||

          urlpart === "/ranobe";

}


function removeLastClass(domElement) {

   var classes = domElement.classList;

   classes.remove(classes.item(classes.length - 1));

}


function setNoData(domElement) {

   var noData = document.createElement('p');

   noData.classList.add('b-nothing_here');

   noData.innerText = getLocale() === 'ru'

       ? `Недостаточно данных`

       : `Insufficient data`;


   domElement.innerHTML = '';

   domElement.appendChild(noData);


   domElement.style.textAlign = 'center';

   domElement.style.color = '#7b8084';

   domElement.style.marginTop = '15px';

}


function appendShikiRating() {

   'use strict';


   var urlpart = window.location.pathname.substring(0,7);

   log(urlpart);


   if (!needAddRating) {

       log('wrong page');

       return;

   }


   if (document.querySelector("#shiki-score") !== null) {

       log('already created');

       return;

   }


   if (document.querySelector(".scores > .b-rate") === null) {

       log("can't find default rating");

       return;

   }


   // get current rating element

   var malRate = document.querySelector(".scores > .b-rate");

   malRate.setAttribute('id', 'mal-score');


   // clone it to new element

   var newShikiRate = malRate.cloneNode(true);

   newShikiRate.setAttribute('id', 'shiki-score');


   // append cloned rating to parent container

   var rateContainer = document.querySelector(".scores");

   rateContainer.appendChild(newShikiRate);


   // load scores stats

   var scoreDataJson = document.querySelector("#rates_scores_stats").getAttribute("data-stats");

   var scoreData = JSON.parse(scoreDataJson);

   log(scoreDataJson);


   // set no data lable

   if (scoreData.length === 0) {

       setNoData(newShikiRate);

       return;

   }


   // calculate shiki rating

   var sumScore = 0;

   var totalCount = 0;

   for (var i = 0; i < scoreData.length; i++) {

       sumScore += scoreData[i].value * scoreData[i].name;

       totalCount += scoreData[i].value;

   }

   var shikiScore = sumScore / totalCount;

   var shikiScoreDigit = Math.round(shikiScore);

   log(shikiScore);


   // set number value

   var scoreElement = newShikiRate.querySelector("div.text-score > div.score-value");

   scoreElement.innerHTML = shikiScore.toFixed(2);

   removeLastClass(scoreElement);

   scoreElement.classList.add("score-" + shikiScoreDigit);


   // set stars calue

   var starElement = newShikiRate.querySelector("div.stars-container > div.stars.score");

   removeLastClass(starElement);

   starElement.style.color = '#456';

   starElement.classList.add("score-" + shikiScoreDigit);


   // load labels

   var labelData = getLocale() === 'ru' ?

           {"0":"","1":"Хуже некуда","2":"Ужасно","3":"Очень плохо","4":"Плохо","5":"Более-менее","6":"Нормально","7":"Хорошо","8":"Отлично","9":"Великолепно","10":"Эпик вин!"} :

           {"0":"","1":"Worst Ever","2":"Terrible","3":"Very Bad","4":"Bad","5":"So-so","6":"Fine","7":"Good","8":"Excellent","9":"Great","10":"Masterpiece!"};


   // set label under score

   newShikiRate.querySelector("div.text-score > div.score-notice").textContent = labelData[shikiScoreDigit];


   // set mal description label

   var malLabel = getLocale() === 'ru' ? 'На основе оценок mal' : 'From MAL users';

   malRate.insertAdjacentHTML('afterend', '<p class="score-source">' + malLabel + '</p>');


   // set shiki description label

   var shikiCountLabel = '<strong>' + totalCount + '</strong>';

   shikiCountLabel = (getLocale() === 'ru')

       ? 'На основе ' + shikiCountLabel + ' оценок shiki'

       : 'From ' + shikiCountLabel + ' shiki users';

   newShikiRate.insertAdjacentHTML('afterend', '<p class="score-counter">' + shikiCountLabel + '</p>');


   // set style for mal description label

   var malScoreLabelElement = document.querySelector('.score-source');

   malScoreLabelElement.style.marginBottom = '15px';

   malScoreLabelElement.style.textAlign = 'center';

   malScoreLabelElement.style.color = '#7b8084';


   // set style for shiki description label

   var shikiScoreLabelElement = document.querySelector('.score-counter');

   shikiScoreLabelElement.style.textAlign = 'center';

   shikiScoreLabelElement.style.color = '#7b8084';

}


function ready(fn) {

   document.addEventListener('page:load', fn);


   if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading"){

       fn();

   } else {

       document.addEventListener('DOMContentLoaded', fn);

   }

}


ready(appendShikiRating);

Report Page