// SPDX-License-Identifier: MIT /** Doxygen Awesome https://github.com/jothepro/doxygen-awesome-css Copyright (c) 2022 - 2025 jothepro */ class DoxygenAwesomeFragmentCopyButton extends HTMLElement { constructor() { super(); this.onclick=this.copyContent } static title = "Copy to clipboard" static copyIcon = `` static successIcon = `` static successDuration = 980 static init() { $(function() { $(document).ready(function() { if(navigator.clipboard) { const fragments = document.getElementsByClassName("fragment") for(const fragment of fragments) { const fragmentWrapper = document.createElement("div") fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title fragment.parentNode.replaceChild(fragmentWrapper, fragment) fragmentWrapper.appendChild(fragment) fragmentWrapper.appendChild(fragmentCopyButton) } } }) }) } copyContent() { const content = this.previousSibling.cloneNode(true) // filter out line number from file listings content.querySelectorAll(".lineno, .ttc").forEach((node) => { node.remove() }) let textContent = content.textContent // remove trailing newlines that appear in file listings let numberOfTrailingNewlines = 0 while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { numberOfTrailingNewlines++; } textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) navigator.clipboard.writeText(textContent); this.classList.add("success") this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon window.setTimeout(() => { this.classList.remove("success") this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon }, DoxygenAwesomeFragmentCopyButton.successDuration); } } customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton)