משתמש:החבלן/common.js/WikiRace.js
מראה
< משתמש:החבלן | common.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';
}
};