// ==UserScript==
// @name Collapsable Diffs and Linked Branches (GitHub)
// @namespace chriskim06
// @description Adds a toggle to collapse diffs in GitHub's pull request and commit diff interfaces
// @include https://github.com/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @version 1.4.2
// @grant none
// @locale en
// @downloadURL none
// ==/UserScript==
this.$ = this.jQuery = jQuery.noConflict(true);
$(function() {
function collapsable() {
var files = $('#files');
if (files.length) {
// Add buttons in each header to allow folding the diff
files.find('div[id^="diff-"]').each(function() {
var diff = $(this);
var info = diff.find('.file-info');
if (!info.children().first().is('a')) {
// If the button isn't there add it and add the event handler
info.prepend(
'' +
'' +
''
);
diff.find('.octicon-btn.custom-collapsable').on('click', function() {
// Toggle the visibility of the diff and the direction of the arrow
var icon = $(this).find('path');
var arrow = (icon.attr('d') === 'M0 14l6-6L0 2v12z') ? 'M0 5l6 6 6-6H0z' : 'M0 14l6-6L0 2v12z';
diff.children('.data.highlight.blob-wrapper').toggle();
icon.attr('d', arrow);
});
}
});
var diffOptions = $('.diffbar-item.dropdown.js-menu-container');
if (diffOptions.length && diffOptions.find('a').length === 2) {
// Add an Expand/Collapse All button if its not there
var blobs = files.find('div[id^="diff-"]').children('.data.highlight.blob-wrapper');
$('.diffbar-item.dropdown.js-menu-container').find('ul').append(
'' +
(blobs.is(':visible') ? 'Collapse' : 'Expand') + ' All'
''
);
$('#diff-collapse-button').on('click', function() {
// Toggle the visibility of all diffs, directions of arrows, and the button
var allButton = $(this);
var icons = $('.octicon-btn.custom-collapsable').find('path');
var state = (allButton.attr('data-toggle-state') === 'expanded');
blobs.toggle();
icons.attr('d', state ? 'M0 14l6-6L0 2v12z' : 'M0 5l6 6 6-6H0z');
allButton.attr('data-toggle-state', state ? 'collapsed' : 'expanded');
allButton.text(state ? 'Expand All' : 'Collapse All');
});
}
}
}
function makeLinks() {
var head = $('#partial-discussion-header');
if (head.length && head.find('.flex-table-item.flex-table-item-primary > a').length === 1) {
// Turn the branches being compared into links if they aren't already
$('span.commit-ref.current-branch').each(function() {
var elem = $(this);
var repo = $('.entry-title').find('a[data-pjax]');
var url = 'https://github.com';
var branch = elem.text();
if (branch.indexOf(':') === -1) {
url += repo.attr('href') + '/tree/' + branch;
} else {
var fork = branch.split(':');
url += '/' + fork[0] + '/' + repo.text() + '/tree/' + fork[1];
}
elem.wrap('');
});
}
}
makeLinks();
collapsable();
window.$(document).on('pjax:end pjax:complete', function() {
makeLinks();
collapsable();
});
});