User:Splarka/tricks

__NEWSECTIONLINK__

These are css/js/parserfunction/magicword hacks that I either developed or "discovered", by myself, by user request, or with the help of other wiki users. Others may have done them proir to me, but in most cases I had no external help in figuring them out (other than the help pages on meta). Mostly this page is to document the requests for tweaks I've been asked to do on wikia, but several also apply to Uncyclopedia or Wikipedia.

=CSS= Mostly these apply to MediaWiki:Common.css, MediaWiki:Monobook.css and Special:Mypage/Monobook.css (assuming you use the default 'monobook' theme). See also: Wikipedia:Wikipedia:Catalogue_of_CSS_classes.

We've upgraded to 1.9!

The main change the upgrade gave us, in regards to CSS, is a unique (usually) per-page class for the &lt;body&gt; tag. That means, you can restrict a style to any single page with a simple css class definition. For example, this page:

So, lets say I wanted to change the background color of links, just on this page:

Etc.

Limiting TOC to certain depths
In MediaWiki:Common.css: .toc5 li.toclevel-6 {display:none} .toc4 li.toclevel-6, .toc4 li.toclevel-5 {display:none} .toc3 li.toclevel-6, .toc3 li.toclevel-5, .toc3 li.toclevel-4 {display:none} .toc2 li.toclevel-6, .toc2 li.toclevel-5, .toc2 li.toclevel-4, .toc2 li.toclevel-3 {display:none} .toc1 li.toclevel-6, .toc1 li.toclevel-5, .toc1 li.toclevel-4, .toc1 li.toclevel-3, .toc1 li.toclevel-2 {display:none}

In Template:TOC1

In Template:TOC2

etc

Un-numbered TOC
In MediaWiki:Common.css:

.utoc .tocnumber { display:none; } .utoc #toc ul, .utoc .toc ul { line-height: 1.5em; list-style-type: square; margin: .3em 0 0 1.5em; padding: 0; list-style-image: url(/skins3/monobook/bullet.gif); }

And then put a in a.

Limiting a DynamicPageList list to one specific letter
Notes:
 * Requires css capable browser or will look funky
 * Does not work well with higher numbers of pages (say ~1000)
 * Lame hack, better to use a custom namespace and Allpages/Prefixindex

In MediaWiki:Common.css: .alphacat ul {list-style: none; } .alphacat li a {display: none; } .alphacat-a li a[title ^="A"] {display: inline } .alphacat-b li a[title ^="B"] {display: inline } .alphacat-c li a[title ^="C"] {display: inline } .alphacat-d li a[title ^="D"] {display: inline } .alphacat-e li a[title ^="E"] {display: inline } .alphacat-f li a[title ^="F"] {display: inline } .alphacat-g li a[title ^="G"] {display: inline } .alphacat-h li a[title ^="H"] {display: inline } .alphacat-i li a[title ^="I"] {display: inline } .alphacat-j li a[title ^="J"] {display: inline } .alphacat-k li a[title ^="K"] {display: inline } .alphacat-l li a[title ^="L"] {display: inline } .alphacat-m li a[title ^="M"] {display: inline } .alphacat-n li a[title ^="N"] {display: inline } .alphacat-o li a[title ^="O"] {display: inline } .alphacat-p li a[title ^="P"] {display: inline } .alphacat-q li a[title ^="Q"] {display: inline } .alphacat-r li a[title ^="R"] {display: inline } .alphacat-s li a[title ^="S"] {display: inline } .alphacat-t li a[title ^="T"] {display: inline } .alphacat-u li a[title ^="U"] {display: inline } .alphacat-v li a[title ^="V"] {display: inline } .alphacat-w li a[title ^="W"] {display: inline } .alphacat-x li a[title ^="X"] {display: inline } .alphacat-y li a[title ^="Y"] {display: inline } .alphacat-z li a[title ^="Z"] {display: inline }

In a template (which you call via to show just 'a')   category= Some Category count=1000 

Style the menus
Done on w:c:scratchpad:MediaWiki:Monobook.css

In MediaWiki:Monobook.css, a base to start fiddling:

background-color: #fffff6; border:1px solid black; }  display: block; border: none; background-color: transparent; padding: 0 } .portlet h5 { font-weight:bold; display: block; border-bottom: 1px solid #ccccff; padding-bottom: .35em; } .pBody a { text-decoration: none; } .pBody ul li:hover { background-color:#ffffcc } list-style-image: none; list-style-position: outside; list-style-type: circle; padding: 0 0 0 1.5em; margin: 0; }  border-left: 1px solid #ffcccc; border-bottom: 1px solid #ccccff; padding: 0 0 .05em .5em;
 * 1) p-wikicities-nav, #p-tb, #p-search, #p-navigation {
 * 1) p-navigation .pBody, #p-search .pBody, #p-tb .pBody, #p-lang .pBody, #p-wikicities-nav .pBody {
 * 1) p-navigation .pBody ul, #p-search .pBody ul, #p-tb .pBody ul, #p-lang .pBody ul, #p-wikicities-nav .pBody ul {
 * 1) p-navigation .pBody li, #p-search .pBody li, #p-tb .pBody li, #p-lang .pBody li, #p-wikicities-nav .pBody li {

