Benutzer:Deus Figendi/HotCat simcat extension.js

Aus Jedipedia

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
function strip_namespace (s) {
	//This function trims the Namespace-Prefix off a string.
	//Returns: Boolean
	//Called in: ajax_catlist_return()
	return(s.substr(s.indexOf(':')+1));
}

function is_in_array(element2search,array2search) {
	// This function checks if the element2search is in the array2search
	// used to remove the categories allready in the article from the
	//                list of similar categories.
	// Returns:Boolean
	// Might be replaced by a function of jQuery or other framework.
	
	//This function is called by ajax_catlist_return()
	var did_find = false;
	for(var i=0; i<array2search.length; i++) {
		if (array2search[i] == element2search) did_find = true;
	}
	return did_find;
}

//CHANGE ME
//Can be removed if the API always returns sorted results.
function countsort_callback(a,b) {
	// A callback-function to sort arrays of objects by the property
	//                                   "count" (highest to lowest)
	//Returns:integer (signed)
	//This function is called by ajax_catlist_return()
	
	return b.count-a.count;
}

function add_simcat_a(cat_name,count_value,li_caption,hidden) {
	//Adds an a- and an br-element to the list of similar categories
	
	//Returns nothing
	//This function is called by ajax_catlist_return()

	var new_simcat_a = document.createElement('a');
	new_simcat_a.title="auswählen";
	new_simcat_a.href="javascript:hotcat_edit('vorschlagclick',new Array('createcatname','"+cat_name+"'));"
	var new_simcat_count_label = document.createElement('span');
	new_simcat_count_label.style.verticalAlign = 'text-top';
	new_simcat_count_label.style.fontSize = 'xx-small';
	new_simcat_count_label.appendChild(document.createTextNode(' ('+count_value+')'));
	new_simcat_a.appendChild(document.createTextNode('↴ '+cat_name));
	new_simcat_a.appendChild(new_simcat_count_label);
	var new_simcat_br = document.createElement('br');
	
	document.getElementById('vorschlaegecreatecatname').appendChild(new_simcat_br);
	document.getElementById('vorschlaegecreatecatname').appendChild(new_simcat_a);
	
}

function ajax_catlist_return(request_object) {
	// Callback-function for a request to get the similar categories
	//                                 of a list of given categories.
	// Called by request_simcats
	
	//First searches the object for categories and add them to a
	//     simcat_array (its an object, I just called it an array).
	//     While this it does not add categories given to the page
	//     or baned by the user.
	//
	//The simcat_array-object is an array of objects. This way (json):
	//     simcat_array:[
	//                    { count:2  , catname:"catname1" , id:11},
	//                    { count:25 , catname:"catname2" , id:22},
	//                    { count:6  , catname:"catname3" , id:44}
	//                   ]
	//
	//Second sorts that array high2low by "count"
	//
	//Third step is to clear the simcat_list
	//
	//Fourth the function adds the twenty items with the highest count.
	if (request_object.readyState == 4) {
		var my_responseObject = request_object.responseXML;
		//CHANGE ME ===================================================
		//This is just for testing... 'cause I'll never get the correct
		//response ^^ just remove it.
		my_responseObject =       '<?xml version="1.0"?>';
		my_responseObject += "\n"+'<api>';
		my_responseObject += "\n"+'  <query>';
		my_responseObject += "\n"+'    <simcats>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Jahre" count="123" pageid="100"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Jahre der Galaktischen Republik" count="120" pageid="200"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:B-Serie Kampfdroiden" count="111" pageid="300"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Jahre der Galaktischen Föderation freier Allianzen" count="102" pageid="400"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:GR-75 Transporter" count="96" pageid="600"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Raumschiffe" count="86" pageid="800"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Raumschiffe der Rebellen-Allianz" count="84" pageid="1100"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Khormai" count="72" pageid="1200"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Personen" count="70" pageid="1400"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Baustellen" count="66" pageid="1500"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Hybriden" count="62" pageid="1600"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Kiffar" count="57" pageid="1700"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Menschen" count="51" pageid="1800"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Personen" count="47" pageid="1900"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Unvollständige Artikel" count="41" pageid="1834"/> ';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Planeten" count="37" pageid="1737"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Planeten des Korporationssektors" count="33" pageid="1762"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Planeten des Äußeren Randes" count="22" pageid="1234"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Planeten" count="21" pageid="1463"/>';
		my_responseObject += "\n"+'      <cl ns="14" title="Kategorie:Planeten des Sanbra-Sektors" count="20000" pageid="1122"/>';
		my_responseObject += "\n"+'    </simcats>';
		my_responseObject += "\n"+'  </query>';
		my_responseObject += "\n"+'</api>';

		my_responseObject = new DOMParser().parseFromString(my_responseObject, "text/xml");
		//Remove 'til here ! ===================================================
		
		
		var simcat_array = new Array();
		var cats_not2list = getGivenCategories();
		for (var i = 0; i < my_responseObject.getElementsByTagName('cl').length && i < 20; i++) {
			if (!is_in_array(strip_namespace(my_responseObject.getElementsByTagName('cl')[i].getAttribute('title')),cats_not2list)) {
				simcat_array[i] = new Object();
				simcat_array[i].count = my_responseObject.getElementsByTagName('cl')[i].getAttribute('count');
				simcat_array[i].catname = strip_namespace(my_responseObject.getElementsByTagName('cl')[i].getAttribute('title'));
				simcat_array[i].id = my_responseObject.getElementsByTagName('cl')[i].getAttribute('pageid');
			}
		}
		
		//CHANGE ME:
		//Sorting can be dropped if the API always returns sorted results
		simcat_array.sort(countsort_callback);
		
		//Clear the list:
		var simcat_list = document.getElementById('vorschlaegecreatecatname');
		while (simcat_list.getElementsByTagName("a").length > 0) {
			simcat_list.removeChild(simcat_list.getElementsByTagName("a")[0]);
		}
		while (simcat_list.getElementsByTagName("br").length > 0) {
			simcat_list.removeChild(simcat_list.getElementsByTagName("br")[0]);
		}

		//Fill the box:
		for (var i = 0; i < 20 && i < simcat_array.length; i++) {
			add_simcat_a(simcat_array[i].catname,
						  simcat_array[i].count,
			              simcat_array[i].catname+' ('+simcat_array[i].count+')',
			              Math.round(i/20)
			);
		}
		
	}
}

