NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name E-Hentai Flags on Gallery Thumbnails // @description Adds some fancy-ass flag icons above gallery thumbnails. // @include http://g.e-hentai.org/* // @include https://exhentai.org/* // @run-at document-end // @version 0.1 // @locale en // @namespace https://sleazyfork.org/en/users/2168-etc/flags // ==/UserScript== var LANGUAGES = [ { name: 'Japanese', regex: '' }, { name: 'English', regex: 'eng(?:lish)?' }, { name: 'Chinese', regex: 'chinese|中国翻訳' }, { name: 'Dutch', regex: 'dutch' }, { name: 'French', regex: 'french' }, { name: 'German', regex: 'german' }, { name: 'Hungarian', regex: 'hungarian' }, { name: 'Italian', regex: 'italian' }, { name: 'Korean', regex: [ 'korean', '[\\u1100-\\u11FF\\u3130-\\u318F\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF]' ] }, { name: 'Polish', regex: 'polish' }, { name: 'Portuguese', regex: 'portugu.se?(?:-br)?' }, { name: 'Russian', regex: 'russian' }, { name: 'Spanish', regex: 'spanish|espa.ol' }, { name: 'Thai', regex: 'thai[\\u0e00-\\u0e7f\\s]*' }, { name: 'Vietnamese', regex: 'vietnamese[a-z\\u00c0-\\u00ff\\u1ea0-\\u1eff\\s]*' }, ]; var FLAG_ICONS = '' + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApQAAAAeCAMAAAClpX6ZAAABXFBMVEXtVWX19/pXqGNKidzuVGXzusLtVWXtVWXtVWVHWKkAAAD5/P1u' + 'fsJDSlTyrrell1ut07YnNFL/zlT/2FJOh4r21WD19/r19/rsQVbg4OX1nl9XqGPD0uxIqGSaptI4hN9KidzxhZEtQJ0/nEz75mFHWKlDSlTtVWX19/pXqGNHWKlKid' + 'z/////zlRDSlT2///21mDtPU/tUGX3+/7rQmftSlv/4FL009n5oVotQJ0+gts/nEzr7fU/Uac3j+r5wMY2fNjzgY3sSWd8isPP3/RwoeOayaP5UV1MXKvxiJT14uf3' + '4GDuRVX+7GHxbnymsNbzpK7uWmP1xmH3vkHAbmTzgln0mk0teNjvYmX/SWWev+xCs2MuNkDIy9K4tb41SqP4zTtYXmj6uFpkgcj1r0aEr+ljmeGLkZjxeWLvbF6hpq' + 'z0kWDk6vFscnpUabXxkZ317PB5foZ2s2DGx1hLP528AAAAJ3RSTlPu7u/v9P7ooSXvAPL+7/7+/v7v/SXtoCXw/Pqh/fv776Hv7u7toaGfOVl5AAAICElEQVR42u2c' + 'i1/SUBTHSckelD2gEiLtzaoji3vBlCBx9pSHLmOuAgQSBUHT+v8/n+42YBGj3QPu86GP/T4ydBy3w9l35+4+XRdv3TzDpZu3Ll703Z3s0dwll5Wmzp2/ePH8uSmXvf' + 'C2vkcXuro/6zljyuPvs318uatrVx7eMPXwxkg+3J7o6sFV5oMpz/RMjy0ivihb04c7n9yDnMX7gImDY7auWx6BU55bvslnvXr1LWQt9/nz7j/3EYRtaKCt78JTU0vr' + 'IJgS10Kk1/Zy2NS1K9nnptIfTVu8DxNPTL28CsJvEqcjPbaY+GJsTR++fvo80Fe8D5g4OGXruilw6+bdDoxxOyhD5871ISlLNrY8OvfoKSeUzPZxmAdKvA+3n3BCyW' + 'zN+FKgQp8o/BZfzLVgPvBByXzAHBcTB6dsXWcEbp2ZNJm0g3JqKtQrOa+oso0th6Yu8EM5dZkLSrwPE/xQTnXjS2lC+BNLSgHAjC/mWkzwQzmFOS4mDk7ZujwCtzyT' + 'HSaDb+I2ULrdvaW21NgsKyFiY2svNwJKNwJKlA8IKN3d+EKx0gKhVwClYzNXejDXAgGlG3NcTBycsh0mU6Z24ctWG8rIAM242kiqeaK/yzubecmaShez5ZULAaULAS' + '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'; //----- Regex ----- var LANGUAGES_REGEX = null; var getLanguageRegex = function() { if (LANGUAGES_REGEX) return LANGUAGES_REGEX; var temp = [ ]; LANGUAGES.forEach(function(language) { if (language.regex.constructor == String) temp.push('[{[(]' + language.regex + '[)\\]}]'); else { var regexes = [ ]; regexes.push('[{[(]' + language.regex[0] + '[)\\]}]'); language.regex.slice(1).forEach(function(value) { regexes.push(value); }); temp.push(regexes.join('|')); } }); LANGUAGES_REGEX = new RegExp('(' + temp.join(')|(') + ')', 'i'); return LANGUAGES_REGEX; }; var matchLanguage = function(title) { var matches = title.match(getLanguageRegex()); if (!matches) return 0; for (var i=2;i<matches.length;++i) { if (matches[i]) return (i - 1); } return 0; }; //----- DOM ----- var walk = function() { [].slice.call(document.querySelectorAll('.id1'), 0).forEach(function(target) { if (target.hasAttribute('processed')) return; var title = target.querySelector('.id2 > a'); if (!title) return; target.setAttribute('processed', true); var language = matchLanguage(title.textContent); var flag = document.createElement('div'); flag.className = 'eh-flag'; flag.style.backgroundPosition = (language * -44) + 'px 0'; target.querySelector('.id3 > a').appendChild(flag); }); }; //----- Init ----- var style = document.createElement('style'); style.innerHTML = '.eh-flag { background: url(%FLAGS); position: absolute; top: 0; right: 0; width: 44px; height: 30px; }'; style.innerHTML = style.innerHTML.replace(/%FLAGS/, FLAG_ICONS.replace(/\s/g,'')); document.head.appendChild(style); var debouncer = null; document.body.addEventListener('DOMNodeInserted', function(e) { if (debouncer !== null) clearTimeout(debouncer); debouncer = setTimeout(walk, 100); }); walk();