Forked from WillSullivan/TaggedQuestionList.userscript
Last active
February 27, 2018 21:06
-
-
Save mogsdad/dc32bc9543e0576bf703 to your computer and use it in GitHub Desktop.
This userscript will add a list (initially hidden in an expandable div) containing links to every question listed on a tag page (i.e., questions/tagged/something). When a link in this list is clicked, it goes away. This allows you to easily open up many questions with this tag at the same time. Simply ctrl-click on the first link, then keep clic…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Tag list | |
// @namespace https://stackapps.com/questions/4207/burninator-toolkit | |
// @author Will Sullivan (Will) | |
// @developer David Bingham (Mogsdad) | |
// @version 1.2.10 | |
// @grant none | |
// @description Adds an expandable list containing a link to every question on the current tag page. Useful when you want to open many questions with the same tag at the same time. | |
// @include /^https?:\/\/(?:meta.)?(?:stackoverflow|stackexchange|serverfault|superuser|askubuntu|stackapps)\.com(?:\/(?:\?|questions(?:$|\/tagged|\?)|search|unanswered).*)?$/ | |
// https://regex101.com/r/1D5jof/3 | |
// ==/UserScript== | |
var runTagList = tagList(); | |
var wannaReSort = false; // Set to true to sort closed items to top | |
$(document).ajaxComplete(tagList); | |
function tagList() { | |
// If list already present, quit. | |
if ($('.linkylist').length) return; | |
var App = {}; | |
userscriptCSS(); | |
// Locate the element containing list of posts. | |
App.linkytarget = $('.question-summary').parent(); | |
if (wannaReSort) { | |
// re-sort list; move all the already handled cruff to the top | |
$.each(["closed", "on hold", "migrated", "duplicate"], function(index) { | |
App.items = $('.question-summary .summary:contains(' + this + ')'); | |
App.items.closest('.question-summary').detach().insertBefore($('.question-summary').first()); | |
}); | |
} | |
// Bail out if we don't have 5+ posts. (reviews have 1 or 2, but 5 is a nice number) | |
if( $(App.linkytarget).children().length <= 5 ) return; | |
// get all the hrefs | |
App.root = App.linkytarget; | |
App.hrefs = App.root.find('.question-hyperlink,.result-link'); // .result-link on searches, .question-hyperlink everywhere else | |
if (App.hrefs.length === 0) { | |
console.log("No post hyperlinks found"); | |
return; | |
} | |
App.listroot = $('<div class="linkylist"/>'); | |
App.listhead = $('<p class="linkyhead">Click here to <span id="linkyaction">open</span> a list of all links on this page</p>'); | |
App.listbody = $('<div class="linkybody"/>'); | |
App.linkytarget.before(App.listroot); | |
App.listroot.prepend(App.listbody); | |
App.listroot.prepend(App.listhead); | |
App.listbody.hide(); | |
App.listhead.click(function() { | |
App.listbody.slideToggle(600); | |
$('#linkyaction').text(function (index, text) { | |
return (text == 'open' ? 'close' : 'open'); | |
}); | |
}); | |
// note that when you click a link it gets removed from the list. | |
App.hrefs.each(function() { | |
App.parent = $('<span class="linkeyspan"/>'); | |
App.linkey = $(this).clone().attr('target', '_blank'); | |
App.linkey.click(function() { | |
$(this).closest('.linkeyspan').remove(); | |
}); | |
App.parent.prepend(App.linkey); | |
App.parent.prepend($('<br/>')); | |
App.listbody.append(App.parent); | |
}); | |
/** | |
* Define "CSS" for this user script | |
*/ | |
function userscriptCSS() { | |
addCss( | |
'.linkylist {margin: 0px;padding: 0px;}' + | |
'.linkyhead {text-align: right;padding: 5px 10px;cursor: pointer;position: relative;background-color:#FFCCCC;margin:1px;}' + | |
'.linkybody {padding: 5px 10px 15px;background-color:#F4F4F8;}' | |
); | |
} | |
/** | |
* Stuff string of styles into doc head. | |
*/ | |
function addCss(cssString) { | |
var head = document.getElementsByTagName('head')[0]; | |
if (!head) return; | |
var newCss = document.createElement('style'); | |
newCss.type = "text/css"; | |
newCss.innerHTML = cssString; | |
head.appendChild(newCss); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment