Медијавики:Gadget-metadata.js
Изглед
Напомена: Пошто објавите измене, можда ћете морати да обришете кеш прегледача како бисте их видели.
- Firefox / Safari: Држите Shift и кликните на Reload или притисните Ctrl-F5 или Ctrl-R (⌘-R на Mac-у).
- Google Chrome: Притисните Ctrl-Shift-R (⌘-Shift-R на Mac-у).
- Edge: Држите Ctrl и кликните на Refresh или притисните Ctrl-F5.
/** _____________________________________________________________________________
* | |
* | === UPOZORENJE: GLOBALNI GADŽET FAJL === |
* | Izmene na ovoj stranici utiču na veliki broj korisnika. |
* | Pre izmene, dogovorite se na strani za razgovor ili na [[WT:Gadget]]. |
* |_____________________________________________________________________________|
*
* GADŽET: Metadata (Procena kvaliteta članaka) — lokalizovan za Vojnu enciklopediju
*
* Šta radi:
* - Čita početni deo razgovor-strane (Razgovor:Članak) preko action=raw (sekcija 0)
* - Traži šablon: {{Procene kvaliteta članaka|...}} ili {{Procene kvaliteta članaka|class=...}}
* - Na osnovu pronađene ocene prikazuje status ispod naslova članka (#siteSub)
* - Svi linkovi vode na lokalnu stranicu:
* Vojna enciklopedija:Procena sadržaja
*
* Važno:
* - Gadžet radi samo u glavnom imenskom prostoru (članci, ns=0).
* - Gadžet NE procenjuje automatski sadržaj. Prikazuje ono što urednici upišu na razgovor-strani.
*/
window.assessment = (function () {
var assessmentObj = {
props: {},
methods: {}
},
// Kratke reference (da kod bude pregledniji)
ap = assessmentObj.props, // props (promenljive stanja)
am = assessmentObj.methods; // methods (funkcije)
/**
* Glavna inicijalizacija gadžeta.
* Pokreće se pri učitavanju strane.
*/
assessmentObj.init = function () {
// Uslovi kada NE treba da se pokrene (bezbedno i bez grešaka):
if (
!$("#siteSub").length || // nema #siteSub (neki skinovi)
mw.config.get("wgNamespaceNumber") !== 0 || // nije članak (nije ns=0)
(mw.config.get("wgAction") !== "view" &&
mw.config.get("wgAction") !== "purge") || // nije prikaz/purge
mw.util.getParamValue("printable") || // printable verzija
mw.config.get("wgIsMainPage") === true // glavna strana
) {
return;
}
// 1) Pokušaj “brzih” provera direktno na članku (npr. preusmerenje, razvrstavanje itd.)
ap.foundAssessment = am.checkArticle();
// 2) Ako nema ničega na samom članku, čitaj razgovor-stranu preko action=raw (sekcija 0)
if (!ap.foundAssessment.exists) {
$.ajax({
url: mw.util.getUrl(
mw.Title.newFromText(mw.config.get("wgPageName"))
.getTalkPage()
.getPrefixedText(),
{ action: "raw", section: 0 }
),
async: true,
dataType: "text",
success: function (responseText) {
ap.text = responseText; // wikitext razgovor strane
ap.foundAssessment = am.getAssessment(ap.text); // izvlačenje ocene
ap.updata = am.renderAssessment(ap.foundAssessment); // priprema HTML/CSS klase
am.update(); // upis u #siteSub
},
error: function () {
// Ako AJAX ne uspe, ne radimo ništa (tiho, bez “pucanja” interfejsa)
return;
}
});
} else {
// Ako je nešto pronađeno bez AJAX-a (npr. redirect), odmah prikaži
ap.updata = am.renderAssessment(ap.foundAssessment);
am.update();
}
};
/**
* Brze provere na samom članku (bez odlaska na razgovor stranu).
* Ovo služi da odmah prepozna:
* - višeznačnu odrednicu (dab)
* - setindex
* - preusmerenje (redir)
* - ako ne postoji razgovor strana (none)
*/
am.checkArticle = function () {
var checkResult = {
extra: [],
exists: false
},
checksList = [
// Višeznačna odrednica (ako postoji element koji to obeležava)
[$("#disambig, #disambig_disambigbox, #disambigbox").length, "dab"],
// Indeksna strana (set index)
[$("#setindexbox").length, "setindex"],
// Preusmerenje
[mw.config.get("wgIsRedirect") === true, "redir"],
// Ako razgovor strana ne postoji (crveni tab “Razgovor”)
[$("#ca-talk").hasClass("new"), "none"]
];
$.each(checksList, function (i, e) {
if (e[0]) {
checkResult.rating = e[1];
checkResult.exists = true;
return false;
}
});
return checkResult;
};
/**
* Iz wikitext-a razgovor strane izvlači ocenu.
*
* Prioritet:
* 1) Lokalni šablon: {{Procene kvaliteta članaka|stub}} (ili class=stub)
* 2) “WP1.0” stil (class=, currentstatus=...) — ostavljeno radi kompatibilnosti
*/
am.getRating = function (text) {
var rating = "none",
standardChecks = [
// (1) LOKALNI ŠABLON — NAJBITNIJE:
// Primeri:
// {{Procene kvaliteta članaka|stub}}
// {{Procene kvaliteta članaka|start}}
// {{Procene kvaliteta članaka|c}}
// {{Procene kvaliteta članaka|class=stub}}
// Ovaj regex hvata vrednost u grupi (m[1]).
[/\{\{\s*Procene kvaliteta članaka\s*\|\s*(fa|fl|ga|a|b|c|start|stub|list|dab|setindex|redir)\s*[\|\}]/i, "template"],
// (2) KOMPATIBILNOST: WP1.0 / WikiProject šabloni
// Rezerva ako neko ubaci šablon drugačijeg formata.
// Traži parametar class=... ili currentstatus=...
[/\|\s*(class|currentstatus)\s*=\s*fa\b/i, "fa"], // izabrani članak
[/\|\s*(class|currentstatus)\s*=\s*fl\b/i, "fl"], // izabrana lista
[/\|\s*class\s*=\s*a\b/i, "a"], // članak A-razreda
[/\|\s*class\s*=\s*b\b/i, "b"], // članak B-razreda
[/\|\s*class\s*=\s*bplus\b/i, "bplus"], // B+ (retko, specijalno)
[/\|\s*class\s*=\s*c\b/i, "c"], // članak C-razreda
[/\|\s*class\s*=\s*start\b/i, "start"], // početni članak
[/\|\s*class\s*=\s*stub\b/i, "stub"], // članak-klica
[/\|\s*class\s*=\s*list\b/i, "list"], // članak-spisak
[/\|\s*class\s*=\s*(dab|disambig)\b/i, "dab"], // višeznačna odrednica
[/\|\s*class\s*=\s*setindex\b/i, "setindex"], // indeksna strana
[/\|\s*class\s*=\s*redir\b/i, "redir"] // preusmerenje
];
// Prolazimo kroz standardne provere i uzimamo prvu koja “pogodi”
$.each(standardChecks, function (i, e) {
var m = text.match(e[0]);
if (m) {
// Ako regex ima grupu (npr. lokalni šablon), uzmi grupu 1.
// U suprotnom uzmi fiksnu vrednost (npr. "fa", "stub", itd.)
rating = (m[1] ? String(m[1]).toLowerCase() : e[1]);
return false;
}
});
// Dodatna kompatibilnost za “GA” varijacije (ako se negde pojave)
if (rating === "a" && text.match(/\|\s*class\s*=\s*ga\b|\|\s*currentstatus\s*=\s*(ffa\/)?ga\b/i)) {
rating = "a/ga"; // A-razred + dobar članak
} else if (
text.match(/\|\s*class\s*=\s*ga\b|\|\s*currentstatus\s*=\s*(ffa\/)?ga\b|\{\{\s*ga\s*\|/i) &&
!text.match(/\|\s*currentstatus\s*=\s*dga\b/i)
) {
rating = "ga";
}
return rating;
};
/**
* Formira objekat procene na osnovu razgovor-strane.
* (Svesno držimo minimalno: rating + postoji li procena.)
*/
am.getAssessment = function (text) {
var gottenAssessment = {
rating: am.getRating(text),
pageLink: [null, null],
extra: [],
activeReview: null,
exists: true
};
return gottenAssessment;
};
/**
* Pretvara pronađenu ocenu u:
* - CSS klasu za naslov (boja teksta naslova)
* - slogan (tekst ispod naslova)
*
* SVI LINKOVI U SLOGANU VODE NA:
* Vojna enciklopedija:Procena sadržaja
*/
am.renderAssessment = function (assess) {
// Projekat (ns=4) – kod tebe je to “Vojna enciklopedija”
var projectNs = mw.config.get("wgFormattedNamespaces")[4],
// Lokalni link ka tvojoj stranici sa objašnjenjem (Procena sadržaja)
assessLink = mw.util.getUrl(projectNs + ":Procena sadržaja"),
// Dodatne informacije su namerno prazne (da nema Wikipedia: linkova)
info = [],
newClass,
slogan,
ratingList;
// Lista svih prikaza (tekstovi su na srpskom)
ratingList = [
// Najviši nivoi
{ name: "fa", className: "assess-fa-text", text: "Izabrani <a>članak</a>" }, // Featured Article (lokalno tumačenje)
{ name: "fl", className: "assess-fl-text", text: "Izabrana <a>lista</a>" }, // Featured List (lokalno tumačenje)
{ name: "ga", className: "assess-ga-text", text: "Dobar <a>članak</a>" }, // Good Article (lokalno tumačenje)
// Ocene kvaliteta
{ name: "a/ga", className: "assess-a-text", text: "<a>Članak</a> A-razreda (takođe dobar članak)" },
{ name: "a", className: "assess-a-text", text: "<a>Članak</a> A-razreda" },
{ name: "b", className: "assess-b-text", text: "<a>Članak</a> B-razreda" },
{ name: "c", className: "assess-c-text", text: "<a>Članak</a> C-razreda" },
{ name: "start", className: "assess-start-text", text: "<a>Početni</a> članak" },
{ name: "stub", className: "assess-stub-text", text: "<a>Članak-klica</a>" },
// Tipovi strana
{ name: "list", className: "assess-list-text", text: "<a>Članak-spisak</a>" },
{ name: "dab", className: "assess-dab-text", text: "<a>Višeznačna odrednica</a>" },
{ name: "setindex", className: "assess-setindex-text", text: "<a>Indeksna strana</a>" },
{ name: "redir", className: "assess-redir-text", text: "<a>Preusmerenje</a>" }
];
// Nađi odgovarajući element u ratingList
$.each(ratingList, function (i, e) {
if (assess.rating === e.name) {
newClass = e.className;
// “a” tag u e.text dobija href ka tvojoj stranici Procena sadržaja
slogan = $("<span>")
.html(e.text)
.children()
.attr({ href: assessLink })
.parent()
.html();
return false;
}
});
// Ako ništa nije prepoznato
if (!newClass) {
newClass = "assess-unassessed-text";
slogan = "Neprocenjen <a href=\"" + assessLink + "\">članak</a>";
}
return { newClass: newClass, slogan: slogan, info: info };
};
/**
* Upisuje rezultat u zaglavlje članka:
* - boji naslov (h1) preko CSS klase
* - menja #siteSub da prikaže slogan + “— iz Vojne enciklopedije”
*
* Napomena:
* - Dodajemo prefiks “Procena kvaliteta:” da bude jasno da je to urednička oznaka,
* a ne automatska analiza teksta.
*/
am.update = function () {
var info = ap.updata.info,
infoSpan = $("<span class=\"assess-info-all\"><\/span>"),
// Fiksni deo: “— iz Vojne enciklopedije”
siteSub = $("<div><span class=\"assess-article-rating\"><\/span> — iz Vojne enciklopedije<\/div>");
// Upis slogana (npr. “Članak-klica”, “Članak B-razreda”, itd.)
siteSub.children().html("Procena kvaliteta: " + ap.updata.slogan);
// Info dodatni deo je namerno prazan (da nema Wikipedia linkova)
if (info && info.length > 0) {
infoSpan.html(".");
$.each(info, function (i, e) {
infoSpan.append(" ").append(e);
});
siteSub.append(infoSpan);
}
// Dodeli CSS klasu naslovu članka (h1) radi boje/isticanja
$("h1:first").addClass(ap.updata.newClass || null);
// Promeni sadržaj #siteSub
$("#siteSub").html(siteSub.html());
};
/**
* Pomoćna funkcija: dekodiranje HTML entiteta (rezerva, ako zatreba).
*/
am.decodeEntities = function (str) {
var t = document.createElement("textarea");
t.innerHTML = str;
return t.value;
};
return assessmentObj;
}());
/**
* Start gadžeta pri učitavanju strane
*/
$(assessment.init);