AniOleg / CustomListMark

// ==UserScript==
// @name         CustomListMark
// @version      0.2
// @description  Заменяет "Онгоинг" и "Анонс" в списке аниме и манги на индикаторы. Отдельно помечает онгоинги, в которых у пользоваля замечено отставание по сериям
// @author       AniOleg
// @match        https://shikimori.one/*
// @match        https://shikimori.org/*
// @match        https://shikimori.me/*
// @match        http://shikimori.one/*
// @match        http://shikimori.org/*
// @match        http://shikimori.me/*
// @icon         https://www.google.com/s2/favicons?domain=shikimori.one
// @homepageURL  https://openuserjs.org/scripts/AniOleg/CustomListMark
// @updateURL    https://openuserjs.org/meta/AniOleg/CustomListMark.meta.js
// @license      MIT
// @grant        none
// ==/UserScript==

//Цвета (поддерживаются также HEX и RGB(R, G, B))
var clOngoing='GreenYellow'; //онгоинг
var clOngoingLaze='red';     //онгоинг, есть отставание по сериям
var clAnnounce='orange';     //анонс

function cReDraw (){
    if (location.pathname.includes('/list/anime') || location.pathname.includes('/list/manga'))
        try{
            var EntriesList = document.getElementsByClassName('entries');

            for (var a = 0; a<EntriesList.length; a++){
                for (var b = 0; b<EntriesList[a].childNodes.length; b++){
                    if (EntriesList[a].childNodes[b].childNodes[1].getElementsByClassName('ongoing').length>0) { //Найден "Онгоинг"
                        EntriesList[a].childNodes[b].childNodes[1].getElementsByClassName('ongoing')[0].remove();
                        if (EntriesList[a].childNodes[b].childNodes[3].getElementsByClassName('misc-value')[0].childNodes[1].nodeValue - EntriesList[a].childNodes[b].childNodes[3].getElementsByClassName('current-value')[0].childNodes[0].childNodes[0].nodeValue<=0
                            || EntriesList[a].childNodes[b].childNodes[3].getElementsByClassName('misc-value')[0].childNodes[1].nodeValue=='?'
                           )
                            MarkTitle(clOngoing, EntriesList, a, b);
                        else
                            MarkTitle(clOngoingLaze, EntriesList, a, b);
                    } else if (EntriesList[a].childNodes[b].childNodes[1].getElementsByClassName('anons').length>0) { //Найден "Анонс"
                        EntriesList[a].childNodes[b].childNodes[1].getElementsByClassName('anons')[0].remove();
                        MarkTitle(clAnnounce, EntriesList, a, b);
                    }
                }
            }
        } catch{}
}

function MarkTitle(sColor, EntriesList, a, b){
    EntriesList[a].childNodes[b].childNodes[0].style.borderLeft='1px solid '+sColor;
}

//Прослушка страницы (и подгрузки)
var observeDOM = (function(){
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
    var eventListenerSupported = window.addEventListener;

    return function(obj, callback){
        if(MutationObserver){
            // define a new observer
            var obs = new MutationObserver(function(mutations, observer){
                if(mutations[0].addedNodes.length || mutations[0].removedNodes.length)
                    callback();
            });
            // have the observer observe foo for changes in children
            obs.observe(obj, { childList: true, subtree: true });
        }
        else if(eventListenerSupported){
            obj.addEventListener('DOMNodeInserted', callback, false);
            //obj.addEventListener('DOMNodeRemoved', callback, false);
        }
    };
})();

observeDOM(document.querySelector('html'), cReDraw);