Wikipedia:WikiProject User scripts/Scripts/Single column diffs

//

// By User:Pile0nades.

// Makes the diff page display as a single column, instead of two.

addOnloadHook(function(){

// ==UserScript==

// @name Wikipedia single column diffs

// @namespace http://mywebsite.com/myscripts

// @description Make Wikipedia diff pages read like patch-format diffs, only one column needed

// @include http://en.wikipedia.org/w/index.php?*&diff=*

// ==/UserScript==

// remove the header for the previous revision, and add the next/prev links to the second header

var prevHeader = get("//table[@class='diff'][1]/tbody/tr[1]/td[@class='diff-otitle']");

var nextHeader = get("//table[@class='diff'][1]/tbody/tr[1]/td[@class='diff-ntitle']");

var oldedit = get("//table[@class='diff'][1]/tbody/tr[1]/td[@class='diff-otitle']/a[@id='differences-prevlink']");

var newedit = get("//table[@class='diff'][1]/tbody/tr[1]/td[@class='diff-ntitle']/a[@id='differences-nextlink']");

for(var i = 0; i < prevHeader.snapshotLength; i++) {

if(oldedit.snapshotLength != 0) {

nextHeader.snapshotItem(i).appendChild(oldedit.snapshotItem(0));

}

if(oldedit.snapshotLength != 0 && newedit.snapshotLength != 0) {

nextHeader.snapshotItem(i).appendChild(document.createTextNode(" | "));

}

if(newedit.snapshotLength != 0) {

nextHeader.snapshotItem(i).appendChild(newedit.snapshotItem(0));

}

remove(prevHeader.snapshotItem(i));

}

// clone rows where the line changed but wasn't added/deleted, and delete where appropriate

var changedLines = get("//table[@class='diff'][1]/tbody/tr/td[@class='diff-addedline' and position()=4]/../td[@class='diff-deletedline' and position()=2]")

for(var i = 0; i < changedLines.snapshotLength; i++) {

var cell = changedLines.snapshotItem(i);

cell.parentNode.parentNode.insertBefore(

cell.parentNode.cloneNode(true),

cell.parentNode

);

remove(cell.previousSibling.previousSibling);

remove(cell);

}

// delete blank cells in the first column to move the added lines into the first column

var blankcells = get("//table[@class='diff'][1]/tbody/tr/td[1]");

for(var i = 0; i < blankcells.snapshotLength; i++) {

if(blankcells.snapshotItem(i).innerHTML == " ") {

remove(blankcells.snapshotItem(i));

}

}

// delete everything past the second td in each column

var waste = get("//table[@class='diff'][1]/tbody/tr/td[2]");

for(var i = 0; i < waste.snapshotLength; i++) {

while(waste.snapshotItem(i).nextSibling) {

remove(waste.snapshotItem(i).nextSibling);

}

}

// delete the 2nd line number cell in each column

var line = get("//table[@class='diff'][1]/tbody/tr/td[@class='diff-lineno'][1]");

for(var i = 0; i < line.snapshotLength; i++) {

remove(line.snapshotItem(i));

}

// delete the extra cols

var cols = get("//table[@class='diff'][1]/col");

for(var i = 0; i < cols.snapshotLength; i++) {

var col = cols.snapshotItem(i);

if(col.className == "diff-content") {

col.style.width = "98%";

col.removeAttribute("class");

}

if(i > 1) remove(col);

}

// shorthand function to remove nodes

function remove(node) {

node.parentNode.removeChild(node);

}

// xpath function

function get(query) {

return document.evaluate(

query,

document,

null,

XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,

null

);

}

});

//