مدیاویکی:LeadGenerator.js

از ویکی‌خبر، مرجع خبری آزاد

نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • اینترنت اکسپلورر/ Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
  • اپرا: Ctrl-F5 را بفشارید.
importScript('Mediawiki:mwapilib2.js');
if (!window.Bawolff) {
 window.Bawolff = {};
}
// http://fa.wikinews.org/w/api.php?action=query&prop=revisions&titles=الگو:مقالهٔ_آغازین_۱|الگو:مقالهٔ_آغازین_۲|الگو:مقالهٔ_آغازین_۳|الگو:مقالهٔ_آغازین_۴|الگو:مقالهٔ_آغازین_۵&rvprop=timestamp|content
//Call as Bawolff.leadGen(pageName, 1, alert)
//replacing 1 with which lead (1-5), alert with your callback
//optionally takes summary method (as numeric) argument. choose 0-4
Bawolff.leadGen = function (title, leadNumb, callback, summaryMethod) {
 api(title).getPage().lift(Bawolff.leadGen.extract, title, summaryMethod).lift(Bawolff.leadGen.create, leadNumb).lift(callback, title).exec();
}

/********
This is a list that maps categories/infboxes to generic images

Note: the category map only works with categories explicity included. it does not count categories included by templates
Note: this does not consider templates with parameters

*****/
Bawolff.leadGen.imgMap = { "UK" : "Flag of the United Kingdom.svg",
 "ایالات متحده آمریکا": "Flag of the United States.svg",
 "کانادا": "Flag of Canada.svg",
 "Computing": "Computer-aj aj ashton 01.svg",
 "Google": "Google logo png.png",
 "Obituary": "Wikinews tag obituary.png",
 "Science and technology infobox": "Science-symbol-2.svg",
 "Science and technology": "Science-symbol-2.svg",
"ASEAN": "LocationASEAN.png", "افغانستان": "LocationAfghanistan.png", "آلبانی": "LocationAlbania.png", "الجزایر": "LocationAlgeria.png", "آندورا": "LocationAndorra.png", "آنگولا": "LocationAngola.png", "Antarctica": "LocationAntarctica.png", "Argentina": "LocationArgentina.png", "Armenia": "LocationArmenia.png", "استرالیا": "LocationAustralia.png", "Austria": "LocationAustria.png", "بحرین": "LocationBahrain.png", "باهاما": "LocationBahamas.png", "Barbados": "LocationBarbados.png", "Belarus": "LocationBelarus.png", "Belgium": "LocationBelgium.png", "Bangladesh": "LocationBangladesh.png", "Azerbaijan": "LocationAzerbaijan.png", "Belize": "LocationBelize.png", "بنین": "LocationBenin.png", "Bhutan": "LocationBhutan.png", "Brazil": "LocationBrazil.png", "Brunei": "LocationBrunei.png", "Bolivia": "LocationBolivia.png", "Botswana": "LocationBotswana.png", "Burkina Faso": "LocationBurkinaFaso.png", "Burundi": "LocationBurundi.png", "بلغارستان": "LocationBulgaria.png", "Cameroon": "LocationCameroon.png", "چاد": "LocationChad.png", "Cape Verde": "LocationCapeVerde.png", "Central African Republic": "LocationCentralAfricanRepublic.png", "شیلی": "LocationChile.png", "چین": "LocationChina.png", "Colombia": "LocationColombia.png", "Comoros": "LocationComoros.png", "Croatia": "LocationCroatia.png", "کاستاریکا": "LocationCostaRica.png", "کوبا": "LocationCuba.png", "قبرس": "LocationCyprus.png", "جمهوری چک": "LocationCzechRepublic.png", "Denmark": "LocationDenmark.png", "Djibouti": "LocationDjibouti.png", "دومینیکا": "LocationDominica.png", "Dominican Republic": "LocationDominicanRepublic.png", "مصر": "LocationEgypt.png", "Ecuador": "LocationEcuador.png", "East Timor": "LocationEastTimor.png", "El Salvador": "LocationElSalvador.png", "Equatorial Guinea": "LocationEquatorialGuinea.png", "Eritrea": "LocationEritrea.png", "Estonia": "LocationEstonia.png", "فیجی": "LocationFiji.png", "فنلاند": "LocationFinland.png", "Ethiopia": "LocationEthiopia.png", "فرانسه": "LocationFrance.png", "Gabon": "LocationGabon.png", "Gambia": "LocationGambia.png", "Georgia": "LocationGeorgia.png", "آلمان": "LocationGermany.png", "غنا": "LocationGhana.png", "Greece": "LocationGreece.png", "Grenada": "LocationGrenada.png", "Guatemala": "LocationGuatemala.png", "Guinea": "LocationGuinea.png", "Guyana": "LocationGuyana.png", "Haiti": "LocationHaiti.png", "Honduras": "LocationHonduras.png", "مجارستان": "LocationHungary.png", "ایسلند": "LocationIceland.png", "اندونزی": "LocationIndonesia.png", "ایران": "LocationIran.png", "عراق": "LocationIraq.png", "Isle of Man": "LocationIsleofMan.png", "ایتالیا": "LocationItaly.png", "اسرائیل": "LocationIsrael.png", "ژاپن": "LocationJapan.png", "جامائیکا": "LocationJamaica.png", "اردن": "LocationJordan.png", "Kazakhstan": "LocationKazakhstan.png", "کویت": "LocationKuwait.png", "قرقیزستان": "LocationKyrgyzstan.png", "Laos": "LocationLaos.png", "Latvia": "LocationLatvia.png", "Lebanon": "LocationLebanon.png", "Kenya": "LocationKenya.png", "Lesotho": "LocationLesotho.png", "Liberia": "LocationLiberia.png", "Libya": "LocationLibya.png", "Liechtenstein": "LocationLiechtenstein.png", "Lithuania": "LocationLithuania.png", "Luxembourg": "LocationLuxembourg.png", "Madagascar": "LocationMadagascar.png", "Malawi": "LocationMalawi.png", "Maldives": "LocationMaldives.png", "Malaysia": "LocationMalaysia.png", "مالی": "LocationMali.png", "Malta": "LocationMalta.png", "Mauritania": "LocationMauritania.png", "Mexico": "LocationMexico.png", "Mauritius": "LocationMauritius.png", "Moldova": "LocationMoldova.png", "Monaco": "LocationMonaco.png", "Montenegro": "LocationMontenegro.png", "Morocco": "LocationMorocco.png", "Mongolia": "LocationMongolia.png", "Mozambique": "LocationMozambique.png", "میانمار": "LocationMyanmar.png", "نپال": "LocationNepal.png", "Namibia": "LocationNamibia.png", "هلند": "LocationNetherlands.png", "نیوزیلند": "LocationNewZealand.png", "Nicaragua": "LocationNicaragua.png", "نیجریه": "LocationNigeria.png", "کره شمالی": "LocationNorthKorea.png", "نیجر": "LocationNiger.png", "Norway": "LocationNorway.png", "عمان": "LocationOman.png", "Pakistan": "LocationPakistan.png", "فلسطین": "LocationPalestine.png", "Papua New Guinea": "LocationPapuaNewGuinea.png", "پاناما": "LocationPanama.png", "پاراگوئه": "LocationParaguay.png", "پرو": "LocationPeru.png", "فیلیپین": "LocationPhilippines.png", "پرتغال": "LocationPortugal.png", "لهستان": "LocationPoland.png", "قطر": "LocationQatar.png", "رومانی": "LocationRomania.png", "روسیه": "LocationRussia.png", "Rwanda": "LocationRwanda.png", "Saint Lucia": "LocationSaintLucia.png", "سن مارینو": "LocationSanMarino.png", "عربستان سعودی": "LocationSaudiArabia.png", "سیشل": "LocationSeychelles.png", "صربستان": "LocationSerbia.png", "سیرالئون": "LocationSierraLeone.png", "سنگال": "LocationSenegal.png", "سنگاپور": "LocationSingapore.png", "اسلواکی": "LocationSlovakia.png", "اسلوونی": "LocationSlovenia.png", "سومالیا": "LocationSomalia.png", "Solomon Islands": "LocationSolomonIslands.png", "آفریقای جنوبی": "LocationSouthAfrica.png", "کره جنوبی": "LocationSouthKorea.png", "اسپانیا": "LocationSpain.png", "سریلانکا": "LocationSriLanka.png", "سورنام": "LocationSuriname.png", "سودان": "LocationSudan.png", "سوازیلند": "LocationSwaziland.png", "سوئد": "LocationSweden.png", "سوئیس": "LocationSwitzerland.png", "سوریه": "LocationSyria.png", "تایوان": "LocationTaiwan.png", "تاجیکستان": "LocationTajikistan.png", "تانزانیا": "LocationTanzania.png", "تایلند": "LocationThailand.png", "توگو": "LocationTogo.png", "تانگا": "LocationTonga.png", "تونس": "LocationTunisia.png", "ترکمنستان": "LocationTurkmenistan.png", "ترکیه": "LocationTurkey.png", "اوگاندا": "LocationUganda.png", "اکراین": "LocationUkraine.png", "امارات متحده عربی": "LocationUnitedArabEmirates.png", "بریتانیا": "LocationUnitedKingdom.png", "اروگوئه": "LocationUruguay.png", "ازبکستان": "LocationUzbekistan.png", "واتیکان": "LocationVaticanCity.png", "ونزوئلا": "LocationVenezuela.png", "ویتنام": "LocationVietnam.png", "یمن": "LocationYemen.png", "زامبیا": "LocationZambia.png", "صحرای غرب": "LocationWesternSahara.png", "زیمباوه": "LocationZimbabwe.png"}

