Jump to content

Wikipedia:WikiProject User scripts/Scripts/Fix diff width: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
m please let me know if there are any problems
m hide nonstandard IE CSS syntax from other browsers
Line 14: Line 14:
' .xdiff-outer.diff-context { margin: 0 0 0 2em; font-size: 85%; background: #eee; }' +
' .xdiff-outer.diff-context { margin: 0 0 0 2em; font-size: 85%; background: #eee; }' +
' .xdiff-inner { display: block; overflow: auto; overflow-y: visible; width: 100%; padding: 1px; }' +
' .xdiff-inner { display: block; overflow: auto; overflow-y: visible; width: 100%; padding: 1px; }' +
(!document.recalc ? '' : // IE kluge:
' * html .xdiff-inner { padding-bottom: expression(this.scrollWidth > this.offsetWidth ? 17 : 1) + "px"; }' + // IE kluge!
' * html .xdiff-sign2 { top: expression((this.parentNode.parentNode.clientHeight - this.offsetHeight)/2 + "px"); }' +
' * html .xdiff-inner { padding-bottom: expression(this.scrollWidth > this.offsetWidth ? "16px" : 0); }' +
' * html .xdiff-sign2 { top: expression((this.parentNode.parentNode.clientHeight - this.offsetHeight)/2 + "px"); }') +
'<'+'/style>');
'<'+'/style>');


addOnloadHook(function () {
addOnloadHook(function () {

Revision as of 13:46, 17 January 2006

/* This script adds scroll bars to wide diffs such as [1]. It replaces the table-based diff layout with a CSS-based layout where the column width is always exactly 50%. Known to work in Firefox, Konqueror, Opera and at least some versions of Internet Explorer. This script is a workaround for Bug 1229. If you have any problems with this script, please let me know. */

//

// inline style sheet to keep this whole thing self-contained:
document.write('<style type="text/css">' +
    ' .xdiff { width: 100%; background: white; }' +
    ' .xdiff-row { width: 100%; margin: 0 0 3px 0; overflow: hidden; }' +
    ' .xdiff-col { width: 49%;  float: left; clear: none; position: relative; }' +
    ' .xdiff-sign1 { display: block; position: relative; width: 0; height: 0; }' +
    ' .xdiff-sign2 { display: block; position: absolute; top: 0; left: 0; width: 2em; text-align: center; }' +
    ' .xdiff-outer { display: block; }' +
    ' .xdiff-outer.diff-addedline { margin: 0 0 0 2em; font-size: 85%; background: #cfc; }' +
    ' .xdiff-outer.diff-deletedline { margin: 0 0 0 2em; font-size: 85%; background: #ffa; }' +
    ' .xdiff-outer.diff-context { margin: 0 0 0 2em; font-size: 85%; background: #eee; }' +
    ' .xdiff-inner { display: block; overflow: auto; overflow-y: visible; width: 100%; padding: 1px; }' +
    (!document.recalc ? '' :  // IE kluge:
        ' * html .xdiff-inner { padding-bottom: expression(this.scrollWidth > this.offsetWidth ? "16px" : 0); }' +
        ' * html .xdiff-sign2 { top: expression((this.parentNode.parentNode.clientHeight - this.offsetHeight)/2 + "px"); }') +
    '<'+'/style>');

addOnloadHook(function () {
    var diffSigns = new Array();
    var fixDiffWidth = function () {
        var tables = document.getElementsByTagName('table');

        for (var i = 0; i < tables.length; i++) {
            if (tables[i].className != 'diff') continue;
            var rows = tables[i].getElementsByTagName('tr');

            var diffDiv = document.createElement('div');
            diffDiv.className = 'xdiff';

            for (var j = 0; j < rows.length; j++) {
                var rowDiv = document.createElement('div');
                rowDiv.className = 'xdiff-row';

                var colDiv = null;
                var cols = rows[j].getElementsByTagName('td');
                for (var k = 0; k < cols.length; k++) { 
                    if (!colDiv) {
                        colDiv = document.createElement('div');
                        colDiv.className = 'xdiff-col';
                        rowDiv.appendChild(colDiv);
                    }
                    // use spans instead of divs so that an eventual non-js solution will look nice in lynx!
                    var outerSpan = document.createElement('span');
                    var innerSpan = document.createElement('span');

                    if (cols[k].getAttribute('colspan') == 2 || cols[k].className.substring(0,5) == 'diff-') {                
                        outerSpan.className = 'xdiff-outer ' + cols[k].className;
                        innerSpan.className = 'xdiff-inner';
                        innerSpan.style.textAlign = cols[k].getAttribute('align');
                    }
                    else if (cols[k].firstChild && (cols[k].firstChild.nextSibling ||
                             cols[k].firstChild.nodeType != 3 || cols[k].firstChild.nodeValue.match(/\S/))) {
                        outerSpan.className = 'xdiff-sign1';
                        innerSpan.className = 'xdiff-sign2';
                        if (!innerSpan.style.setExpression)
                            diffSigns[diffSigns.length] = innerSpan;
                    }
                    else continue; 

                    for (var node = cols[k].firstChild; node; node = node.nextSibling)
                        innerSpan.appendChild(node.cloneNode(true));
                    innerSpan.appendChild(document.createTextNode(String.fromCharCode(0xa0))); // add nbsp
                    outerSpan.appendChild(innerSpan);
                    colDiv.appendChild(outerSpan);

                    if (innerSpan.className == 'xdiff-inner')
                        colDiv = null;  // start new column
                }
                diffDiv.appendChild(rowDiv);
            }
            tables[i].parentNode.replaceChild(diffDiv, tables[i]);
        }
    };
    // finally, a kluge to vertically center the +/- signs
    var centerDiffSigns = function () {
        for (var i = 0; i < diffSigns.length; i++) {
            var parentHeight;
            if (!( parentHeight = diffSigns[i].parentNode )) continue; 
            if (!( parentHeight = parentHeight.parentNode )) continue; 
            if (!( parentHeight = parentHeight.clientHeight )) continue; 
            diffSigns[i].style.top = ((parentHeight - diffSigns[i].offsetHeight)/2) + "px";
        }
    };
    fixDiffWidth();
    if (diffSigns.length) {
        hookEvent('resize', centerDiffSigns);
        setTimeout(centerDiffSigns, 250); 
    }
});

//