Пређи на садржај

Медијавики:Gadget-metadata.js — разлика између измена

Iz Vojne Enciklopedije
Promena koda
Promena koda
 
(2 међуизмене истог корисника нису приказане)
Ред 1: Ред 1:
/** _____________________________________________________________________________
/** _____________________________________________________________________________
  * |                                                                            |
  * |                                                                            |
  * |               === UPOZORENJE: GLOBALNI GADŽET FAJL ===                     |
  * |                   === UPOZORENJE: GLOBALNI GADŽET FAJL ===                 |
  * |          Izmene na ovoj stranici utiču na veliki broj korisnika.          |
  * |          Izmene na ovoj stranici utiču na veliki broj korisnika.          |
  * | Pre izmene, dogovorite se na strani za razgovor ili na [[WT:Gadget]].     |
  * | Pre izmene, dogovorite se na strani za razgovor ili na [[WT:Gadget]].       |
  * |_____________________________________________________________________________|
  * |_____________________________________________________________________________|
  *
  *
Ред 9: Ред 9:
  *
  *
  * Šta radi:
  * Šta radi:
  * - Čita početni deo razgovor-strane (Razgovor:Članak) preko action=raw (sekcija 0)
  * - Otvara (čita) početni deo strane za razgovor (Razgovor:Članak)
  * - Traži šablon: {{Procene kvaliteta članaka|...}} ili {{Procene kvaliteta članaka|class=...}}
  * - Traži šablon: {{Procene kvaliteta članaka|...}} ili {{Procene kvaliteta članaka|class=...}}
  * - Na osnovu pronađene ocene prikazuje status ispod naslova članka (#siteSub)
  * - Na osnovu pronađene ocene upisuje prikaz ispod naslova članka (#siteSub)
  * - Svi linkovi vode na lokalnu stranicu:
  * - Svi linkovi vode na lokalnu stranicu:
  *  Vojna enciklopedija:Procena sadržaja
  *  Vojna enciklopedija:Procena sadržaja
Ред 17: Ред 17:
  * Važno:
  * Važno:
  * - Gadžet radi samo u glavnom imenskom prostoru (članci, ns=0).
  * - 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.
  * - Da bi prikazao ocenu, na razgovor-strani članka mora postojati šablon.
  */
  */