//takes the source of a wikipage, extracts the first image name without the leading namespace
Bawolff.leadGen.extractImg = function (page) {
 var imgRegex = /\[\[(?:[iI][mM][aA][gG][eE]\:|[fF][Ii][lL][eE]\:|پرونده:)((?:[^\|\]])*?\.[pPsSjJgG][nNvVpPiI][gGeEfF][gG]?)[\|\]]?/;
 var img = imgRegex.exec(page);
 if (img && img.length >= 2) {
  return img[1];
 }
 else {
  var infoboxRegex = /\{\{([^|}]*)\}\}/g;
  var categoryRegex = /\[\[[cC]ategory:([^|\]]*)(?:\|[^\]]*)?\]\]/g;
  //js seems to reuse these objects from prev calls without reseting lastIndex. reset lastIndex.
  infoboxRegex.lastIndex = categoryRegex.lastIndex = 0;
  var item; //note doesn't match infoboxes w/params

  while (item = infoboxRegex.exec(page)) {
   item = item[1];
   item = item.charAt(0).toUpperCase() + item.substring(1, item.length);
   if (Bawolff.leadGen.imgMap[item]) return Bawolff.leadGen.imgMap[item];
  }
  while (item = categoryRegex.exec(page)) {
   item = item[1];
   item = item.charAt(0).toUpperCase() + item.substring(1, item.length);
   if (Bawolff.leadGen.imgMap[item]) return Bawolff.leadGen.imgMap[item];
  }

  //return "Wikinews-logo.png"; //default
  return "";
 } 

}
Bawolff.leadGen.extractType = function (page) {
 //valid types are: breaking, special, original, exclusive, urgent or none.
 //this currently does not detect special or urget.
 if (page.match(/\{\{[bB]reaking(?: [nN]ews)?\}\}/)) {
  return "breaking";
 }
 else if (page.match(/\{\{[iI]nterview(?:\|[^}]*)?\}\}/i)) {
  return "exclusive";
 }
 else if (page.match(/\{\{[oO]riginal(?: reporting)?(?:\|[^}]*)?\}\}/i)) {
  return "original";
 }
 else {
  //default
  return "none";
 } 

}

