Sonako Light Novel Wiki
Advertisement

Chú ý: Sau khi lưu trang, có thể bạn sẽ phải xóa bộ nhớ đệm của trình duyệt để xem các thay đổi.

  • Firefox / Safari: Nhấn giữ phím Shift trong khi nhấn Tải lại (Reload), hoặc nhấn tổ hợp Ctrl-F5 hay Ctrl-R (⌘R trên Mac)
  • Google Chrome: Nhấn tổ hợp Ctrl-Shift-R (⇧⌘R trên Mac)
  • Internet Explorer / Edge: Nhấn giữ phím Ctrl trong khi nhấn Làm tươi (Refresh), hoặc nhấn tổ hợp Ctrl-F5
  • Opera: Nhấn tổ hợp Ctrl-F5.
// Credit go to Penguin-Pal 
// Modified it to make it work with AjaxRC and some Duplicate pages
function SpecialPages() {
    /* data */
    var data = {
            pages: {}, // key = title, value = data
            ids: {}, // key = title, value = pageid
            specialPages: ["Longpages", "Newpages", "Protectedpages"],
            normalPages: ["Sonako_Light_Novel", "Sonako_Cập_Nhật"]
        },
        fn = {};

    /* functions */
    // json xhr
    fn.queryJsonUrl = function(url, cb) {
        var a = new XMLHttpRequest(),
            b;
        a.open("GET", url, true);
        a.onload = function() {
            b = JSON.parse(a.responseText);
            cb(b);
        };
        a.send();
    };

    // prepare ids of pages
    fn.preparePageIds = function(list, cb) {
        if (list.length > 0) {
            fn.queryJsonUrl(mw.config.get("wgScriptPath") + "/api.php?action=query&format=json&titles=" + encodeURIComponent(list.splice(0, 100).join("|")), function(response) {
                var pages = response.query.pages,
                    pageid;
                for (pageid in pages) {
                    data.ids[pages[pageid].title] = pageid;
                }
                fn.preparePageIds(list, cb);
            });
        } else {
            cb();
        }
    };

    // prepare data of pages
    fn.preparePageData = function(ids, cb) {
        if (ids.length > 0) {
            fn.queryJsonUrl("/api/v1/Articles/Details?abstract=150&width=128&height=128&ids=" + ids.splice(0, 100).join(","), function(response) {
                var page,
                    pageid;
                for (pageid in response.items) {
                    page = response.items[pageid];
                    data.pages[page.title] = {
                        id: page.id,
                        title: page.title,
                        desc: page.abstract,
                        url: page.url,
                        src: page.thumbnail || mw.config.get("wgBlankImgUrl")
                    };
                }
                fn.preparePageData(ids, cb);
            });
        } else {
            cb();
        }
    };

    // generate markup
    fn.generateMarkup = function(list) {
        var nav = $('<nav class="special-pages-preview" />'),
            item,
            pg,
            columns = 3;
        list.forEach(function(page, i) {
            pg = data.pages[page];
            if (typeof pg === "undefined") {
                pg = {
                    url: "/wiki/" + mw.util.wikiUrlencode(page),
                    title: page,
                    src: null,
                    desc: ""
                };
            }
            if (typeof pg.src !== "string") {
                pg.src = mw.config.get("wgBlankImgUrl");
            }
            console.log(page, i, pg);
            item = $('<a target="_blank" class="special-pages-preview-link" />').attr({
                href: pg.url,
                title: pg.title
            }).append(
                $('<img class="special-pages-preview-image" />').attr({
                    src: pg.src,
                    width: 128,
                    height: 128
                }),
                $('<span class="special-pages-preview-title" />').text(pg.title),
                $('<span class="special-pages-preview-description" />').text(pg.desc)
            );
            $('<div class="special-pages-preview-item" />').attr({
                "data-row": i % 3 + 1
            }).append(item).appendTo(nav);
            if (i % columns == 2) {
                $(nav).append('<br />');
            }
        });
        return nav;
    };

    // generate Normal page markup
    fn.generateNormalMarkup = function(list) {
        var nav = $('<nav class="normal-pages-preview" />'),
            item,
            pg,
            columns = 2;
        list.forEach(function(page, i) {
            pg = data.pages[page];
            if (typeof pg === "undefined") {
                pg = {
                    url: "/wiki/" + mw.util.wikiUrlencode(page),
                    title: page,
                    src: null,
                    desc: ""
                };
            }
            if (typeof pg.src !== "string") {
                pg.src = mw.config.get("wgBlankImgUrl");
            }
            console.log(page, i, pg);
            item = $('<a target="_blank" class="normal-pages-preview-link" />').attr({
                href: pg.url,
                title: pg.title
            }).append(
                $('<img class="normal-pages-preview-image" />').attr({
                    src: pg.src,
                    width: 128,
                    height: 128
                }),
                $('<span class="normal-pages-preview-title" />').text(pg.title),
                $('<span class="normal-pages-preview-description" />').text(pg.desc)
            );
            $('<div class="normal-pages-preview-item" />').attr({
                "data-row": i % 2 + 1
            }).append(item).appendTo(nav);
            if (i % columns == 1) {
                $(nav).append('<br />');
            }
        });
        return nav;
    };


    // prepare pages
    fn.preparePages = function(list, cb) {
        fn.preparePageIds(list.concat(), function() {
            var ids = [];
            list.forEach(function(page) {
                ids.push(data.ids[page]);
            });
            fn.preparePageData(ids, function() {
                var nav = fn.generateMarkup(list);
                cb(nav);
            });
        });
    };

    // prepare normal pages
    fn.prepareNormalPages = function(list, cb) {
        fn.preparePageIds(list.concat(), function() {
            var ids = [];
            list.forEach(function(page) {
                ids.push(data.ids[page]);
            });
            fn.preparePageData(ids, function() {
                var nav = fn.generateNormalMarkup(list);
                cb(nav);
            });
        });
    };

    // get selectors for given normal page
    fn.getSpecialPageSelectors = function(specialPage) {
        var s = {
            wrapper: "ol.special",
            items: "ol.special li a"
        };
        switch (normalPage) {
            case "Sonako_Light_Novel":
                s.wrapper = "#mw-content-text .newpages > ul";
                s.items = "#mw-content-text .newpages > ul a.mw-newpages-pagename";
                break;
            case "Sonako_Cập_Nhật":
                s.wrapper = "#mw-content-text > ul";
                s.items = "#mw-content-text > ul a.mw-newpages-pagename";
                break;
        }
        switch (specialPage) {
            case "Protectedpages":
                s.wrapper = "#mw-content-text > ul";
                s.items = "#mw-content-text > ul a:first-of-type";
                break;
            case "Newpages":
                s.wrapper = "#mw-content-text > ul";
                s.items = "#mw-content-text > ul a.mw-newpages-pagename";
                break;
            case "Longpages":
                s.items = "ol.special a:last-of-type";
                break;
        }
        return s;
    };

    /* implementations */
    var specialPage = mw.config.get("wgCanonicalSpecialPageName"),
        normalPage = mw.config.get("wgPageName"),
        specialPageContent = [],
        selectors;
    if (data.specialPages.indexOf(specialPage) > -1) {
        selectors = fn.getSpecialPageSelectors(specialPage);
        $(selectors.items).each(function() {
            specialPageContent.push($(this).text());
        });
        fn.preparePages(specialPageContent, function(nav) {
            $(selectors.wrapper).html(nav);
        });
    }
    if (data.normalPages.indexOf(normalPage) > -1) {
        selectors = fn.getSpecialPageSelectors(normalPage);
        $(selectors.items).each(function() {
            specialPageContent.push($(this).text());
        });
        fn.prepareNormalPages(specialPageContent, function(nav) {
            $(selectors.wrapper).html(nav);
        });
    }
}

$(function() {
    $(SpecialPages);
    // ajaxrc support
    window.ajaxCallAgain = window.ajaxCallAgain || [];
    window.ajaxCallAgain.push(SpecialPages);
});
Advertisement