Gebruiker:JePe/recentrevisionsbox.js

Uit Wikipedia, de vrije encyclopedie

Opmerking: nadat u de wijzigingen hebt gepubliceerd is het wellicht nodig uw browsercache te legen.

  • Firefox / Safari: houd Shift ingedrukt terwijl u op Vernieuwen klikt of druk op Ctrl-F5 of Ctrl-R (⌘-Shift-R op een Mac)
  • Google Chrome: druk op Ctrl-Shift-R (⌘-Shift-R op een Mac)
  • Internet Explorer / Edge: houd Ctrl ingedrukt terwijl u op Vernieuwen klikt of druk op Ctrl-F5
  • Opera: druk op Ctrl-F5.
// <pre>

// (nl) Dit script leest de meest recente bewerkingen van een pagina
// uit de MediaWiki API en plaatst die in een box in de zijbalk
// boven de navigatie na het indrukken van een knop. In de box staan de
// gebruikersnamen met een link naar de betreffende paragraaf. 
// Voor de naam staat het tijdstip van de bewerking met een
// link die een diff met het verschil tussen de vorige bewerking
// boven de pagina plaatst. In de tooltip staat de bewerkingssamenvatting.
//
// (en) This script reads the most recent versions off a page
// from the MediaWiki API and places them in a box in the sidebar
// above the navigation after the press of a button. In the box are the
// usernames listed with a link to the corresponding paragraph.
// Before the name you can find the time of the edit with a
// link what places a diff with the differences with the previous version
// on top of the page. The tooltip contains the edit summary.
//
// Auteur/author: nl:User:JePe


function removeDiff()
{
   var diffFrame = document.getElementById("revisionsBoxDiff");
   if (diffFrame) diffFrame.parentNode.removeChild(diffFrame);
}

function makeCloseButton(position)
{
    var closeButton = document.createElement("img");  
    with (closeButton) {
       style.cssFloat = position; 
       style.styleFloat = position;
       style.verticalAlign = "baseline";
       style.cursor = "pointer";
       title = closeButtonTitle; 
       src = "http://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/No-Symbol.svg/9px-No-Symbol.svg.png";    
       height = "9";                                                                                            
       width = "9"; }                                                                                          
    return closeButton;
}

function processDiff()
{
    if (diffReq.readyState != 4) return;
    if (diffReq.status != 200) return;
    var bodyContent = document.getElementById("bodyContent");                  
    var diffFrame = document.createElement("div");                              
    diffFrame.id = "revisionsBoxDiff";                                           
    diffFrame.innerHTML = diffReq.responseText;                                 
    diffTable = diffFrame.getElementsByTagName("table")[0];   
    if (!diffTable) return;
    if (diffTable.className != "diff") return;                  
    diffTable.style.border = "1px solid #ccc";                                  
    diffTable.style.width = "100%";                                             
    diffTable.style.paddingBottom = ".5em";                                     
    diffTable.style.marginBottom = "1em";                                       
    diffTable.style.marginTop = ".5em";                                         
    var closeButton = makeCloseButton("left"); 
    closeButton.onclick = removeDiff;
    var tdNode = diffTable.getElementsByTagName("td");    
    for (i=0; i < tdNode.length; i++) {
       if (tdNode[i].className == "diff-otitle") {
          tdNode[i].insertBefore(closeButton, tdNode[i].firstChild); 
          tdNode[i].style.verticalAlign = "top";
       } else if (tdNode[i].className == "diff-ntitle") {
          tdNode[i].style.verticalAlign = "top";
       }   
    }                                        
    var diffFrameOld = document.getElementById("revisionsBoxDiff");              
    if (diffFrameOld) diffFrameOld.parentNode.removeChild(diffFrameOld);        
    bodyContent.parentNode.insertBefore(diffFrame,bodyContent);                 
    window.location.hash = "revisionsBoxDiff";
    var prevLink = document.getElementById("differences-prevlink");  
    if (prevLink) {      
       var oldid = prevLink.href.replace(/[\s\S]+&oldid=(\d+)[\s\S]*/,"$1");    
       prevLink.href = "javascript:loadDiff("+oldid+",'prev')"; }                                                      
    var nextLink = document.getElementById("differences-nextlink");  
    if (nextLink) {           
       var oldid = nextLink.href.replace(/[\s\S]+&oldid=(\d+)[\s\S]*/,"$1");   
       nextLink.href = "javascript:loadDiff("+oldid+",'next')"; }                                                   
}    

function loadDiff(oldid,diffDir)
{
    var url = "/w/index.php?title=" + wgPageName;
    url += "&diff=" + diffDir;
    url += "&oldid=" + oldid;
    url += "&diffonly=1&action=render";
    if (window.XMLHttpRequest) { // native XMLHttpRequest
        diffReq = new XMLHttpRequest();
        diffReq.onreadystatechange = processDiff;
        diffReq.open("GET", url, true);
        diffReq.send(null);
    } else if (window.ActiveXObject) { // activeX version
        diffReq = new ActiveXObject("Microsoft.XMLHTTP");
        if (diffReq) {
            diffReq.onreadystatechange = processDiff;
            diffReq.open("GET", url, true);
            diffReq.send("");
        }
    }
}

