/** * Set up copy/paste for code blocks */ const copySVG = `` const clipboardButton = id => ` ${copySVG} ` // Clears selected text since ClipboardJS will select the text when copying const clearSelection = () => { if (window.getSelection) { window.getSelection().removeAllRanges() } else if (document.selection) { document.selection.empty() } } // Changes tooltip text for two seconds, then changes it back const temporarilyChangeTooltip = (el, newText) => { const oldText = el.getAttribute('data-tooltip') el.setAttribute('data-tooltip', newText) setTimeout(() => el.setAttribute('data-tooltip', oldText), 2000) } const addCopyButtonToCodeCells = () => { // If ClipboardJS hasn't loaded, wait a bit and try again. This // happens because we load ClipboardJS asynchronously. if (window.ClipboardJS === undefined) { setTimeout(addCopyButtonToCodeCells, 250) return } pageElements['codeCells'].forEach((codeCell) => { const id = codeCell.getAttribute('id') if (document.getElementById("copy-button" + id) == null) { codeCell.insertAdjacentHTML('afterend', clipboardButton(id)); } }) const clipboard = new ClipboardJS('.copybtn') clipboard.on('success', event => { clearSelection() temporarilyChangeTooltip(event.trigger, 'Copied!') }) clipboard.on('error', event => { temporarilyChangeTooltip(event.trigger, 'Failed to copy') }) // Get rid of clipboard before the next page visit to avoid memory leak document.addEventListener('turbolinks:before-visit', () => clipboard.destroy() ) } initFunction(addCopyButtonToCodeCells);