X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/3ac34b584930aad5625d29ca6c2e59b85e9d2ef8..refs/pull/1021/head:/resources/assets/js/services/code.js diff --git a/resources/assets/js/services/code.js b/resources/assets/js/services/code.js index 6c04e9872..7e43ab0c6 100644 --- a/resources/assets/js/services/code.js +++ b/resources/assets/js/services/code.js @@ -16,6 +16,8 @@ require('codemirror/mode/toml/toml'); require('codemirror/mode/xml/xml'); require('codemirror/mode/yaml/yaml'); +const Clipboard = require("clipboard"); + const CodeMirror = require('codemirror'); const modeMap = { @@ -77,7 +79,7 @@ function highlightElem(elem) { elem.innerHTML = elem.innerHTML.replace(//gi ,'\n'); let content = elem.textContent.trim(); - CodeMirror(function(elt) { + let cm = CodeMirror(function(elt) { elem.parentNode.replaceChild(elt, elem); }, { value: content, @@ -86,6 +88,33 @@ function highlightElem(elem) { theme: getTheme(), readOnly: true }); + + addCopyIcon(cm); +} + +/** + * Add a button to a CodeMirror instance which copies the contents to the clipboard upon click. + * @param cmInstance + */ +function addCopyIcon(cmInstance) { + const copyIcon = ``; + const copyButton = document.createElement('div'); + copyButton.classList.add('CodeMirror-copy'); + copyButton.innerHTML = copyIcon; + cmInstance.display.wrapper.appendChild(copyButton); + + const clipboard = new Clipboard(copyButton, { + text: function(trigger) { + return cmInstance.getValue() + } + }); + + clipboard.on('success', event => { + copyButton.classList.add('success'); + setTimeout(() => { + copyButton.classList.remove('success'); + }, 240); + }); } /** @@ -128,6 +157,7 @@ function wysiwygView(elem) { newWrap.className = 'CodeMirrorContainer'; newWrap.setAttribute('data-lang', lang); + newWrap.setAttribute('dir', 'ltr'); newTextArea.style.display = 'none'; elem.parentNode.replaceChild(newWrap, elem);