-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontentscript.js
115 lines (86 loc) · 3.05 KB
/
contentscript.js
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
var TEST_FILE_REGEXP = /Tests?\//i;
// Thanks StackOverflow... maybe overkill for my usage.
// http://stackoverflow.com/a/14234618/53338
function findParentBySelector(elm, selector) {
var all = document.querySelectorAll(selector);
var cur = elm.parentNode;
var collectionHas = function(a, b) {
for(var i = 0, len = a.length; i < len; i ++) {
if(a[i] == b) return true;
}
return false;
};
while(cur && !collectionHas(all, cur)) { //keep going up until you find a match
cur = cur.parentNode; //go up
}
return cur; //will return null if not found
}
function toggleFileDataView(event) {
var btn = event.target;
var file = findParentBySelector(event.target, '.file');
file.classList.toggle('gh-ext-close');
if (file.classList.contains('gh-ext-close')) {
btn.innerHTML = 'Show diff';
} else {
btn.innerHTML = 'Hide diff';
}
}
function addHideShowButton(fileContainer) {
var btn = document.createElement('a');
btn.innerHTML = 'Hide diff';
btn.addEventListener('click', toggleFileDataView);
btn.className = 'minibutton';
fileContainer.querySelector('.actions .button-group').appendChild(btn);
}
function isTestFile(filename) {
return !!filename.match(TEST_FILE_REGEXP);
}
function markLine(event) {
var line = findParentBySelector(event.target, '.file-diff-line');
line.classList.toggle('gh-ext-line-marked');
}
var files = document.querySelectorAll("#files .file");
for(var i = 0; i < files.length; i++) {
var file = files[i];
var filename = file.querySelector('.meta').dataset.path;
// Add Hide/Show diff buttons on PR files changed
addHideShowButton(file);
if (isTestFile(filename)) {
file.classList.add('gh-ext-testfile');
}
}
var linesOfCode = document.querySelectorAll('.js-file-line .diff-line-code');
for(var i=0; i < linesOfCode.length; i++) {
var line = linesOfCode[i];
var mark = document.createElement('b');
mark.addEventListener('click', markLine);
mark.className = 'gh-ext-add-line-mark octicon octicon-pin';
line.insertBefore(mark, line.querySelector('.add-line-comment'));
}
// add visit site button
(function(window) {
var tmp = window.location.href.match('github.com/([^/]*)/([^/]*)');
if (!tmp || tmp.length < 3) {
return;
}
var user = tmp[1];
var repo = tmp[2];
var ghPageUrl = 'https://' + user + '.github.io/' + repo + '/';
var addGhPagesButton = function(e) {
var status = this.status;
if (404 == status) {
return;
}
var btn = [
'<li>',
'<a class="btn btn-sm" href="'+ghPageUrl+'"><span class="octicon octicon-arrow-right"></span> Visit site</a>',
'</li>'
].join('');
var headActions = document.querySelector('.pagehead-actions');
headActions.innerHTML = btn + headActions.innerHTML;
};
var request = new XMLHttpRequest();
request.onload = addGhPagesButton;
request.open('HEAD', ghPageUrl);
request.send();
})(window);