Skip to content

Commit caa0c46

Browse files
authored
docs: add a copy code function (top/right copy icon) on doc examples (#22114)
1 parent 62c69e8 commit caa0c46

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

cmd/tools/vdoc/theme/doc.css

+11
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,7 @@ code {
623623
pre {
624624
overflow: auto;
625625
margin: 0;
626+
position: relative;
626627
}
627628
.namespace {
628629
opacity: 0.7;
@@ -684,6 +685,16 @@ tr:nth-child(even) {
684685
background-color: var(--table-background-color);
685686
}
686687

688+
button.copy {
689+
border: none;
690+
background-color: transparent;
691+
position: absolute;
692+
font-size: 12px;
693+
top: 5px;
694+
right: 5px;
695+
color: var(--ref-symbol-hover-color);
696+
}
697+
687698
/* Medium screen and up */
688699
@media (min-width: 768px) {
689700
*::-webkit-scrollbar {

cmd/tools/vdoc/theme/doc.js

+25
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
setupScrollSpy();
88
setupSearch();
99
setupCollapse();
10+
setupCodeCopy();
1011
})();
1112

1213
function setupScrollSpy() {
@@ -300,3 +301,27 @@ function debounce(func, timeout) {
300301
timer = setTimeout(next, timeout > 0 ? timeout : 300);
301302
};
302303
}
304+
305+
function setupCodeCopy() {
306+
const pres = document.querySelectorAll('pre:not(.signature)');
307+
pres.forEach((pre) => {
308+
const tempDiv = document.createElement('button');
309+
tempDiv.className = 'copy';
310+
tempDiv.innerHTML =
311+
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="rgba(173,184,194,1)"><path d="M6.9998 6V3C6.9998 2.44772 7.44752 2 7.9998 2H19.9998C20.5521 2 20.9998 2.44772 20.9998 3V17C20.9998 17.5523 20.5521 18 19.9998 18H16.9998V20.9991C16.9998 21.5519 16.5499 22 15.993 22H4.00666C3.45059 22 3 21.5554 3 20.9991L3.0026 7.00087C3.0027 6.44811 3.45264 6 4.00942 6H6.9998ZM5.00242 8L5.00019 20H14.9998V8H5.00242ZM8.9998 6H16.9998V16H18.9998V4H8.9998V6Z"></path></svg>';
312+
tempDiv.addEventListener('click', (e) => {
313+
const parent = e.target;
314+
var code = tempDiv.parentElement.querySelector('code');
315+
let i = Array.from(code.childNodes)
316+
.map((r) => r.textContent)
317+
.join('');
318+
navigator.clipboard.writeText(i);
319+
var tmp = tempDiv.innerHTML;
320+
tempDiv.innerHTML = 'Copied';
321+
window.setTimeout(function () {
322+
tempDiv.innerHTML = tmp;
323+
}, 1000);
324+
});
325+
pre.insertAdjacentElement('afterbegin', tempDiv);
326+
});
327+
}

0 commit comments

Comments
 (0)