mirror of
				https://github.com/Wonderfall/hugo-WonderMod.git
				synced 2025-10-30 19:35:26 +01:00 
			
		
		
		
	Add copy button to copy code block contents (#345)
* add buttons to copy code block contents
Adds a clickable "copy" link in the top-right corner of each code block.
If available, uses the navigator.clipboard API. Falls back to selecting
the text and calling document.execCommand('copy') to copy text.
* hides copy button unless mouse is hovering over code block
* change text of copy button when text is copied
* add translation keys for copy button text  `code_copy` and `code_copied`
* To disable use `Params.disableCodeCopy: true` in site config
			
			
This commit is contained in:
		| @@ -84,3 +84,43 @@ | ||||
|  | ||||
| </script> | ||||
| {{- end }} | ||||
|  | ||||
| {{- if (not .Site.Params.disableCodeCopy) }} | ||||
| <script> | ||||
|     document.querySelectorAll('pre > code').forEach((codeblock) => { | ||||
|         const container = codeblock.parentNode.parentNode; | ||||
|  | ||||
|         const copybutton = document.createElement('button'); | ||||
|         copybutton.classList.add('copy-code'); | ||||
|         copybutton.innerText = '{{- i18n "code_copy" | default "copy" }}'; | ||||
|  | ||||
|         function copyingDone() { | ||||
|             copybutton.innerText = '{{- i18n "code_copied" | default "copied!" }}'; | ||||
|             setTimeout(() => { | ||||
|                 copybutton.innerText = '{{- i18n "code_copy" | default "copy" }}'; | ||||
|             }, 2000); | ||||
|         } | ||||
|  | ||||
|         copybutton.addEventListener('click', (cb) => { | ||||
|             if ('clipboard' in navigator) { | ||||
|                 navigator.clipboard.writeText(codeblock.textContent); | ||||
|                 copyingDone(); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             const range = document.createRange(); | ||||
|             range.selectNodeContents(codeblock); | ||||
|             const selection = window.getSelection(); | ||||
|             selection.removeAllRanges(); | ||||
|             selection.addRange(range); | ||||
|             try { | ||||
|                 document.execCommand('copy'); | ||||
|                 copyingDone(); | ||||
|             } catch (e) { }; | ||||
|             selection.removeRange(range); | ||||
|         }); | ||||
|  | ||||
|         container.appendChild(copybutton); | ||||
|     }); | ||||
| </script> | ||||
| {{- end }} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Kian Kasad
					Kian Kasad