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

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

Iz Vojne Enciklopedije
Promena koda
Promena koda
Ред 1: Ред 1:
/** _____________________________________________________________________________
/** _____________________________________________________________________________
  * |                                                                            |
  * |                                                                            |
  * |                    === WARNING: GLOBAL GADGET FILE ===                     |
  * |                    === UPOZORENJE: GLOBALNI GADŽET FAJL ===                 |
  * |                 Changes to this page affect many users.                   |
  * |         Izmene na ovoj stranici utiču na veliki broj korisnika.           |
  * | Please discuss changes on the talk page or on [[WT:Gadget]] before editing. |
  * | Pre izmene, dogovorite se na strani za razgovor ili na [[WT:Gadget]].       |
  * |_____________________________________________________________________________|
  * |_____________________________________________________________________________|
  *
  *
  * Imported from revision 185704269 as of January 20, 2008 18:40 from
  * GADŽET: Metadata (Procena kvaliteta članaka) — lokalizovan za Vojnu enciklopediju
  * [[User:Pyrospirit/metadata.js]], itself a modified version of
*
  * [[User:Outriggr/metadata.js]].
  * Šta radi:
  * Metadata assessment script
  * - Otvara (čita) početni deo strane za razgovor (Razgovor:Članak)
  * Finds the WP 1.0/WikiProject assessment of every article you go to, then
* - Traži šablon: {{Procene kvaliteta članaka|...}} ili {{Procene kvaliteta članaka|class=...}}
  * displays that information in the article header. See (new script homepage
  * - Na osnovu pronađene ocene upisuje tekst ispod naslova članka (#siteSub)
  * pending).
  * - Svi linkovi vode na lokalnu stranicu:
  * @author Outriggr - created the script and used to maintain it
  *   Vojna enciklopedija:Procena sadržaja
  * @author Pyrospirit - used to maintain and update the script
  *
  * @author Nihiltres - Overhauled the script, current maintainer
  * 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 () {
window.assessment = (function () {
Ред 22: Ред 24:
         methods: {}
         methods: {}
     },
     },
         //internal shortcuts
         // Kratke reference (da kod bude pregledniji)
         ap = assessmentObj.props,
         ap = assessmentObj.props,   // props (promenljive stanja)
         am = assessmentObj.methods;
         am = assessmentObj.methods; // methods (funkcije)


     /**
     /**
     * The main function of the script. If the checkArticle() function can find
     * Glavna inicijalizacija gadžeta.
     * the assessment, it parses and displays that assessment for the page.
     * Pokreće se pri učitavanju strane.
    * Otherwise, it tries to retrieve an assessment via AJAX.
     */
     */
     assessmentObj.init = function () {
     assessmentObj.init = function () {
         if (!$("#siteSub").length || //incompatible skin
        // Uslovi kada NE treba da se pokrene (bezbedno i bez grešaka):
                mw.config.get("wgNamespaceNumber") !== 0 || //non-mainspace page
         if (!$("#siteSub").length ||                       // nema #siteSub (neki skinovi)
                (mw.config.get("wgAction") !== "view" && mw.config.get("wgAction") !== "purge") || //non-read action
            mw.config.get("wgNamespaceNumber") !== 0 ||     // nije članak (nije ns=0)
                mw.util.getParamValue("printable") || //printable page
            (mw.config.get("wgAction") !== "view" && mw.config.get("wgAction") !== "purge") || // nije prikaz/purge
                mw.config.get("wgIsMainPage") === true //Main Page
            mw.util.getParamValue("printable") ||           // printable verzija
                ) {
            mw.config.get("wgIsMainPage") === true         // glavna strana
             return; //Don't run the script under any of these conditions.
        ) {
             return;
         }
         }
         ap.foundAssessment = am.checkArticle(); //checks for types visible from article page
 
         if (!ap.foundAssessment.exists) { // no type visible on article, proceed to check the talk page
        // 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({
             $.ajax({
                 url: mw.util.getUrl(
                 url: mw.util.getUrl(
  mw.Title.newFromText( mw.config.get("wgPageName") ).getTalkPage().getPrefixedText(),
                    mw.Title.newFromText(mw.config.get("wgPageName")).getTalkPage().getPrefixedText(),
  { action: "raw", section: 0 }
                    { action: "raw", section: 0 }
),
                ),
                 async: true,
                 async: true,
                 dataType: "text",
                 dataType: "text",
                 success: function (responseText) {
                 success: function (responseText) {
                     ap.text = responseText;
                     ap.text = responseText;                       // wikitext razgovor strane
                     ap.foundAssessment = am.getAssessment(ap.text);
                     ap.foundAssessment = am.getAssessment(ap.text); // izvlačenje ocene
                     ap.updata = am.renderAssessment(ap.foundAssessment);
                     ap.updata = am.renderAssessment(ap.foundAssessment); // priprema HTML/CSS klase
                     am.update();
                     am.update();                                   // upis u #siteSub
                 }
                 }
             });
             });
         } 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();
