您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a 'Quote' button to posts in the archives
// ==UserScript== // @name ETI Archive Quoter // @description Adds a 'Quote' button to posts in the archives // @namespace pendevin // @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.4.min.js // @version 2.1 // ==/UserScript== //ll breaks without noconflict jquery this.$ = this.jQuery = jQuery.noConflict(true); //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; } //finds the last index of a regular expression value //takes a string and a regex object //kinda slow :( function reLastIndex(string, regex) { var index = -1; //we're going backwards from the end and searching for the first occurrence we find for (var i = string.length - 1; i > 0; i--) { //once we find it, we're outta here if (string.substring(i).search(regex) != -1) { index = i; break; } } return index; } //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); 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); } }); } //add in those pesky triggers function addQuoteLinks() { //i'm lazy so rearrange the quotes $('#u0_1 .message-container').each(function(i, container) { rearrangeQuotes(container); }); //make sure this topic is closed if (location.hostname == 'archives.endoftheinter.net' || $('em').text().match(/This topic has been closed/)) { $('#u0_1 .message-container>.message-top').each(function(i, top) { top = $(top); //message detail link var messageDetail = top.children('[href^="/message.php"]'); //new quote link var link = $('<span class="linky quote">Quote</span>'); messageDetail.after(' | ', link); //oh look we got quoted link.on( 'click', top.next().find('.message:first'), function(e) { postToText(e.data); } ); }); } } //takes a post and returns the text required to get it function postToText(post) { post = $(post); var text = $('<div>' + post.html() + '</div>'); //get rid of sigs //if people fuck with the sig belt, this probably won't work var lastIndex = reLastIndex(text.html(), /(<br>|<\/div>)?\n?---\n?<br>/g); if (lastIndex != -1) { text.html(text.html().substring(0, lastIndex)); } //in case of sig parser text.find('.sig').remove(); //deal with spoilers text.find('.spoiler_closed').each(function(i, spoiler) { spoiler = $(spoiler); //build our spoiler notation var pointA = spoiler.find('span>a>b').text(); var pointB = spoiler.find('.spoiler_on_open').html(); var spoiled = '<spoiler' + (pointA != '<spoiler />' ? ' caption="' + pointA.slice(1, -3) + '">' : '>') + pointB.substring(pointB.indexOf('</a>') + 4, pointB.lastIndexOf('<a class="caption"')) + '</spoiler>'; //replace the old spoiler spoiler.replaceWith(spoiled); }); //deal with quotes //this guy only handles rearranged quotes //go in reverse order so it can handle nested quotes $(text.find('.quoted-message').get().reverse()).each(function(i, quote) { quote = $(quote); //build our quote notation var msgID = quote.attr('msgid'); //quoted text omitted var omitted = (quote.children(':last-child').children(':last-child').text() == ('[quoted text omitted]')); //quoting empty posts var quoteContent = quote.children(':last-child').html() != undefined ? quote.children(':last-child').html() : ''; //remove trailing linebreaks quoteContent = quoteContent.replace(/(\n|<br>)+$/g, ''); var quoted = '<quote' + (msgID != '' ? ' msgid="' + msgID + '"' : '') + (!omitted ? '>' + quoteContent + '</quote>' : ' />'); //replace the old quote quote.replaceWith(quoted); //if next element is a br, get rid of it if (quoted.nextSibling && quoted.nextSibling.nodeName == 'BR') { $(quoted).next().remove(); } }); //deal with images //works with all image settings don't worry text.find('.imgs').each(function(i, imgs) { imgs = $(imgs); //there's possibly a bunch of images per div imgs.children('a').each(function(i2, img) { img = $(img); //stick all the images after the imgs div var imged = $('<img src="' + img.attr('imgsrc') + '">'); imgs.before(imged); }); //get rid of the imgs div and replace with a br imgs.replaceWith('<br>'); }); //deal with links //the selector takes care of youtube video embed text.find('a:not([href^="javascript"])').each(function(i, a) { a = $(a); //just need the href to make a link a.replaceWith(a.attr('href')); }); //deal with pre tags text.find('.pr').each(function(i, pre) { pre = $(pre); //replacing pre tags so easy var post = $('<pre>' + pre.html() + '</pre>'); pre.replaceWith(post); }); //if you have the userpics script, get rid of the userpic text.find('.photo-album-image').remove(); //if you have my youtube embed script or something similar text.find('a[href="javascript:void(0);"]').each(function(i, thing) { thing = $(thing); //remove that thingy thing.parent().remove() console.log(thing.attr('href')); }); //final clean-up and display var alert = text.html(); //remove trailing newlines alert = alert.replace(/(\n|<br>)+$/g, ''); //add quote thingy and replace brs for newlines alert = '<quote msgid="' + post.attr('msgid') + '">' + alert + '</quote>\n'; alert = alert.replace(/<br>\n?/g, '\n'); //create shadow var shadow = $('<div id="AQshadowbox">'); //create textbox to go on top of shadow var light = $('<textarea id="AQtextarea">' + alert + '</textarea>'); //add these guys to the document $('body').append(shadow, light); //listen for removal shadow.on( 'click', function(e) { shadow.remove(); light.remove(); } ); } //styles addStyle('\ #AQshadowbox{\ position:fixed;\ top:0px;\ left:0px;\ width:100%;\ height:100%;\ background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA9JREFUeNpiYGBgaAAIMAAAhQCB69VMmQAAAABJRU5ErkJggg==);\ }\ #AQtextarea{\ position:fixed;\ top:0px;\ left:0px;\ width:70%;\ height:70%;\ margin:15%;\ border:4px solid;\ }\ ', 'archive-quoter'); addStyle('.linky{cursor:pointer;text-decoration:underline;}', 'linky'); //initialize addQuoteLinks();