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

Медијавики:Gadget-metadata.js

Iz Vojne Enciklopedije

Напомена: Пошто објавите измене, можда ћете морати да обришете кеш прегледача како бисте их видели.

  • 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:
 * - 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);