לדלג לתוכן

משתמש:החבלן/common.js/WikiRace.js

מתוך ויקיפדיה, האנציקלופדיה החופשית

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
/*
סקיצה זו נכתבה על ידי אלעד
אזהרה: התוצאות אינן מדויקות ממספר סיבות:
1. ההפניות שכאן הן כל ההפניות - הן מגוף הערך והן מתבניות וכדו'
2. נכללים כאן דפי פירושונים.
3. דפי הפניה נספרים כדור בפני עצמו כך שייתכן שיש מסלול קצר יותר דרך דפי הפניה
Example=>

myNamespace.go('מפתח שבדי,4');

If you want arive from 'Big Data' to מפתח שבדי  type in console myNamespace.results['Big Data'].
This contains the genneration of this article and all the relations between big data and מפתח שבדי.
You can filter the hirarchi like this way=>

var bigData = myNamespace.results['Big Data'];
var minResults = Object.keys(bigData.hirarchi).filter(function(art){return (myNamespace.results[art].seq < bigData.seq)});
*/

var myNamespace = myNamespace || {};
myNamespace.maxSessions = 2000;// מקסימום הבקשות ללא תשובה בו זמנית
myNamespace.delay = 200;
myNamespace.query =window.location.origin+"/w/api.php?action=query&list=backlinks&bllimit=500&blnamespace=0&rawcontinue=&format=json&bltitle=";
myNamespace.titleRegex = /title=([^&]*)/;
myNamespace.generationRegex  = /a=([^&]*)/;
myNamespace.init = function() {
	myNamespace.results = {};
	ajaxOrchaster.init();
};
/*
article - המאמר שאליו רוצים להגיע
maxGennneration - עד איזה מרחק מהערך רוצים להגיע. 1- ערכים שמקושרים ישירות, ערך ברירת מחדל - 4
*/
myNamespace.go = function(article, maxGennneration) {
	myNamespace.init();
	myNamespace.maxGennneration = maxGennneration || 4;
	myNamespace.results[article] = 1;
	ajaxOrchaster.reqCount++;
	//a=1 טריק מלוכלך כדי לדעת באיזה דור אחנו עומדים
	$.get(myNamespace.query+article+'&a=1',getSubArt);
};


function getSubArt(res) {
	ajaxOrchaster.resCount++;
	//sequence - genneration
	var sequence = Number(this.url.match(myNamespace.generationRegex)[1]);
	//הערך שאליו מקושרות התוצאות
	var callTitle =this.url.match(myNamespace.titleRegex)[1];
	// האובייקט של הערך הזה
	var callObj =myNamespace.results[callTitle];
	
	// Has more results
	if (res["query-continue"]) {
		ajaxOrchaster.requests.push(myNamespace.query+callTitle+'&blcontinue='+res["query-continue"].backlinks.blcontinue + '&a=' + sequence);
	}
	if (sequence === 1) {
		// נחכה טיפונת כדי שיהיה לו על מה לעבוד
		window.setTimeout(ajaxOrchaster, 1000);
	}
	
	if (res.query) {
		if (sequence < myNamespace.maxGennneration) {// אנחנו נשלח בקשה עבור כל אחד מהערכים שחזרו
			res.query.backlinks.forEach(function(val){
				if (!myNamespace.results[val.title]) { // אם הערך לא קיים במילון נוסיף אותו
					myNamespace.results[val.title] = {hirarchi:{},seq:sequence};
					myNamespace.results[val.title].hirarchi[callTitle] =callObj;
					
					ajaxOrchaster.requests.push(myNamespace.query+val.title+'&a='+(sequence+1));
				} else if (myNamespace.results[val.title].hirarchi && !myNamespace.results[val.title].hirarchi[callTitle]) { // אם הערך קיים במילון אך עדיין לא מקושר לערך הספציפי
					myNamespace.results[val.title].hirarchi[callTitle] =callObj;
				}
			});
		} else { // רק נשמור את הערכים שחזרו
			res.query.backlinks.forEach(function(val){
				if (!myNamespace.results[val.title]) {
					myNamespace.results[val.title] = {hirarchi:{},seq:sequence};
					myNamespace.results[val.title].hirarchi[callTitle] =callObj;
				} else if (myNamespace.results[val.title].hirarchi && !myNamespace.results[val.title].hirarchi[callTitle]) {
					myNamespace.results[val.title].hirarchi[callTitle] =callObj;
				}
			});
		}
	}
}

