From cd0774c18da9977cb3443f9c5a9ba36b0051ab2b Mon Sep 17 00:00:00 2001 From: Sam Gleske Date: Sat, 14 Oct 2023 16:22:44 -0400 Subject: [PATCH] Add a copy button to all code blocks in groovydoc --- gradle/groovydoc.gradle | 1 + .../resources/copycode/copybutton.js | 45 ++++++++++++ .../classLevel/classDocName.html | 72 +++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 src/groovydoc/resources/copycode/copybutton.js diff --git a/gradle/groovydoc.gradle b/gradle/groovydoc.gradle index 14b072f5..5a394340 100644 --- a/gradle/groovydoc.gradle +++ b/gradle/groovydoc.gradle @@ -36,6 +36,7 @@ groovydoc { } copy { from 'src/groovydoc/resources/highlightjs' into 'build/docs/groovydoc' + from 'src/groovydoc/resources/copycode' into 'build/docs/groovydoc' } } diff --git a/src/groovydoc/resources/copycode/copybutton.js b/src/groovydoc/resources/copycode/copybutton.js new file mode 100644 index 00000000..f9f705ea --- /dev/null +++ b/src/groovydoc/resources/copycode/copybutton.js @@ -0,0 +1,45 @@ +document.addEventListener("DOMContentLoaded", function(event) { + // START of copy button java script + // Source: https://remarkablemark.org/blog/2021/06/01/add-copy-code-to-clipboard-button-to-jeyll-site/ + var codeBlocks = document.querySelectorAll('pre'); + + codeBlocks.forEach(function (codeBlock) { + var copyButton = document.createElement('button'); + copyButton.className = 'copy'; + copyButton.type = 'button'; + copyButton.ariaLabel = 'Copy code to clipboard'; + copyButton.innerText = 'Copy'; + + codeBlock.append(copyButton); + + copyButton.addEventListener('click', function () { + var code = codeBlock.querySelector('code').innerText.trim(); + if(window.navigator.clipboard && window.isSecureContext) { + window.navigator.clipboard.writeText(code); + } else { + // Source: https://stackoverflow.com/questions/51805395/navigator-clipboard-is-undefined + // text area method + let textArea = document.createElement("textarea"); + textArea.value = code; + // make the textarea out of viewport + textArea.style.position = "fixed"; + textArea.style.left = "-999999px"; + textArea.style.top = "-999999px"; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + // here the magic happens + document.execCommand('copy') + textArea.remove(); + } + + copyButton.innerText = 'Copied'; + var fourSeconds = 4000; + + setTimeout(function () { + copyButton.innerText = 'Copy'; + }, fourSeconds); + }); + }); + // END start of copy button java script +}); diff --git a/src/groovydoc/resources/org/codehaus/groovy/tools/groovydoc/gstringTemplates/classLevel/classDocName.html b/src/groovydoc/resources/org/codehaus/groovy/tools/groovydoc/gstringTemplates/classLevel/classDocName.html index 9bf6a4cf..94702043 100644 --- a/src/groovydoc/resources/org/codehaus/groovy/tools/groovydoc/gstringTemplates/classLevel/classDocName.html +++ b/src/groovydoc/resources/org/codehaus/groovy/tools/groovydoc/gstringTemplates/classLevel/classDocName.html @@ -744,5 +744,77 @@

${method.typeParameters() ? + + + +