Bawolff.leadGen.takeIntro = function (pageText, method) {
 //first test for redirects.
 var isRedirect = pageText.match(/^#تغییرمسیر\s?\[\[([^\]]*)\]\]/i)
 if (isRedirect) {
  alert("It appears you are trying to use make lead on a redirect page. Please use the real page name instead (" + isRedirect[1] + ").");
  throw new Error("Page is redirect. please manually resolve to: " + isRedirect[1] );
 }

 //doesn't handle links that make [1].
 //intentionally doesn't strip ' chars (bold or italic)
 //as this often marks thigs with periods (E. coli)
 //method is a number (must be a number. no type conversion preformed).
 // 0: 1st sentence
 // 1: 1st two senetences
 // 2: 1st paragraph
 // 3: 1st 250 characters (+ a couple so we don't end in middle of word), or paragraph
 // 4: 1st 500 characters-ish, or paragraph
 var stripTemplates = /\{\{[^\}\{]*(?:\{\{[^\}\{]*(?:\{\{[^\}\{]*(?:\{\{[^\}\{]*\}\})?\}\})?\}\})?\}\}/g;
 //the img regex, looks for a start of the image, than checks for nested internal links, external links, and for ending ]] in caption
 //templates shold already be stripped at this point.
 var img = /\[\[(?:[iI][mM][aA][gG][eE]\:|[fF][Ii][lL][eE]\:|پرونده:)((?:[^\|\]])*?\.[pPsSjJgG][nNvVpPiI][gGeEfF][gG]?)[\|\]]?/;

 pageText = pageText.replace(stripTemplates, '')
 pageText = pageText.replace(img, '');
 var pipedLink = /\[\[[^\]\|]*\|([^\]\|]*)\]\]/g;
 pageText = pageText.replace(pipedLink, '$1');
 var normLink = /\[\[([^\]\|]*)\]\]/g;
 pageText = pageText.replace(normLink, '$1');
 var extLink = /\[(?:http|ftp|gopher|irc|https)\:[^\]\s]*\s?([^\]]*)]/g
 pageText = pageText.replace(extLink, '$1');
 var firstPar;
 switch (method) {
  case 1: //1st 2 sentence or 1st paragraph
   firstPar = /[^\n]+?\s*\.(?=\s)(?:[^\n]+?\s[^\s\.]*\.(?=\s)|(?=\s))/;
   pageText = pageText.match(firstPar)[0];
   break;
  case 2: //1st paragraph
   firstPar = /[^\n]+?(?=\n)/;
   pageText = pageText.match(firstPar)[0];
   break;
  case 3: // 1st 250 characters-ish
   firstPar = /[^\n]{2,250}.*?\b/;
   pageText = pageText.match(firstPar)[0] + "...";
   break;
  case 4: //1st 500 characters-ish
   firstPar = /[^\n]{2,500}.*?\b/;
   pageText = pageText.match(firstPar)[0] + "...";
   break;
  default: //aka case 0. 1st sentence
   firstPar = /[^\n]+?\s[^\s\.]*\.(?=\s)/;
   pageText = pageText.match(firstPar)[0];
   break;
 }
 return pageText;
}

