User:Chaplin/recentrivisionbox.js
外观
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// <pre>
// Recent Rivison Box by JePe@nlwiki
// (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
// Localize by Alexsh@zhwiki
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 = "/media/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 = monthName[date.getMonth()] + date.getDate() + "日";
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 = wgULS("与旧版的差异","與舊版的差異");
var closeButtonTitle = wgULS("关闭","關閉");
var revBoxTitle = wgULS("最近的修订版","最近的修訂版");
var buttonBeginText = wgULS("显示修订","顯示修訂");
var buttonNextText = "次" + revCount +wgULS("个","個");
var buttonNextTitle = wgULS("显示","顯示")+"次"+revCount+wgULS("个修订版","個修訂版");
var monthName = ["1月", "2月", "3月", "4月", "5月", "6月", "7月",
"8月", "9月", "10月", "11月", "12月"];
}
if (wgNamespaceNumber >= 0) addOnloadHook(recentRevisions);
// </pre>