diff options
author | silverwind <me@silverwind.io> | 2021-11-16 09:16:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-16 16:16:05 +0800 |
commit | 23bd7b1211a80aa3b0dcb60ec4a1c0089ff28dd4 (patch) | |
tree | 38fafd772b6341daa87cb256ee10dfdcf5a87a48 /web_src/js/features/clipboard.js | |
parent | d789670894d09d7db96f4cd2dc3d57d2424eb753 (diff) | |
download | gitea-23bd7b1211a80aa3b0dcb60ec4a1c0089ff28dd4.tar.gz gitea-23bd7b1211a80aa3b0dcb60ec4a1c0089ff28dd4.zip |
Add copy button to markdown code blocks (#17638)
* Add copy button to markdown code blocks
Done mostly in JS because I think it's better not to try getting buttons
past the markup sanitizer.
* add svg module tests
* fix sanitizer regexp
* remove outdated comment
* vertically center button in issue comments as well
* add comment to css
* fix undefined on view file line copy
* combine animation less files
* Update modules/markup/markdown/markdown.go
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
* add test for different sizes
* add cloneNode and add tests for it
* use deep clone
* remove useless optional chaining
* remove the svg node cache
* unify clipboard copy string and i18n
* remove unused var
* remove unused localization
* minor css tweaks to the button
* comment tweak
* remove useless attribute
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'web_src/js/features/clipboard.js')
-rw-r--r-- | web_src/js/features/clipboard.js | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/web_src/js/features/clipboard.js b/web_src/js/features/clipboard.js index 89aface93a..b0c4134537 100644 --- a/web_src/js/features/clipboard.js +++ b/web_src/js/features/clipboard.js @@ -1,27 +1,25 @@ -// For all DOM elements with [data-clipboard-target] or [data-clipboard-text], this copy-to-clipboard will work for them +const {copy_success, copy_error} = window.config.i18n; -// TODO: replace these with toast-style notifications function onSuccess(btn) { - if (!btn.dataset.content) return; + btn.setAttribute('data-variation', 'inverted tiny'); $(btn).popup('destroy'); - const oldContent = btn.dataset.content; - btn.dataset.content = btn.dataset.success; + const oldContent = btn.getAttribute('data-content'); + btn.setAttribute('data-content', copy_success); $(btn).popup('show'); - btn.dataset.content = oldContent; + btn.setAttribute('data-content', oldContent || ''); } function onError(btn) { - if (!btn.dataset.content) return; - const oldContent = btn.dataset.content; + btn.setAttribute('data-variation', 'inverted tiny'); + const oldContent = btn.getAttribute('data-content'); $(btn).popup('destroy'); - btn.dataset.content = btn.dataset.error; + btn.setAttribute('data-content', copy_error); $(btn).popup('show'); - btn.dataset.content = oldContent; + btn.setAttribute('data-content', oldContent || ''); } -/** - * Fallback to use if navigator.clipboard doesn't exist. - * Achieved via creating a temporary textarea element, selecting the text, and using document.execCommand. - */ + +// Fallback to use if navigator.clipboard doesn't exist. Achieved via creating +// a temporary textarea element, selecting the text, and using document.execCommand function fallbackCopyToClipboard(text) { if (!document.execCommand) return false; @@ -37,7 +35,8 @@ function fallbackCopyToClipboard(text) { tempTextArea.select(); - // if unsecure (not https), there is no navigator.clipboard, but we can still use document.execCommand to copy to clipboard + // if unsecure (not https), there is no navigator.clipboard, but we can still + // use document.execCommand to copy to clipboard const success = document.execCommand('copy'); document.body.removeChild(tempTextArea); @@ -45,10 +44,13 @@ function fallbackCopyToClipboard(text) { return success; } +// For all DOM elements with [data-clipboard-target] or [data-clipboard-text], +// this copy-to-clipboard will work for them export default function initGlobalCopyToClipboardListener() { document.addEventListener('click', (e) => { let target = e.target; - // in case <button data-clipboard-text><svg></button>, so we just search up to 3 levels for performance. + // in case <button data-clipboard-text><svg></button>, so we just search + // up to 3 levels for performance for (let i = 0; i < 3 && target; i++) { let text; if (target.dataset.clipboardText) { |