User:Mike Dillon/Scripts/recentpages.js

From Wiktionary, the free dictionary
Jump to navigation Jump to search

Note – after saving, you may have to bypass your browser’s cache to see the changes.

  • Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
  • Konqueror and Chrome: click Reload or press F5;
  • Opera: clear the cache in Tools → Preferences;
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.

// Requires: [[User:Mike Dillon/Scripts/i18n.js]], [[User:Mike Dillon/Scripts/easydom.js]], [[User:Mike Dillon/Scripts/cookies.js]]

var pageHistoryCookieName;
var pageHistoryCookieItemCount;
var pageHistoryBeforePorlet;
var pageHistoryExpiresInDays;

/* Messages */
// pageHistoryTitle: title of page history portlet
wfAddMsg("en", "pageHistoryTitle", "Page history");
wfAddMsg("es", "pageHistoryTitle", "Historial de páginas");

// clearHistoryLabel: label of the "clear history" link
wfAddMsg("en", "clearHistoryLabel", "clear history");
wfAddMsg("es", "clearHistoryLabel", "borrar historial");

// clearHistoryTitle: tooltip of the "clear history" link
wfAddMsg("en", "clearHistoryTitle", "Clear page history");
wfAddMsg("es", "clearHistoryTitle", "Borrar historial de páginas");

// noPageHistoryText: text to display when there is no page history
wfAddMsg("en", "noPageHistoryText", "No page history");
wfAddMsg("es", "noPageHistoryText", "Ningún historial de páginas");

$(function () {
    // Set defaults for variables
    if (!pageHistoryCookieName) pageHistoryCookieName = "pageHistory";
    if (!pageHistoryCookieItemCount) pageHistoryCookieItemCount = 10;
    if (!pageHistoryBeforePorlet) pageHistoryBeforePorlet = null;
    if (!pageHistoryExpiresInDays) pageHistoryExpiresInDays = 0;

    // Create portlet
    with (easyDom) {
        var historyPortlet = div({ "class": "portlet", "id": "p-history" },
            h5(wfMsg("pageHistoryTitle")));
        var historyList = ul();
        var historyPBody = div({ "class": "pBody" }, historyList);
        historyPortlet.appendChild(historyPBody);
    }

    // Insert portlet
    var beforePortlet = document.getElementById(pageHistoryBeforePorlet);
    document.getElementById("column-one").insertBefore(historyPortlet, beforePortlet);

    // Extract previous history from cookie
    var historyItems = [];
    var historyCookie = readCookie(pageHistoryCookieName);
    if (historyCookie) {
        var cookieItems = historyCookie.split(",");
        for (var n in cookieItems) {
            historyItems.push(decodeURIComponent(cookieItems[n]));
        }
    }

    // Prepend the current page to the list, remove duplicates, and control item count
    if (wgArticleId > 0) {
        historyItems.unshift(wgPageName);
        for (var n = 1; n < historyItems.length; n++) {
            if (historyItems[n] == wgPageName) {
                historyItems.splice(n, 1);
            }
        }
        if (pageHistoryCookieItemCount > 0) {
            while (historyItems.length > pageHistoryCookieItemCount) {
                historyItems.pop();
            }
        }
    }

    // History clearing
    var clearHistory = function () {
        historyItems = [];
        while (historyList.firstChild) {
            historyList.removeChild(historyList.firstChild);
        }
        with (easyDom) {
            historyList.appendChild(li(em(wfMsg("noPageHistoryText"))));
        }
        $.removeCookie(pageHistoryCookieName, { path: "/" });
        return false;
    };

    // Build out the history list
    with (easyDom) {
        if (historyItems.length == 0) {
            historyList.appendChild(li(em(wfMsg("noPageHistoryText"))));
        } else {
            for (var n in historyItems) {
                var itemUrl = wgArticlePath.replace(/\$1/,
                     encodeURIComponent(historyItems[n]));
                itemUrl = itemUrl.replace(/%2f/gi, "/");
                itemUrl = itemUrl.replace(/%3a/gi, ":");

                var itemLabel = historyItems[n].replace(/_/g, " ");
                // Add zero-width spaces before some punctuation
                itemLabel = itemLabel.replace(/([\/(])/g, "\u200B$1");
                // Add zero-width spaces after other punctuation
                itemLabel = itemLabel.replace(/([:;,.)-])/g, "$1\u200B");

                historyList.appendChild(li(
                    a({ "href": itemUrl, "title": historyItems[n] }, itemLabel)));
            }

            var clearHistoryLink = a({ "href": "#", "title": wfMsg("clearHistoryTitle") },
                em(wfMsg("clearHistoryLabel")));
            clearHistoryLink.onclick = clearHistory;
            historyPBody.appendChild(div(
                { "style": "padding-top: 1em; text-align: right" }, clearHistoryLink));
        }
    }

    // Write out the updated cookie
    historyCookie = "";
    for (var n in historyItems) {
        var encodedItem = encodeURIComponent(historyItems[n]);

        // Limit cookie value size to 4000 bytes
        if (historyCookie.length + encodedItem.length + 1 > 4000) break;

        if (n > 0) historyCookie += ",";
        historyCookie += encodedItem;
    }
    writeCookie(pageHistoryCookieName, historyCookie,
        { "path": "/", "expiresInDays": pageHistoryExpiresInDays });
});