Chortowod / Shiki Highlighting

// ==UserScript==
// @name         Shiki Highlighting
// @author       Chortowod (https://openuserjs.org/users/Chortowod/scripts)
// @description  Изменение цвета некоторых элементов (например, хронология и история) для наглядного понимания и лучшего(?) просмотра
// @namespace    http://shikimori.me/
// @version      2.0.2
// @match        *://shikimori.org/*
// @match        *://shikimori.one/*
// @match        *://shikimori.me/*
// @icon         https://www.google.com/s2/favicons?domain=shikimori.me
// @license      MIT
// @require      https://gist.githubusercontent.com/arantius/3123124/raw/grant-none-shim.js
// @updateURL    https://openuserjs.org/meta/Chortowod/Shiki_Highlighting.meta.js
// @downloadURL  https://openuserjs.org/install/Chortowod/Shiki_Highlighting.user.js
// @require      https://gist.githubusercontent.com/Chortowod/814b010c68fc97e5f900df47bf79059c/raw/chtw_settings.js?v3
// @copyright    2023, Chortowod (https://openuserjs.org/users/Chortowod)
// ==/UserScript==

let settings = new ChtwSettings('chtwHighlight', '<a target="_blank" href="https://openuserjs.org/scripts/Chortowod/Shiki_Highlighting">Цвета тайтлов</a>');
let debug;

function initSettings() {
    settings.createOption('isChronology', 'Хронология');
    settings.createOption('isHistory', 'История');

    settings.createOption('darkTheme', '', 'Переключить тему', 'submit', true);
    settings.setOption('isDarkTheme', false);

    // settings.createOption('defaultTr', 'Хронология [не в списке] кнопка', '#8f2929', 'color');
    settings.createOption('completedBg', 'Хронология [просмотрено] фон', '#b4f5bf', 'color');
    settings.createOption('completedTr', 'Хронология [просмотрено] кнопка', '#1aff42', 'color');
    settings.createOption('plannedBg', 'Хронология [запланировано] фон', '#ffef7c', 'color');
    settings.createOption('plannedTr', 'Хронология [запланировано] кнопка', '#ffc45a', 'color');
    settings.createOption('onHoldBg', 'Хронология [отложено] фон', '#cfcfe9', 'color');
    settings.createOption('onHoldTr', 'Хронология [отложено] кнопка', '#79bde7', 'color');
    settings.createOption('watchingBg', 'Хронология [смотрю] фон', '#9bfbff', 'color');
    settings.createOption('watchingTr', 'Хронология [смотрю] кнопка', '#00c5ff', 'color');
    settings.createOption('droppedBg', 'Хронология [брошено] фон', '#e2e1e1', 'color');
    settings.createOption('droppedTr', 'Хронология [брошено] кнопка', '#454545', 'color');
    settings.createOption('rewatchingBg', 'Хронология [пересматриваю] фон', '#cae097', 'color');
    settings.createOption('rewatchingTr', 'Хронология [пересматриваю] кнопка', '#a0c54b', 'color');


    settings.createOption('added', 'История, добавлено', '#05b2ee', 'color');
    settings.createOption('done', 'История, просмотрено', '#12d326', 'color');
    settings.createOption('dropped', 'История, брошено', 'red', 'color');
    settings.createOption('hold', 'История, отложено', '#ff7935', 'color');
    // settings.createOption('watching', 'История, смотрю', '#34c34dfc', 'color');

    settings.createOption('darkTheme', '', 'Переключить тему', 'submit', true);

    debug = settings.getOption('isDebug');

    $('#'+settings.getOptionID('darkTheme')).on('click', function () {
        let textInfo = 'Цвета сброшены и переключены на '+(settings.getOption('isDarkTheme') ? 'светлую' : 'тёмную')+' тему. Перезагрузите страницу.';
        if (settings.getOption('isDarkTheme')) {
            // settings.setOptionForced('defaultTr', '#8f2929');
            settings.setOptionForced('completedBg', '#b4f5bf');
            settings.setOptionForced('completedTr', '#1aff42');
            settings.setOptionForced('plannedBg', '#ffef7c');
            settings.setOptionForced('plannedTr', '#ffc45a');
            settings.setOptionForced('onHoldBg', '#cfcfe9');
            settings.setOptionForced('onHoldTr', '#79bde7');
            settings.setOptionForced('watchingBg', '#9bfbff');
            settings.setOptionForced('watchingTr', '#00c5ff');
            settings.setOptionForced('droppedBg', '#e2e1e1');
            settings.setOptionForced('droppedTr', '#454545');
            settings.setOptionForced('rewatchingBg', '#cae097');
            settings.setOptionForced('rewatchingTr', '#a0c54b');

            settings.setOptionForced('added', '#05b2ee');
            settings.setOptionForced('done', '#12d326');
            settings.setOptionForced('dropped', 'red');
            settings.setOptionForced('hold', '#ff7935');
        }
        else {
            // settings.setOptionForced('defaultTr', '#8f2929');
            settings.setOptionForced('completedBg', '#091d0c');
            settings.setOptionForced('completedTr', '#34c34d');
            settings.setOptionForced('plannedBg', '#252002');
            settings.setOptionForced('plannedTr', '#986407');
            settings.setOptionForced('onHoldBg', '#111038');
            settings.setOptionForced('onHoldTr', '#2d2df4');
            settings.setOptionForced('watchingBg', '#005458');
            settings.setOptionForced('watchingTr', '#00c5ff');
            settings.setOptionForced('droppedBg', '#2d2d2d');
            settings.setOptionForced('droppedTr', '#111111');
            settings.setOptionForced('rewatchingBg', '#384b0b');
            settings.setOptionForced('rewatchingTr', '#698d16');

            settings.setOptionForced('added', '#04f1ff');
            settings.setOptionForced('done', '#b2ff00');
            settings.setOptionForced('dropped', '#ff2020');
            settings.setOptionForced('hold', '#eb560b');
        }
        settings.setOptionForced('isDarkTheme', !settings.getOption('isDarkTheme'));
        alert(textInfo);
    });
}

