Exhentai better experience

This script will bring a better experience for exhentai

As of 2021-06-25. See the latest version.

// ==UserScript==
// @name          Exhentai better experience
// @namespace discuz
// @description This script will bring a better experience for exhentai
// @include        http*://exhentai.org/*
// @include        http*://e-hentai.org/*
// @require      https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js
// @version 1.8
// ==/UserScript==

// 默认收藏夹, 收藏默认添加到 0 收藏夹,可以更改
var default_favcat = 0

// gallery detail page
if (/\/g\//.test(location.pathname)) {
    // enable tag link
    var xpath = "//div[@class='gt' or @class='gtl']/a[@onclick]";
    var nodes = document.evaluate(
        xpath,
        document,
        null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null
    );
    var node = null;
    var index = 0;
    while ((node = nodes.snapshotItem(index))) {
        node.removeAttribute("onclick");
        index++;
    }

    var fav_url = popbase + "addfav"; // popbase is from exhentai js file

    // fav operation without popup
    function fav_post() {
        if (
            $("#favoritelink").find("img").length
        ) {
            $.post(fav_url, {
                favcat: default_favcat,
                favnote: "",
                apply: "Add to Favorites",
                update: "1",
            }).done(function () {
                if (document.getElementById("favoritelink") != undefined) {
                    document.getElementById("fav").innerHTML =
                        '<div class="i" style="background-image:url(https://exhentai.org/img/fav.png); background-position:0px -2px; margin-left:10px" title="Favorites '+default_favcat+'"></div>';
                    document.getElementById("favoritelink").innerHTML = "Favorites " + default_favcat;
                }
            });
        } else {
            $.post(fav_url, {
                favcat: "favdel",
                favnote: "",
                apply: "Apply Changes",
                update: "1",
            }).done(function () {
                if (document.getElementById("favoritelink") != undefined) {
                    document.getElementById("fav").innerHTML = "";
                    document.getElementById("favoritelink").innerHTML =
                        '<img src="https://exhentai.org/img/mr.gif" /> Add to Favorites';
                }
            });
        }
    }

    var gdf_div = document.querySelector("#gdf");
    gdf_div.removeAttribute("onclick");
    gdf_div.addEventListener("click", fav_post, false);

}