// דואג שלא יהיו יותר מדי בקשות שלא חזרו בו זמנית
function ajaxOrchaster(){
	if (ajaxOrchaster.tryCount < 11) {
		while (ajaxOrchaster.requests.length && ajaxOrchaster.reqCount < ajaxOrchaster.resCount + myNamespace.maxSessions) {
			ajaxOrchaster.tryCount =0;
			ajaxOrchaster.reqCount++;
			$.get(ajaxOrchaster.requests.shift(),getSubArt);
		}
		window.setTimeout(ajaxOrchaster, myNamespace.delay);
		
		// אם אין לנו יותר בקשות ננסה 10 פעמים לפני שנחליט שאין יותר בקשות
		if(ajaxOrchaster.reqCount > 0 && !ajaxOrchaster.requests.length) {
			ajaxOrchaster.tryCount++;
		}
	} else {
		console.log('finnish!');
		alert('המירוץ הסתיים!');
		ajaxOrchaster.init();
		var result =  myNamespace.calculateMin(document.getElementById('rc_src_article_name').value, document.getElementById('rc_article_name').value);
		result = result.replace(/\r\n/g,"</li><li>");
		$('#rc_race_results').html('<br/>תוצאה:<br/><ul><li>' + result + '</li></ul>');
	}
}
ajaxOrchaster.init = function() {
	ajaxOrchaster.tryCount =0;
	ajaxOrchaster.reqCount =0;
	ajaxOrchaster.resCount =0;
	ajaxOrchaster.requests = [];
};
myNamespace.init();
myNamespace.run = function() {
	myNamespace.go(document.getElementById('rc_article_name').value,document.getElementById('rc_genneration').value);
};

$('#p-navigation').after(
	'<div class="portal" id="wikiRace">'+
		'<h3>מירוץ ויקיפדיה</h3>'+
			'<div class="body" id="div_race_body">'+
				'שם ערך המקור<br/>'+
				'<input id="rc_src_article_name" style="width:90px"/><br/>'+
				'שם ערך היעד<br/>'+
				'<input id="rc_article_name" style="width:90px"/>'+
				'מספר דורות<br/>'+
				'<input id="rc_genneration" type="number" min="1" max="6" value="4" style="width:30px"/><br/>'+
				'<input type="button" onclick="myNamespace.run()" value="הרץ"/>'+
				'<span id="rc_race_results"></span>'+
				'<a id="rc_dwonload_csv_link" style="display:none">יצא לאקסל</a>'+
			'</div>'+
		'</div>');

//Function for calculate the short way (Warning: be carful with this)
myNamespace.calculateMin = function(source,target){
	var currArt = myNamespace.results[source];
	var result = 'לא נמצאה דרך';
	
	if (currArt) {
		myNamespace.minHirarchies = myNamespace.getSubWays([source],source,target);
		if (!(myNamespace.minHirarchies[0]  instanceof Array)) {
			myNamespace.minHirarchies = [myNamespace.minHirarchies];
		}
		result = myNamespace.minHirarchies[0].join('\r\n');
		myNamespace.createCSV();
	}
	
	return (result);
};

myNamespace.getSubWays = function(preArray ,currArtName, target) {
	var currArt = myNamespace.results[currArtName];
	var result;

	if (currArt.hirarchi[target]) {
		result =preArray.concat(target);
	} else {
		var minResults = Object.keys(currArt.hirarchi).filter(function(art){return (myNamespace.results[art].seq < currArt.seq)});
		result=[];
		
		for (var i = 0; i < minResults.length; i++) {
			var currArray = preArray.concat(minResults[i]);
			var results = myNamespace.getSubWays(currArray ,minResults[i], target);
			if (results[0] instanceof Array) {
				result=result.concat(results);
			} else {
				result.push(results);
			}
		}
	}
	return result;
};

myNamespace.createCSV = function () {
	if (myNamespace.minHirarchies) {
		var a = myNamespace.minHirarchies.join('\r\n').split('');
		var b = a.map(function(chr){return chr.charCodeAt(0) >255 ? chr.charCodeAt(0)-1264:chr.charCodeAt(0)});
		var c = String.fromCharCode.apply(null,b);
		var d = btoa(c);
		var link = document.getElementById('rc_dwonload_csv_link');
		link.style.display = 'block';
		link.href='data:application/vnd.ms-excel;base64,' + d;
		link.download = 'Wiki_Race.csv';
	}
};