User:Mike Dillon/Scripts/recentpages.js
From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
// Requires: [[User:Mike Dillon/Scripts/i18n.js]], [[User:Mike Dillon/Scripts/easydom.js]], [[User:Mike Dillon/Scripts/cookies.js]] /* <pre><nowiki> */ 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"); addOnloadHook(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")))); } deleteCookie(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 }); }); /* </nowiki></pre> */

