Zum Inhalt dieser Seite

Greasemonkey-Skripte

Weiter unten sind die in meiner Firefox-Konfiguration verwendeten und selbst geschriebenen bzw. veränderten Greasemonkey-Skripte aufgeführt.
  • Icon für Abschnitt erweitern/schliessen - erweitert/schliesst den Code-Abschnitt.
  • Icon für Markiervorgang - markiert den Code-Abschnitt, um ihn bequemer kopieren zu können.
  • Icon für Download - lädt das Skript herunter bzw. installiert dieses im Firefox.

Nach oben vbulletinshowfulllinks.user.js

Zeigt verkürzte Links vollständig an (funktioniert auch auf anderen Seiten).
Abschnitt erweitern/schliessen  Code markieren  Download Nur bei Bedarf aktiviert  Gespiegelt

Nach oben vbulletinshowpostnumber.user.js

Zeigt in vBulletin-Foren [post=n]Titel[/post] neben # Beitragnummer - erleichtert somit das Verlinken auf einzelne Beiträge. Funktioniert nur in Linear- und Hybriddarstellung! S. auch Thread im MS-Office-Forum.
Abschnitt erweitern/schliessen  Code markieren  Download Dauerhaft aktiviert  Gespiegelt
// ==UserScript==
// @name         vBulletin - Show Postnumber
// @namespace    http://openuserjs.org/users/ardiman
// @description  Shows [post=n]title[/post] near # postnumber, so internal links to single posts in vBulletin-forums could be done easy. Works in linear and hybrid mode only!
// @description:de-DE Zeigt [post=n]Titel[/post] neben # Beitragnummer - erleichtert somit das Verlinken auf einzelne Beiträge in vBulletin-Foren. Funktioniert nur in Linear- und Hybriddarstellung!
// @grant        none
// @homepage     https://github.com/ardiman/userscripts/tree/master/vbulletinshowpostnumber
// @icon         https://raw.githubusercontent.com/ardiman/userscripts/master/scriptlogo.gif
// @include      */showthread.php*
// @include      http://www.vbseo.com/f*
// @include      http://www.apfeltalk.de/forum/*
// @license      CC BY-NC-SA 3.0; https://creativecommons.org/licenses/by-nc-sa/3.0/
// @supportURL   https://github.com/ardiman/userscripts/issues
// @version      1.0.4
// @date         2014-11-21
// ==/UserScript==
 