// general gallery pages
if (/(\/g\/)|(watched)|(popular)|(favorites)|()/.test(location.pathname)) {

    // global search
    var nb_div = document.querySelector("#nb");

    function createElementFromHTML(htmlString) {
        var div = document.createElement("div");
        div.innerHTML = htmlString.trim();
        return div.firstChild;
    }

    function global_search() {
        var s_content = document.getElementById("g_search");
        window.location.href = "/?f_search=" + s_content.value + "&advsearch=1&f_sname=on&f_stags=on&f_sh=on&f_spf=&f_spt="; //relative to domain
    }

    var html_string =
        '<p class="nopm"><input type="text" id="g_search" name="g_search" placeholder="Search Keywords" size="50" maxlength="200"><input type="submit" id="g_search_btn" value="Apply Filter"></p>';
    var search_bar = createElementFromHTML(html_string);
    nb_div.appendChild(search_bar);

    var g_search_btn = document.querySelector("#g_search_btn");
    g_search_btn.addEventListener("click", global_search, false);
    $("#g_search").keydown(function (e){
        if(e.keyCode == 13){
            global_search();}
    })

    // global search only appears when hovering
    $("#nb").css("transition", "0.1s")
    var global_s_style = "<style> #nb:hover { max-height: 46px}; </style>";
    // var $userBgStyle = $("#user_bg_theme");
    $("head").append(global_s_style);

    // quick fav operation, show favcat num
    function fav_post_pages() {
        $('[id*="posted_"]').each(function() {
            var date_div = $(this);
            var favcat_tag_id = date_div.attr("id") + "_favcat"
            var favcat_btn_id = date_div.attr("id")+ "_favbtn"
            var fav_btn_content = `
            <div class="cs ct2" id = ${favcat_btn_id} style="
            position: absolute;
            top: -2px;
            left: -36px;
            width: 30px;
            height: 18px;
            line-height: 18px;
            background: #1c563dcc;
            border-color: #671c17;
            ">` + "收藏" + "</div>";
            // If favoriite, change style, show favcat num
            if (date_div.attr("title")){
                var title = date_div.attr("title")
                var favcat = title.slice(-1)
                var style = date_div.attr("style")
                var border_color = date_div.css("border-color")
                // var background_color = date_div.css("background-color")
                var background_color = border_color
                var style_for_fav1 = "border-color:#e4ee2c;background-color:rgb(70 141 220 / 85%)"
                if (favcat == "0"){background_color="#309427"; border_color="#671c17"; style=style_for_fav1}
                date_div.attr("style", style);
                date_div.attr("title", title);
                var favcat_tag_content = `
                <div class="cs ct2" id = ${favcat_tag_id} style="
                position: absolute;
                top: -2px;
                left: -36px;
                width: 30px;
                height: 18px;
                line-height: 18px;
                background: ${background_color};
                border-color: ${border_color};
                ">fav` + favcat + "</div>";
                date_div.append(favcat_tag_content)
                // debugger;
            } else {
                date_div.append(fav_btn_content)
            }
            var popUpStr = $(this).attr("onclick");
            var fav_url = popUpStr.slice(7, -10);
            $(this).removeAttr("onclick");
            $(this).click(function(){
                if (! $(this).attr("title")) {
                    $.post(fav_url, {
                        favcat: default_favcat,
                        favnote: "",
                        apply: "Add to Favorites",
                        update: "1",
                    }).done(function (data) {
                        // debugger;
                        var patt_borderColor = /borderColor="(.*?)"/
                        var borderColor = patt_borderColor.exec(data)[1];
                        var patt_backgroundColor = /backgroundColor="(.*?)"/
                        // var backgroundColor = patt_backgroundColor.exec(data)[1];
                        var backgroundColor = borderColor
                        var patt_title = /title="(.*?)"/
                        var title = patt_title.exec(data)[1];
                        var favcat = title.slice(-1);
                        var style_for_fav1 = "border-color:#e4ee2c;background-color:rgb(70 141 220 / 85%)"

                        if (favcat == "0"){backgroundColor="#309427"; borderColor="#671c17"; style=style_for_fav1};

                        date_div.attr("style", style_for_fav1);
                        date_div.attr("title", title)
                        var favcat_tag_content = `
                        <div class="cs ct2" id = ${favcat_tag_id} style="
                        position: absolute;
                        top: -2px;
                        left: -36px;
                        width: 30px;
                        height: 18px;
                        line-height: 18px;
                        background: ${backgroundColor};
                        border-color: ${borderColor};
                        ">fav` + default_favcat + "</div>";
                        date_div.append(favcat_tag_content);
                        $("#"+favcat_btn_id).remove();
                        // debugger;
                    })
                } else {
                    $.post(fav_url, {
                        favcat: "favdel",
                        favnote: "",
                        apply: "Apply Changes",
                        update: "1",
                    }).done(function () {
                        // debugger;
                        date_div.attr("style", "");
                        date_div.attr("title", "");
                        $("#"+favcat_tag_id).remove();
                        date_div.append(fav_btn_content);
                        // debugger;
                    });
                }
            }
                         )
        }
                                 )
    };
    fav_post_pages()
}

// Chinsese translation highlight
var title_path = "//div[contains(@class, 'gl4t')]";
var titles = document.evaluate(
    title_path,
    document,
    null,
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
    null
);
var title = null;
var idx = 0;
while ((title = titles.snapshotItem(idx))) {
    var text = title.innerText;
    if (text.includes("中国") || text.includes("Chinese")  || text.includes("中國")) {
        title.setAttribute("style", "color: #ff8d8d; font-weight: bold;");}
    idx++;
}