function getGivenCategories() {
	//This function is to get alle categories the article belongs to
	//Returns: array of strings
	//Might be replaced by a global variable or existing function...
	
	//This function is called by ajax_catlist_return and request_simcats
	var return_array = new Array();
	var cat_div = document.getElementById("mw-normal-catlinks");
	var cat_spans = cat_div.getElementsByTagName("span");
	var this_href = "";
	for (var i = 0; i < cat_spans.length; i++) {
		if (cat_spans[i].getElementsByTagName("a").length > 0) {
			return_array.push(cat_spans[i].getElementsByTagName("a")[0].firstChild.data);
		}
	}
	return return_array;
}

function request_simcats(query_type) {
	//This function creates an API-request for "similar categories"
	//and sends it.
	
	//called by add_simcatlist (or events of the input-box for categories)
	
	if(document.getElementById('createcatname').value.length == 0) {
		//CHANGE ME!!!
		// getGivenCategories() tells a list of categories the article belongs
		// to. Might be replaces by a global variable or an existing function.
		var given_category_list = getGivenCategories();
		
		// create a query of these categories...
		var api_query = "action=query&list=simcats";
		if (query_type == 'inline') {
			//The given cats are noted in a list and requested by GET
			api_query+= "&sclist="+encodeURIComponent(given_category_list.join("|"));
		} else if (query_type == 'array') {
			//The given cats are noted in an array and requested by POST
			for (var i = 0; i < given_category_list.length; i++) {
				api_query+= "&scarray[]="+encodeURIComponent(given_category_list[i]);
			}		
		}
		api_query+= "&sclimit=20&format=xml";
		
		//Create and send the request
		var ajax_pagerequest = new XMLHttpRequest();
		if (query_type == 'inline') {
			ajax_pagerequest.open('GET', "http://www.jedipedia.net/w/api.php", true);	
		} else {
			ajax_pagerequest.open('POST', "http://www.jedipedia.net/w/api.php", true);	
		}
		ajax_pagerequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		ajax_pagerequest.onreadystatechange = function() { ajax_catlist_return(this); }
		ajax_pagerequest.send(api_query);
	}	
}

function add_simcatlist() {
	//This function does not do anything ^^
	//these events can also be added otherway.
	document.getElementById('createcatname').addEventListener("focus", function(e) { request_simcats('inline'); } ,false);
	document.getElementById('createcatname').addEventListener("keyup", function(e) { request_simcats('inline'); } ,false);
}


// CHANGE ME!!!
// this is where everything begins ^^
// A button is created to request similar categories.
// But add_simcatlist() might also be called otherways but it should be
// called only one time (kinda initiation).
//if (document.getElementById("catlinks")) {
	var hce_link = document.createElement("input");
	hce_link.type = "button";
	hce_link.style.display = "block";
	hce_link.value = "HC erweitern";
        hce_link.style.position = "fixed";
        hce_link.style.right = "1em";
        hce_link.style.top = "1em";
	hce_link.addEventListener("click", function(e) { add_simcatlist(); } ,false);
//	document.getElementById("catlinks").parentNode.insertBefore(hce_link,document.getElementById("catlinks"));
        document.getElementsByTagName("body")[0].appendChild(hce_link);
	
//}