// ==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.4
// @grant none
// @locale en
// @downloadURL none
// ==/UserScript==
this.$ = this.jQuery = jQuery.noConflict(true);
$(function() {
function collapsable() {
if ($('#files').length) {
// Add buttons in each header to allow folding the diff
var expanded = 'M0 5l6 6 6-6H0z';
var collapsed = 'M0 14l6-6L0 2v12z';
var diffs = $('#files').find('div[id^="diff-"]');
diffs.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');
diff.children('.data.highlight.blob-wrapper').toggle();
icon.attr('d', (icon.attr('d') === collapsed) ? expanded : collapsed);
var allButton = $('#diff-collapse-button');
var visible = diffs.children('.data.highlight.blob-wrapper').is(':visible');
allButton.attr('data-toggle-state', visible ? 'expanded' : 'collapsed');
allButton.text(visible ? 'Collapse All' : 'Expand All');
});
}
});
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 = diffs.children('.data.highlight.blob-wrapper');
diffOptions.find('ul').append(
'' +
(blobs.is(':visible') ? 'Collapse All' : 'Expand All') +
''
);
$('#diff-collapse-button').on('click', function() {
// Toggle the visibility of all diffs, directions of arrows, and the button
var state = ($(this).attr('data-toggle-state') === 'expanded');
if (state) {
blobs.hide();
} else {
blobs.show();
}
$('.octicon-btn.custom-collapsable').find('path').attr('d', state ? collapsed : expanded);
$(this).attr('data-toggle-state', state ? 'collapsed' : 'expanded');
$(this).text(state ? 'Expand All' : 'Collapse All');
diffOptions.removeClass('active');
});
}
}
}
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
var r = window.location.href.match(/(https:\/\/github\.com\/)([A-Za-z0-9_-]+\/([A-Za-z0-9_-]+))/);
if (r) {
$('span.commit-ref.current-branch').each(function() {
var branch = $(this).text();
if (branch.indexOf(':') === -1) {
r[1] += r[2] + '/tree/' + branch;
} else {
r[1] += branch.split(':')[0] + '/' + r[3] + '/tree/' + branch.split(':')[1];
}
$(this).wrap('');
});
}
}
}
makeLinks();
collapsable();
window.$(document).on('pjax:end pjax:complete', function() {
makeLinks();
collapsable();
});
});