User:Quarl/diffsince.js

// User:Quarl/diffsince.js - utility functions for doing a "diff since I // last edited"

// depends: wikipage.js, util.js

// Synopsis: //   url = diffsince.makeUrl(wikiPage); //   href = 'diff since';

// Or: //   url = diffsince.makeUrl(wp); //   href = 'diff since';

// Navigating to the value of makeUrl will open a history page, parse it, and // jump to the appropriate diff.

// The diffPageAsync function asynchronously downloads the history page and // then navigates to the diff. It is appropriate as an onClick handler.

// The diffThis function does the diff directly if already looking at a // history page, else calls diffPageAsync(wikiPage).

// diffPageAsync and diffThis take status_node and status_text parameters for // showing progress.

// quarl 2006-01-16 (asynchronous code originally written in show_diff_since.js) // quarl 2006-02-03 factored as library

//

var diffsince = new Object;

diffsince.historyLimit = [200];

// return a URL that points to a "fakeaction" page for doing a diff. diffsince.makeUrl = function(wp) { return wp.qurl + '&fakeaction=diffsince&action=history&limit='+diffsince.historyLimit[0]; }

diffsince._load = function { if (WikiPage.queryVars.fakeaction == 'diffsince') { diffsince._parseHistory(document); } }

diffsince.diffPageAsync = function(wp, statusNode, statusText) { var url = wp.qurl + '&action=history&limit='+diffsince.historyLimit[0]; var req = new XMLHttpRequest;

// change the button to show the user we're doing something and // prevent another click buttonShowStatus(statusNode, statusText); // (statusNode, statusText are optional)

asyncDownloadXML(url, diffsince._handleHistoryPage,                    { statusNode: statusNode }); return false; }

diffsince.diffThis = function(statusNode, statusText) { if (wikiDoc.historyP) { // already looking at a history page diffsince._parseHistory(document); } else { // not yet a history page -- asynchronously download it first diffsince.diffPageAsync(wikiPage, statusNode, statusText); }   return false; }

diffsince._handleHistoryPage = function(req) { // restore button in case this fails, so user can click again buttonRestoreStatus(req.statusNode);

if (req.status == 200) { diffsince._parseHistory(req.responseXML); } else { alert("Error downloading history page!"); } }

diffsince._parseHistory = function(doc) { if (!doc) { alert ("## no doc?!"); return; } var hists = doc.getElementById("pagehistory").childNodes; if (!hists) { alert("Couldn't parse history from page"); return; } for (n=0;n<hists.length;n++) { // window.username is defined in wikipage.js       if (hists[n].getElementsByTagName &&            hists[n].getElementsByTagName("span")[0].textContent==wikiDoc.username) {           document.location = hists[n].childNodes[1].href; return; }   }

alert("diffsince: Couldn't find your entry in the history page; you haven't edited recently!"); // TODO: retry with a larger limit }

$(diffsince._load);

//