| /** |
| * 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'); |
| } |