Gebruiker:Michielderoo/interwiki-tools-dev.js

Uit Wikipedia, de vrije encyclopedie

Opmerking: nadat u de wijzigingen hebt gepubliceerd is het wellicht nodig uw browsercache te legen.

  • Firefox / Safari: houd Shift ingedrukt terwijl u op Vernieuwen klikt of druk op Ctrl-F5 of Ctrl-R (⌘-Shift-R op een Mac)
  • Google Chrome: druk op Ctrl-Shift-R (⌘-Shift-R op een Mac)
  • Internet Explorer / Edge: houd Ctrl ingedrukt terwijl u op Vernieuwen klikt of druk op Ctrl-F5
  • Opera: druk op Ctrl-F5.
/*
Author: Michiel de Roo
released under cc-by-sa 3.0, 2012
 
==Example configuration==
 
var interwikiTools = {}; 
interwikiTools.auto = true;
interwikiTools.sort = true;
interwikiTools.toplinks = ["en", "de", "fr"];
interwikiTools.translateLink = true;
interwikiTools.userConfig = true;
 
// load language file
mw.loader.load('//nl.wikipedia.org/w/index.php?title=Gebruiker:Michielderoo/interwiki-translation-nl.js&action=raw&ctype=text/javascript');
 
*/

console.log("loading interwiki-tools");

// initialize default configuration if none
if(typeof interwikiTools=='undefined') { 
 
	// init object
	var interwikiTools = {}; 
}
 
if(!interwikiTools.userConfig) {
	interwikiTools.auto = true;
	interwikiTools.sort = true;
	interwikiTools.translateLink = true;
}
 
// these interwiki's are put on top of the list
if(!interwikiTools.toplinks) interwikiTools.toplinks = [];
 
// set default language to english, if no language is set.
if(!interwikiTools.translation && !interwikiTools.configTranslation) { 
	console.log("loading language nl");
	mw.loader.load('//nl.wikipedia.org/w/index.php?title=Gebruiker:Michielderoo/interwiki-translation-nl.js&action=raw&ctype=text/javascript'); 
} 
 
// some private variables, don't touch these
interwikiTools.original = [];
interwikiTools.originalTitle = [];
interwikiTools.originalLang = [];
interwikiTools.translated = false;
 
addLoadEvent(initInterwikiTools);
 
getWPLanguageCode();
 