function log (message) { debug&&console.log(message) }

// собственная подсветка тайтлов для наглядности
function hlChronology() {
    if (!settings.getOption('isChronology'))
        return;
    let trigger = '.b-db_entry-variant-list_item > .info > .user_rate-container > .b-user_rate .b-add_to_list';
    let parent = '.b-db_entry-variant-list_item';
    let bc = 'background-color';

    // $('.b-add_to_list.planned .trigger').css(bc, settings.getOption('defaultTr'));

    $(trigger + ' .trigger').css({'margin-bottom':'6px', 'border':'none', 'border-radius':'5px'});
    $(parent).css({'margin-bottom':'0px', 'border-radius':'18px'});

    $(trigger + '.completed').parents(parent).css(bc, settings.getOption('completedBg'));
    $(trigger + '.completed .trigger').css(bc, settings.getOption('completedTr'));

    $(trigger + '.planned .edit-trigger').parents(parent).css(bc, settings.getOption('plannedBg'));
    $(trigger + '.planned .trigger').css(bc, settings.getOption('plannedTr'));

    $(trigger + '.on_hold .edit-trigger').parents(parent).css(bc, settings.getOption('onHoldBg'));
    $(trigger + '.on_hold .trigger').css(bc, settings.getOption('onHoldTr'));

    $(trigger + '.watching .edit-trigger').parents(parent).css(bc, settings.getOption('watchingBg'));
    $(trigger + '.watching .trigger').css(bc, settings.getOption('watchingTr'));

    $(trigger + '.dropped .edit-trigger').parents(parent).css(bc, settings.getOption('droppedBg'));
    $(trigger + '.dropped .trigger').css(bc, settings.getOption('droppedTr'));

    $(trigger + '.rewatching .edit-trigger').parents(parent).css(bc, settings.getOption('rewatchingBg'));
    $(trigger + '.rewatching .trigger').css(bc, settings.getOption('rewatchingTr'));
}

function hlHistory() {
    if (!$('.history-page').length || !settings.getOption('isHistory'))
        return;
    // $(".history-page span").children().children().css("color", settings.getOption('watching'));
    $(".history-page span:contains('добавлено в список')").children().css("color", settings.getOption('added'));
    $(".history-page span:contains('запланировано')").children().css("color", settings.getOption('added'));
    $(".history-page span:contains('просмотрено'):not(:contains('эпиз'))").children().css("color", settings.getOption('done'));
    $(".history-page span:contains('прочитано и оценено')").children().css("color", settings.getOption('done'));
    $(".history-page span:contains('удалено')").children().css("color", settings.getOption('dropped'));
    $(".history-page span:contains('брошено')").children().css("color", settings.getOption('dropped'));
    $(".history-page span:contains('отложено')").children().css("color", settings.getOption('hold'));
    $('.history-page .b-user_history-line > span > *').css('font-weight', 'bold');
}


function ready(fn) {
    document.addEventListener('page:load', fn);
    document.addEventListener('turbolinks:load', fn);
    if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading") fn();
    else document.addEventListener('DOMContentLoaded', fn);
}

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'), hlHistory);

ready(initSettings);
ready(hlChronology);
ready(hlHistory);