Bawolff.leadGen.extract = function(pageText, pageName, summaryMethod) {
//editlink is overriden later.
return { width:'100x100px',
         image: Bawolff.leadGen.extractImg(pageText),
         title: pageName,
         synopsis: Bawolff.leadGen.takeIntro(pageText, summaryMethod),
         order: 'right',
         edit_this: 'ویکی‌خبر:صفحه تمرین',
         type: Bawolff.leadGen.extractType(pageText)
         };
}


Bawolff.leadGen.create = function (leadObj, leadNumb) {
 if (leadNumb === 1) {
  leadObj.width = "150x150px"; //ugly i know, but whatever.
 }
 var res = '{' + '{آغازین ۲٫۰';
 res += "\n |شماره=" + leadNumb + " <!-- تغییر ندهید، هر بخش آغازینی باید شمارهٔ منحصر به فرد خود را داشته باشد -->";
 res += "\n |تصویر=" + leadObj.image;
 res += "\n |عرض=" + leadObj.width;
 res += "\n |نوع=" + leadObj.type;
 res += "\n |عنوان=" + leadObj.title;
 res += "\n |عنوان کوتاه=";
 res += "\n |خلاصه=" + leadObj.synopsis;
 res += "\n}}<noinclude>\n{{"
 res += "توضیحات مقاله آغازین}}</noinclude>";

 return res;
}
//calls its argument giving it an object with meta info about the current leads.
//probably want to use Bawolff.leadGen.makeLeadTable instead.