/* Function to translate the interwiki links in the sidebar to another language.
*/ 
function startInterwikiTools() {
 	
	// switch used to create a toggle effect
	if(interwikiTools.translated) return resetInterwikiTools();
	
	// initalize the array to order the items
	var ordered = [];
	var toplinks = [];
	var bottomlinks = [];
	
	// create a list of interwikilink classes with their corresponding translation
	var translation = [];
	for(var key in interwikiTools.translation) {
	  translation["interwiki-" + key] = interwikiTools.translation[key];
	}
	
	// index the toplinks by their short language code (e.g. en, de ,fr)
	var toplinksIndex = [];
	for(var key in interwikiTools.toplinks) {
		toplinksIndex[interwikiTools.toplinks[key]] = 1;
	}
	
	// get the main container from sidebar
	var container = document.getElementById("p-lang");
	if (!container) return;
 
	// get the childs from the container and start to loop
	var childs = container.getElementsByTagName("li");
	var cnt = 0; var start = interwikiTools.translateLink?1:0; var cnt_bottom = 0;
	for (i=start;i<childs.length;i++) {
		
		// get the first class of the element
		var matches = childs[i].getAttribute('class').match(/interwiki-[a-z\-]*/);
		if(matches && matches.length>0) iwclass = matches[0];
		else iwclass="";
		
		// get the anchor element
		var anchor = childs[i].getElementsByTagName("a").item(0);
		if(iwclass.substring(0,10)=='interwiki-') {	
			if(translation[iwclass]) {
	
				// swap link title with the translation
				anchor.innerHTML = translation[iwclass];
				anchor.lang = "en";
				
				// store the element in either the toplinks array or the array to be ordered
				if(toplinksIndex[anchor.hreflang]) {
					toplinks[anchor.hreflang] = {title: translation[iwclass], content: childs[i]};
				}
				else {
					ordered[cnt++] = {title: anchor.innerHTML, content: childs[i]};
				}
			}
			else {
				ordered[cnt++] = {title: anchor.innerHTML, content: childs[i]};
			}
		}
		else {
			bottomlinks[cnt_bottom++] = {title: anchor.innerHTML, content: childs[i]};
		}
	}
	
	// sort the array using locale compare function
	if(interwikiTools.sort) ordered.sort(function(a,b) { return a.title.localeCompare(b.title); });
	
	// get ul element so we can remove the old items and put the sorted items back
	var ul = container.getElementsByTagName("ul");
	if (!ul) return; if (ul.length != 1) return; ul = ul[0];
	
	var child;
	// remove all items
	while (child = ul.firstChild) {
	  ul.removeChild(child);
	}
	
	// append ordered items
	addTranslateLink(container);
	for(key in interwikiTools.toplinks) {
		if(toplinks[interwikiTools.toplinks[key]]) 
			ul.appendChild(toplinks[interwikiTools.toplinks[key]].content);
	}
	
	for (i=0;i<ordered.length;i++) {
	  ul.appendChild(ordered[i].content);
	}

	for (i=0;i<bottomlinks.length;i++) {
	  ul.appendChild(bottomlinks[i].content);
	}

	// toggle translated switch
	interwikiTools.translated = !interwikiTools.translated;
	
}

function initInterwikiTools() {
	// get the main container from sidebar
	var container = document.getElementById("p-lang");
	if (!container) return;
	
	// store the original items
	childs = container.getElementsByTagName("li");
	for (i=0;i<childs.length;i++) {
		interwikiTools.originalTitle[i] = childs[i].getElementsByTagName("a").item(0).innerHTML;
		interwikiTools.originalLang[i] = childs[i].getElementsByTagName("a").item(0).lang;
		interwikiTools.original[i] = childs[i];
	}
	
	addTranslateLink(container);	
	
	if(interwikiTools.auto) startInterwikiTools();
}

function resetInterwikiTools() {

	// get the main container from sidebar
	var container = document.getElementById("p-lang");
	if (!container) return;

	var ul = container.getElementsByTagName("ul");
	if (!ul) return; if (ul.length != 1) return;
	ul = ul[0];
	
	var child;
	// remove all items
	while (child = ul.firstChild) {
	  ul.removeChild(child);
	}

	// append ordered items
	addTranslateLink(container);	
	for (i=0;i<interwikiTools.original.length;i++) {
		interwikiTools.original[i].getElementsByTagName("a").item(0).innerHTML = interwikiTools.originalTitle[i];
		interwikiTools.original[i].getElementsByTagName("a").item(0).lang = interwikiTools.originalLang[i];
		ul.appendChild(interwikiTools.original[i]);
	}
	interwikiTools.translated = !interwikiTools.translated;
	
}

function addTranslateLink(container) {
	
	if(!interwikiTools.translateLink) return;
	
	newNode = document.createElement("li");
	newNode.className = "interwiki-translate";
	newNode.innerHTML = "<a href='' onClick='startInterwikiTools(); return false;'>" + interwikiTools.translation["translate"] + "</a>";

	var ul = container.getElementsByTagName("ul");
	if (ul) {
		ul = ul[0];
		ul.insertBefore(newNode,ul.firstChild);
	}
}


// code by ExpressingIT
function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
       window.onload = func
    } else {
       window.onload = function() {
           if (oldonload) {
                  oldonload()
          }
          func()
       }
   }
}

// parse the language code from the domain.
function getWPLanguageCode() {
	url = window.location.hostname;
	return url.match(/(.[^\.]+)/)[1];
}