1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
import React from 'dom-chef';
import select from 'select-dom';
import * as pageDetect from 'github-url-detection';
import {BookIcon, CheckIcon, DiffIcon, DiffModifiedIcon} from '@primer/octicons-react';
import features from '.';
import selectHas from '../helpers/select-has';
import {onDiffFileLoad} from '../github-events/on-fragment-load';
function makeLink(type: string, icon: Element, selected: boolean): JSX.Element {
const url = new URL(location.href);
url.searchParams.set('diff', type);
const classes = pageDetect.isPR()
? 'tooltipped tooltipped-s d-none d-lg-block ml-2 color-icon-secondary color-fg-muted'
: 'tooltipped tooltipped-s btn btn-sm BtnGroup-item ' + (selected ? 'selected' : '');
return (
<a
className={classes}
aria-label={`Switch to the ${type} diff view`}
href={url.href}
>
{icon}
</a>
);
}
function createDiffStyleToggle(): DocumentFragment {
const isUnified = select.exists([
'[value="unified"][checked]', // Form in PR
'.table-of-contents .selected[href*="diff=unified"]', // Link in single commit
]);
if (pageDetect.isPR()) {
return isUnified
? makeLink('split', <BookIcon className="v-align-middle"/>, false)
: makeLink('unified', <DiffIcon className="v-align-middle"/>, false);
}
return (
<>
{makeLink('unified', <DiffIcon/>, isUnified)}
{makeLink('split', <BookIcon/>, !isUnified)}
</>
);
}
function isHidingWhitespace(): boolean {
// The selector is the native button
return new URL(location.href).searchParams.get('w') === '1' || select.exists('button[name="w"][value="0"]:not([hidden])');
}
function createWhitespaceButton(): HTMLElement {
const url = new URL(location.href);
if (isHidingWhitespace()) {
url.searchParams.delete('w');
} else {
url.searchParams.set('w', '1');
}
const classes = pageDetect.isPR()
? 'tooltipped tooltipped-s d-none d-lg-block color-icon-secondary color-fg-muted'
: 'tooltipped tooltipped-s btn btn-sm tooltipped ' + (isHidingWhitespace() ? 'color-text-tertiary color-fg-subtle' : '');
return (
<a
href={url.href}
data-hotkey="d w"
className={classes}
aria-label={`${isHidingWhitespace() ? 'Show' : 'Hide'} whitespace changes`}
>
{pageDetect.isPR() ? <DiffModifiedIcon className="v-align-middle"/> : <>{isHidingWhitespace() && <CheckIcon/>} No Whitespace</>}
</a>
);
}
function initPR(): false | void {
const originalToggle = selectHas('details:has([aria-label="Diff settings"])')!.parentElement!;
if (!isHidingWhitespace()) {
originalToggle.after(
<div className="diffbar-item d-flex">{createWhitespaceButton()}</div>,
);
}
originalToggle.after(
<div className="diffbar-item d-flex">{createDiffStyleToggle()}</div>,
);
// Trim title
const prTitle = select('.pr-toolbar .js-issue-title');
if (prTitle && select.exists('.pr-toolbar progress-bar')) { // Only review view has progress-bar
prTitle.style.maxWidth = '24em';
prTitle.title = prTitle.textContent!;
}
originalToggle.classList.add('d-lg-none');
// Make space for the new button by removing "Changes from" #655
select('[data-hotkey="c"] strong')!.previousSibling!.remove();
// Remove extraneous padding around "Clear filters" button
select('.subset-files-tab')?.classList.replace('px-sm-3', 'ml-sm-2');
}
function initCommitAndCompare(): false | void {
select('#toc')!.prepend(
<div className="float-right d-flex">
<div className="d-flex ml-3 BtnGroup">{createWhitespaceButton()}</div>
</div>,
);
}
const shortcuts = {
'd w': 'Show/hide whitespaces in diffs',
};
void features.add(import.meta.url, {
shortcuts,
include: [
pageDetect.isPRFiles,
pageDetect.isPRCommit,
],
exclude: [
pageDetect.isPRFile404,
],
deduplicate: 'has-rgh-inner',
init: initPR,
}, {
shortcuts,
include: [
pageDetect.isSingleCommit,
],
init: initCommitAndCompare,
}, {
shortcuts,
include: [
pageDetect.isCompare,
],
additionalListeners: [
onDiffFileLoad,
],
onlyAdditionalListeners: true,
deduplicate: false,
init: initCommitAndCompare,
});
|