window.assessment = (function () {
window.assessment = (function () {
     var assessmentObj = {
     var assessmentObj = { props: {}, methods: {} },
            props: {},
         ap = assessmentObj.props,
            methods: {}
         am = assessmentObj.methods;
        },
 
        // Kratke reference (da kod bude pregledniji)
         ap = assessmentObj.props,   // props (promenljive stanja)
         am = assessmentObj.methods; // methods (funkcije)


     /**
     /**
     * Glavna inicijalizacija gadžeta.
     * Glavna inicijalizacija gadžeta.
    * Pokreće se pri učitavanju strane.
     */
     */
     assessmentObj.init = function () {
     assessmentObj.init = function () {
 
         // Uslovi kada NE treba da se pokrene
         // Uslovi kada NE treba da se pokrene (bezbedno i bez grešaka):
         if (!$("#siteSub").length ||                       // nema #siteSub (neki skinovi)
         if (
             mw.config.get("wgNamespaceNumber") !== 0 ||     // nije članak
            !$("#siteSub").length ||                             // nema #siteSub (neki skinovi)
             (mw.config.get("wgAction") !== "view" && mw.config.get("wgAction") !== "purge") ||
             mw.config.get("wgNamespaceNumber") !== 0 ||           // nije članak (nije ns=0)
             mw.util.getParamValue("printable") ||           // printable verzija
             (mw.config.get("wgAction") !== "view" &&
             mw.config.get("wgIsMainPage") === true         // glavna strana
            mw.config.get("wgAction") !== "purge") ||           // nije prikaz/purge
             mw.util.getParamValue("printable") ||                 // printable verzija
             mw.config.get("wgIsMainPage") === true               // glavna strana
         ) {
         ) {
             return;
             return;
         }
         }


         // 1) Pokušaj “brzih” provera direktno na članku (npr. preusmerenje, razvrstavanje itd.)
         // 1) Brze provere direktno na članku
         ap.foundAssessment = am.checkArticle();
         ap.foundAssessment = am.checkArticle();


         // 2) Ako nema ničega na samom članku, čitaj razgovor-stranu preko action=raw (sekcija 0)
         // 2) Ako nema ničega na članku, čitaj razgovor stranu (sekcija 0)
         if (!ap.foundAssessment.exists) {
         if (!ap.foundAssessment.exists) {
             $.ajax({
             $.ajax({
                 url: mw.util.getUrl(
                 url: mw.util.getUrl(
                     mw.Title.newFromText(mw.config.get("wgPageName"))
                     mw.Title.newFromText(mw.config.get("wgPageName")).getTalkPage().getPrefixedText(),
                        .getTalkPage()
                        .getPrefixedText(),
                     { action: "raw", section: 0 }
                     { action: "raw", section: 0 }
                 ),
                 ),
Ред 63: Ред 51:
                 dataType: "text",
                 dataType: "text",
                 success: function (responseText) {
                 success: function (responseText) {
                     ap.text = responseText;                               // wikitext razgovor strane
                     ap.text = responseText;
                     ap.foundAssessment = am.getAssessment(ap.text);       // izvlačenje ocene
                     ap.foundAssessment = am.getAssessment(ap.text);
                     ap.updata = am.renderAssessment(ap.foundAssessment); // priprema HTML/CSS klase
                     ap.updata = am.renderAssessment(ap.foundAssessment);
                     am.update();                                          // upis u #siteSub
                     am.update();
                },
                error: function () {
                    // Ako AJAX ne uspe, ne radimo ništa (tiho, bez “pucanja” interfejsa)
                    return;
                 }
                 }
             });
             });
         } else {
         } else {
            // Ako je nešto pronađeno bez AJAX-a (npr. redirect), odmah prikaži
             ap.updata = am.renderAssessment(ap.foundAssessment);
             ap.updata = am.renderAssessment(ap.foundAssessment);
             am.update();
             am.update();
Ред 81: Ред 64:


     /**
     /**
     * Brze provere na samom članku (bez odlaska na razgovor stranu).
     * Brze provere na samom članku.
    * Ovo služi da odmah prepozna:
    * - višeznačnu odrednicu (dab)
    * - setindex
    * - preusmerenje (redir)
    * - ako ne postoji razgovor strana (none)
     */
     */
     am.checkArticle = function () {
     am.checkArticle = function () {
         var checkResult = {
         var checkResult = { extra: [], exists: false },
                extra: [],
                exists: false
            },
             checksList = [
             checksList = [
                // Višeznačna odrednica (ako postoji element koji to obeležava)
                 [$("#disambig, #disambig_disambigbox, #disambigbox").length, "dab"], // višeznačnost
                 [$("#disambig, #disambig_disambigbox, #disambigbox").length, "dab"],
                 [$("#setindexbox").length, "setindex"],                               // setindex
 
                 [mw.config.get("wgIsRedirect") === true, "redir"],                   // preusmerenje
                // Indeksna strana (set index)
                 [$("#ca-talk").hasClass("new"), "none"]                               // nema razgovor strane
                 [$("#setindexbox").length, "setindex"],
 
                // Preusmerenje
                 [mw.config.get("wgIsRedirect") === true, "redir"],
 
                // Ako razgovor strana ne postoji (crveni tab “Razgovor”)
                 [$("#ca-talk").hasClass("new"), "none"]
             ];
             ];


Ред 123: Ред 91:
     * Prioritet:
     * Prioritet:
     * 1) Lokalni šablon: {{Procene kvaliteta članaka|stub}} (ili class=stub)
     * 1) Lokalni šablon: {{Procene kvaliteta članaka|stub}} (ili class=stub)
     * 2) “WP1.0” stil (class=, currentstatus=...) — ostavljeno radi kompatibilnosti
     * 2) WP1.0 kompatibilnost (class=, currentstatus=...)
     */
     */
     am.getRating = function (text) {
     am.getRating = function (text) {
         var rating = "none",
         var rating = "none",
             standardChecks = [
             standardChecks = [
                 // (1) LOKALNI ŠABLON — NAJBITNIJE:
                 // (1) LOKALNI ŠABLON — NAJBITNIJE
                 // Primeri:
                 [/\{\{\s*Procene kvaliteta članaka\s*\|\s*(fa|fl|ga|a|b|bplus|c|start|stub|list|dab|setindex|redir|al|bl|cl|sl|cur|future)\s*[\|\}]/i, "$1"],
                //  {{Procene kvaliteta članaka|stub}}
 
                 //   {{Procene kvaliteta članaka|start}}
                 // (2) WP1.0 / kompatibilnost (rezerva)
                 //   {{Procene kvaliteta članaka|c}}
                [/\|\s*(class|currentstatus)\s*=\s*fa\b/i, "fa"],
                 //  {{Procene kvaliteta članaka|class=stub}}
                 [/\|\s*(class|currentstatus)\s*=\s*fl\b/i, "fl"],
                 // Ovaj regex hvata vrednost u grupi (m[1]).
                [/\|\s*(class|currentstatus)\s*=\s*ga\b/i, "ga"],
                 [/\{\{\s*Procene kvaliteta članaka\s*\|\s*(fa|fl|ga|a|b|c|start|stub|list|dab|setindex|redir)\s*[\|\}]/i, "template"],
                 [/\|\s*class\s*=\s*a\b/i, "a"],
                 [/\|\s*class\s*=\s*bplus\b/i, "bplus"],
                 [/\|\s*class\s*=\s*b\b/i, "b"],
                [/\|\s*class\s*=\s*c\b/i, "c"],
                [/\|\s*class\s*=\s*start\b/i, "start"],
                [/\|\s*class\s*=\s*stub\b/i, "stub"],
                [/\|\s*class\s*=\s*list\b/i, "list"],
                [/\|\s*class\s*=\s*(dab|disambig)\b/i, "dab"],
                [/\|\s*class\s*=\s*setindex\b/i, "setindex"],
                [/\|\s*class\s*=\s*redir\b/i, "redir"],
 
                // Liste (rezerva)
                [/\|\s*class\s*=\s*al\b/i, "al"],
                [/\|\s*class\s*=\s*bl\b/i, "bl"],
                [/\|\s*class\s*=\s*cl\b/i, "cl"],
                [/\|\s*class\s*=\s*sl\b/i, "sl"],


                 // (2) KOMPATIBILNOST: WP1.0 / WikiProject šabloni
                 // Ostalo (rezerva)
                // Rezerva ako neko ubaci šablon drugačijeg formata.
                 [/\|\s*class\s*=\s*cur(rent)?\b/i, "cur"],
                // Traži parametar class=... ili currentstatus=...
                 [/\|\s*class\s*=\s*future\b/i, "future"]
                 [/\|\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) {
         $.each(standardChecks, function (i, e) {
             var m = text.match(e[0]);
             if (text.match(e[0])) {
            if (m) {
                 rating = e[1];
                // 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;
                 return false;
             }
             }
         });
         });


         // Dodatna kompatibilnost za “GA” varijacije (ako se negde pojave)
         // A + GA (rezerva)
         if (rating === "a" && text.match(/\|\s*class\s*=\s*ga\b|\|\s*currentstatus\s*=\s*(ffa\/)?ga\b/i)) {
         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
             rating = "a/ga";
        } 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";
         }
         }


Ред 179: Ред 141:


     /**
     /**
     * Formira objekat procene na osnovu razgovor-strane.
     * Formira objekat procene.
    * (Svesno držimo minimalno: rating + postoji li procena.)
     */
     */
     am.getAssessment = function (text) {
     am.getAssessment = function (text) {
         var gottenAssessment = {
         return {
             rating: am.getRating(text),
             rating: am.getRating(text),
             pageLink: [null, null],
             pageLink: [null, null],
Ред 190: Ред 151:
             exists: true
             exists: true
         };
         };
        return gottenAssessment;
     };
     };


     /**
     /**
     * Pretvara pronađenu ocenu u:
     * Pretvara ocenu u:
     * - CSS klasu za naslov (boja teksta naslova)
     * - CSS klasu (za boju)
     * - slogan (tekst ispod naslova)
     * - HTML slogan (ikonica + plavi link tekst)
    *
    * SVI LINKOVI U SLOGANU VODE NA:
    *  Vojna enciklopedija:Procena sadržaja
     */
     */
     am.renderAssessment = function (assess) {
     am.renderAssessment = function (assess) {
        // Projekat (ns=4) – kod tebe je to “Vojna enciklopedija”
         var projectNs = mw.config.get("wgFormattedNamespaces")[4],
         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"),
             assessLink = mw.util.getUrl(projectNs + ":Procena sadržaja"),
            // Dodatne informacije su namerno prazne (da nema Wikipedia: linkova)
             info = [],
             info = [],
             newClass,
             newClass,
             slogan,
             slogan;
            ratingList;


         // Lista svih prikaza (tekstovi su na srpskom)
         // Mapiranje: ocena -> (klasa, ikona, tekst)
         ratingList = [
         var ratingMap = {
             // Najviši nivoi
             // Najviši nivoi
             { name: "fa", className: "assess-fa-text", text: "Izabrani <a>članak</a>" },         // Featured Article (lokalno tumačenje)
             "fa":  { className: "assess-fa-text",     icon: "assess-icon-fa",     label: "Izabrani članak" },
             { name: "fl", className: "assess-fl-text", text: "Izabrana <a>lista</a>" },         // Featured List (lokalno tumačenje)
             "fl":  { className: "assess-fl-text",     icon: "assess-icon-fl",     label: "Izabrana lista" },
             { name: "ga", className: "assess-ga-text", text: "Dobar <a>članak</a>" },           // Good Article (lokalno tumačenje)
             "ga":  { className: "assess-ga-text",     icon: "assess-icon-ga",     label: "Dobar članak" },


             // Ocene kvaliteta
             // Ocene kvaliteta
             { name: "a/ga", className: "assess-a-text", text: "<a>Članak</a> A-razreda (takođe dobar članak)" },
             "a/ga": { className: "assess-a-text",     icon: "assess-icon-a",      label: "Članak A-razreda (takođe dobar članak)" },
             { name: "a", className: "assess-a-text", text: "<a>Članak</a> A-razreda" },
             "a":    { className: "assess-a-text",     icon: "assess-icon-a",      label: "Članak A-razreda" },
             { name: "b", className: "assess-b-text", text: "<a>Članak</a> B-razreda" },
             "bplus":{ className: "assess-bplus-text",  icon: "assess-icon-bplus",  label: "Članak B+ razreda" },
             { name: "c", className: "assess-c-text", text: "<a>Članak</a> C-razreda" },
            "b":    { className: "assess-b-text",     icon: "assess-icon-b",      label: "Članak B-razreda" },
             { name: "start", className: "assess-start-text", text: "<a>Početni</a> članak" },
             "c":    { className: "assess-c-text",     icon: "assess-icon-c",     label: "Članak C-razreda" },
             { name: "stub", className: "assess-stub-text", text: "<a>Članak-klica</a>" },
             "start":{ className: "assess-start-text", icon: "assess-icon-start", label: "Početni članak" },
             "stub": { className: "assess-stub-text",   icon: "assess-icon-stub",   label: "Članak-klica" },


             // Tipovi strana
             // Tipovi strana
             { name: "list", className: "assess-list-text", text: "<a>Članak-spisak</a>" },
             "list":    { className: "assess-list-text",     icon: "assess-icon-list",     label: "Članak-spisak" },
             { name: "dab", className: "assess-dab-text", text: "<a>Višeznačna odrednica</a>" },
             "dab":      { className: "assess-dab-text",     icon: "assess-icon-dab",     label: "Višeznačna odrednica" },
             { name: "setindex", className: "assess-setindex-text", text: "<a>Indeksna strana</a>" },
             "setindex": { className: "assess-setindex-text", icon: "assess-icon-setindex", label: "Indeksna strana" },
             { name: "redir", className: "assess-redir-text", text: "<a>Preusmerenje</a>" }
             "redir":    { className: "assess-redir-text",    icon: "assess-icon-redir",   label: "Preusmerenje" },
        ];
 
            // Liste (rezerva/kompatibilnost)
            "al": { className: "assess-al-text", icon: "assess-icon-al", label: "Lista A-razreda" },
            "bl": { className: "assess-bl-text", icon: "assess-icon-bl", label: "Lista B-razreda" },
            "cl": { className: "assess-cl-text", icon: "assess-icon-cl", label: "Lista C-razreda" },
            "sl": { className: "assess-sl-text", icon: "assess-icon-sl", label: "Lista-klica" },


        // Nađi odgovarajući element u ratingList
            // Ostalo (rezerva)
        $.each(ratingList, function (i, e) {
            "cur":    { className: "assess-cur-text",    icon: "assess-icon-cur",   label: "Aktuelno (current)" },
             if (assess.rating === e.name) {
             "future": { className: "assess-future-text", icon: "assess-icon-future", label: "Buduća tema (future)" }
                newClass = e.className;
        };


                // “a” tag u e.text dobija href ka tvojoj stranici Procena sadržaja
        var cfg = ratingMap[assess.rating];
                slogan = $("<span>")
                    .html(e.text)
                    .children()
                    .attr({ href: assessLink })
                    .parent()
                    .html();


                return false;
        if (cfg) {
             }
             newClass = cfg.className;
        });


        // Ako ništa nije prepoznato
            slogan =
         if (!newClass) {
                "<span class=\"assess-icon-wrap " + cfg.className + "\">" +
                    "<span class=\"assess-icon " + cfg.icon + "\" aria-hidden=\"true\"></span>" +
                "</span>" +
                "<a class=\"assess-rating-link\" href=\"" + assessLink + "\">" + cfg.label + "</a>";
         } else {
             newClass = "assess-unassessed-text";
             newClass = "assess-unassessed-text";
             slogan = "Neprocenjen <a href=\"" + assessLink + "\">članak</a>";
             slogan =
                "<span class=\"assess-icon-wrap assess-unassessed-text\">" +
                    "<span class=\"assess-icon assess-icon-unassessed\" aria-hidden=\"true\"></span>" +
                "</span>" +
                "Neprocenjen <a class=\"assess-rating-link\" href=\"" + assessLink + "\">članak</a>";
         }
         }


Ред 265: Ред 221:


     /**
     /**
     * Upisuje rezultat u zaglavlje članka:
     * 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 () {
     am.update = function () {
         var info = ap.updata.info,
         var info = ap.updata.info,
             infoSpan = $("<span class=\"assess-info-all\"><\/span>"),
             infoSpan = $("<span class=\"assess-info-all\"><\/span>"),
            siteSub = $("<div>Procena kvaliteta: <span class=\"assess-article-rating\"><\/span> — iz Vojne enciklopedije<\/div>");


            // Fiksni deo: “— iz Vojne enciklopedije”
        siteSub.find(".assess-article-rating").html(ap.updata.slogan);
            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) {
         if (info && info.length > 0) {
             infoSpan.html(".");
             infoSpan.html(".");
Ред 292: Ред 238:
         }
         }


        // Dodeli CSS klasu naslovu članka (h1) radi boje/isticanja
         $("h1:first").addClass(ap.updata.newClass || null);
         $("h1:first").addClass(ap.updata.newClass || null);
        // Promeni sadržaj #siteSub
         $("#siteSub").html(siteSub.html());
         $("#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;
     };
     };


Ред 311: Ред 245:
}());
}());


/**
* Start gadžeta pri učitavanju strane
*/
$(assessment.init);
$(assessment.init);

Тренутна верзија на датум 7. фебруар 2026. у 20:54

/** _____________________________________________________________________________
 * |                                                                             |
 * |                    === 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:
 * - Otvara (čita) početni deo strane za razgovor (Razgovor:Članak)
 * - Traži šablon: {{Procene kvaliteta članaka|...}} ili {{Procene kvaliteta članaka|class=...}}
 * - Na osnovu pronađene ocene upisuje prikaz 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).
 * - Da bi prikazao ocenu, na razgovor-strani članka mora postojati šablon.
 */
window.assessment = (function () {
    var assessmentObj = { props: {}, methods: {} },
        ap = assessmentObj.props,
        am = assessmentObj.methods;

    /**
     * Glavna inicijalizacija gadžeta.
     */
    assessmentObj.init = function () {
        // Uslovi kada NE treba da se pokrene
        if (!$("#siteSub").length ||                        // nema #siteSub (neki skinovi)
            mw.config.get("wgNamespaceNumber") !== 0 ||     // nije članak
            (mw.config.get("wgAction") !== "view" && mw.config.get("wgAction") !== "purge") ||
            mw.util.getParamValue("printable") ||           // printable verzija
            mw.config.get("wgIsMainPage") === true          // glavna strana
        ) {
            return;
        }

        // 1) Brze provere direktno na članku
        ap.foundAssessment = am.checkArticle();

        // 2) Ako nema ničega na članku, čitaj razgovor stranu (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;
                    ap.foundAssessment = am.getAssessment(ap.text);
                    ap.updata = am.renderAssessment(ap.foundAssessment);
                    am.update();
                }
            });
        } else {
            ap.updata = am.renderAssessment(ap.foundAssessment);
            am.update();
        }
    };

    /**
     * Brze provere na samom članku.
     */
    am.checkArticle = function () {
        var checkResult = { extra: [], exists: false },
            checksList = [
                [$("#disambig, #disambig_disambigbox, #disambigbox").length, "dab"], // višeznačnost
                [$("#setindexbox").length, "setindex"],                               // setindex
                [mw.config.get("wgIsRedirect") === true, "redir"],                    // preusmerenje
                [$("#ca-talk").hasClass("new"), "none"]                               // nema razgovor strane
            ];

        $.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 kompatibilnost (class=, currentstatus=...)
     */
    am.getRating = function (text) {
        var rating = "none",
            standardChecks = [
                // (1) LOKALNI ŠABLON — NAJBITNIJE
                [/\{\{\s*Procene kvaliteta članaka\s*\|\s*(fa|fl|ga|a|b|bplus|c|start|stub|list|dab|setindex|redir|al|bl|cl|sl|cur|future)\s*[\|\}]/i, "$1"],

                // (2) WP1.0 / kompatibilnost (rezerva)
                [/\|\s*(class|currentstatus)\s*=\s*fa\b/i, "fa"],
                [/\|\s*(class|currentstatus)\s*=\s*fl\b/i, "fl"],
                [/\|\s*(class|currentstatus)\s*=\s*ga\b/i, "ga"],
                [/\|\s*class\s*=\s*a\b/i, "a"],
                [/\|\s*class\s*=\s*bplus\b/i, "bplus"],
                [/\|\s*class\s*=\s*b\b/i, "b"],
                [/\|\s*class\s*=\s*c\b/i, "c"],
                [/\|\s*class\s*=\s*start\b/i, "start"],
                [/\|\s*class\s*=\s*stub\b/i, "stub"],
                [/\|\s*class\s*=\s*list\b/i, "list"],
                [/\|\s*class\s*=\s*(dab|disambig)\b/i, "dab"],
                [/\|\s*class\s*=\s*setindex\b/i, "setindex"],
                [/\|\s*class\s*=\s*redir\b/i, "redir"],

                // Liste (rezerva)
                [/\|\s*class\s*=\s*al\b/i, "al"],
                [/\|\s*class\s*=\s*bl\b/i, "bl"],
                [/\|\s*class\s*=\s*cl\b/i, "cl"],
                [/\|\s*class\s*=\s*sl\b/i, "sl"],

                // Ostalo (rezerva)
                [/\|\s*class\s*=\s*cur(rent)?\b/i, "cur"],
                [/\|\s*class\s*=\s*future\b/i, "future"]
            ];

        $.each(standardChecks, function (i, e) {
            if (text.match(e[0])) {
                rating = e[1];
                return false;
            }
        });

        // A + GA (rezerva)
        if (rating === "a" && text.match(/\|\s*class\s*=\s*ga\b|\|\s*currentstatus\s*=\s*(ffa\/)?ga\b/i)) {
            rating = "a/ga";
        }

        return rating;
    };

    /**
     * Formira objekat procene.
     */
    am.getAssessment = function (text) {
        return {
            rating: am.getRating(text),
            pageLink: [null, null],
            extra: [],
            activeReview: null,
            exists: true
        };
    };

    /**
     * Pretvara ocenu u:
     * - CSS klasu (za boju)
     * - HTML slogan (ikonica + plavi link tekst)
     */
    am.renderAssessment = function (assess) {
        var projectNs = mw.config.get("wgFormattedNamespaces")[4],
            assessLink = mw.util.getUrl(projectNs + ":Procena sadržaja"),
            info = [],
            newClass,
            slogan;

        // Mapiranje: ocena -> (klasa, ikona, tekst)
        var ratingMap = {
            // Najviši nivoi
            "fa":   { className: "assess-fa-text",     icon: "assess-icon-fa",     label: "Izabrani članak" },
            "fl":   { className: "assess-fl-text",     icon: "assess-icon-fl",     label: "Izabrana lista" },
            "ga":   { className: "assess-ga-text",     icon: "assess-icon-ga",     label: "Dobar članak" },

            // Ocene kvaliteta
            "a/ga": { className: "assess-a-text",      icon: "assess-icon-a",      label: "Članak A-razreda (takođe dobar članak)" },
            "a":    { className: "assess-a-text",      icon: "assess-icon-a",      label: "Članak A-razreda" },
            "bplus":{ className: "assess-bplus-text",  icon: "assess-icon-bplus",  label: "Članak B+ razreda" },
            "b":    { className: "assess-b-text",      icon: "assess-icon-b",      label: "Članak B-razreda" },
            "c":    { className: "assess-c-text",      icon: "assess-icon-c",      label: "Članak C-razreda" },
            "start":{ className: "assess-start-text",  icon: "assess-icon-start",  label: "Početni članak" },
            "stub": { className: "assess-stub-text",   icon: "assess-icon-stub",   label: "Članak-klica" },

            // Tipovi strana
            "list":     { className: "assess-list-text",     icon: "assess-icon-list",     label: "Članak-spisak" },
            "dab":      { className: "assess-dab-text",      icon: "assess-icon-dab",      label: "Višeznačna odrednica" },
            "setindex": { className: "assess-setindex-text", icon: "assess-icon-setindex", label: "Indeksna strana" },
            "redir":    { className: "assess-redir-text",    icon: "assess-icon-redir",    label: "Preusmerenje" },

            // Liste (rezerva/kompatibilnost)
            "al": { className: "assess-al-text", icon: "assess-icon-al", label: "Lista A-razreda" },
            "bl": { className: "assess-bl-text", icon: "assess-icon-bl", label: "Lista B-razreda" },
            "cl": { className: "assess-cl-text", icon: "assess-icon-cl", label: "Lista C-razreda" },
            "sl": { className: "assess-sl-text", icon: "assess-icon-sl", label: "Lista-klica" },

            // Ostalo (rezerva)
            "cur":    { className: "assess-cur-text",    icon: "assess-icon-cur",    label: "Aktuelno (current)" },
            "future": { className: "assess-future-text", icon: "assess-icon-future", label: "Buduća tema (future)" }
        };

        var cfg = ratingMap[assess.rating];

        if (cfg) {
            newClass = cfg.className;

            slogan =
                "<span class=\"assess-icon-wrap " + cfg.className + "\">" +
                    "<span class=\"assess-icon " + cfg.icon + "\" aria-hidden=\"true\"></span>" +
                "</span>" +
                "<a class=\"assess-rating-link\" href=\"" + assessLink + "\">" + cfg.label + "</a>";
        } else {
            newClass = "assess-unassessed-text";
            slogan =
                "<span class=\"assess-icon-wrap assess-unassessed-text\">" +
                    "<span class=\"assess-icon assess-icon-unassessed\" aria-hidden=\"true\"></span>" +
                "</span>" +
                "Neprocenjen <a class=\"assess-rating-link\" href=\"" + assessLink + "\">članak</a>";
        }

        return { newClass: newClass, slogan: slogan, info: info };
    };

    /**
     * Upisuje rezultat u zaglavlje članka.
     */
    am.update = function () {
        var info = ap.updata.info,
            infoSpan = $("<span class=\"assess-info-all\"><\/span>"),
            siteSub = $("<div>Procena kvaliteta: <span class=\"assess-article-rating\"><\/span> — iz Vojne enciklopedije<\/div>");

        siteSub.find(".assess-article-rating").html(ap.updata.slogan);

        if (info && info.length > 0) {
            infoSpan.html(".");
            $.each(info, function (i, e) {
                infoSpan.append(" ").append(e);
            });
            siteSub.append(infoSpan);
        }

        $("h1:first").addClass(ap.updata.newClass || null);
        $("#siteSub").html(siteSub.html());
    };

    return assessmentObj;
}());

$(assessment.init);