Skip to content

Commit 8f68c56

Browse files
committed
Merge pull request #100 from adangel:issue-94-code-snippet-preview
Improve code snippet preview #100 * pr-100: Update release notes (#94) Add copy to clipboard button Render code snippet as table Fix highlighting of violation line
2 parents 2234eb2 + 4358e37 commit 8f68c56

File tree

3 files changed

+66
-13
lines changed

3 files changed

+66
-13
lines changed

History.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## New and Noteworthy
44

5+
## Enhancements
6+
7+
* [#94](https://github.com/pmd/pmd-regression-tester/issues/94): Improve code snippet preview
8+
59
## Fixed Issues
610

711
* [#86](https://github.com/pmd/pmd-regression-tester/issues/86): Uncaught TypeError: violation is undefined

resources/css/pmd-tester.css

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,25 @@ code {
1010
font-size: 13pt;
1111
white-space: pre;
1212
}
13-
code.highlight {
13+
code.highlight, tr.highlight {
1414
background-color: yellow;
1515
}
16+
table.code-snippet > tbody > tr > td {
17+
padding: 0px;
18+
border: none;
19+
}
20+
table.code-snippet > tbody > tr > td.line-number > code:before {
21+
content: attr(data-line-number);
22+
}
23+
.btn-clipboard {
24+
margin-top: 1rem;
25+
display: block;
26+
padding: .25rem .5rem;
27+
color: #0d6efd;
28+
background-color: #fff;
29+
border: 1px solid;
30+
border-radius: .25rem;
31+
}
1632
a {
1733
text-decoration: none;
1834
}

resources/js/code-snippets.js

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,45 +26,78 @@
2626
return prefix + number;
2727
}
2828

29-
function fetchSnippet(document, container, url, line, weburl) {
29+
function fetchSnippet(document, container, url, violationLineNumber, weburl) {
3030
var weburl, requestUrl, oReq;
3131

3232
requestUrl = url.replace(/github.com/, "raw.githubusercontent.com");
3333
requestUrl = requestUrl.replace(/(tree|blob)\//, "");
3434

3535
oReq = new XMLHttpRequest();
3636
oReq.addEventListener("load", function() {
37-
let lines, start, deleteCount;
37+
let lines, start, deleteCount, lineSeparator;
3838

3939
// we'll append stuff in the loop below
4040
container.innerHTML = '<p><a href="' + weburl + '" target="_blank" rel="noopener noreferrer">' + weburl + '</a></p>';
4141

42-
lines = this.responseText.split(/\r\n|\n/);
43-
start = line - contextLines;
42+
if (this.responseText.indexOf('\r\n') >= 0) {
43+
lineSeparator = '\r\n';
44+
} else {
45+
lineSeparator = '\n';
46+
}
47+
lines = this.responseText.split(lineSeparator);
48+
start = violationLineNumber - contextLines;
4449
if (start > 0) {
4550
lines.splice(0, start); // remove lines before
4651
}
4752
deleteCount = lines.length - (2 * contextLines) + 1;
4853
lines.splice(2 * contextLines - 1, deleteCount); // delete lines after
4954

55+
let table = document.createElement('table');
56+
table.classList.add('code-snippet');
57+
let tableBody = document.createElement('tbody');
58+
table.appendChild(tableBody);
5059
// now we have just the lines which will be displayed
5160
lines.forEach(line => {
5261
start++;
53-
let lineElt = document.createElement("code");
54-
if (start === line) {
55-
lineElt.classList.add("highlight");
62+
let tableRow = document.createElement('tr');
63+
if (start === violationLineNumber) {
64+
tableRow.classList.add("highlight");
5665
}
66+
67+
let lineNumberColumn = document.createElement('td');
68+
lineNumberColumn.classList.add('line-number');
69+
tableRow.appendChild(lineNumberColumn);
70+
let lineNumberElement = document.createElement('code');
71+
lineNumberColumn.appendChild(lineNumberElement);
72+
lineNumberElement.setAttribute('data-line-number', formatLineNumber(start));
73+
74+
let codeColumn = document.createElement('td');
75+
tableRow.appendChild(codeColumn);
76+
let codeElement = document.createElement("code");
77+
codeColumn.appendChild(codeElement);
5778
// createTextNode escapes special chars
58-
lineElt.appendChild(document.createTextNode(formatLineNumber(start) + nbsp + line));
59-
lineElt.appendChild(document.createElement("br"));
79+
codeElement.appendChild(document.createTextNode(line));
6080

61-
container.appendChild(lineElt); // append to the container
81+
tableBody.appendChild(tableRow); // append row to the table
6282
});
83+
container.appendChild(table);
84+
85+
if (navigator.clipboard) {
86+
let copyButton = document.createElement('button');
87+
copyButton.classList.add('btn-clipboard');
88+
copyButton.setAttribute('title', 'Copy to clipboard');
89+
copyButton.appendChild(document.createTextNode('copy'));
90+
copyButton.onclick = function() {
91+
navigator.clipboard.writeText(lines.join(lineSeparator));
92+
}
93+
container.appendChild(copyButton);
94+
}
6395
});
64-
oReq.open("GET", requestUrl);
65-
oReq.send();
6696

6797
container.innerHTML = "<samp>fetching...</samp>";
98+
99+
oReq.open("GET", requestUrl);
100+
oReq.send();
68101
}
69102

70103
window.pmd_code_snippets = {

0 commit comments

Comments
 (0)