Skip to content

Instantly share code, notes, and snippets.

@os0x
Forked from ucnv/README.md
Created May 12, 2009 13:19
Show Gist options
  • Save os0x/110472 to your computer and use it in GitHub Desktop.
Save os0x/110472 to your computer and use it in GitHub Desktop.
Diff for gist.github for Opera & Chrome
// ==UserScript==
// @name Diff for gist.github for Opera & Chrome
// @namespace http://ss-o.net/
// @include http://gist.github.com/*
// @include https://gist.github.com/*
// ==/UserScript==
(function(){
var f = function($) {
var rev = $('#revisions li');
if(!rev.length || rev.length == 1) return;
var diffSelect = function(e) {
var me = e.target;
var c = $('#revisions li input:checked');
if(c.length > 2)
c.each(function(i) { if(c[i] != me) c[i].checked = false; });
$('#diffExec').attr('disabled', (c.length != 2));
};
var diffcontent;
var files = document.getElementById('files');
var diffsrc = 'http://gist.github.com/105908.txt';
var diffscript;
var diffExec = function() {
if (!window.Diff && !diffscript) {
var script = diffscript = document.createElement('script');
script.type = 'text/javascript';
script.onload = diffExec;
script.src = diffsrc;
document.body.appendChild(script);
return;
}
if(!diffcontent) {
diffcontent = $('#files div.file')[0].cloneNode(true);
}
var pres = diffcontent.getElementsByTagName('pre');
pres[0].parentNode.replaceChild(pres[0].cloneNode(false),pres[0]);
pres[1].parentNode.replaceChild(pres[1].cloneNode(false),pres[1]);
files.insertBefore(diffcontent,files.firstChild);
$(diffcontent).hide();
var selected = $('#revisions').find('input:checkbox:checked');
var link = selected.map(function() {return this.value.replace(/(https?:\/\/[^\/]+\/)/, '$1raw/')});
var desc = selected.map(function() { return $(this).parent().text().replace(/\s+/g, ' '); });
var req = function(url,func){
var x = new XMLHttpRequest();
x.onload = func;
x.open('GET',url,false);
x.send(null);
return x;
};
var clog1,clog2,flog1,flog2,raw1,raw2;
var log = function(){
setTimeout(function(){
var r1 = clog1.responseText.split(/\n/)[0].split(/\s/)[1];
var r2 = clog2.responseText.split(/\n/)[0].split(/\s/)[1];
flog1 = req(link[0].replace(/[^\/]*$/, r1)+'/meta', function(){
flog2 = req(link[1].replace(/[^\/]*$/, r2)+'/meta',fil);
});
},100);
};
var fil = function(){
setTimeout(function(){
var r1 = flog1.responseText.split(/\n/)[0].split(/\s/);
var r2 = flog2.responseText.split(/\n/)[0].split(/\s/);
raw1 = req(link[0].replace(/[^\/]*$/, r1[2])+'/'+r1[3], function(){
raw2 = req(link[1].replace(/[^\/]*$/, r2[2])+'/'+r2[3] ,dif);
});
},100);
};
var dif = function(){
setTimeout(function(){
var pre = $(pres[1]);
var udiff = new UnifiedDiff(raw2.responseText, raw1.responseText, 4).toString();
udiff = '--- ' + desc[1] + '\n' + '+++ ' + desc[0] + '\n' + pre.text(udiff).html();
var len = udiff.split(/\n/).length;
if(len < 5000) {
udiff = udiff.replace(/^(\+.*)$/mg, '<span class="gd">$1</span>')
.replace(/^(\-.*)$/mg, '<span class="gi">$1</span>')
.replace(/^(\@.*)$/mg, '<span class="gu">$1</span>')
.replace(/^(.*)\n/mg, '<div class="line">$1</div>');
pres[0].innerHTML = new Array(len-1).join(',').split(',').map(function(a,i){return '<span>'+(1+i)+'</span>'}).join('\n');
}
pre.html(udiff);
$(diffcontent).slideDown('normal');
},100);
};
clog1 = req(link[0]+'/meta',function(){
clog2 = req(link[1]+'/meta',log);
});
};
var button = document.createElement('button');
button.name = button.id = 'diffExec';
button.textContent = 'Compare';
button.onclick = diffExec;
button.disabled = true;
$('#revisions')[0].appendChild(button);
rev.each(function() {
var check = document.createElement('input');
check.type = 'checkbox';
check.name = 'diff';
check.value = this.querySelector('a.id').href;
check.onclick = diffSelect;
this.insertBefore(check, this.firstChild);
});
};
var script = document.createElement('script');
script.type = 'text/javascript';
script.textContent = '(' + f.toString() + ')(jQuery);';
document.body.appendChild(script);
})();
@fearphage
Copy link

I've added support for multiple files in a diff. It's not thoroughly tested. Feel free to improve. Here's a multi-file gist to test with.

@GabrieleCalarota
Copy link

can you add a little README to know how to use this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment