RR: CJK Language Family Interface Enhance

Solve the problem that the CJK language family causes the layout of some pages of RR to misalign.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name:zh-TW          RR: CJK 語系介面調整
// @name                RR: CJK Language Family Interface Enhance
// @namespace           -
// @version             1.1.0
// @description:zh-TW   解決 CJK 語系導致 RR 部分頁面排版走位的問題。
// @description         Solve the problem that the CJK language family causes the layout of some pages of RR to misalign.
// @author              LianSheng
// @include             http://rivalregions.com/*
// @include             https://rivalregions.com/*
// @grant               none
// @license             MIT
// ==/UserScript==

(() => {
    // Mutation Observer Callback Check functions
    class MOCC {
        /**
         * 頁面:storage
         * 
         * @param {MutationRecord} record
         */
        static pageStorage(record) {
            if (record.addedNodes.length > 0) {
                let content = [...record.addedNodes].filter(
                    each => each.id == "content"
                );

                if (content.length > 0) {
                    let marginDiv = content[0].querySelector(".margin");

                    if (marginDiv) {
                        marginDiv.style.height = "100%";
                    }
                }
            }
        }

        /**
         * 頁面:article
         * 
         * @param {MutationRecord} record
         */
        static pageArticle(record) {
            if (record.addedNodes.length > 0) {
                let content = [...record.addedNodes].filter(
                    each => each.querySelector && each.querySelector("#another_langs_area")
                );

                if (content.length > 0) {
                    let articles = [...content[0].querySelectorAll("div[action*='news/show/']")];

                    articles.forEach(
                        each => each.style.height = "fit-content"
                    );
                }
            }
        }

        /**
         * 滑頁:state, region
         * 
         * @param {MutationRecord} record
         */
        static slide(record) {
            if (record.addedNodes.length > 0) {
                let content = [...record.addedNodes].filter(
                    each => each.querySelector && each.querySelector(".jspContainer")
                );

                if (content.length > 0) {
                    let slideProfileData = [...content[0].querySelectorAll(".jspContainer .slide_profile_data, .jspContainer .short_details")];

                    slideProfileData.forEach(each => {
                        each.style.minHeight = "50px";

                        // 解決顯示不完全的問題
                        $('#region_scroll').jScrollPane();
                    });
                }
            }
        }
    }

    // 常規頁面
    let contentId = setInterval(() => {
        let content = document.querySelector("#content");
        if (content) {
            let mo = new MutationObserver(records => records.map(record => {
                if (record.addedNodes.length > 0) {
                    MOCC.pageStorage(record);
                    MOCC.pageArticle(record);
                }
            }));
            let options = {
                'childList': true
            };
            mo.observe(content, options);
            clearInterval(contentId);
        }
    }, 100);

    // 滑頁
    let slideId = setInterval(() => {
        let slide = document.querySelector("#header_slide_inner");
        if (slide) {
            let mo = new MutationObserver(records => records.map(record => {
                if (record.addedNodes.length > 0) {
                    MOCC.slide(record);
                }
            }));
            let options = {
                'childList': true,
            };
            mo.observe(slide, options);
            clearInterval(slideId);
        }
    }, 100);
})();