less annoying "You have new messages"
In your user/monobook.css : .usermessage { background-color: #FFFFFF; border: 1px solid #777777; color: Black; font-weight: normal; margin: .5em 0em .5em 0em; padding: 4px; vertical-align: middle; }

Redirects
On Special:Allpages, you can make redirects stand out a lot more. For example (in MediaWiki:Common.css or user/monobook.css):

.allpagesredirect { font-style: italic; } .allpagesredirect:after { color:grey; content: " (redirect)"}

Makes them italic and appended with the word 'redirect'.

.allpagesredirect a { background: url(/images/5/5c/Allpagesredirect.gif) center left no-repeat; padding-left: 13px; }

Gives each redirect a small image (found here, save and upload to use, public domain (or create your own)) to the side.

Hilighting admin/staff
This lets you style the nickname of trusted editors in the recent changes as you wish.

In your user/monobook.css (or in MediaWiki:Common.css with community approval) :

ul.special li a[title="User:Angela"], ul.special li a[title="User:Sannse"], ul.special li a[title="User:Splarka"] { font-weight: bold; font-style: italic; color: #ff00ff; }

This example shows Angela, Sannse, and Splarka as bold, magenta, and italic, in recent changes.

table.diff a[title="User:Splarka"], ul#pagehistory li a[title="User:Splarka"], ul.special li a[title="User:Splarka"] { color: #33dd33; font-weight:bold; }

This example shows Splarka as bold and green, in diffs, page histories, and recent changes.

Finding new users
In MediaWiki:Common.css or user/monobook.css:

ul.special li a[title ^="User talk:"].new { color:#ff00ff;font-weight:bold }

Will show a bright pink Talk link on recent changes, for all users who do not have talk pages.

ul.special li a[title ^="User talk:"].new { color:#ff00ff;font-weight:bold } ul.special li a[title ="Special:Contributions"] + a[title ^="User talk:"].new { color:#CC2200;font-weight:normal }

Will do the same, but only for logged in users, and not IPs. Note that it does this by resetting IP talk links to normal, so whatever changes done have to be undone.

Float the namespace selector to the right
In user/monobook.css: div.namespacesettings { float: right; clear: none; position: relative; top: -8em; width: 175px; border: 1px dotted #AAAAAA; padding: 4px; } Gets it out of the way.

Various minor tweaks
In user/monobook.css: .newpage { color : #990000; } .minor { color : #AAAAAA; } .unpatrolled { color : #ff00ff; } This changes the N (new page) letter to red, the m (minor edit) letter to grey, and the ! (unpatrolled edit) exclamation mark to bright pink. Lots of things can be done in excess to this, such as images, extra comments, and blinking.

Make some links look like regular links
This is useful if you want to make inline templates with a mixture of internal/interwiki/external links but don't want a clash of link formatting associated with such. In MediaWiki:Common.css:


 * 1) bodyContent .stealthexternallink a { background: none; padding: 0; color: #002bb8; }
 * 2) bodyContent .stealthexternallink a.new { color: #CC2200 !important; }
 * 3) bodyContent .stealthexternallink a:visited { color: #5a3696; }
 * 4) bodyContent .stealthexternallink a:active { color: #faa700; }
 * 5) bodyContent .stealthexternallink a:hover { text-decoration: underline; }

And then put such links in

Make class="new" inheritable
This allows you to force links to be red, by putting links in a block or inline element in class="new": In MediaWiki:Common.css:

.new a { color:#cc2200; } .new a:visited { color:#a55858; }

And then: Blah should always be red.

Per namespace
You can change the logos in each namespace, via MediaWiki:Monobook.css. For example:

body.ns-110 #p-logo a { background-image: url(/images/6/61/Forum_Logo_Soapboxes.png) !important; } body.ns-111 #p-logo a { background-image: url(/images/d/db/Forum_talk.png) !important; }

Note that you must determine the image location and namespace number yourself. To determine the image location: upload an image, right click on it, and 'copy image location' (mozilla) or 'properites' (ie). To determine the namespace number, go to a page in that namespace and view page source, the tag will have it as a class, eg user might be  indicating body.ns-2 is the identifier for that namespace. Hint: Lots of customizations are possible by namespace.

Per pagename
If you look at the page source, you'll see the &lt;body&gt; tag has quite a lot of classes as of MediaWiki: 1.9. For example, this page:  If one wanted to change the logo, just of this page, one could put in MediaWiki:Monobook.css body.page-User_Splarka_tricks #p-logo a { background-image: url( http://somelink ) !important; } This opens up the possibility to make certain pages, such a your main page or certain help pages, quite unique.

Misc user css tweaks
Mostly for user/monobook.css:

Make action tab links change color when visited:
 * 1) p-cactions .new a:visited { color: #ba6644; }
 * 2) p-cactions li a:visited { color: #492FAF; }

Position the delete confirmation button at the same place on every page (useful for mass deletions in tabs):
 * 1) deleteconfirm { position: absolute; top: 130px; left: 150px; }

Remove gap between action tabs (talk/edit, and move/watch (or history/watch)): li#ca-watch, li#ca-unwatch { margin-right: 1.6em; margin-left: .05em; } li#ca-talk { margin-right: .4em; }

Show "Templates used on this page" as an inline list instead of long bullet pointed list. .templatesUsed ul { list-style: none; } .templatesUsed li { display: inline; padding: 0 0 0.1em 0; margin: 0 0.3em 0 0; }

Make edit pages much smaller (by removing copyright warning and tools) Warning: for advanced users only, could get you banned for ignoring site rules
 * 1) editpage-copywarn { display: none !important; }
 * 2) editpage-tools { display: none !important; }

Removes block expiry dropdown on Special:Blockip (I always type in a time manually).
 * 1) wpBlockExpiry { display: none !important; }

That annoying updated marker! .updatedmarker {display: none}

Wanna change your edit box font? textarea {font-family: "Comic Sans MS"; font-size:110%;}

Printed links Underlined
in user/monobook.css: @media print { a, a.external, a.new, a.stub { color: blue ! important; text-decoration: underline ! important; } }

Border on LaTeX images
Experimental, requires CSS2. a img[alt="math"] { border:1px solid green;background-color:white;padding:3px; }

Also (from Lapper):
 * 1) bodyContent a[href ^="/extensions/wiki/text/tmp/"] { border:1px solid green;background-color: hite;padding:3px; }

Per-namespace tab buttons
A quick trick to let you customize messages per namespace.

For example, to prefix a namespace-specific word before 'discussion' on every talk page:

body.ns-0 #ca-talk a:before { content: "Article "} body.ns-1 #ca-talk a:before { content: "Article "} body.ns-2 #ca-talk a:before { content: "User "} body.ns-3 #ca-talk a:before { content: "User "} body.ns-4 #ca-talk a:before { content: "Project "} body.ns-5 #ca-talk a:before { content: "Project "} body.ns-6 #ca-talk a:before { content: "Image "} body.ns-7 #ca-talk a:before { content: "Image "} body.ns-8 #ca-talk a:before { content: "Message "} body.ns-9 #ca-talk a:before { content: "Message "} body.ns-10 #ca-talk a:before { content: "Template "} body.ns-11 #ca-talk a:before { content: "Template "} body.ns-12 #ca-talk a:before { content: "Help "} body.ns-13 #ca-talk a:before { content: "Help "} body.ns-14 #ca-talk a:before { content: "Category "} body.ns-15 #ca-talk a:before { content: "Category "} body.ns-100 #ca-talk a:before { content: "Lodging "} body.ns-101 #ca-talk a:before { content: "Lodging "} body.ns-102 #ca-talk a:before { content: "Restaurant "} body.ns-103 #ca-talk a:before { content: "Restaurant "} body.ns-110 #ca-talk a:before { content: "Forum "} body.ns-111 #ca-talk a:before { content: "Forum "}

(CSS2 - won't work on all browsers)

=Javascript (untested in 1.9 yet)= Note: I haven't tested all the scripts in this section in 1.9 yet. When I do, I'll move them to the next section or remove them (if they are not needed).

Usually for MediaWiki:Monobook.js or Special:Mypage/monobook.js

Trimmed main page
NOTE: ''As we've upgraded to 1.9, javascript is no longer needed (rev:17119). This section should be moved to the CSS sections above.''

To style a specific page, in MediaWiki:Monobook.css (or user css, or MediaWiki:Common.css if it is not unique to the user interface), use the body tag page class. Examples:

body.page-Main_Page #lastmod, #siteSub, #contentSub, h1.firstHeading { display: none !important; } body.page-Main_Page #p-cactions, #p-personal, #lastmod, #siteSub, #contentSub, h1.firstHeading body.page-Main_Page #p-logo a { background-image: url( http://upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png ) !important; }

Per-Page CSS support

 * Deprecated due to upgrade.: this is now supported natively in Wikia. View page history for code if you wish to use it elsewhere.

Patrolled edits popups
// ** patrolled edit popups ** // Lets you open patrolled edit links in popups which will autoclose when complete. // Set popups to open in new tabs for best results. function patrolpop { if( (!document.getElementById)||(!queryString("diff"))||(!queryString("rcid")) ) return;

if(document.getElementsByTagName("table")[0].className = "diff") { var marklink = document.getElementsByTagName("table")[0].getElementsByTagName("a").length -1; var purl = document.getElementsByTagName("table")[0].getElementsByTagName("a")[marklink].href var mp = document.getElementsByTagName("table")[0].getElementsByTagName("a")[marklink].parentNode var mpa=document.createElement('span'); mpa.innerHTML='&emsp;[pop]'; mp.appendChild(mpa); document.getElementById("poppatrol").accessKey="p"; } } addOnloadHook(patrolpop);

// window closer and query string retriever if( queryString("autoclose") == "true") window.close; function queryString(p) { var re = RegExp('[&?]' + p + '=([^&]*)'); var matches; if (matches = re.exec(document.location)) { try { return decodeURI(matches[1]); } catch (e) { }	}	return null; } // ** end patrolled edit popups **

Link generation page

 * Not highly tested. Known to have problems with non-english content languages (like Polish in MediaWiki: namespace).

This lets you create a template with parameter that generates a multitude of links that, for example, search for that parameter (Similar to Book_sources on Wikimedia, eg: Wikipedia:Wikipedia:Book_sources)

addOnloadHook(linkInsert); function linkInsert { //parameters var linkpage = 'MediaWiki:Links'; var linkparm = 'link'; var magic = 'MAGICWORD';

//aborts if(document.title.indexOf(linkpage) != 0) return; if(!queryString(linkparm)||(queryString(linkparm)==magic)) return;

//loop var body = document.getElementById('bodyContent') alert(body.innerHTML.indexOf(magic)); while (body.innerHTML.indexOf(magic) != -1) { body.innerHTML = body.innerHTML.replace(magic, queryString(linkparm)) } }

function queryString(p) { var re = RegExp('[&?]' + p + '=([^&]*)'); var matches; if (matches = re.exec(document.location)) { try { return decodeURI(matches[1]); } catch (e) { }	}	return null; }

To use it, create a template with contents like:

[ search]

And then if your template is called, eg  it will generate a link to   ... and all occurences of MAGICWORD on MediaWiki:Links will be replaced by, eg: http://www.google.com/search?q=MAGICWORD becomes http://www.google.com/search?q=pink+floyd+the+wall

Re-link 'Talk:' Categories
Often, to keep maintenace/project category clutter on large wikis to a minimum, the talk page is categorized instead.

Someone requested am on-demand script to change links on category pages from "Talk:Pagename" to "Pagename", and "Namespace_talk:Pagename" to "Namespace:Pagename".

function catSwapButton { if(document.title.indexOf('Category:' == 0)) { var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0]; addlilink(tabs, 'javascript:catSwap', 'De-talkify', 'ca-catswap'); } } addOnloadHook(catSwapButton)

function catSwap { var cat = document.getElementById('bodyContent'); cat.innerHTML = cat.innerHTML.replace(/Talk\:/g,'').replace(/[_\s]talk\:/g,':'); }

function addlilink(tabs, url, name, id) { var na = document.createElement('a'); na.href = url; na.id = id; na.appendChild(document.createTextNode(name)); var li = document.createElement('li'); li.appendChild(na); tabs.appendChild(li); return li; }

Watchlist styler
If you want to hilight certain aspects of your watchlist, you can do so thusly.

var wstyle = []; wstyle[wstyle.length] = { 'match': 'Hydrogen', 'color': '#ffff00', 'bgcol': '#00ff00'} wstyle[wstyle.length] = { 'match': 'MediaWiki', 'color': '#ff0000'} wstyle[wstyle.length] = { 'match': 'Talk:', 'bgcol': '#000000'}

function watchlistStyle { if(document.title.indexOf('My watchlist -') != 0) return; var links = document.getElementById('bodyContent').getElementsByTagName('a'); for(var i=0;i < links.length;i++) { for(var k=0;k < wstyle.length;k++) { if(links[i].innerHTML.indexOf(wstyle[k].match)!= -1) { if(wstyle[k].color) links[i].style.color = wstyle[k].color if(wstyle[k].bgcol) links[i].style.backgroundColor = wstyle[k].bgcol }   }  } } addOnloadHook(watchlistStyle)

Note that you can expand this to work on other content pages, or all content pages, by modifying the return conditions. For example, if you'd like this to work on recent changes too: if((document.title.indexOf('My watchlist -') != 0)&&(document.title.indexOf('Recent changes - ') != 0)) return;

Also, this can be done in CSS (similar to User:Splarka/tricks). body.ns--1 #bodyContent a[title*="Template"] {color: red; background-color:blue;} This will be more effective per-page (such as just watchlist or just recent changes) after then 1.9 upgrade

=Javascript 1.9+= Stuff here has been tested on and works under 1.9. Will migrate/simplify stuff and move it here this week.

Note that with MediaWiki:Common.js functionality: do not make the mistake of moving all your javscript there directly. Much of the Javascript used is specifically for Monobook.

Changeable preloads
Here is a quick and dirty way to add a dropdown selection menu:

function preloadMenu { if(document.createbox.preload) { var cb = document.createbox; if(cb.preload.value == 'Template:Default') { var sel = 'Preloads: \n' sel += ' Default: '+ document.createbox.preload.value +' \n'; sel += ' Foo page \n'; sel += ' Bar page \n'; sel += ' Baz page \n'; sel += ' \n'; cb.innerHTML = sel + cb.innerHTML; } } } addOnloadHook(preloadMenu);

If the above script finds an input box with a preload=, and if it finds the default template matching (as a way to limit its operation), it will then create a dropdown list that you specify, and allow you to choose a different preload. For example, the following inputbox would trigger the above script:

There are 3 demo options listed above (you can add or remove as needed). sel += ' Foo page \n'; The editable parts:
 * value="" specifies the exact name of the template (spaces or underscores allowed).
 * The text between the &gt;&lt; specifies the text seen in the dropdown box.

You can add more cases, just duplicate the inner if and simply change the conditions.

Add checkuser link to contribs

 * Note #1: Probably only works in Mozilla/FF/Netscape, still buggy and in testing. Also: This is written for mw1.7, not 1.8. 1.8 has some extra js globals defined that make some of this easier.
 * Note #2: If you are not a CheckUser, this link is rather useless for you. Also, it probably won't even work unless you are set admin.

This adds a link to Special:CheckUser on user contrib pages in the contentSub heading.
 * Before: For Nobody (Talk | block | Block log | Logs )
 * After: For Nobody (Talk | block | Block log | Logs | Checkuser )

function checklink { if(document.getElementsByTagName("h1")[0].innerHTML != "User contributions") return;

if(document.getElementById("contentSub").getElementsByTagName("a")[0].innerHTML == "Talk") { var link = document.getElementById("contentSub").getElementsByTagName("a")[3]; checkhref = "ip=" + document.getElementById("contentSub").innerHTML.substring(4,document.getElementById("contentSub").innerHTML.indexOf("(")-1);   } else {        var link = document.getElementById("contentSub").getElementsByTagName("a")[4];        checkhref = "user=" + document.getElementById("contentSub").getElementsByTagName("a")[0].innerHTML;    }    var chLink = document.createElement("a");    chLink.href = "\/wiki\/Special:CheckUser?" + checkhref;    chLink.textContent = "Checkuser";    chLink.title = "Checkuser this user";    var space = insertAfter(link.parentNode, document.createTextNode(" | "), link);    insertAfter(link.parentNode, chLink, space); } addOnloadHook(checklink);

// insertAfter by Volte function insertAfter(parent, node, referenceNode) { if(referenceNode.nextSibling) { return parent.insertBefore(node, referenceNode.nextSibling); } else { return parent.appendChild(node); } }

List of all Wikia
MediaWiki:Wikialist.js

This is just a list of all the Wikia on Wikia. It isn't current (as it has to be manually created from the database list), and it excludes all the non-wikia domains (uncyclopedia.org/memoryalpha.org). It would be nice if someday it was referenceable from a url like www.wikia.com/stats/wikialist.js (hint hint).

As it is, you can reference it via: <script type="text/javascript" src="http://wikia.com/index.php?title=MediaWiki:Wikialist.js&amp;action=raw&amp;ctype=text/javascript&amp;dontcountme=s">

And then use it for something in JS that needs a list of lots of wikia. Whatever.

Customize the search box
You can add this to your user/monobook.js to change the search box.

This changes the go button to view, and the search button to edit (the value and label should stay at these words), and the name of both to action. The consequece of this is: clicking edit takes you to /w/index.php?title=WHATEVER&action=edit, and clicking go *should* take you to /w/index.php?title=WHATEVER&action=view ... however, it takes me (at least) directly to /wiki/WHATEVER, even if the page does not exist (and not to the edit page). Note that this still does not let you manually type &action=edit but it does let you just click 'edit' instead.

function customsearch { if(document.getElementById('searchform')) { document.getElementById('searchform').action = "/index.php"; document.getElementById('searchInput').name = "title"; document.getElementById('searchGoButton').name = "action"; document.getElementById('searchGoButton').value = "view"; document.getElementById('mw-searchButton').name = "action"; document.getElementById('mw-searchButton').value = "edit"; } } addOnloadHook(customsearch);

This sets the focus on a page load, to the search box: addOnloadHook(function {document.getElementById('searchInput')..focus; return false;});

Change the favicon
On Wikia you can upload a custom favicon per wiki, but if you personally want to put a notably different favicon on each wiki you edit, you can add to your user/monobook.js: document.write('<link REL="shortcut icon" HREF="link to icon" />') Where link to icon</tt> is the full url to a 16x16 icon.

Extra search box
function whoisip { if(!document.getElementById) return; var searchForm = document.getElementById("searchform"); var whoisForm=document.createElement('form'); whoisForm.action = 'http://www.dnsstuff.com/tools/whois.ch'; whoisForm.method - 'GET'; whoisForm.innerHTML = '<input accesskey="1" TYPE=text NAME=ip SIZE=16 class="std"><input TYPE=submit VALUE="WHOIS" class="send-btn">'; searchForm.appendChild(whoisForm); }; addOnloadHook(whoisip);

Search link reassign
Originally from Wookieepedia, but this version is updated for 1.9. This should cause no errors in Common.js, but the image only ever loads in the Monobook skin, so only needs to be added to Monobook.js. This reassigns the Image:Search_logo.png link on the side to point to Special:Search. If the div or anchor tags do not exist, it does nothing.

function searchLink { if ((document.getElementById('searchform'))&&(document.getElementById('searchform').getElementsByTagName('a').length != 0)) { document.getElementById('searchform').getElementsByTagName('a')[0].href = wgArticlePath.replace(/\$1/,'Special:Search'); } } addOnloadHook(searchLink);

Supercustomize edit buttons
Now that we have support for custom edit buttons, it is easy to add buttons to the edit tools, but say you want to rearrange the existing ones? Pretty easy, just disable the default ones, and re-add them in any order you want (you will lose translations, so be warned).

For example, Say you want to put a redirect button before the other buttons:

<pre style="overflow:auto;height:20em"> function addButton { return; }

if (mwCustomEditButtons) { mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://images.wikia.com/central/images/c/c8/Button_redirect.png", "speedTip": "Redirect", "tagOpen": "#REDIRECT ",   "tagClose": "", "sampleText": "Insert text"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_bold.png", "speedTip": "Bold text", "tagOpen": "\'\'\'", "tagClose": "\'\'\'", "sampleText": "Bold text"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_italic.png", "speedTip": "Italic text", "tagOpen": "\'\'", "tagClose": "\'\'", "sampleText": "Italic text"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_link.png", "speedTip": "Internal link", "tagOpen": "",   "tagClose": "", "sampleText": "Link title"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_extlink.png", "speedTip": "External link (remember http:// prefix)", "tagOpen": "[", "tagClose": "]", "sampleText": "http://www.example.com link title"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_headline.png", "speedTip": "Level 2 headline", "tagOpen": "\n== ", "tagClose": " ==\n", "sampleText": "Headline text"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_image.png", "speedTip": "Embedded image", "tagOpen": "[[Image:",   "tagClose": "]]", "sampleText": "Example.jpg"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_media.png", "speedTip": "Media file link", "tagOpen": "[[Media:",   "tagClose": "]]", "sampleText": "Example.ogg"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_math.png", "speedTip": "Mathematical formula (LaTeX)", "tagOpen": "", "tagClose": "<\/math>", "sampleText": "Insert formula here"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_nowiki.png", "speedTip": "Ignore wiki formatting", "tagOpen": " ", "tagClose": "<\/nowiki>", "sampleText": "Insert non-formatted text here"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_sig.png", "speedTip": "Your signature with timestamp", "tagOpen": "--~", "tagClose": "", "sampleText": ""};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "/skins/common/images/button_hr.png", "speedTip": "Horizontal line (use sparingly)", "tagOpen": "\n\n", "tagClose": "", "sampleText": ""}; }

Note: There is no need to upload the images for the default ones (just use the local /skins/ url), and if the custom buttons have possible use across wikia, please upload them to the Central Wikia (see Help:Custom edit buttons. --Splarka (talk) 09:13, 28 March 2007 (UTC)

Semi-automated deletions
Note: This method has been used to delete thousands of images on commons.wikimedia, and can be very effective for those with nothing but Firefox to semo-automate a process, or those having problems getting the PyWikipediaBot to work while logged in as a sysop.

This is actually, basically, one line of code (along with a query string checker, like volte's below. If the query string contains &submitdelete=true, the delete button is submitted by the javascript.

function checkdelete { if(queryString("submitdelete")=="true") document.getElementById('deleteconfirm').wpConfirmB.click } addOnloadHook(checkdelete);

function queryString(p) { var re = RegExp('[&?]' + p + '=([^&]*)'); var matches; if (matches = re.exec(document.location)) { try { return decodeURI(matches[1]); } catch (e) { }   }    return null; }

The trick, then, is simply generating a list of files to delete as URLs. For example, to delete this page:
 * http://www.wikia.com/index.php?title=User:Splarka/tricks&action=delete
 * Would become:


 * http://www.wikia.com/index.php?title=User:Splarka/tricks&action=delete&submitdelete=true
 * You can also add a default reason, using MediaWiki query-input syntax:


 * http://www.wikia.com/index.php?title=User:Splarka/tricks&action=delete&wpReason=This+is+a+dangerous+page&submitdelete=true

Having generated several dozen or thousand links (with a search/replace or other method of your choice), you can then put them on a temporary wiki page, select about 50 at a time, right click, and 'open in new tabs' (in Firefox). And then go through and close all the tabs as soon as they finish.

Hint: This can be used on some other forms with some modification, like Special:Block.

Batch upload
A batch file upload is often requested, but usually requires a greasemonkey-type plugin or specially written Python bot. There is a way to highly automate the process in vanilla Mozilla/Firefox, but it requires temporarily relaxing security settings (as explained in the script comments). There are three parts to using it (note that, except for testing, you should really do step 3, the URL generation, first, so that you don't leave your browser insecure longer than needed):

The script
This goes into your user/monobook.js on the Wiki you need to upload to. It can stay in your script indefinitely as it is rather passive unless triggered: <pre style="overflow: auto; width:90%;height:30em"> // ================================================== // Begin batch upload script for Mozilla/FF - Splarka // ================================================== /* This is a highly evil and somewhat esoteric script that allows fast and multiple batch uploading of files to a wiki.

---DISCLAIMER It requires TEMPORARILY relaxing default security settings in your browser. Specifically: Javascript should *not* be able to arbitrarily upload files of a given name. But this is exactly what this script requires to operate. While relaxing your security, you should not visit any other sites except the wiki in question.

To enable:
 * Go to the URL about:config in firefox
 * find/create and set to 'true':
 * signed.applets.codebase_principal_support

To disable:
 * Go to the URL about:config in firefox
 * find/create and set to 'false':
 * signed.applets.codebase_principal_support

For more info/troubleshooting see: http://www.wikia.com/wiki/User:Splarka/tricks#Batch_upload

function uploadbatch { if((document.title.indexOf('Upload file - ') == 0)&&(queryString('wpUploadFile'))) { try { netscape.security.PrivilegeManager.enablePrivilege('UniversalFileRead'); } catch($err) { var $privileges = false; alert('Error: Unable to perform file upload. App was denied elevated privileges to do so.'); return; }   if((queryString('wpUploadFile'))&&(document.getElementById('wpUploadFile').value == '')) document.getElementById('wpUploadFile').value = decodeURIComponent(queryString('wpUploadFile')).replace(/\+/g,' ') if((queryString('wpDestFile'))&&(document.getElementById('wpDestFile').value == '')) document.getElementById('wpDestFile').value = decodeURIComponent(queryString('wpDestFile')).replace(/\+/g,' ') if((queryString('wpUploadDescription'))&&(document.getElementById('wpUploadDescription').value == '')) document.getElementById('wpUploadDescription').value = decodeURIComponent(queryString('wpUploadDescription')).replace(/\+/g,' ') if(queryString('wpUpload') == 'submit') document.forms[0].wpUpload.click } } addOnloadHook(uploadbatch);

function queryString(p) { var re = RegExp('[&?]' + p + '=([^&]*)'); var matches; if (matches = re.exec(document.location)) { try { return decodeURI(matches[1]); } catch (e) { }	}	return null; }

// ================================================== // End batch upload script for Mozilla/FF - Splarka // ==================================================

The security
Enabling this script is somewhat of a pain. There are several ways to do it and not all of them work. You will get a warning message the first time (usually you can select a default answer).

As explained in the script, to enable it in Firefox/Mozilla, go to about:config "signed.applets.codebase_principal_support" to "true" "signed.applets.codebase_principal_support" to "false"
 * To enable:
 * To disable:

Alternately, you can add these to the browser's prefs.js (usually in a subfolder of "documents and settings\user\application data") directly (comment out to disable): user_pref("signed.applets.codebase_principal_support", true);

Or to the browser's default prefs definition defaults\pref\firefox.js (comment out to disable): pref("signed.applets.codebase_principal_support", true);

Note, if the above fails, you may have luck by adding (temporarily) this to your prefs.js: user_pref("capability.principal.codebase.p0.granted", "UniversalFileRead");

The URL generation and usage
Now, once you have this infrastructure in place, what do you do with it?

The easiest way, is to generate a set of URLs which you can then list on a temporary wikipage and batch-upload by hilighting large groups and using the "open links in new tabs" feature of Firefox. Then, after they've loaded, all you have to do is close the tabs (if there are no warning messages).

The javascript takes 4 URL parameters which must be escaped/encoded into URL-speak (hex values for nonalphanumeric characters, %20 = space, %A0 = linefeed, etc) :
 * wpUploadFile (string, required): determines the local path of your file to upload. Like &wpUploadFile=c:%5Cwiki%5Cimage%201.gif (encoded version of "c:\wiki\image 1.gif")
 * wpDestFile (string, optional): file name, if different.
 * wpUploadDescription (string, optional): information box for the upload. Put license info here. For example: wpUploadDescription=Some%20file%0A%0A%3D%3DLicense%3D%3D%0A%7B%7BGFDL%7D%7D
 * wpUpload (string, optional): if set to "submit" the form will submit automatically, meaning you only have to open the URL in a new tab, and close it when done.

So for example: /wiki/Special:Upload?wpUploadFile=c:%5Cwiki%5Cimage%201.gif&wpUploadDescription=Some%20file%0A%0A%3D%3DLicense%3D%3D%0A%7B%7BGFDL%7D%7D&wpUpload=submit


 * Note: Mostly working tool to automate this: Batch upload generator.

&bot=1
Add a bot=1 parameter to user contribs pages, to hide the rollbacks from Special:Recentchanges (if spammy).

function hiderollback { if(document.title.indexOf('User contributions')==-1) return; var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0]; var botlink = document.location.href; if(botlink.indexOf('?')==-1) { botlink += '?bot=1'; } else { botlink += '&bot=1'; } var botlink = addlilink(tabs, botlink, '&bot=1', 'ca-bot'); } addOnloadHook(hiderollback)

function addlilink(tabs, url, name, id) { var na = document.createElement('a'); na.href = url; na.id = id; na.appendChild(document.createTextNode(name)); var li = document.createElement('li'); li.appendChild(na); tabs.appendChild(li); return li; }

Hide namespaces in categories
A quick script to hide namespace prefixes in category lists. Just add  to the category description page to activate it.

function catprefix { if(!document.getElementById('catnoprefix')) return var anchors = document.getElementById('mw-pages').getElementsByTagName('a'); for(var i=0;i < anchors.length;i++) { if(anchors[i].firstChild.nodeValue.indexOf(':') != -1) { anchors[i].firstChild.nodeValue = anchors[i].firstChild.nodeValue.substring(anchors[i].firstChild.nodeValue.indexOf(':')+1); } } } addOnloadHook(catprefix)

Here is another version: <pre style="overflow:auto;"> addOnloadHook(function {if(document.getElementById('catnoprefix')) document.getElementById('mw-pages').innerHTML = document.getElementById('mw-pages').innerHTML.replace(/\]*\>)[^\:|\<]*\:/g,'<a href=$1');});

Countdown timers
An unusual request for a countdown timer had me trying various. After getting to this point:

<pre style="overflow:auto;border-color:#ff0000">

years, weeks, days, hours, minutes, seconds

And realizing I still had to factor in leap years, I said "screw that" and did it in Javascript instead (which has built-in date functionality as well as live updates).

<pre style="overflow:auto;height:20em"> // ************************************************** // Experimental javascript countdown timer (Splarka) // Version 0.0.2 // ************************************************** // Embed with a span class="countdowntimer", eg: // April 12 2008 00:00:01 AM EST // default replacement text can accompany, eg: *javascript required*

function updatetimer(i) { var now = new Date; var then = timers[i].eventdate; var diff = count=Math.floor((then.getTime-now.getTime)/1000);

// catch bad date strings if(isNaN(diff)) { timers[i].firstChild.nodeValue = '** ' + timers[i].eventdate + ' **' ; return; }

// catch negative dates if(diff<0) { diff = -diff; var left = ' ago since'; } else { var left = ' until'; }

// calcuate the diff left = (diff%60) + ' seconds ' + left; diff=Math.floor(diff/60); if(diff > 0) left = (diff%60) + ' minutes ' + left; diff=Math.floor(diff/60); if(diff > 0) left = (diff%24) + ' hours ' + left; diff=Math.floor(diff/24); if(diff > 0) left = diff + ' days ' + left timers[i].firstChild.nodeValue = left;

// a setInterval is more efficient, but calling setTimeout // makes errors break the script rather than infinitely recurse tim[i] = setTimeout('updatetimer(' + i + ')',1000); }

function checktimers { var untimers = getElementsByClassName(document, 'span', 'notimer'); for(var i=0;i < untimers.length; i++) { untimers[i].style.display = 'none'; } timers = getElementsByClassName(document, 'span', 'countdowntimer');  //global tim = new Array; // generic holder for the timeouts, global if(timers.length == 0) return; for(var i=0;i < timers.length; i++) { timers[i].eventdate = new Date(timers[i].firstChild.nodeValue); timers[i].firstChild.nodeValue = '0 days 0 hours 0 minutes 0 seconds'; timers[i].style.display = 'inline'; updatetimer(i); //start it up  } } addOnloadHook(checktimers)

// ************************************************** // - end -  Experimental javascript countdown timer // **************************************************

Not highly tested yet. Feedback welcome.

(To add)

 * http://www.w3.org/TR/css3-selectors/#selectors


 * http://uncyclopedia.org/wiki/MediaWiki:Uncyclopedia.js
 * http://uncyclopedia.org/wiki/User:Splaka/uncyclopedia.js
 * http://en.wikipedia.org/wiki/User:Splarka/wikialink.js
 * http://uncyclopedia.org/wiki/HowTo:Reskin_Uncyclopedia
 * http://www.wikia.com/wiki/Forum:Uncyclopedia_logo
 * http://www.wikia-inc.com/wiki/Wikia:Tools


 * http://bdsm.wikia.com/wiki/MediaWiki:Monobook.js <- warning cookie
 * http://list.wikia.com/index.php?title=User:Splarka/monobook.js&oldid=2176 <- list columnizer
 * http://en.wikipedia.org/w/index.php?title=Wikipedia_talk:WikiProject_User_scripts&oldid=119646968#New_messages_woe (not useful with shared new messages, perhaps rewrite with a popdown)

=Javascript 1.10+= Here are some scripts I used or made on Wikipedia. Note that they either require 1.10 features (either due to laziness (some can be rewritten easily) or do to advanced functions or elements) or simply don't have much use on Wikia.

Redirect talk pages in a category list
Adds a button to make talk page links on a category temporarly go to the subject page. function catSwapButton { if(document.title.indexOf('Category:' == 0)) { addPortletLink('p-cactions','javascript:catSwap;','De-Talkify','ca-catswap','change category links from talk pages to article pages'); } } addOnloadHook(catSwapButton)

function catSwap { var cat = document.getElementById('mw-pages'); cat.innerHTML = cat.innerHTML.replace(/Talk\:/g,'').replace(/[_\s]talk\:/g,':'); }

Add "save" button to actions
Save action button super delux transform morph go! addOnloadHook(addsaveaction); function addsaveaction { if(document.title.indexOf('Editing ') == 0) addPortletLink('p-cactions','javascript:document.getElementById("wpSave").click;','save','Save'); }

Make personal 'talk' link blink for new messages
Not much use on Wikia with shared new messages. Possibly will make a popdown list or something (as of this writing, shared new messages are broken, though). function checkMsgs { var divs = document.getElementById('bodyContent').getElementsByTagName('div'); if(divs.length <= 2) return; for(var i=0;i<divs.length;i++) { if(divs[i].className == 'usermessage') { divs[i].style.display = 'none'; var talk = document.getElementById('pt-mytalk').firstChild; talk.style.color='#ffff00'; talk.style.textDecoration='blink'; talk.style.background='#ffff00 url(http://upload.wikimedia.org/wikipedia/commons/9/96/New_%28animated%29.gif) no-repeat 0 0'; talk.style.paddingLeft='32px'; } } } addOnloadHook(checkMsgs)

=Other= Parserfunctions/magicwords/messages

"Did you delete the talk page?"

 * Note: It should no longer be necessary to put this into a template and transclude it. It should work directly from inside these MediaWiki message in most cases.

From a thread on Wikipedia:WP:VP/T: When deleting pages, often times the talk pages are forgotten, this can cause a rash of orphaned talk pages to hover around indefinitely. Sometimes a talk page should be kept as a valid indicator as to previous conversations about the page and why it should not exist, but most times the talk pages should be deleted (except in user: namespace). As of this writing, parserfunctions don't work in MediaWiki:Deletedtext, but transcluded parserfunctions do. (should work now without transcluding).

In: MediaWiki:Deletedtext: "$1" has been deleted. See $2 for a record of recent deletions.

In Template:Talkexist:

This can also be added to MediaWiki:Confirmdeletetext (and will show up similar to the "This page has a history" alert).

Per-namespace sitenotice
Sometimes this is requested. It is fairly straightforward with ParserFunctions, just put something like this into MediaWiki:Sitenotice:

The main namespace can sometimes cause problems as it is null, best to wrap it in dashes:

Slightly more advanced is putting a message in multiple namespaces, like for example all talk namespace. This is easier done with a #switch:

Image upload prompt
A template to ask you to upload an image if it doesn't exist, and automatically display it if it does.