Imagenorator

turns images into links in specified people's posts

当前为 2014-11-25 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        Imagenorator
// @namespace   pendevin
// @description turns images into links in specified people's posts
// @include     http://boards.endoftheinter.net/showmessages.php?*
// @include     http://archives.endoftheinter.net/showmessages.php?*
// @include     https://boards.endoftheinter.net/showmessages.php?*
// @include     https://archives.endoftheinter.net/showmessages.php?*
// @require     http://code.jquery.com/jquery-2.1.0.min.js
// @version     2
// ==/UserScript==


//add userIDs of people you want ignorated
//this is CactusMD and Das Bhut
const IMAGENORATED=$([13346,23945]);


//ll breaks without noconflict jquery
this.$ = this.jQuery = jQuery.noConflict(true);

//livelinks compatiblity *JQUERY
//calls the function on each message-container in a document, including ones added by livelinks
function livelinks(func,extraParams){
	if(extraParams==undefined)
		extraParams=null;
	//run the function on the message-containers currently on the page
	$('#u0_1 .message-container').each(function(i,container){
		func(container,extraParams);
	});
	//run it on any message-containers added in the future
	$('#u0_1').on(
		'DOMNodeInserted',
		extraParams,
		function(e){
			if($(e.target).children('.message-container').length){
				$(e.target).children('.message-container').each(function(i,container){
					func(container,e.data);
				});
			}
		}
	);
}

//adds a style to a document and returns the style object *JQUERY
//css is a string, id is an optional string that determines the object's id
function addStyle(css,id){
	//create a style
	var style=$('<style type="text/css">');
	//add the css data to it
	style.html(css);
	if(id){
		//remove any style that has our id
		$('#'+id).remove();
		//give our style the id after removing the other stuff. idk if it matters, but i'm too lazy to find out
		style.attr('id',id);
	}
	//add the style into the head
	$('head').append(style);
	//we're outta here
	return style;
}

//tags message-tops with userids
//should call it with livelinks imo *JQUERY
function userids(container){
	$(container).find('.message-top').each(function(i,top){
		top=$(top);
		//get userid attribute from the profile link
		top.attr('userID',top.children('a[href*="user="]').attr('href').split('user=')[1]);
	});
}

//puts the message body of any quoted-message in its own message div like normal messages for easier styling(hiding)
//livelinks ready *JQUERY
function rearrangeQuotes(container){
	//this is a for loop or something
	$(container).find('.quoted-message').each(function(i,quote){
		quote=$(quote);
		//create message div for quote
		var quoteBody=$('<div class="message">');
		//add everything but the message-top to the message div
		quote.contents().each(function(i2,node){
			node=$(node);
			//make sure we don't do shit with an already parsed quote
			if(!node.hasClass('message-top')&&!node.hasClass('message')){
				quoteBody.append(node);
			}
		});
		//add the new message div to the quoted-message if it's got anything in it
		if(quoteBody.contents()[0]){
			quote.append(quoteBody);
		}
	});
}

//adds hidden class to posts of ignorated users
//needs stuff and jquery
function ignorate(container){
	rearrangeQuotes(container);
	userids(container);
	//get the messages and such
	$(container).find('.message-top').each(function(i,top){
		top=$(top);
		//check against each ignorated id
		IMAGENORATED.each(function(j,id){
			if(top.attr('userID')==id){
				//do the thing in the function and stuff
				hideImages(top.parent().find('.message:first'));
				//this guy breaks the loop
				return;
			}
		});
	});
	//do shit for blank quotes
	$(container).find('.quoted-message[msgid=""]>.message').each(function(i,message){
		message=$(message);
		//get appropriate userID
		//this could be inside a quote or directly inside a message
		var parentID=message.parent().parent().prev().attr('userID')?
			message.parent().parent().prev().attr('userID'):
			message.parent().parent().parent().parent().parent().prev().attr('userID');
		//find out if parent is imagenorated
		IMAGENORATED.each(function(j,id){
			if(parentID==id){
				//do the thing in the function and stuff
				hideImages(message);
				//this guy breaks the loop
				return;
			}
		});
	});
}

//take a message element and turn images into links in it
function hideImages(message){
	//aah we gotta do the same thing in multiple places
	function hider(i,img){
		img=$(img);
		//make sure you don't gots links turned on
		if(img.children()[0]){
			//hide image
			img.children().addClass('hidden');
			//get image name
			var name=decodeURIComponent(img[0].href.substring(img[0].href.lastIndexOf('/')+1));
			//stick name in link content
			img.append(name);
			//add a br tag after the link
			img.after('<br>');
		}
	}

	//make sure we're only getting the imgs elements from this message and not subordinate ones
	message.children('.imgs').find('a').each(hider);
	//shit in spoilers oh god this is so long i wish i could select descendents of the selection context with find()
	message.children('.spoiler_closed,.spoiler_open').children('.spoiler_on_open').children('.imgs').find('a').each(hider);
}

//tag posts with userids
livelinks(ignorate);
addStyle('.hidden{display:none}','hidden');