(function () {
// Anfang der moeglichen Anpassungen - Stil der anzuzeigenden Strings:
// Fuer Postlinks:
var p_postcolor = '#f9f9f9';           // moeglich waere auch 'inherit' - dann wird die Standardfarbe eingesetzt
var p_postbackground = 'transparent';  // Hintergrundfarbe/art - fuer rot: '#f00'
var p_postfontsize = '0.8em';          // Schriftgroesse (mit 0.8em wird sie kleiner)
// Hover-Text des anzuzeigenden Strings (title-Attribut):
var p_posthover = 'Kopieren Sie die Zeichenfolge, um auf diesen Beitrag zu verweisen';
// Fuer Threadlink:
var p_threadlink = 1;                  // 1= auch [thread=n]Titel[/thread] in Navbar anzeigen
var p_threadfontsize = '0.7em';        // Schriftgroesse
var p_threadhover = 'Kopieren Sie die Zeichenfolge, um auf dieses Thema zu verweisen';
// Maximale Laenge fuer Titel (0 fuer keine Aenderung):
var p_titlelen = 55;
// Ende der moeglichen Anpassungen
 
 
// Ab hier nichts mehr aendern!
 
var v_title='';                        // Fuer Titel
 
// Titelnode ermitteln (vBulletin 4 und vBulletin 3.6x)
var titlenode = document.evaluate(
	"//div[@id='pagetitle']/h1/span|//td[@class='navbar']",
	document,
	null,
	XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
	null);
 
// Titelstring ermitteln
if (titlenode.snapshotItem(0) !== null) {
	v_title= fcttitle(titlenode.snapshotItem(0).textContent);
	// Threadlink setzen, falls gewuenscht
	if (p_threadlink == 1){
		var link_node = document.evaluate(
		"//a[contains(@href,'sendmessage.php?do=sendtofriend')]",
		document,
		null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
		null);
		var tnr=fctgivenumber(link_node.snapshotItem(0).href,'t');
		titlenode.snapshotItem(0).innerHTML = "<span style='cursor:help' id=gmvbspn_t" + tnr + " title='"+p_threadhover+"'><span style='font-size:"+p_threadfontsize +"'>[thread=" + tnr +"]</span>"+v_title+"<span style='font-size:"+p_threadfontsize +"'>[/thread]</span></span>";
		var tlink=document.getElementById("gmvbspn_t"+tnr);
		tlink.addEventListener('click', selectID("gmvbspn_t"+tnr), false);
		}
	// Ende Threadlink setzen, falls gewuenscht
	} else {
	// falls kein Titelnode gefunden, auf document.title ausweichen
	v_title=fcttitle(document.title);
}
// Ende Titelstring ermitteln
 
//Postnodes ermitteln
var postnodes = document.evaluate(
	"//a[starts-with(@id,'postcount')]",
	document,
	null,
	XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
	null);
 
 
//Postlinks in vorher ermittelten Postnodes setzen
for(var i=0; i<postnodes.snapshotLength; i++) {
	thisnode = postnodes.snapshotItem(i);
	var postspan = document.createElement("span");
	var postid= fctgivenumber(thisnode.id,"p");
	postspan.id = "gmvbspn_p"+postid;
	postspan.innerHTML="[post="+postid+"]"+v_title+"[/post] ";
	postspan.style.backgroundColor = p_postbackground;
	postspan.style.color = p_postcolor;
	postspan.style.cursor = 'help';
	postspan.style.fontSize= p_postfontsize;
	postspan.title = p_posthover;
	postspan.addEventListener('click', selectID(postspan.id), false);
	thisnode.parentNode.insertBefore(postspan, thisnode.previousSibling);	
}
// Ende Postlinks setzen
 
 
// Hilfsfunktionen
 
// Markierung per Klick auf Element mit ID:
function selectID(sId){
	return (function(event) {
	var myElement = document.getElementById(sId);
	var selection = window.getSelection();
	var range = document.createRange();	
	range.selectNodeContents(myElement);
	selection.removeAllRanges();
	selection.addRange(range);
	});
}
 
 
// kuerzt den Titel auf x Zeichen - s. p_titlelen (es wird nicht im Wort gekuerzt):
function fcttitle(a_str){
	a_str = a_str.replace(/ +/g, ' ').replace(/^\s+/g, '').replace(/\s+$/g, '');
	if(a_str.length > p_titlelen && p_titlelen > 0) {
		wordWrap = a_str.slice(0,a_str.lastIndexOf(' ',p_titlelen));
		if (wordWrap.length<a_str.length){wordWrap += '&nbsp;&#133';}
	}
	else {
		wordWrap = a_str;
	}
	return wordWrap.replace(/</g,'&lt;').replace(/'/g,'&apos;').replace(/"/g,'&quot;');
}
 
 
// extrahiert die Post- bzw. Threadnummer:
function fctgivenumber(a_str,a_type) {
	var b_return='';
	if (a_type == 'p') {
		// alle Zahlen ab '...postcount':
		b_return=a_str.match(/postcount\d+/)[0].match(/\d+/);
		}
	else {
		// einige Browser veraendern leider innerHTML, deshalb innerHTML sicherheitshalber auf einen Stand bringen:
		var c_tlinkextr = 'sendmessage.php?do=sendtofriend&amp;t=';
		var c_tlinkrepl = 'sendmessage.php?do=sendtofriend&t=';
		a_str=a_str.replace(c_tlinkrepl,c_tlinkextr);
		// alle Zahlen ab '...sendmessage.php?do=sendtofriend&amp;t=' (? maskiert!):
		b_return=a_str.match(/sendmessage.php\?do=sendtofriend&amp;t=\d+/)[0].match(/\d+/);
	}
	return b_return;
}
// Ende Hilfsfunktionen
 
})();
 

Nach oben vbulletinsignaturecollapse.user.js

Blendet in vBulletin-Foren Signaturen aus. Die Signaturen können mit dem "[+]" unterhalb des Beitrags wieder angezeigt werden.
Abschnitt erweitern/schliessen  Code markieren  Download Dauerhaft aktiviert  Gespiegelt
// ==UserScript==
// @name         vBulletin - Signature Collapse
// @namespace    http://openuserjs.org/users/ardiman
// @description  Allows quick display toggle of user's signature on vBulletin- and other forums.
// @description:de-DE Erlaubt schnelles Ausblenden/Anzeigen von Signaturen in vBulletin- und anderen Forensystemen.
// @grant        none
// @homepage     https://github.com/ardiman/userscripts/tree/master/vbulletinsignaturecollapse
// @icon         https://raw.githubusercontent.com/ardiman/userscripts/master/scriptlogo.gif
// @include      */showthread.php*
// @include      */showpost.php*
// @include      */viewtopic.php*
// @include      */index.php?showtopic=*
// @include      */index.php?topic=*
// @include      */index.php/topic=*
// @include      http://community.invisionpower.com/topic/*
// @include      http://forums.modx.com/thread/*
// @include      http://community.mybb.com/*
// @include      http://www.xendach.de/threads/*
// @license      CC BY-NC-SA 3.0; https://creativecommons.org/licenses/by-nc-sa/3.0/
// @supportURL   https://github.com/ardiman/userscripts/issues
// @version      1.0.9
// @date         2014-11-21
// ==/UserScript==
 
(function() {
	var nodes = document.evaluate(
		"//td/div/following::comment()[.=' sig ']|//div[@class='signaturecontainer']|//div[@class='dis-signature']|//div[contains(@class, 'signature')]",
		document,
		null,
		XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
		null);
 
	var thissign;
 
	for(var i=0; i<nodes.snapshotLength; i++) {
		// vBulletin 3.x
		if (nodes.snapshotItem(i).data==' sig ') {
			thissign = nodes.snapshotItem(i).nextSibling.nextSibling;
			thissign.style.display = 'none';
			var anchor = document.createElement("a");
			anchor.appendChild(document.createTextNode("\u005B+]"));
			anchor.style.cursor = 'pointer';
			anchor.title = 'Click to expand signature';
			anchor.addEventListener('click', genHandler(thissign), false);
			thissign.parentNode.insertBefore(anchor, thissign.previousSibling);
		// vBulletin 4.x (signaturecontainer) or phpBB v3, xenForo (signature) or discuss on modx.com (dis-signature)
		} else {
			if (nodes.snapshotItem(i).className=="signaturecontainer" || nodes.snapshotItem(i).classList.contains("signature") || nodes.snapshotItem(i).className=="dis-signature") {
				thissign = nodes.snapshotItem(i);
				thissign.style.display = 'none';
				var anchor = document.createElement("a");
				anchor.appendChild(document.createTextNode("\u005B+]"));
				anchor.style.cursor = 'pointer';
				anchor.title = 'Click to expand signature';
				anchor.addEventListener('click', genHandler(thissign), false);
				thissign.parentNode.insertBefore(anchor, thissign);
			}
		}
	}
})();
 
 
function genHandler(signode) {
	return (function(event) {
			if(signode.style.display == 'none') {
			  signode.style.display='block';
			  // signode.removeAttribute("style");
			  this.firstChild.nodeValue=("[-]");
			  this.title = 'Click to collapse signature';
			 }
			else {
			  signode.style.display = 'none';
			  this.firstChild.nodeValue=("\u005B+]");
			  this.title = 'Click to expand signature';
		}
	});
}
 

Nach oben xenforoendlessforumpages.user.js

Lädt in xenForo-Threads die folgenden Beiträge nach, sobald man bei einem mehrseitigen Thread ans Ende der Seite scrollt.
Abschnitt erweitern/schliessen  Code markieren  Download Dauerhaft aktiviert  Gespiegelt
// ==UserScript==
// @name         xenForo - Endless Forum Pages
// @namespace    http://openuserjs.org/users/ardiman
// @description  Makes xenForo forum pages infinitely long instead of a limited number of posts per page by loading more when you scroll to near the bottom of the page.
// @description:de-DE Lädt in xenForo-Threads die folgenden Beiträge nach, sobald man bei einem mehrseitigen Thread ans Ende der Seite scrollt.
// @grant        none
// @homepage     https://github.com/ardiman/userscripts/tree/master/xenforoendlessforumpages
// @icon         https://raw.githubusercontent.com/ardiman/userscripts/master/scriptlogo.gif
// @include      http://xenforo.com/community/threads/*
// @include      http://www.xendach.de/threads/*
// @license      CC BY-NC-SA 3.0; https://creativecommons.org/licenses/by-nc-sa/3.0/
// @supportURL   https://github.com/ardiman/userscripts/issues
// @version      1.0.4
// @date         2014-11-21
// ==/UserScript==
 
var nextURL = null; // the URL for next, or null for pending/none
var nextLinkNode = null; // the node of the "Next" link
var mainTable = null;
window.addEventListener("load", init, false);
 
// Check the scroll position on a timer because we can't use onscroll (bug 189308).
// If we do switch to onscroll, remember to call testScrollPosition after changing the page.
setInterval(testScrollPosition, 100);
 
function init()
{
  mainTable = findMainTable(document);
  nextLinkNode = findNextLink(document);
  setNextURL(document);
}
 
function testScrollPosition()
{
  if ((nextURL != null) && ((document.documentElement.offsetHeight - document.documentElement.scrollTop) < (2.5 * window.innerHeight))) {
    // We're near the bottom of the page; one press of pgdn could get close to the bottom of the page.
    // (At about 1.9 * window.innerHeight, one press of pgdn would actually hit the bottom of the page.)
    pullMore();
  }
}
 
function pullMore()
{
  var iframe = document.createElement("iframe");
  iframe.addEventListener("load", whee, false);
  iframe.width = 1;
  iframe.height = 1;
  iframe.style.visibility = "hidden";
  iframe.src = nextURL;
  document.body.appendChild(iframe);
  // Don't pull this more than once.
  nextURL = null;
 
  function whee() {
    var iframeDoc = iframe.contentDocument;
 
    // Update nextURL for when we reach the bottom of the page again.
    setNextURL(iframeDoc);
 
    // Update the "Next" link in the page to make it a little less confusing.
    // Commented out because updating the "Next" link at the top of the page but not the one at
    // the bottom of the page is no good.
    // nextLinkNode.href = nextURL || "javascript:alert('No more!')";
 
    // Move posts into the main page's table.
    siphon(findMainTable(iframeDoc), mainTable);
 
    // Get rid of the iframe to free memory once it's GCed and so on.
    // Use a setTimeout to work around bug 305471 and to spread out the CPU usage to keep Firefox responsive.
    setTimeout( function() { iframe.parentNode.removeChild(iframe); }, 1500);
  }
}
 
function findMainTable(doc)
{
  div=doc.getElementById("messageList");
  return div;
}
 
function findNextLink(doc)
{
  for (var link,i=0; link=doc.links[i]; ++i)
    if ((link.innerHTML.indexOf(" >") != -1 || link.text.indexOf(" >") != -1) && link.getAttribute("href").indexOf("page-") != -1) {
      return link;
    }
  return null;
}
 
function setNextURL(doc)
{
  var nextLink = findNextLink(doc)
 
  if (nextLink)
    nextURL = nextLink.href;
}
 
function siphon(sourceTable, destTable)
{
  var child;
  while ((child = sourceTable.childNodes[0]))
    destTable.appendChild(child);
}
 

Nach oben xenforonewtopics.user.js

Erstellt in xenForo-Foren eine Schaltfläche, die alle neuen Posts in Tabs öffnet.
Abschnitt erweitern/schliessen  Code markieren  Download Dauerhaft aktiviert  Gespiegelt
// ==UserScript==
// @name         xenForo - New Topics
// @namespace    http://openuserjs.org/users/ardiman
// @description  Generates button which opens all new topics of xenForo-boards in tabs
// @description:de-DE Erstellt in xenForo-Foren eine Schaltfläche, die alle neuen Posts in Tabs öffnet.
// @grant        GM_openInTab
// @homepage     https://github.com/ardiman/userscripts/tree/master/xenforonewtopics
// @icon         https://raw.githubusercontent.com/ardiman/userscripts/master/scriptlogo.gif
// @include      http://xenforo.com/community/forums/*
// @include      http://www.xendach.de/forums/*
// @license      CC BY-NC-SA 3.0; https://creativecommons.org/licenses/by-nc-sa/3.0/
// @supportURL   https://github.com/ardiman/userscripts/issues
// @version      1.0.5
// @date         2014-11-21
// ==/UserScript==
 
(function (){
 
// Konfiguration
var maxlnks = 0;  // 0=open all new threads, 10=open first 10 new threads
var showBtnIf = 1; // 0=button will always be shown, 5=show only, if there are more than 4 new threads
var useTimeout = true; // don't attempt delay on thread-read cookie setting - YMMV - the timeout delay didn't work for me, so =false
var tOut = 800;   // set timeout in milliseconds for opening (cookies won't be stored if too low!)
var oMode = false; // =true: show first *unread* post, =false: show first post/beginning of thread
// Ende der Konfiguration
 
/* x-browser event register */
function addEvent(elm, evType, fn, useCapture) {
    if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; }
    else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r; }
    else { elm['on' + evType] = fn; }
}
 
/* x-browser open tab */
function openTab(url) {
    if (typeof GM_openInTab != 'undefined') GM_openInTab(url);
    // if (typeof GM_openInTab != 'undefined') chromeWin.openNewTabWith(url,url,null,true);
    else if (typeof PRO_openInTab != 'undefined') PRO_openInTab(url,2);
    else window.open(url);
}
 
var f = 0;
var newposts = new Array();
// alle Links zu neuen Beitraegen finden
var lnks = document.evaluate("//a[@class='unreadLink']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE , null);
 
for (var i=0; i < lnks.snapshotLength; i++) {
  thisnode = lnks.snapshotItem(i);
  if (oMode) {
    newposts.push(thisnode.href);  // den direkten Link zum ungelesen Beitrag speichern
   } else {
    newposts.push(thisnode.href.replace(/\/unread/, ""));  // (bereinigten) Link zum Thread speichern
  }
  f++
  // falls nur die ersten x neuen Beitraege geoeffnet werden sollen, dann raus hier:
  if (f+1 > maxlnks && maxlnks > 0) break;
}
 
// Button generieren, sofern noetig
if (f >= showBtnIf) {
  // Zieldiv finden
  var targetnode = document.evaluate("//div[@class='PageNav']//nav", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  // normalerweise ist erster div-Abschnitt mit class=buttons {snapshotItem(0)} derjenige mit dem Button "NeuesThema" -> da soll's also hin
  var btn = targetnode.snapshotItem(0).appendChild(document.createElement('a'));
  if (f > 1) {
    btn.innerHTML = "&Ouml;ffne " + f + " neue Beitr&auml;ge";
   } else {
    btn.innerHTML = "&Ouml;ffne neuen Beitrag";
  }
  btn.href="#";
  btn.setAttribute("class","text");
  addEvent(btn, "click",
    function(e) {
      if (maxlnks==0) this.style.display = 'none';
      if (e && e.target) e.preventDefault();
      else window.event.returnValue = false;
      if (useTimeout) {
        var i = -1;
        function inner() {
          if(++i < f) openTab(newposts[i]);
          else clearInterval(timer);
        }
        var timer = setInterval(inner, tOut);
      } else {
        for (var i=0; i < newposts.length; i++)
          openTab(newposts[i]);
      }
    }
  , false);
  }
})();
Home