Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: copy to clipboard #18963

Merged
merged 5 commits into from
Oct 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion doc/nimdoc.css
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ Modified by Boyd Greenfield and narimiran
--program: #6060c0;
--option: #508000;
--raw-data: #a4255b;

--clipboard-image-normal: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: black' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E %3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2' /%3E %3C/svg%3E");
--clipboard-image-selected: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: black' viewBox='0 0 20 20' fill='currentColor'%3E %3Cpath d='M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z' /%3E %3Cpath d='M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z' /%3E %3C/svg%3E");
--clipboard-image: var(--clipboard-image-normal)
}

[data-theme="dark"] {
Expand Down Expand Up @@ -68,6 +72,10 @@ Modified by Boyd Greenfield and narimiran
--program: #9090c0;
--option: #90b010;
--raw-data: #8be9fd;

--clipboard-image-normal: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: lightgray' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E %3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2' /%3E %3C/svg%3E");
--clipboard-image-selected: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: lightgray' viewBox='0 0 20 20' fill='currentColor'%3E %3Cpath d='M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z' /%3E %3Cpath d='M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z' /%3E %3C/svg%3E");
--clipboard-image: var(--clipboard-image-normal);
}

.theme-switch-wrapper {
Expand Down Expand Up @@ -572,6 +580,10 @@ span.tok {
margin-right: 0.2em;
}

.copyToClipBoard {
position: relative;
}

pre {
font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
color: var(--text);
Expand All @@ -590,7 +602,25 @@ pre {
border: 1px solid var(--border);
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px; }
border-radius: 6px;
}

.copyToClipBoardBtn {
visibility: hidden;
position: absolute;
width: 24px;
border-radius: 4px;
background-image: var(--clipboard-image);
right: 5px;
top: 13px;
background-color: var(--secondary-background);
padding: 11px;
border: 0;
}

.copyToClipBoard:hover .copyToClipBoardBtn {
visibility: visible;
}

.pre-scrollable {
max-height: 340px;
Expand Down
32 changes: 31 additions & 1 deletion nimdoc/testproject/expected/nimdoc.out.css
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ Modified by Boyd Greenfield and narimiran
--program: #6060c0;
--option: #508000;
--raw-data: #a4255b;

--clipboard-image-normal: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: black' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E %3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2' /%3E %3C/svg%3E");
--clipboard-image-selected: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: black' viewBox='0 0 20 20' fill='currentColor'%3E %3Cpath d='M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z' /%3E %3Cpath d='M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z' /%3E %3C/svg%3E");
--clipboard-image: var(--clipboard-image-normal)
}

[data-theme="dark"] {
Expand Down Expand Up @@ -68,6 +72,10 @@ Modified by Boyd Greenfield and narimiran
--program: #9090c0;
--option: #90b010;
--raw-data: #8be9fd;

--clipboard-image-normal: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: lightgray' fill='none' viewBox='0 0 24 24' stroke='currentColor'%3E %3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2' /%3E %3C/svg%3E");
--clipboard-image-selected: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='color: lightgray' viewBox='0 0 20 20' fill='currentColor'%3E %3Cpath d='M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z' /%3E %3Cpath d='M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z' /%3E %3C/svg%3E");
--clipboard-image: var(--clipboard-image-normal);
}

.theme-switch-wrapper {
Expand Down Expand Up @@ -572,6 +580,10 @@ span.tok {
margin-right: 0.2em;
}

.copyToClipBoard {
position: relative;
}

pre {
font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
color: var(--text);
Expand All @@ -590,7 +602,25 @@ pre {
border: 1px solid var(--border);
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px; }
border-radius: 6px;
}

.copyToClipBoardBtn {
visibility: hidden;
position: absolute;
width: 24px;
border-radius: 4px;
background-image: var(--clipboard-image);
right: 5px;
top: 13px;
background-color: var(--secondary-background);
padding: 11px;
border: 0;
}

.copyToClipBoard:hover .copyToClipBoardBtn {
visibility: visible;
}

.pre-scrollable {
max-height: 340px;
Expand Down
56 changes: 56 additions & 0 deletions tools/dochack/dochack.nim
Original file line number Diff line number Diff line change
Expand Up @@ -341,3 +341,59 @@ proc search*() {.exportc.} =

if timer != nil: clearTimeout(timer)
timer = setTimeout(wrapper, 400)

proc copyToClipboard*() {.exportc.} =
{.emit: """

function updatePreTags() {

const allPreTags = document.querySelectorAll("pre")

allPreTags.forEach((e) => {

const div = document.createElement("div")
div.classList.add("copyToClipBoard")

const preTag = document.createElement("pre")
preTag.innerHTML = e.innerHTML

const button = document.createElement("button")
button.value = e.textContent.replace('...', '')
button.classList.add("copyToClipBoardBtn")

div.appendChild(preTag)
div.appendChild(button)

e.outerHTML = div.outerHTML

})
}


function copyTextToClipboard(e) {
const clipBoardContent = e.target.value
navigator.clipboard.writeText(clipBoardContent).then(function() {
e.target.style.setProperty("--clipboard-image", "var(--clipboard-image-selected)")
}, function(err) {
console.error("Could not copy text: ", err);
});
}

window.addEventListener("click", (e) => {
if (e.target.classList.contains("copyToClipBoardBtn")) {
copyTextToClipboard(e)
}
})

window.addEventListener("mouseover", (e) => {
if (e.target.nodeName === "PRE") {
e.target.nextElementSibling.style.setProperty("--clipboard-image", "var(--clipboard-image-normal)")
}
})

window.addEventListener("DOMContentLoaded", updatePreTags)

"""
.}

copyToClipboard()