Bawolff.leadGen.makeLeadMetaObject = function (callback) {
 var leadObj = function (doc) {
  var exTitle = function (text) {
   text = text.replace(/[\s\S]*?\|عنوان=([^\|]*)[\s\S]*/, '$1');
   text = text.replace(/\s*$/, '');
   return text;
  }
  var pages = doc.getElementsByTagName('page');

  var obj = {}, time, time2 = Infinity;
  for (var i = 0; i < pages.length; i++) {
   pages[i].getElementsByTagName('rev')[0].normalize();
   time = Bawolff.mwapi.parseAPIDate(pages[i].getElementsByTagName('rev')[0].getAttribute('timestamp'));
   //This is really ugly...
   //put the oldest lead in a global variable.
   if (time < time2) { //this compares miliseconds after epoch
    Bawolff.leadGen.oldestLead = pages[i].getAttribute('title');
    time2 = time;
   }
   obj[pages[i].getAttribute('title')] = {timestamp: time,
   title: exTitle(pages[i].getElementsByTagName('rev')[0].firstChild.data)};
  }
  return obj;
 }
 api().makeRequest({action: 'query', prop: 'revisions', titles: 'الگو:مقالهٔ_آغازین_۱|الگو:مقالهٔ_آغازین_۲|الگو:مقالهٔ_آغازین_۳|الگو:مقالهٔ_آغازین_۴|الگو:مقالهٔ_آغازین_۵', prop: 'revisions', rvprop: 'timestamp|content'}, leadObj).lift(callback).exec();
}


Bawolff.leadGen.oldestLead = null;
Bawolff.leadGen.makeLeadTable = function (callback) {
 var wrapper = function(leadObj) {
  var html = '<table class="wikitable"><caption>خبرهای فعلی صفحهٔ اصلی:</caption>';
  html += '<thead><tr><th>شماره</th><th>موقعیت</th><th>خبر</th><th>مدت</th></tr></thead><tbody>';
  for (var i in leadObj) {
   if (leadObj.hasOwnProperty(i)) {
    var numb = i.charAt(i.length - 1);
    html += '<tr><th>';
    html += numb; //last character
    html += '</th><td>';
    html += Bawolff.leadGen.leadToPosition(numb);
    html += '</td><td>';
    html += leadObj[i].title;
    html += '</td><td>';
    var time = leadObj[i].timestamp.getTime(); //convert to miliseconds
    var d = (new Date).getTime();
    var delta = Math.round((d - time) / (1000*60*60));
    var timeStr;
    timeStr = delta + ' ساعت';
    timeStr = timeStr.replace(/0/g, '۰');
    timeStr = timeStr.replace(/1/g, '۱');
    timeStr = timeStr.replace(/2/g, '۲');
    timeStr = timeStr.replace(/3/g, '۳');
    timeStr = timeStr.replace(/4/g, '۴');
    timeStr = timeStr.replace(/5/g, '۵');
    timeStr = timeStr.replace(/6/g, '۶');
    timeStr = timeStr.replace(/7/g, '۷');
    timeStr = timeStr.replace(/8/g, '۸');
    timeStr = timeStr.replace(/9/g, '۹');
    html += timeStr;
    html += "</td></tr>";
   }
  }
  html += '</tbody></table>';
  callback(html);
 }
 Bawolff.leadGen.makeLeadMetaObject(wrapper);
}

Bawolff.leadGen.leadToPosition = function (numb) {
//double equal sign intentional to convert from string.
 if (numb == "۱") {
  return "اول از بالا";
 }
 if (numb == "۲") {
  return "دوم از بالا";
 }
 if (numb == "۳") {
  return "سوم از بالا";
 }
 if (numb == "۴") {
  return "چهارم از بالا";
 }
 if (numb == "۵") {
  return "پنجم از بالا";
 }
 else {
  throw new Error("Invalid lead number (" + numb +") passed to Bawolff.leadGen.leadToPosition");
 }
}