DeviantBlocker

DeviantArt gallery - block images from selected artists

2018-05-18 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name DeviantBlocker
// @namespace brandrock.co.za
// @author Peter Brand
// @description DeviantArt gallery - block images from selected artists
// @license GNU GPLv3
// @include http://www.deviantart.com/*
// @include https://www.deviantart.com/*
// @version 3.5
// @grant GM_getValue
// @grant GM_setValue
// @run-at document-start
// ==/UserScript==

// @grant GM_log
(function() {
	//first time scan on load
	document.addEventListener ('DOMContentLoaded', pageInit);
	
	function buttonAdd(parent, label, title, style, clickEvent){
		var elem = document.createElement('button');
		elem.type = 'button';
		elem.style = style;
		elem.style.zIndex = '99';
		elem.style.position = 'absolute';
		elem.title = title;
		elem.innerHTML = label;
		parent.appendChild(elem);
		elem.addEventListener('click', clickEvent);
		return elem;
	}
	
	function pageInit() {
		//button to reveal blacklist
		var bdiv = document.getElementById('browse-results');
		var blackText = document.createElement('textarea');
		blackText.style = 'position: absolute; display: none; top:0px; right: 0px; z-index: 99;';
		bdiv.appendChild(blackText);
		buttonAdd(bdiv, '?', 'Click to show blacklisted artists'
			, 'top:0px; right: 0px', function(e){
			var blacklist = GM_getValue('DAGbl2', '|');
			blackText.innerHTML = blacklist;
			blackText.style.display='inline-block';
		});
		blackText.addEventListener('change', function (){
			GM_setValue('DAGbl2', blackText.value)
		});
	}
	
	function scanImages() {
		var thumbs = document.querySelectorAll('img[data-sigil]');
		var blacklist = GM_getValue('DAGbl2', '|');
		var count = 0;
		//scan all IMG elements that have a data-sigil attribute (seems unique to gallery images)
		for(var i = thumbs.length; i--;) {
			var img = thumbs[i];
			//quick check to see if src has been specified and haven't done this image already
			if (!img.devblok && img.getAttribute('src')>''){
				img.devblok = true;
				img.setAttribute("data-blocked", -1);
				var a = img.parentNode;
				var div = a.parentNode; //is a span now
				var userid = a.href;
				if (userid.indexOf("://") > -1) {
					userid = userid.split('/')[2];
				}
				userid = userid.split('.')[0];
				//create a button on the page to toggle the state of the artist
				var elem = buttonAdd(div, 'x', 'Click to hide/show images from this artist'
					, 'bottom:0px; right: 0px', function(e){
					artistToggle(e, this);
					});
				elem.userid = userid;
				img.setAttribute('data-userid', userid);
				img.userid = userid;
				var useridD = '|' + userid + '|';
				if (blacklist.indexOf(useridD) > -1){
					imgHide(img);
					elem.isBlocked = true;
					img.setAttribute('data-blocked', 1);
					count++;
				} else {
					elem.isBlocked = false;
					img.setAttribute('data-blocked', 0);
				}
			}
		}
	}

	function artistToggle(e, button) {
		//show or hide the images for this artist
		var i, img;
		var blacklist = GM_getValue('DAGbl2', '|');
		var thumbs = document.querySelectorAll('img[data-sigil]');
		if (button.isBlocked){
			//remove from blacklist string - could have used an array, but string is fast enough
			blacklist = blacklist.replace(button.userid + '|', '');
			GM_setValue('DAGbl2', blacklist);
			//scan page for all images for this artist and show them
			for(i = thumbs.length; i--;) {
				img = thumbs[i];
				if(img.userid == button.userid){
					imgShow(img);
				}
			}
			button.isBlocked = false;
		} else {
			//add to blacklist
			blacklist = blacklist + button.userid + '|';
			GM_setValue('DAGbl2', blacklist);
			//scan page for all images for this artist and hide them
			for(i = thumbs.length; i--;) {
				img = thumbs[i];
				if(img.userid == button.userid){
					imgHide(img);
				}
			}
			button.isBlocked = true;
		}
		var event = e || window.event;
		if (!event) return;
		event.cancelBubble = true;
		if (event.stopPropagation) event.stopPropagation();
	}
	function imgHide(img){
		//img.style.opacity = '0.05';
		img.style.visibility = 'hidden';
	}
	function imgShow(img){
		//img.style.opacity = '1';
		img.style.visibility = 'visible';
	}
	setInterval(function() {scanImages();}, 1000);
})();