function nextRevisions()
{
   var revContent = document.getElementById("recRevContent");
   var divNode = revContent.appendChild(document.createElement("div"));
   divNode.id = "nextButton";
   divNode.style.textAlign = "center";   
   var button = divNode.appendChild(document.createElement("button"));
   button.innerHTML = buttonNextText;
   button.title = buttonNextTitle;
   button.onclick = loadJsonDoc;            
   button.style.fontSize = "90%";
   button.style.marginTop = ".3em";
   button.style.padding = "0";
} 

function indexSort(revObj)
{
   var revIndex = new Array();                                
   var revIndexSort = new Array();                            
   var x = 0;                                                 
   for (i in revObj) {                                        
      revIndex[x] = i;                                        
      x++;                                                    
      }                                                       
   if (parseInt(revIndex[0]) < parseInt(revIndex[revIndex.length-1])) {           
      for (x = 0; x < revIndex.length; x++) {                 
         revIndexSort[revIndex.length-1-x] = revIndex[x]; }   
      revIndex = revIndexSort;                                
   }    
   return revIndex;                                                      
}

function writeResults(revObj)
{
   var showButton = document.getElementById('showButton');
   var nextButton = document.getElementById('nextButton');
   var revContent = document.getElementById("recRevContent");
   if (showButton) { 
      showButton.parentNode.removeChild(showButton);
      var closeButton = makeCloseButton("right");
      closeButton.onclick = recentRevisions;
      closeButton.style.marginTop = ".3em"; 
      revContent.appendChild(closeButton); }
   if (nextButton) nextButton.parentNode.removeChild(nextButton);   
   var date = new Date();
   var dateNow = (date.getFullYear()*10000) + ((date.getMonth()+1)*100) + date.getDate();
   var revIndex = indexSort(revObj);
   for (i = 0; i < revIndex.length; i++) {
      var time = revObj[revIndex[i]].timestamp;
      var year = time.replace(/^(\d\d\d\d)[\s\S]+/,"$1");
      var month = time.replace(/^\d\d\d\d-(\d\d)[\s\S]+/,"$1");
      var day = time.replace(/^\d\d\d\d-\d\d-(\d\d)[\s\S]+/,"$1");
      var hours = time.replace(/[\s\S]+T(\d\d)[\s\S]+/,"$1");
      var minutes = time.replace(/[\s\S]+T\d\d:(\d\d)[\s\S]+/,"$1");
      date.setUTCFullYear(year,month-1,day);
      date.setUTCHours(hours,minutes);
      var dateRevision = (date.getFullYear()*10000) + ((date.getMonth()+1)*100) + date.getDate();
      if (dateRevision < dateControl) {
         var divNodeDate = revContent.appendChild(document.createElement("div"));
         divNodeDate.style.fontSize = "95%";
         divNodeDate.style.marginTop = ".3em";
         divNodeDate.style.fontWeight = "bold";
         divNodeDate.style.paddingLeft = ".5em";
         divNodeDate.innerHTML = date.getDate() + " " + monthName[date.getMonth()]; 
         if (dateNow - dateRevision > 10000) divNodeDate.innerHTML += " " + date.getFullYear();
         dateControl = dateRevision;   
      }   
      var divNode = revContent.appendChild(document.createElement("div"));
      divNode.style.marginLeft = "1em";
      divNode.style.textIndent = "-1em";
      divNode.style.fontSize = "95%";
      divNode.style.marginTop = ".3em";
      var aNodeTime = divNode.appendChild(document.createElement("a"));
      aNodeTime.innerHTML = (date.getHours() < 10) ? "0" + date.getHours() : date.getHours();
      aNodeTime.innerHTML += ":";
      aNodeTime.innerHTML += (date.getMinutes() < 10) ? "0" + date.getMinutes() : date.getMinutes();
      aNodeTime.style.fontSize = "90%";
      aNodeTime.href = "javascript:loadDiff("+revObj[revIndex[i]].revid+",'prev')";
      aNodeTime.title = timeTitle;
      divNode.appendChild(document.createTextNode(" "));
      var aNodeUser = divNode.appendChild(document.createElement("a"));
      aNodeUser.innerHTML = revObj[revIndex[i]].user;
      if (revObj[revIndex[i]].comment) { 
         var anchorURL = revObj[revIndex[i]].comment.replace(/\\\//g,"/"); 
         } else { var anchorURL = ""; }
      aNodeUser.title = anchorURL; 
      // convert comment into a usable anchor link
      if (anchorURL.search(/\/\*\s([\s\S]+)\s\*\/[\s\S]*/) != -1) {
         var reg = [ [/\/\*\s([\s\S]+)\s\*\/[\s\S]*/,"$1"], [/\[\[[\s\S]*\|([\s\S]+)\]\]/g,"$1"],
                   [/\[\[\:?([\s\S]+)\]\]/g,"$1"], [/\s/g,"_"] ];
         for (x = 0; x < reg.length; x++) {
            anchorURL = anchorURL.replace(reg[x][0],reg[x][1]); }
         anchorURL = encodeURIComponent(anchorURL); 
         var reg = [ [/%/g,"."], [/\(/g,".28"], [/\)/g,".29"], [/\!/g,".21"], 
                   [/\'/g,".27"], [/\*/g,".2A"], [/.3A/g,":"] ];
         for (x = 0; x < reg.length; x++) {
            anchorURL = anchorURL.replace(reg[x][0],reg[x][1]); }
      } else {
         anchorURL = ""; }   
      aNodeUser.href = document.location.href.split("#",1) + "#" + anchorURL;
   } 
}

function processReq()
{
    if (apiReq.readyState != 4) return;
    if (apiReq.status != 200) return;                              
    var jsonObj = eval("(" + apiReq.responseText + ")");  
    var revObj = jsonObj.query.pages[wgArticleId].revisions;  
    if (revObj) writeResults(revObj);  
    if (jsonObj["query-continue"]) {
       rvStartId = jsonObj["query-continue"].revisions.rvstartid;
       nextRevisions();
    }   
}    

function loadJsonDoc()
{
    var url = "/w/api.php?action=query&prop=revisions&format=json";             
    url += "&pageids=" + wgArticleId + "&rvprop=timestamp|user|comment";      
    url += "&rvlimit=" + revCount;                           
    if (rvStartId != 0) url += "&rvstartid=" + rvStartId; 
    if (window.XMLHttpRequest) { // native XMLHttpRequest 
        apiReq = new XMLHttpRequest();
        apiReq.onreadystatechange = processReq;
        apiReq.open("GET", url, true);
        apiReq.send(null);
    } else if (window.ActiveXObject) { // activeX version
        apiReq = new ActiveXObject("Microsoft.XMLHTTP");
        if (apiReq) {
            apiReq.onreadystatechange = processReq;
            apiReq.open("GET", url, true);
            apiReq.send("");
        }
    }
}

function recentRevisions()
{
   var revContent = document.getElementById("recRevContent");
   if (revContent) { // when pressed the close button
      revContent.innerHTML = "";
      rvStartId = 0;
      dateControl = 99999999;
   } else {   
      var navigationBox = document.getElementById('p-navigation');                                      
      var revBox = document.createElement("div");                                                
      var revBox = navigationBox.parentNode.insertBefore(document.createElement("div"),navigationBox); 
      revBox.id = "p-rev";                                                                       
      revBox.className = "portlet";                                                              
      var h5Node = revBox.appendChild(document.createElement("h5"));                             
      h5Node.innerHTML = revBoxTitle;                                                            
      revContent = revBox.appendChild(document.createElement("div"));                           
      revContent.id = "recRevContent";                                                              
      revContent.className = "pBody";                                                               
      revContent.style.padding = "0 .3em .3em .3em";                                                
      revContent.style.lineHeight = "1.2em";                                                        
      revContent.style.fontFamily = "Verdana, sans-serif"; 
   }                                            
   var divNode = revContent.appendChild(document.createElement("div"));
   divNode.id = "showButton";
   divNode.style.textAlign = "center";   
   var button = divNode.appendChild(document.createElement("button"));
   button.innerHTML = buttonBeginText;
   button.onclick = loadJsonDoc;            
   button.style.fontSize = "90%";
   button.style.marginTop = ".3em";
   button.style.padding = "0";
}

var diffReq;
var apiReq;
var rvStartId = 0;
var revCount = 20; // max 50, higher numbers not possible, they give an error
var dateControl = 99999999; // must only be higher than today (yyyymmdd)
if (wgUserLanguage == "nl") {
   var timeTitle = "Verschillen met de vorige bewerking";
   var closeButtonTitle = "Sluiten";
   var revBoxTitle = "recente bewerkingen"; 
   var buttonBeginText = "Toon bewerkingen";
   var buttonNextText = "Volgende " + revCount;
   var buttonNextTitle = "Toon de volgende "+revCount+" bewerkingen";
   var monthName = ["januari", "februari", "maart", "april", "mei", "juni", "juli",
                    "augustus", "september", "oktober", "november", "december"];
} else {
   var timeTitle = "Differences with the previous revision";
   var closeButtonTitle = "Close";
   var revBoxTitle = "recent revisions"; 
   var buttonBeginText = "Show revisions";
   var buttonNextText = "Next " + revCount;
   var buttonNextTitle = "Show the next "+revCount+" revisions";
   var monthName = ["January", "February", "March", "April", "May", "June", "July",
                    "August", "September", "October", "November", "December"];
}  
if (wgNamespaceNumber >= 0) addOnloadHook(recentRevisions);


// </pre>