|
265 | 265 | .code-view { |
266 | 266 | display: flex; |
267 | 267 | align-items: center; |
| 268 | + position: relative; |
268 | 269 | } |
269 | 270 |
|
270 | 271 | .code-view pre { |
|
283 | 284 | width: 100%; |
284 | 285 | } |
285 | 286 |
|
| 287 | + .code-view .copy-btn { |
| 288 | + cursor: pointer; |
| 289 | + position: absolute; |
| 290 | + display: inline-flex; |
| 291 | + top: 4px; |
| 292 | + right: 4px; |
| 293 | + padding: 4px; |
| 294 | + width: 24px; |
| 295 | + height: 24px; |
| 296 | + border-radius: 50%; |
| 297 | + align-items: center; |
| 298 | + justify-content: center; |
| 299 | + } |
| 300 | + |
| 301 | + .code-view .copy-btn:hover { |
| 302 | + background-color: #e4e4e4; |
| 303 | + } |
| 304 | + |
286 | 305 | .media-view { |
287 | 306 | display: block; |
288 | 307 | margin: 0 0 10px; |
|
660 | 679 | }); |
661 | 680 |
|
662 | 681 | document.addEventListener("click", function (e) { |
663 | | - if (!e.target.closest(".dropdown")) { |
| 682 | + const $dropdown = e.target.closest(".dropdown"); |
| 683 | + if (!$dropdown) { |
664 | 684 | $exportDropdownContent.style.display = "none"; |
665 | 685 | $copyDropdownContent.style.display = "none"; |
666 | 686 | } |
| 687 | + const $codeCopyBtn = e.target.closest(".code-view .copy-btn"); |
| 688 | + if ($codeCopyBtn) { |
| 689 | + ClipboardJS.copy($codeCopyBtn.parentElement.querySelector(".code").textContent); |
| 690 | + |
| 691 | + const oldBtnHtml = $codeCopyBtn.innerHTML; |
| 692 | + $codeCopyBtn.innerHTML = ` |
| 693 | + <svg width="16" height="16" viewBox="0 0 16 16"> |
| 694 | + <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0"/> |
| 695 | + </svg> |
| 696 | + `; |
| 697 | + setTimeout(() => { |
| 698 | + $codeCopyBtn.innerHTML = oldBtnHtml; |
| 699 | + }, 2000); |
| 700 | + } |
667 | 701 | }); |
668 | 702 | } |
669 | 703 |
|
|
947 | 981 | const highlightedCode = hljs.getLanguage(language) |
948 | 982 | ? hljs.highlight(value, { language }).value |
949 | 983 | : hljs.highlightAuto(value).value; |
950 | | - return `<div class="code-view"><pre><code>${highlightedCode}</code></pre></div>`; |
| 984 | + return `<div class="code-view"> |
| 985 | + <pre><code class="code">${highlightedCode}</code></pre> |
| 986 | + <span class="copy-btn" title="Copy"> |
| 987 | + <svg width="16" height="16" viewBox="0 0 16 16"> |
| 988 | + <path fill-rule="evenodd" d="M4 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2zm2-1a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zM2 5a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-1h1v1a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h1v1z"/> |
| 989 | + </svg> |
| 990 | + </span> |
| 991 | + </div>`; |
951 | 992 | } |
952 | 993 | if (encode == "base64") { |
953 | 994 | if ( |
|
968 | 1009 | return `<div class="media-view"><a href="${downloadUrl}" download="${filename}">Download the binary data</a></div>`; |
969 | 1010 | } |
970 | 1011 | } |
971 | | - return `<div class="code-view">${value}</div>`; |
| 1012 | + return `<div class="code-view"><pre><code>${value}</code></pre></div>`; |
972 | 1013 | } |
973 | 1014 |
|
974 | 1015 | function tmplError(error) { |
|
1073 | 1114 | * @param {string} contentType |
1074 | 1115 | */ |
1075 | 1116 | function base64ToBlob(base64String, contentType) { |
1076 | | - const byteArrays= base64ToUint8Array(base64String); |
| 1117 | + const byteArrays = base64ToUint8Array(base64String); |
1077 | 1118 | return new Blob([byteArrays], { type: contentType }); |
1078 | 1119 | } |
1079 | 1120 |
|
1080 | 1121 | /** |
1081 | 1122 | * @param {string} base64String |
1082 | 1123 | */ |
1083 | 1124 | function base64ToText(base64String) { |
1084 | | - const byteArrays= base64ToUint8Array(base64String); |
| 1125 | + const byteArrays = base64ToUint8Array(base64String); |
1085 | 1126 | const decoder = new TextDecoder('utf-8'); |
1086 | 1127 | return decoder.decode(byteArrays); |
1087 | 1128 | } |
|
0 commit comments