Greasemonkey-Skripte
Weiter unten sind die in meiner Firefox-Konfiguration verwendeten und selbst geschriebenen bzw. veränderten Greasemonkey-Skripte aufgeführt.
- erweitert/schliesst den Code-Abschnitt.
- markiert den Code-Abschnitt, um ihn bequemer kopieren zu können.
- lädt das Skript herunter bzw. installiert dieses im Firefox.
escape_html_entities.user.js
Per Knopfdruck in Textareas unerwünschte Zeichen ersetzen (momentan spitze Klammern und [kbd]-Tags).

// Copyright 2006 David Wilkinson. All Rights Reserved.
// ==UserScript==
// @name Escape HTML Entities in TextAreas
// @namespace http://www.dopiaza.org/tools/greasemonkey/escapeentities/
// @description Escape HTML Entities in TextAreas
// @include *
// ==/UserScript==
function updateTextAreas()
{
// Find textareas
var textareas = document.evaluate(
"//textarea",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
for (var i = 0; i < textareas.snapshotLength; i++)
{
addHandlerLink(textareas.snapshotItem(i));
}
}
function addHandlerLink(textarea)
{
var icon = "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%04gAMA%00%00%AF%C87%05%8A%E9%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%02BIDAT8%CB%A5%93M%88%8Dq%14%C6%7F%EF%7B%DF%B9w%A6%99%09%F7%22%1A%9F%09%0B%A5%D8LH%92%AF%7Cm%2C4Bd%81%2C%2C%AC%94%12%25%3B%85%14Y%D9)Y%11%09I%CDX%D8%F9%88%85R%94%193fL%99%B9%EF%7D%EF%FF%FF%3F%FFs%2Cf%C4%C2bj%9E%CD%B39%E79%9D%E7%9C'13%A6%83%94ib%DA%02%D9%C5%FB%C3%FF%DDAT%09Aq%22%84%00%85%18%85%13%5C%10%0Ao%E4A)%0A!%03%E8%5E%DE%F6O%AB!j%C48%C1%12%8D%20FP%25%04%23%88%12%A2%E2E%B9%FDbhB%00%60%AC!De%B2I%F1q%B2X%0C%2F%8A%93%88%0F%86%13%C5%07%A5%DA%91Q%D4e%C2%035c%DB%EAN%5C%88%EC%5E%D3%C9%FEu%B38%B4%A1%CA%D1M56%AC%EC%A0%9C%25%1CX%3F%9B%D6r%C2%B1%CDs%A9%BBH%C3E%B4%08%A4N%84%20J%25KpA%A9%B4%A4%DCz%F6%83%24%81%2B%0F%BF%B3%A0%D6%C2%8A%F9%15%BA%AAe%DA%CB)K%E6T%C8%9B%91%22(%9A%0BY%EE%84%A6(%95%96%84%83%1BkdiB%EE%043%A3%EE%22%AA%D0%BD%BC%03%03%9AA%A97%23%0D%1Fq!%C5%F2HZ%2F%0C%E7%95%C2%2B%D7%1E%0F%E2Ei4%15%03%F2f%24%9A%F1%FEk%83%0Fw%AF%B3%F6%DEV%DE%EDk%E7H%EFv%96%7D%BC%8D%3AO%F6%AB%F04%7D%1BfLN%86%FA%24%E7.%A2j%BC%BEs%95%9D%E9s6%1D%3ENe%E9*%8AwO%F9%D0%FB%8C%B7%D6%20%D9r%E9%A3%ED%5D3%8Bo%A3%0E%1F%14'%8A%0B%7F%9C%9F8%D7%E1%BE%5D%EC9y%9A%B6%CF%2F%A1%BF%0Ff%CCd%24%5B%CC%93'%9F%C8%C6%C6%85%C2G%3A%5BK%F8%96%84%D6%90%10*%86HB%90%94%A0F5%1F%A0u%DER%D8u%E6%EF%07%5E%98%CF%3C~%92%8D%16%81%1B%8F%FB%B1%60%A8S%CC%0B%16%14s%11%BCbQ%D9Z%AE%D2x%F3%88%F6%07%A7p%C5%20%0D%60%7C%AC%C4HR%23%99J%1A%FBz%BA.%94%3B%DB%CF-%ACI%96%A5%DF%18%1F%16%BE%0C%95bh%DA%F9d%AAq~%D5%B3%E8l%3E%3Ap%A2%14%93%C5%B1d%FD%067w%3C%95%CB%BF%01%8FKv%3FQ%979%D3%00%00%00%00IEND%AEB%60%82";
var span = document.createElement('span');
var a = document.createElement('a');
var img = document.createElement('img');
img.setAttribute("src", icon);
img.setAttribute("border", "0");
img.setAttribute("alt", "Ersetze <, > und kbd-Tags");
img.setAttribute("title", "Ersetze <, > und kbd-Tags");
img.style.marginLeft = "3px";
a.setAttribute("href", window.location.href+"#");
a.setAttribute("title", "Ersetze <, > und kbd-Tags");
a.appendChild(img);
a.addEventListener("click", function(evt)
{
escapeEntities(textarea);
}, false);
span.appendChild(a);
if (textarea.nextSibling == null)
{
textarea.parentNode.appendChild(span);
}
else
{
textarea.parentNode.insertBefore(span, textarea.nextSibling);
}
}
function escapeEntities(textarea)
{
var start = textarea.selectionStart;
var end = textarea.selectionEnd;
var val = textarea.value;
var len = val.length;
var pos = textarea.scrollTop;
var selectionMade = true;
if (start == end)
{
start = 0;
end = len;
selectionMade = false;
}
var s = val.slice(start, end);
s = s.replace(/</g, "<");
s = s.replace(/>/g, ">");
//s = s.replace(/&/g, "&");
//s = s.replace(/"/g, """);
s = s.replace(/\[KBD\]/gi, "[CODE]");
s = s.replace(/\[\/KBD\]/gi, "[/CODE]");
var pre = val.slice(0, start);
var post = val.slice(end, len);
textarea.value = pre + s + post;
if (selectionMade)
{
textarea.selectionStart = start;
textarea.selectionEnd = start + s.length;
}
textarea.scrollTop = pos;
}
window.addEventListener("load",
function ()
{
updateTextAreas();
}, false
);
fxforumnewtab.user.js
Gepostete Links werden in einem neuen Tab geöffnet.

// ==UserScript==
// @name FxForumNewTab
// @namespace http://userscripts.org/people/5587
// @description Opens posted links in new tabs
// @source http://userscripts.org/scripts/show/49555
// @identifier http://userscripts.org/scripts/source/49555.user.js
// @version 1.01
// @date 2009-05-19
// @creator Arne Dieckmann (aka "Mithrandir")
// @include http://www.camp-firefox.de/forum/*
// ==/UserScript==
var res = document.evaluate("//div[@class='content']/a|//blockquote/div/a", document, null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE , null);
for(var i = 0; i < res.snapshotLength; i++) {
var elem = res.snapshotItem(i);
elem.target = "_blank";
}
googleblank.user.js
Ersetzt auf google das Attribut target="nw" durch target="_blank" und verbessert damit das Verhalten beim Öffnen der Suchergebnisse (ansonsten wird der letzte Tab überschrieben).

// ==UserScript==
// @name googleBlank
// @version 0.8
// @homepage http://www.ardiman.de
// @description Ersetzt auf google das Attribut target="nw" durch target="_blank" und verbesssert damit
// das Verhalten beim Oeffnen der Suchergebnisse (ansonsten wird der letzte Tab ueberschrieben).
// @author Arne Dieckmann
// @namespace http://www.ardiman.de/assets/files/firefox/googleblank.user.js
// @include *www.google*
// ==/UserScript==
(function (){
var a = window.document.getElementsByTagName("a");
var regTarget = /^(nw)$/i;
for (i=0;i<a.length;i++) {
if (a[i].target.match(regTarget)) {
a[i].setAttribute("target","_blank");
}
}
}());
kennytranslator.user.js
Übersetzt Text in das, was Kenny von South Park sagen würde und zurück. Das Übersetzungsfenster erscheint bei Textmarkierung und auf Klick mit gleichzeitig gehaltener
Alt-Taste

// ==UserScript==
// @name Kenny Translator
// @namespace http://userscripts.org/people/5587
// @description Translates text into what Kenny from South Park would say and back again. A translation window appears when you click selected text with the alt key pressed.
// @source http://userscripts.org/scripts/show/15987
// @identifier http://userscripts.org/scripts/source/15987.user.js
// @version 0.1
// @date 2007-12-08
// @creator Arne Dieckmann (aka "Mithrandir")
// @include *
// @exclude http://www.namesuppressed.com/kenny/
// ==/UserScript==
(function () {
function kenny_it(text){
kenny="";
for(i=0;i<text.length;i++){
item=text.charAt(i);
if((item>="a" && item<="z")||(item>="A" && item<="Z")){
if(item>="a"){
offset=97;
}else{
offset=65;
}
char=((item.charCodeAt(0)-offset).toString(3));
if(char.length<3){
do {
char="0"+char;
} while (char.length<3);
}
for(j=0;j<3;j++){
n=char.charAt(j);
if(j==0 && offset==65){
kenny=kenny+["M","P","F"][n];
}else{
kenny=kenny+["m","p","f"][n];
}
}
}else{
kenny=kenny+item;
}
}
return (kenny);
}
function kenny_said(text){
output="";
upper=false;
do{
item=text.charAt(0);
n="mpfMPF".indexOf(item);
if(n != -1){
if(n>2){
upper=true;
n-=3;
}
for(i=0;i<2;i++){
text=text.substring(1,text.length);
char=text.charAt(0);
n=n*10+"mpf".indexOf(char);
}
item=String.fromCharCode(parseInt(n,3)+97);
if(upper){
item=item.toUpperCase();
upper=false;
}
}
text=text.substring(1,text.length);
output=output+item;
}while(text != "")
return(output);
}
var from, to;
from = "K";
to = "O";
var defaultTranslation = from + "_" + to;
//provides to make visible kenny fish box only when mouse up and alt key pressed
//or provides to hide kenny fish box when user click out of box
window.addEventListener('mouseup', function(mouseEvent) {
var boxLeft = window.kennySpeak.offsetLeft;
var boxRight = boxLeft + window.kennySpeak.offsetWidth;
var boxTop = window.kennySpeak.offsetTop;
var boxBottom = boxTop + window.kennySpeak.offsetHeight;
if (window.kennySpeak.style.display == "inline"
&& (mouseEvent.pageX < boxLeft
|| mouseEvent.pageX > boxRight
|| mouseEvent.pageY < boxTop
|| mouseEvent.pageY > boxBottom)) {
window.kennySpeak.stopCapture();
} else if (window.getSelection() != '' && mouseEvent.altKey) {
window.kennySpeak.psychicalWavesCapture(mouseEvent, window.getSelection());
}
}, true);
//create kenny fish object and box instance. make it unvisible on start
function engagekennySpeak() {
//set global css
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { alert('ugh'); }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = "span.gmkennyTranslatorToolBar {margin: 1px; border: 1px dotted gray; padding: 0px 5px 0px 5px;}";
head.appendChild(style);
var kennySpeak = document.createElement("div");
kennySpeak.id = "gmkennySpeak";
kennySpeak.translationFrom = from;
kennySpeak.translationTo = to;
kennySpeak.fish_imgSrc = "data:image/gif;base64,R0lGODlhEAAQAOe8AHRDIXRFI3VFI3RGJHZGI3dGIndGJHZHI3VHJnpHI3dIJnlIJHZJKH1HInxOLo5KG45LG5VPG5VPHJhQHINXN55RGIhaNqNTGahTFqlUF4deP41fOrBVE7NVEb9UDYlmSrhYFbpYE8JXDb9YEMFaEYtsVctbC71gHM1cDsVgGddcCdZdCNxbBthdCNRfCttcB9ZeCtNgC9xdCN9cBtVhCd1fB99eCOBeBuBeB91gBt1gB9xhB%2BBgCONfBsFqLN9iCelgBehiBehjBuVlCO1iBfBjBOpmBe9kBaJ8V%2FBkBO1mBfJkA%2FNkA%2FFlBPNkBOtoBvBmBPJlBPNlA%2FNlBO5oBPJmBPFnBPNmBPJnBPJoBPJoBfNoBfJpA%2FJpBPNpBPJpB%2FNpBfJqA%2FJqBPNqA%2FNqBPJqB%2FJrA%2FJrBPNrA%2FJrBvJsBvJsCPFtC%2FJsDvJsD%2FFuEfJwD%2B14IOp6J%2FB7K%2FJ7KvJ%2BLfKALPKAMbmTbLuUbqyXiPOEMfGFObCZhemRTrKglPOQRvORS%2FKVTfSWVu2aXvWhZ%2FSmbPSnb%2FWnb%2FSob%2FSocfWpc%2FWsdPWsdcm7sdu6jsDAw9HFvMjIyuzMn%2FfJqerRsPLTp%2B%2FTvfHat%2Fjaxvzesvzfsfrft%2F7gsf7hsvnfzf3itvnj0vnj0%2Fnk1Pbn0Pnm1%2FPs5%2F3u1vHw7%2FHx8fjy5vjy6Pzy4fry6%2Fvz5fT09fr28Pv49fv49vv59vn6%2Bvr6%2Bvv7%2Bvv7%2B%2Fz7%2Bvz8%2FP39%2Ff7%2B%2Fv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FyH5BAEAAP8ALAAAAAAQABAAAAj%2BAP8JFLjozhs3dRANXPhP0RcsWbBogVjmEMNAWTJq1OLFSxZAAxt16aJlyIgTKWCIMYMGjSGBa7o8qXAAiaVJGx7QQEMmzT9GYqhAGNCHFCdNlSg0cMFlTKI9aEwAKEEr1ypVuRwhuGCEjB04ZjoQ%2BJMLUqpcklAxmKBDDJs2YDgE0JMrlytcr2o5iJADjRo6W0QI%2BACLFahTuSIZyLBjTJxCV15IUJCnUydPmDQUiFFDC6F%2FToiowLAAz6ZHFhKEWDFGjMBBS4CwEILCBwgSP1ooCeNn4JwpUWbg8MDDxo0tY%2BQs5FNkipQeMqowqRLFiqCBlLRoOXIESpAmUZIHHNFy5tO%2FgAA7";
kennySpeak.supportedTranslations = {
"O_K" : "Original in Kenny",
"K_O" : "Kenny in Original"
}
//hides the kennyspeak box
kennySpeak.stopCapture = function() {
this.style.display = "none";
}
//capture selected text and show the kennyspeak box near the pointer
kennySpeak.psychicalWavesCapture = function(mouseEvent, selectedText) {
if (this.style.display == "none") {
this.style.display = "inline";
this.kennySpeakImage.style.display = "inline";
this.style.left = (mouseEvent.pageX - 20).toString(10) + 'px';
this.style.top = (mouseEvent.pageY - 5).toString(10) + 'px';
this.kennyTextSpan.value = selectedText;
}
}
//translate the code and after set box properties
kennySpeak.defecates = function () {
this.kennySpeakImage.src = this.fish_imgSrc;
if (kennySpeak.translationFrom == "K") {
var t= kenny_said(this.kennyTextSpan.value);
} else {
var t= kenny_it(this.kennyTextSpan.value);
}
window.kennySpeak.kennyTextSpan.value = t;
window.kennySpeak.kennySpeakImage.src = window.kennySpeak.fish_imgSrc;
}
// kenny fish box style properties
kennySpeak.style.border = "1px solid #006699";
kennySpeak.style.display = "none";
kennySpeak.style.position = "absolute";
kennySpeak.style.backgroundColor = "#F4F4F4";
kennySpeak.style.padding = "2px";
kennySpeak.style.MozBorderRadius = "4px";
kennySpeak.style.font = "arial";
kennySpeak.style.fontSize = "12px";
kennySpeak.style.color = "black";
kennySpeak.style.textAlign = "left";
kennySpeak.style.zIndex = "100";
//image button to translate text
var kennySpeakImg = document.createElement("img");
kennySpeakImg.src = kennySpeak.fish_imgSrc;
kennySpeakImg.title = "Click to translate";
kennySpeakImg.style.border = "none";
kennySpeakImg.style.cursor = "pointer";
kennySpeakImg.style.marginBottom = "-3px";
kennySpeakImg.style.marginLeft = "20px";
kennySpeakImg.addEventListener('click', function() {kennySpeak.defecates();}, true);
//text to translate/translated text span
var kennyTextSpan = document.createElement("textarea");
kennyTextSpan.cols = "40";
kennyTextSpan.rows = "7";
//close button
var closeButton = document.createElement("span");
closeButton.innerHTML = "x";
closeButton.style.cursor = "pointer";
closeButton.className = "gmkennyTranslatorToolBar";
closeButton.title = "Close Kenny Translator";
closeButton.addEventListener('click', function() {kennySpeak.stopCapture();}, true);
//translation from and to source
var langsSpan = document.createElement("span");
langsSpan.refreshData = function() {
langsSpan.innerHTML = kennySpeak.supportedTranslations[kennySpeak.translationFrom + "_" + kennySpeak.translationTo];
langsSpan.title = "Click to change direction";
langsSpan.style.cursor = "pointer";
}
langsSpan.className = "gmkennyTranslatorToolBar";
langsSpan.style.cursor = "default";
langsSpan.addEventListener('click', function() {
var temp = kennySpeak.translationTo;
kennySpeak.translationTo = kennySpeak.translationFrom;
kennySpeak.translationFrom = temp;
langsSpan.refreshData();
}, true);
langsSpan.refreshData();
//toolbar
var toolBarDiv = document.createElement("div");
toolBarDiv.style.borderBottom = "1px solid #cccccc";
toolBarDiv.style.margin = "2px 0px";
toolBarDiv.style.paddingBottom = "2px";
//append objects to toolbar
toolBarDiv.appendChild(closeButton);
toolBarDiv.appendChild(langsSpan);
toolBarDiv.appendChild(kennySpeakImg);
//put html objects into kennyspeak box
kennySpeak.appendChild(toolBarDiv);
kennySpeak.appendChild(kennyTextSpan);
//set objects into kennyspeak instance
kennySpeak.kennySpeakImage = kennySpeakImg
kennySpeak.kennyTextSpan = kennyTextSpan;
kennySpeak.kennyLangLabel = langsSpan;
window.kennySpeak = kennySpeak;
document.body.insertBefore(window.kennySpeak, document.body.firstChild);
}
engagekennySpeak();
})();
phpbb_new_topics.user.js
Damit wird neben dem Button "Neues Thema" eine Schaltfläche erstellt, die alle neuen Posts in Tabs öffnet.

// ==UserScript==
// @name phpBB New Topics
// @namespace http://userscripts.org/people/5587
// @description Generates button which opens all new topics of phpBB3-boards in tabs
// @source http://userscripts.org/scripts/show/114485
// @identifier http://userscripts.org/scripts/source/114485.user.js
// @include */viewforum.php*
// @version 1.0.0
// @date 2011-10-02
// @creator Arne Dieckmann (aka "Mithrandir")
// ==/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 = 300; // set timeout in milliseconds for opening (cookies won't be stored if too low!)
var oMode = true; // =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[contains(@href,'&view=unread#unread')]", 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(/&view=unread#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='buttons']", 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('button'));
if (f > 1) {
btn.innerHTML = "Öffne " + f + " neue Beiträge";
} else {
btn.innerHTML = "Öffne neuen Beitrag";
}
btn.style.background='#EEEEEE';
btn.style.color='#BC2A4D';
btn.style.fontWeight='bold';
btn.style.fontSize='0.9em';
btn.style.height='25px';
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);
}
})();