// ==UserScript==
// @name nhentai show Tag in main page
// @name:ja nhentai show Tag in main page
// @name:zh-TW nhentai show Tag in main page
// @name:zh-CN nhentai show Tag in main page
// @namespace nhentai_display_and_highlight_tag_with_thumbnail
// @supportURL https://github.com/zhuzemin
// @description nhentai show Tag in main page, and highlight/block tag
// @description:zh-CN nhentai show Tag in main page, and highlight/block tag
// @description:zh-TW nhentai show Tag in main page, and highlight/block tag
// @description:ja nhentai show Tag in main page, and highlight/block tag
// @include https://nhentai.net/*
// @include https://en.nyahentai3.com/*
// @include https://zh.nyahentai.co/*
// @include https://ja.nyahentai.net/*
// @include https://zh.nyahentai.pro/*
// @include https://ja.nyahentai.org/g/*
// @include https://zh.nyahentai4.com/g/*
// @include https://zh.bughentai.com/g/*
// @include https://zh.bughentai.com/*
// @include https://nyahentai.club/g/*
// @include https://nyahentai.club/*
// @include https://ja.cathentai.com/g/*
// @include https://ja.cathentai.com/*
// @version 1.53
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// @run-at document-start
// @author zhuzemin
// @license Mozilla Public License 2.0; http://www.mozilla.org/MPL/2.0/
// @license CC Attribution-ShareAlike 4.0 International; http://creativecommons.org/licenses/by-sa/4.0/
// @connect-src zh.nyahentai4.com
// @connect-src ja.nyahentai.org
// @connect-src zh.nyahentai.pro
// @connect-src ja.nyahentai.net
// @connect-src zh.nyahentai.co
// @connect-src en.nyahentai3.com
// @connect-src nhentai.net
// @connect-src nyahentai.org
// ==/UserScript==
var config = {
'debug': false
}
var debug = config.debug ? console.log.bind(console) : function () {
};
// setting User Preferences
function setUserPref(varName, defaultVal, menuText, promtText, sep){
GM_registerMenuCommand(menuText, function() {
var val = prompt(promtText, GM_getValue(varName, defaultVal));
if (val === null) { return; } // end execution if clicked CANCEL
// prepare string of variables separated by the separator
if (sep && val){
var pat1 = new RegExp('\\s*' + sep + '+\\s*', 'g'); // trim space/s around separator & trim repeated separator
var pat2 = new RegExp('(?:^' + sep + '+|' + sep + '+$)', 'g'); // trim starting & trailing separator
//val = val.replace(pat1, sep).replace(pat2, '');
}
//val = val.replace(/\s{2,}/g, ' ').trim(); // remove multiple spaces and trim
GM_setValue(varName, val);
// Apply changes (immediately if there are no existing highlights, or upon reload to clear the old ones)
//if(!document.body.querySelector(".THmo")) THmo_doHighlight(document.body);
//else location.reload();
});
}
// prepare UserPrefs
setUserPref(
'highlights',
'chinese;',
'Set Highlight Tags',
`Set highlights, split with ";". Example: "mmf threesome; chinese"`,
','
);
setUserPref(
'BlackList',
'english;',
'Set BlackList',
`Set BlackList, split with ";". Example: "chinese; yaoi"`,
','
);
CreateStyle=function(){
debug("Start: CreateStyle");
var style=document.createElement("style");
style.setAttribute("type","text/css");
style.innerHTML=`
.glowbox {
background: #4c4c4c;
//width: 400px;
//margin: 40px 0 0 40px;
//padding: 10px;
-moz-box-shadow: 0 0 5px 5px #FFFF00;
-webkit-box-shadow: 0 0 5px 5px #FFFF00;
box-shadow: 0 0 5px 5px #FFFF00;
}
`;
debug("Processing: CreateStyle");
var head=document.querySelector("head");
head.insertBefore(style,null);
debug("End: CreateStyle");
}
class Gallery{
constructor(href,other=null) {
this.method = 'GET';
this.url = href;
this.headers = {
'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
'Accept': 'application/atom+xml,application/xml,text/xml',
'Referer': window.location.href,
};
this.charset = 'text/plain;charset=utf8';
this.other=other;
}
}
var BlackListLast=[];
var highlightsLast=[];
var DivCount;
function HighlightTag(responseDetails,divs){
//debug("HighlightTag");
var dom;
if(responseDetails!=null){
var responseText=responseDetails.responseText;
dom = new DOMParser().parseFromString(responseText, "text/html");
}
var highlights;
var BlackList;
try{
highlights=GM_getValue("highlights").trim().replace(/;$/,"").split(";");
BlackList=GM_getValue("BlackList").trim().replace(/;$/,"").split(";");
}catch(e){
debug("Not set GM_Value.");
}
if (BlackList == undefined||BlackList.length ==0) {
BlackList = [];
}
if (highlights == undefined||highlights.length ==0) {
highlights = [];
}
debug("BlackList: " + BlackList);
if(responseDetails!=null||JSON.stringify(BlackList)!=JSON.stringify(BlackListLast)||JSON.stringify(highlights)!=JSON.stringify(highlightsLast)){
var taglist;
var NewDivs;
if(responseDetails==null){
NewDivs = divs;
}
else{
NewDivs=[0];
}
//debug("NewDivs.length: "+NewDivs.length);
for(var i=0;i<NewDivs.length;i++){
var Break=false;
var div;
if(responseDetails!=null){
div=divs[DivCount];
taglist = dom.querySelector('#tags');
}
else{
div=divs[i];
taglist = div.querySelector('#tags');
}
//debug(taglist);
var links = taglist.querySelectorAll("a.tag");
//debug(links);
if(responseDetails!=null||JSON.stringify(BlackList)!=JSON.stringify(BlackListLast)){
for (var link of links) {
var tag = link.innerText.toLowerCase().match(/([\w\s]*)/)[1].trim();
//debug("Tag: "+tag);
for (var BlackWord of BlackList) {
if (BlackWord.length > 1) {
if (tag == BlackWord.trim()) {
debug("BlackWord: " + link.innerText);
div.className += " blacklisted";
Break=true;
break;
}
else if (link==links[links.length-1]&&BlackWord == BlackList[BlackList.length - 1]) {
div.className = div.className.replace(" blacklisted", "");
}
}
else{
div.className = div.className.replace(" blacklisted", "");
}
}
if (Break) {
break;
}
}
}
if(responseDetails!=null||JSON.stringify(highlights)!=JSON.stringify(highlightsLast)){
for (var link of links) {
var tag = link.innerText.toLowerCase().match(/([\w\s]*)/)[1].trim();
//debug("Tag: "+tag);
for (var highlight of highlights) {
if (highlight.length > 1) {
//debug("Highlight: "+highlight);
if (tag == highlight.trim()) {
debug("highlight: " + link.innerText);
link.className += " glowbox";
break;
}
else if (highlight == highlights[highlights.length - 1]) {
link.className = link.className.replace(" glowbox", "");
}
}
else{
link.className = link.className.replace(" glowbox", "");
}
}
}
}
if(responseDetails!=null) {
var a = div.querySelector("a");
a.replaceChild(taglist, a.querySelector("#tags"));
let favorite=dom.querySelector('a.btn.btn-primary.btn-disabled.tooltip');
if(favorite!=null){
a.insertBefore(favorite,a.lastChild);
}
DivCount++;
}
}
if(responseDetails!=null) {
if (DivCount < divs.length) {
MainWoker(divs);
}
}
debug("BlackListLast: "+BlackListLast);
debug("highlightsLast: "+highlightsLast);
highlightsLast=highlights;
BlackListLast=BlackList;
}
}
function MainWoker(divs){
debug("MainWoker");
var div=divs[DivCount];
div.style.maxHeight = "900px";
div.style.height = "900px";
var a = div.querySelector("a");
var img = a.querySelector("img");
var data_src=img.getAttribute("data-src");
img.setAttribute("src",data_src);
div.insertBefore(img, a);
a.style.overflow = "auto";
a.style.maxHeight = 900 - img.offsetHeight + "px";
var caption = a.querySelector("div.caption");
caption.style.position = "static";
var taglist = document.createElement("section");
taglist.setAttribute("id", "tags");
a.insertBefore(taglist, null);
var href = div.querySelector('a').href;
//debug(href);
var gallery = new Gallery(href);
gallery.other=divs;
request(gallery,HighlightTag);
}
var init = function () {
var LastDivNum=0;
CreateStyle();
DivCount=0;
var html = document.querySelector('html');
setInterval(function(){
var divs = html.querySelectorAll('div.gallery');
//debug("DivNum: "+divs.length);
if(LastDivNum<divs.length) {
html.style.height=divs.length/5*900+"px";
debug("html.style.height: "+html.style.height);
MainWoker(divs);
}
LastDivNum=divs.length;
HighlightTag(null,divs);
}, 2000)
}
function request(object,func) {
var retries = 10;
GM_xmlhttpRequest({
method: object.method,
url: object.url,
headers: object.headers,
overrideMimeType: object.charset,
//synchronous: true
onload: function (responseDetails) {
if (responseDetails.status != 200) {
// retry
if (retries--) { // *** Recurse if we still have retries
setTimeout(request,2000);
return;
}
}
//debug(responseDetails);
//Dowork
func(responseDetails,object.other);
}
})
}
window.addEventListener('DOMContentLoaded', init);