Ред 63: Ред 70:


     /**
     /**
     * Checks for various objects on the article page that indicate a certain
     * Brze provere na samom članku (bez odlaska na razgovor stranu).
     * assessment, such as a disambiguation page notice. If this function can
    * Ovo služi da odmah prepozna:
     * find the assessment, AJAX is not needed for this page.
    * - višeznačnu odrednicu (dab)
     * @returns {Object} checkResult - the assessment found
     * - setindex
     * - preusmerenje (redir)
     * - ako ne postoji razgovor strana (none)
     */
     */
     am.checkArticle = function () {
     am.checkArticle = function () {
Ред 73: Ред 82:
             exists: false
             exists: false
         }, checksList = [
         }, checksList = [
            // Ako postoji element koji obeležava višeznačnost
             [$("#disambig, #disambig_disambigbox, #disambigbox").length, "dab"],
             [$("#disambig, #disambig_disambigbox, #disambigbox").length, "dab"],
            // Ako postoji setindex box
             [$("#setindexbox").length, "setindex"],
             [$("#setindexbox").length, "setindex"],
            // Ako je stranica preusmerenje
             [mw.config.get("wgIsRedirect") === true, "redir"],
             [mw.config.get("wgIsRedirect") === true, "redir"],
             /* [$("table.stub").length, "stub"], */
 
             [$("#ca-talk").hasClass("new"), "none"] //no talk page
             // Ako razgovor strana ne postoji (crveni tab “Razgovor”)
             [$("#ca-talk").hasClass("new"), "none"]
         ];
         ];
         $.each(checksList, function (i, e) {
         $.each(checksList, function (i, e) {
             if (e[0]) {
             if (e[0]) {
Ред 86: Ред 102:
             }
             }
         });
         });
         return checkResult;
         return checkResult;
     };
     };


     /**
     /**
     * Searches the provided wikicode for the rating part of an assessment and
     * Iz wikitext-a razgovor strane izvlači ocenu.
    * returns it as a string.
     *
     * Note that higher assessments take priority, and less-used assessments
     * Prioritet:
     * such as "list", "current", or "future" are used only if nothing else can
     * 1) Lokalni šablon: {{Procene kvaliteta članaka|stub}} (ili class=stub)
     * be found.
     * 2) “WP1.0” stil (class=, currentstatus=...) — ostavljeno radi kompatibilnosti
     * @param {String} text - some wikitext to be searched for assessment info
     */
     */
     am.getRating = function (text) {
     am.getRating = function (text) {
         var rating = "none",
         var rating = "none",
             standardChecks = [
             standardChecks = [
            [/\{\{\s*Procene kvaliteta članaka\s*\|\s*(fa|fl|ga|a|b|c|start|stub|list|dab|setindex|redir)\s*[\|\}]/i, "$1"],
                // (1) LOKALNI ŠABLON — NAJBITNIJE:
                 [/\|\s*(class|currentstatus)\s*=\s*fa\b/i, "fa"],
                // Primeri:
                 [/\|\s*(class|currentstatus)\s*=\s*fl\b/i, "fl"],
                //  {{Procene kvaliteta članaka|stub}}
                 [/\|\s*class\s*=\s*a\b/i, "a"],
                //  {{Procene kvaliteta članaka|start}}
                 [/\|\s*class\s*=\s*b\b/i, "b"],
                //  {{Procene kvaliteta članaka|c}}
                 [/\|\s*class\s*=\s*bplus\b/i, "bplus"], //used by WP Math
                //  {{Procene kvaliteta članaka|class=stub}}
                 [/\|\s*class\s*=\s*c\b/i, "c"],
                [/\{\{\s*Procene kvaliteta članaka\s*\|\s*(fa|fl|ga|a|b|c|start|stub|list|dab|setindex|redir)\s*[\|\}]/i, "$1"],
                 [/\|\s*class\s*=\s*start/i, "start"],
 
                [/\|\s*class\s*=\s*stub/i, "stub"],
                // (2) KOMPATIBILNOST: WP1.0 / WikiProject šabloni
                 [/\|\s*class\s*=\s*al\b/i, "al"], // used by WP Military history & WP Highways
                // Ovo je “rezerva” ako neko kasnije ubaci šablon drugačijeg formata.
                 [/\|\s*class\s*=\s*bl\b/i, "bl"], // used by WP Military history
                // Napomena: ovde se traži parametar class=... ili currentstatus=...
                 [/\|\s*class\s*=\s*cl\b/i, "cl"], // used by WP Military history
                 [/\|\s*(class|currentstatus)\s*=\s*fa\b/i, "fa"],     // izabrani članak
                 [/\|\s*class\s*=\s*list/i, "list"],
                 [/\|\s*(class|currentstatus)\s*=\s*fl\b/i, "fl"],     // izabrana lista
                [/\|\s*class\s*=\s*sl\b/i, "sl"], // used by WP Plants
                 [/\|\s*class\s*=\s*a\b/i, "a"],                       // A-razred
                 [/\|\s*class\s*=\s*(dab|disambig)/i, "dab"],
                 [/\|\s*class\s*=\s*b\b/i, "b"],                       // B-razred
                [/\|\s*class\s*=\s*cur(rent)?/i, "cur"],
                 [/\|\s*class\s*=\s*bplus\b/i, "bplus"],               // B+ (retko, specijalno)
                 [/\|\s*class\s*=\s*future/i, "future"]
                 [/\|\s*class\s*=\s*c\b/i, "c"],                       // C-razred
                 [/\|\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
             ];
             ];
         //evaluate the standard checks
 
         // Prolazimo kroz standardne provere i uzimamo prvu koja “pogodi”
         $.each(standardChecks, function (i, e) {
         $.each(standardChecks, function (i, e) {
             if (text.match(e[0])) {
             if (text.match(e[0])) {
Ред 125: Ред 148:
             }
             }
         });
         });
         //and then the nonstandard ones. These override earlier ratings if applicable.
 
         // 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)) {
         if (rating === "a" && text.match(/\|\s*class\s*=\s*ga\b|\|\s*currentstatus\s*=\s*(ffa\/)?ga\b/i)) {
             rating = "a/ga"; // A-class articles that are also GA's
             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) &&
         } else if (
                !text.match(/\|\s*currentstatus\s*=\s*dga\b/i)) {
            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";
             rating = "ga";
         }
         }
         return rating;
         return rating;
     };
     };


     /**
     /**
     * Searches the provided wikicode for data on the article's current and past
     * Formira objekat procene na osnovu razgovor-strane.
     * featured or good status and returns an object that contains this data
     * (Ovde zadržavamo osnovno: rating + postoji li procena.)
    * along with some miscellaneous other bits of information.
    * @param {String} text - some wikitext to be searched for assessment info
    * @return {Object} gottenAssessment - the assessment data for the page
     */
     */
     am.getAssessment = function (text) {
     am.getAssessment = function (text) {
Ред 149: Ред 173:
             activeReview: null,
             activeReview: null,
             exists: true
             exists: true
         },
         };
            actionNumber = 0,
            pageLinkFlag = false,
            peerReview, linkPattern, linkMatch, currentList, formerList;
 
        currentList = [
            // Current nominations (FAC, FLC, or GAN)
            {
                reg: /\{\{\s*featured[ _]article[ _]candidates\s*(?:[\|\}]\s*([^\|\}]*))?[^\}]*?\}\}/i,
                extraName: "fac",
                addArticleNameTo: "Wikipedia:Featured_article_candidates\/"
            },
            {
                reg: /\{\{\s*featured[ _]list[ _]candidates\s*(?:[\|\}]\s*([^\|\}]*))?[^\}]*?\}\}/i,
                extraName: "flc",
                addArticleNameTo: "Wikipedia:Featured_list_candidates\/"
            },
            {
                reg: /\{\{\s*ga ?nominee\s*[\|\}][^\}]*\}\}/i,
                extraName: "gan",
                addMatchReg: /\|\s*page\s*=\s*(\d+).*\|\s*status\s*=\s*\w+\b/i,
                addMatchTo: "Talk:" + mw.config.get("wgPageName") + "\/GA"
            },
            // Current reviews of a status (FAR, FLRC, or GAR)
            {
                reg: /\{\{\s*featured[ _]article[ _]review\s*(?:[\|\}]\s*([^\|\}]*))?[^\}]*?\}\}/i,
                extraName: "far",
                addArticleNameTo: "Wikipedia:Featured_article_review\/"
            },
            {
                reg: /\{\{\s*featured[ _]list[ _]removal[ _]candidates\s*(?:[\|\}]\s*([^\|\}]*))?[^\}]*?\}\}/i,
                extraName: "flrc",
                addArticleNameTo: "Wikipedia:Featured_list_removal_candidates\/"
            },
            {
                reg: /\{\{\s*gar\/link\s*[\|\}][^\}]*\}\}/i,
                extraName: "gar",
                addMatchReg: /\|\s*GARpage\s*=\s*(\d+).*\|/i,
                addMatchTo: mw.config.get("wgPageName")
            }
        ];
        $.each(currentList, function (i, e) {
            var reg = text.match(e.reg),
                articleName,
                tempMatch;
            if (reg) {
                gottenAssessment.extra.push(e.extraName);
                if (e.hasOwnProperty("addArticleNameTo") && reg[1]) {
                    articleName = am.decodeEntities($.trim(reg[1]));
                    if (articleName) {
                        gottenAssessment.pageLink[0] = e.addArticleNameTo + articleName;
                    }
                }
                if (e.hasOwnProperty("addMatchReg")) {
                    tempMatch = reg[0].match(e.addMatchReg);
                    if (tempMatch) {
                        gottenAssessment.pageLink[0] = (e.addMatchTo || "") + (tempMatch[1] || "");
                    }
                    if (e.extraName === "gar") { //Can't get around this special case easily
                        gottenAssessment.pageLink[0] = am.getGARLink(e.addMatchTo, tempMatch[1]);
                    }
                }
                return false;
            }
        });
 
        formerList = [
            // Former statuses (FFA, FFL, or DGA)
            {
                name: "ffa",
                reg: /\|\s*currentstatus\s*=\s*ffa\b/i,
                getActionNumber: true,
                getActionNumberReg: /\|\s*action(\d+)\s*=\s*far\b/gi
            },
            {
                name: "ffa",
                reg: /\|\s*action(\d+)\s*=\s*far\b/gi,
                extraCondition: function (ec_reg) {
                //Checks if the last FAR entry in ArticleHistory resulted in removal.
                    var match, ratingSearch;
                    if (!ec_reg) {
                        return false;
                    }
                    match = text.match(new RegExp(
                        "\\|\\s*action" + ec_reg[ec_reg.length - 1].match(/\d+/) + "result\\s*=\\s*removed\\b",
                        "i"
                    ));
                    ratingSearch = (gottenAssessment.rating.search(/f[al]/i) === -1);
                    return (match && ratingSearch);
                },
                getActionNumber: true
            },
            {
                name: "ffa",
                reg: /\{\{\s*formerfa2?\b/i
            },
            {
                name: "ffl",
                reg: /\|\s*currentstatus\s*=\s*ffl\b/i
            },
            {
                name: "ffl",
                reg: /\{\{\s*ffl\s*[\|\}]/i
            },
            {
                name: "dga",
                reg: /\|\s*currentstatus\s*=\s*dga\b/i,
                getActionNumber: true,
                getActionNumberReg: /\|\s*action(\d+)\s*=\s*gar\b/gi
            },
            {
                name: "dga",
                reg: /\{\{\s*d(elisted)?ga\s*[\|\}]/i
            },
            // Former nominations (former FAC, FLC, or GAN)
            {
                name: "ffac",
                reg: /\|\s*action(\d+)\s*=\s*fac\b/gi,
                extraCondition: function () {
                    return (gottenAssessment.rating.search(/f[al]/i) === -1);
                },
                getActionNumber: true
            },
            {
                name: "ffac",
                reg: /\|\s*currentstatus\s*=\s*ffac\b/i
            },
            {
                name: "ffac",
                reg: /\{\{\s*fac?(failed|(\-|[ _]\()?contested\)?)\s*[\|\}]/i
            },
            {
                name: "fflc",
                reg: /\|\s*action(\d+)\s*=\s*flc\b/gi,
                extraCondition: function () {
                    return (gottenAssessment.rating.search(/f[al]/i) === -1);
                },
                getActionNumber: true
            },
            {
                name: "fflc",
                reg: /\|\s*currentstatus\s*=\s*fflc\b/i
            },
            {
                name: "fgan",
                reg: /\|\s*action(\d+)\s*=\s*gan\b/gi,
                extraCondition: function () {
                    return (gottenAssessment.rating.search(/f[al]|(a\/)?ga/i) === -1);
                },
                getActionNumber: true
            },
            {
                name: "fgan",
                reg: /\|\s*currentstatus\s*=\s*fgan\b/i
            },
            {
                name: "fgan",
                reg: /\{\{\s*f(ailed ?)?ga\s*[\|\}]/i
            }
        ];
        $.each(formerList, function (i, e) {
            var reg = text.match(e.reg),
                extraCondition = !e.hasOwnProperty("extraCondition") ||
                    typeof e.extraCondition !== "function" ||
                    e.extraCondition(reg), //either true (ignored) or result of function
                tempMatch;
            if (reg && extraCondition) {
                gottenAssessment.extra.push(e.name);
                if (e.getActionNumber) {
                    tempMatch = (e.getActionNumberReg ? text.match(e.getActionNumberReg) : reg);
                    actionNumber = tempMatch[tempMatch.length - 1].match(/\d+/);
                    pageLinkFlag = true;
                }
                return false;
            }
        });
 
        // Looks for currently active peer reviews
        ap.showOldPeerReviews = false; //see TODO below
        peerReview = text.match(/\{\{\s*peer[_ ]?review\s*\|\s*archive\s*=\s*(\d+)\b/i);
        if (peerReview) {
            gottenAssessment.review = "Wikipedia:Peer_review/" +
                mw.config.get("wgPageName") + "/archive" + peerReview[1];
            gottenAssessment.activeReview = true;
        } else if (ap.showOldPeerReviews) {
            $.noop(); // TODO: Add code for old peer reviews
        } else {
            gottenAssessment.review = null;
        }
 
        // Scans for the link associated with an action in ArticleHistory
        if (pageLinkFlag) {
            linkPattern = new RegExp("\\|\\s*action" + actionNumber + "link\\s*=\\s*([^\\n\\|]+)\\s*\\|");
            linkMatch = text.match(linkPattern);
            gottenAssessment.pageLink[1] = linkMatch ? am.decodeEntities(linkMatch[1]) : null;
        }


         return gottenAssessment;
         return gottenAssessment;
Ред 350: Ред 179:


     /**
     /**
     * Parses an assessment object into the HTML and CSS code needed to update
     * Pretvara pronađenu ocenu u:
     * the article header. If it doesn't recognize a part of the information
     * - CSS klasu za naslov (boja teksta naslova)
     * given, it will simply ignore it and mark as unassessed.
     * - slogan (tekst ispod naslova)
    * @param {Object} assess - assessment information for this article
     *
     * @return {String} newClass - the CSS class corresponding to its assessment
     * SVI LINKOVI U SLOGANU VODE NA:
     * @return {String} slogan - HTML giving (with a link) the main assessment
     *   Vojna enciklopedija:Procena sadržaja
     * @return {String} info - HTML giving (with a link) additional information
     */
     */
     am.renderAssessment = function (assess) {
     am.renderAssessment = function (assess) {
         var projectNs = mw.config.get('wgFormattedNamespaces')[4]; // Project namespace (npr. Vojna enciklopedija)
        // Projekat (ns=4) – kod tebe je to “Vojna enciklopedija”
        var assessLink = mw.util.getUrl(projectNs + ":Procena sadržaja"),
         var projectNs = mw.config.get('wgFormattedNamespaces')[4],
             peerReviewText = am.addPeerReview(assess.review, assess.activeReview),
 
             pageLink = assess.pageLink || [null, null],
            // Lokalni link ka tvojoj stranici sa objašnjenjem (Procena sadržaja)
            info = am.getExtraInfo((assess.extra || []), pageLink),
            assessLink = mw.util.getUrl(projectNs + ":Procena sadržaja"),
 
             // Info se ne koristi (namerno prazno, da nema “Wikipedia:” stvari)
             info = [],
 
             newClass,
             newClass,
             slogan,
             slogan,
             ratingList;
             ratingList;


         if (peerReviewText) {
         // Lista svih prikaza (tekstovi su na srpskom)
            info.push(peerReviewText);
        }
         ratingList = [
         ratingList = [
             {
            // Najviši nivoi
                name: "a",
             { name: "fa", className: "assess-fa-text", text: "Izabrani <a>članak</a>" },
                className: "assess-a-text",
             { name: "fl", className: "assess-fl-text", text: "Izabrana <a>lista</a>" },
                text: "An <a>A-class<\/a> article"
             { name: "ga", className: "assess-ga-text", text: "Dobar <a>članak</a>" },
            },
 
             {
             // Ocene kvaliteta
                name: "a/ga",
             { name: "a/ga", className: "assess-a-text", text: "<a>Članak</a> A-razreda (takođe dobar članak)" },
                className: "assess-a-text",
             { name: "a", className: "assess-a-text", text: "<a>Članak</a> A-razreda" },
                text: "An <a>A-class<\/a> article",
             { name: "b", className: "assess-b-text", text: "<a>Članak</a> B-razreda" },
                info: "Also a <a href=\"" + mw.util.getUrl("Wikipedia:Good_articles") + "\">good article<\/a>."
             { 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>" },
                name: "ga",
 
                className: "assess-ga-text",
             // Tipovi strana
                text: "A <a>good article<\/a>",
             { name: "list", className: "assess-list-text", text: "<a>Članak-spisak</a>" },
                url: mw.util.getUrl("Wikipedia:Good_articles")
             { 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>" }
                name: "b",
                className: "assess-b-text",
                text: "A <a>B-class<\/a> article"
            },
            {
                name: "bplus",
                className: "assess-bplus-text",
                text: "A <a>B-plus-class<\/a> article",
                url: mw.util.getUrl("Wikipedia:WikiProject_Mathematics/Wikipedia_1.0/Grading_scheme")
            },
             {
                name: "c",
                className: "assess-c-text",
                text: "A <a>C-class<\/a> article"
            },
            {
                name: "start",
                className: "assess-start-text",
                text: "A <a>start-class<\/a> article"
            },
             {
                name: "stub",
                className: "assess-stub-text",
                text: "Članak <a>klice<\/a>"
            },
             {
            name: "al",
            className: "assess-al-text",
            text: "An <a>A-class<\/a> list",
            url: mw.util.getUrl("Wikipedia:WikiProject_Military_history/Assessment") + "#SCALE" //Could use a more general link if one is available
            },
             {
            name: "bl",
            className: "assess-bl-text",
            text: "A <a>B-class<\/a> list",
            url: mw.util.getUrl("Wikipedia:WikiProject_Military_history/Assessment") + "#SCALE"
            },
             {
            name: "cl",
            className: "assess-cl-text",
            text: "A <a>C-class<\/a> list",
            url: mw.util.getUrl("Wikipedia:WikiProject_Military_history/Assessment") + "#SCALE"
            },
             {
                name: "sl",
                className: "assess-sl-text",
                text: "A <a>stub-class<\/a> list"
            },
             {
                name: "list",
                className: "assess-list-text",
                text: "A <a>list-class<\/a> article",
                url: mw.util.getUrl("Wikipedia:Stand-alone lists")
            },
             {
                name: "dab",
                className: "assess-dab-text",
                text: "A <a>disambiguation page<\/a>",
                url: mw.util.getUrl("Wikipedia:Disambiguation")
            },
             {
                name: "setindex",
                className: "assess-setindex-text",
                text: "A <a>set index article<\/a>",
                url: mw.util.getUrl("Wikipedia:Set_index_articles")
            },
             {
                name: "redir",
                className: "assess-redir-text",
                text: "A <a>redirect page<\/a>",
                url: mw.util.getUrl("Help:Redirect")
            },
            {
                name: "fl",
                className: "assess-fl-text",
                text: "A <a>featured list<\/a>",
                url: mw.util.getUrl("Wikipedia:Featured_lists")
            },
            {
                name: "fa",
                className: "assess-fa-text",
                text: "A <a>featured article<\/a>",
                url: mw.util.getUrl("Wikipedia:Featured_articles")
            },
            {
                name: "cur",
                className: "assess-cur-text",
                text: "A <a>current-class<\/a> article",
                url: mw.util.getUrl("Portal:Current_events")
            },
            {
                name: "future",
                className: "assess-future-text",
                text: "A <a>future-class<\/a> article",
                url: mw.util.getUrl("Category:Future-Class_articles")
            }
         ];
         ];
        // Nađi odgovarajući element u ratingList
         $.each(ratingList, function (i, e) {
         $.each(ratingList, function (i, e) {
             if (assess.rating === e.name) {
             if (assess.rating === e.name) {
                 newClass = e.className;
                 newClass = e.className;
                slogan = $("<span>").html(e.text).children().attr({href: (e.url || assessLink)}).parent().html();
                if (e.info) {
                    info.push(e.info);
                }
                return false;
            }
        });
        if (!newClass) {
    newClass = "assess-unassessed-text";
    slogan = "Neprocenjen <a href=\"" + assessLink + "\">članak<\/a>";
}
        return {newClass: newClass, slogan: slogan, info: info};
    };


    /**
                // “a” tag u e.text dobija href ka tvojoj stranici Procena sadržaja
    * Creates an info string based on the assessment info and a page link.
                slogan = $("<span>")
    */
                    .html(e.text)
    am.getExtraInfo = function (extra, pageLink) {
                    .children()
        var info = [], page = mw.config.get("wgPageName"), typeList;
                    .attr({ href: assessLink })
                    .parent()
                    .html();


        typeList = [
                 return false;
            // Current nominations and reviews
            {
                 name: "fac",
                html: "Currently a <a>featured article candidate<\/a>.",
                url: pageLink[0] || ("Wikipedia:Featured_article_candidates/" + page)
            },
            {
                name: "flc",
                html: "Currently a <a>featured list candidate<\/a>.",
                url: pageLink[0] || ("Wikipedia:Featured_list_candidates/" + page)
            },
            {
                name: "gan",
                html: "Currently a <a>good article nominee<\/a>.",
                url: pageLink[0] || "Wikipedia:Good_article_nominations"
            },
            {
                name: "far",
                html: "Currently undergoing <a>review<\/a> of its featured status.",
                url: pageLink[0] || ("Wikipedia:Featured_article_review/" + page)
            },
            {
                name: "flrc",
                html: "Currently a <a>candidate<\/a> for removal as a featured list.",
                url: pageLink[0] || ("Wikipedia:Featured_list_removal_candidates/" + page)
            },
            {
                name: "gar",
                html: "Currently undergoing a <a>good article reassessment<\/a>.",
                url: pageLink[0] || "Wikipedia:Good_article_reassessment",
                wrapper: "<span id=\"assess-gar-link\"><\/span>"
            },
            // Past statuses and nominations
            {
                name: "ffa",
                html: "A <a>former<\/a> featured article.",
                url: pageLink[1] || ("Wikipedia:Featured_article_review/" + page)
            },
            {
                name: "ffl",
                html: "A <a>former<\/a> featured list.",
                url: pageLink[1] || ("Wikipedia:Featured_list_removal_candidates/" + page)
            },
            {
                name: "dga",
                html: "A <a>delisted<\/a> good article.",
                url: pageLink[1] || "Wikipedia:Good_article_reassessment"
            },
            {
                name: "ffac",
                html: "A former <a>featured article candidate<\/a>.",
                url: pageLink[1] || ("Wikipedia:Featured_article_candidates/" + page)
            },
            {
                name: "fflc",
                html: "A former <a>featured list candidate<\/a>.",
                url: pageLink[1] || ("Wikipedia:Featured_list_candidates/" + page)
            },
            {
                name: "fgan",
                html: "A former <a>good article nominee<\/a>.",
                url: pageLink[1] || "Wikipedia:Good_article_nominations"
            }
        ];
        $.each(typeList, function (i, e) {
            if (extra.indexOf(e.name) !== -1) {
                info.push($("<span>").html(e.html).children().attr({href: mw.util.getUrl(e.url)})
                    .parent().wrapInner(e.wrapper || null).html());
             }
             }
         });
         });


         return info;
         // 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 };
    * Get the correct link for Good Article reassessments. These things require an
    * additional AJAX request to determine whether it's a community or individual
    * reassessment. The trick is to assume it's a community reassessment, then
    * switch the link once the request returns if it's actually not.
    * @param {String} articleName - the name of the article to use
    * @param {String} reviewNumber - the number of the GAR to look for
    */
    am.getGARLink = function (articleName, reviewNumber) {
         var communityTitle = "Wikipedia:Good_article_reassessment\/" + articleName + "\/" + reviewNumber,
            individualTitle = "Talk:" + articleName + "\/GA" + reviewNumber,
            titlesList = [communityTitle, individualTitle],
            api = new mw.Api();
 
        api.get({
            action: "query",
            titles: titlesList.join("|"),
            prop: "info",
            format: "json"
        }).done(function (data) {
            var i, j, noCommunityAssessment,
                query = data.query,
                communityTitleNorm = titlesList[0],
                individualTitleNorm = titlesList[1],
                len = query.normalized.length,
                garLink = $("#assess-gar-link a:first");
 
            for (j = 0; j < len; j++) {
                switch (query.normalized[j].from) {
                case titlesList[0]:
                    communityTitleNorm = query.normalized[j].to;
                    break;
                case titlesList[1]:
                    individualTitleNorm = query.normalized[j].to;
                    break;
                }
            }
            noCommunityAssessment = false;
            for (i = -1; i >= -2; i--) {
                if (query.pages[i] && typeof query.pages[i].missing === "string") {
                    if (query.pages[i].title === individualTitleNorm) {
                        // No individual assessment, no need to change anything.
                        return;
                    }
                    if (query.pages[i].title === communityTitleNorm) {
                        // There's no community assessment, so flag it.
                        noCommunityAssessment = true;
                    }
                }
            }
            if (noCommunityAssessment && garLink.length) {
                // There's an individual assessment but no community assessment. Switch the link.
                garLink.attr("href", mw.util.getUrl(titlesList[1]));
            }
        });
        return communityTitle;
    };
 
    /**
    * Creates the peer review text from an info string, if a peer review was detected earlier.
    */
    am.addPeerReview = function (peerReview, activeReview) {
        var reviewText = null;
        if (peerReview) {
            reviewText = $("<div><span class=\"assess-info-review\">" +
                (activeReview ? "Currently being" : "Previously") + " <a>peer reviewed<\/a>.<\/span><\/div>");
            reviewText.find("a").attr({href: mw.util.getUrl(peerReview)});
            reviewText = reviewText.html(); //Note div wrapper above.
        }
        return reviewText;
     };
     };


     /**
     /**
     * Updates article header with new assessment information by giving it a new
     * Upisuje rezultat u zaglavlje članka:
     * class (for style information such as color) and altering the tagline below
     * - boji naslov (h1) preko CSS klase
     * it to state the assessment found.
     * - menja #siteSub da prikaže slogan + “— iz Vojne enciklopedije”
     */
     */
     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>"),
            // Ovo je fiksni deo: “— iz Vojne enciklopedije”
             siteSub = $("<div><span class=\"assess-article-rating\"><\/span> — iz Vojne enciklopedije<\/div>");
             siteSub = $("<div><span class=\"assess-article-rating\"><\/span> — iz Vojne enciklopedije<\/div>");
        // Upis slogana (npr. “Članak-klica”, “Članak B-razreda”, itd.)
         siteSub.children().html(ap.updata.slogan);
         siteSub.children().html(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(".");
Ред 674: Ред 271:
             siteSub.append(infoSpan);
             siteSub.append(infoSpan);
         }
         }
        // 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());
     };
     };


     /**
     /**
     * Decodes all HTML entities in the string provided.
     * Pomoćna funkcija: dekodiranje HTML entiteta (rezerva, ako zatreba).
     */
     */
     am.decodeEntities = function (str) {
     am.decodeEntities = function (str) {
Ред 691: Ред 292:


/**
/**
  * Initializes the script on page load
  * Start gadžeta pri učitavanju strane
  */
  */
$(assessment.init);
$(assessment.init);

Верзија на датум 7. фебруар 2026. у 18:25

/** _____________________________________________________________________________
 * |                                                                             |
 * |                    === 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 tekst 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: {}
    },
        // 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
                }
            });
        } 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 = [
            // Ako postoji element koji obeležava višeznačnost
            [$("#disambig, #disambig_disambigbox, #disambigbox").length, "dab"],

            // Ako postoji setindex box
            [$("#setindexbox").length, "setindex"],

            // Ako je stranica 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}}
                [/\{\{\s*Procene kvaliteta članaka\s*\|\s*(fa|fl|ga|a|b|c|start|stub|list|dab|setindex|redir)\s*[\|\}]/i, "$1"],

                // (2) KOMPATIBILNOST: WP1.0 / WikiProject šabloni
                // Ovo je “rezerva” ako neko kasnije ubaci šablon drugačijeg formata.
                // Napomena: ovde se 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"],                        // A-razred
                [/\|\s*class\s*=\s*b\b/i, "b"],                        // B-razred
                [/\|\s*class\s*=\s*bplus\b/i, "bplus"],                // B+ (retko, specijalno)
                [/\|\s*class\s*=\s*c\b/i, "c"],                        // C-razred
                [/\|\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) {
            if (text.match(e[0])) {
                rating = 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.
     * (Ovde zadržavamo osnovno: 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"),

            // Info se ne koristi (namerno prazno, da nema “Wikipedia:” stvari)
            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>" },
            { name: "fl", className: "assess-fl-text", text: "Izabrana <a>lista</a>" },
            { name: "ga", className: "assess-ga-text", text: "Dobar <a>članak</a>" },

            // 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”
     */
    am.update = function () {
        var info = ap.updata.info,
            infoSpan = $("<span class=\"assess-info-all\"><\/span>"),

            // Ovo je 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(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);