X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/736d7118b08ef7f03d35a237bf5a909ada90d9cd..refs/pull/906/head:/resources/assets/js/services/code.js diff --git a/resources/assets/js/services/code.js b/resources/assets/js/services/code.js index 8a5a7a022..ae63a8ce8 100644 --- a/resources/assets/js/services/code.js +++ b/resources/assets/js/services/code.js @@ -16,17 +16,19 @@ 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 = { css: 'css', - c: 'clike', - java: 'clike', - scala: 'clike', - kotlin: 'clike', - 'c++': 'clike', - 'c#': 'clike', - csharp: 'clike', + c: 'text/x-csrc', + java: 'text/x-java', + scala: 'text/x-scala', + kotlin: 'text/x-kotlin', + 'c++': 'text/x-c++src', + 'c#': 'text/x-csharp', + csharp: 'text/x-csharp', diff: 'diff', go: 'go', html: 'htmlmixed', @@ -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'); + }, 360); + }); } /**