| /** | |
| * Scripting for handling custom code snippets | |
| */ | |
| /** | |
| * Shows the requested snippet, and stores the current state in visibleSnippet. | |
| */ | |
| function showSnippet(name, visibleSnippet) { | |
| if (visibleSnippet == name) return; | |
| if (visibleSnippet != null) { | |
| var shown = document.getElementById(visibleSnippet); | |
| var attribute = document.createAttribute('hidden'); | |
| if (shown != null) { | |
| shown.setAttributeNode(attribute); | |
| } | |
| var button = document.getElementById(visibleSnippet + 'Button'); | |
| if (button != null) { | |
| button.removeAttribute('selected'); | |
| } | |
| } | |
| if (name == null || name == '') { | |
| visibleSnippet = null; | |
| return; | |
| } | |
| var newlyVisible = document.getElementById(name); | |
| if (newlyVisible != null) { | |
| visibleSnippet = name; | |
| newlyVisible.removeAttribute('hidden'); | |
| } else { | |
| visibleSnippet = null; | |
| } | |
| var button = document.getElementById(name + 'Button'); | |
| var selectedAttribute = document.createAttribute('selected'); | |
| if (button != null) { | |
| button.setAttributeNode(selectedAttribute); | |
| } | |
| return visibleSnippet; | |
| } | |
| // Finds a sibling to given element with the given id. | |
| function findSiblingWithId(element, id) { | |
| var siblings = element.parentNode.children; | |
| var siblingWithId = null; | |
| for (var i = siblings.length; i--;) { | |
| if (siblings[i] == element) continue; | |
| if (siblings[i].id == id) { | |
| siblingWithId = siblings[i]; | |
| break; | |
| } | |
| } | |
| return siblingWithId; | |
| }; | |
| // Returns true if the browser supports the "copy" command. | |
| function supportsCopying() { | |
| return !!document.queryCommandSupported && | |
| !!document.queryCommandSupported('copy'); | |
| } | |
| // Copies the given string to the clipboard. | |
| function copyStringToClipboard(string) { | |
| var textArea = document.createElement("textarea"); | |
| textArea.value = string; | |
| document.body.appendChild(textArea); | |
| textArea.focus(); | |
| textArea.select(); | |
| if (!supportsCopying()) { | |
| alert('Unable to copy to clipboard (not supported by browser)'); | |
| return; | |
| } | |
| try { | |
| document.execCommand('copy'); | |
| } finally { | |
| document.body.removeChild(textArea); | |
| } | |
| } | |
| function fixHref(anchor, id) { | |
| anchor.href = window.location.href.replace(/#.*$/, '') + '#' + id; | |
| } | |
| // Copies the text inside the currently visible snippet to the clipboard, or the | |
| // given element, if any. | |
| function copyTextToClipboard(element) { | |
| if (typeof element === 'string') { | |
| var elementSelector = '#' + element + ' .language-dart'; | |
| element = document.querySelector(elementSelector); | |
| if (element == null) { | |
| console.log( | |
| 'copyTextToClipboard: Unable to find element for "' + | |
| elementSelector + '"'); | |
| return; | |
| } | |
| } | |
| if (!supportsCopying()) { | |
| alert('Unable to copy to clipboard (not supported by browser)'); | |
| return; | |
| } | |
| if (element.hasAttribute('contenteditable')) { | |
| element.focus(); | |
| } | |
| var selection = window.getSelection(); | |
| var range = document.createRange(); | |
| range.selectNodeContents(element); | |
| selection.removeAllRanges(); | |
| selection.addRange(range); | |
| document.execCommand('copy'); | |
| } |