| //============================================================================= | |
| // System : Color Syntax Highlighter | |
| // File : Highlight.js | |
| // Author : Eric Woodruff (Eric@EWoodruff.us) | |
| // Updated : 11/13/2007 | |
| // Note : Copyright 2006, Eric Woodruff, All rights reserved | |
| // | |
| // This contains the script to expand and collapse the regions in the | |
| // syntax highlighted code. | |
| // | |
| //============================================================================= | |
| // Expand/collapse a region | |
| function HighlightExpandCollapse(showId, hideId) | |
| { | |
| var showSpan = document.getElementById(showId), | |
| hideSpan = document.getElementById(hideId); | |
| showSpan.style.display = "inline"; | |
| hideSpan.style.display = "none"; | |
| } | |
| // Copy the code if Enter or Space is hit with the image focused | |
| function CopyColorizedCodeCheckKey(titleDiv, eventObj) | |
| { | |
| if(eventObj != undefined && (eventObj.keyCode == 13 || | |
| eventObj.keyCode == 32)) | |
| CopyColorizedCode(titleDiv); | |
| } | |
| // Change the icon as the mouse moves in and out of the Copy Code link | |
| // There should be an image with the same name but an "_h" suffix just | |
| // before the extension. | |
| function CopyCodeChangeIcon(linkSpan) | |
| { | |
| var image = linkSpan.firstChild.src; | |
| var pos = image.lastIndexOf("."); | |
| if(linkSpan.className == "highlight-copycode") | |
| { | |
| linkSpan.className = "highlight-copycode_h"; | |
| linkSpan.firstChild.src = image.substr(0, pos) + "_h" + | |
| image.substr(pos); | |
| } | |
| else | |
| { | |
| linkSpan.className = "highlight-copycode"; | |
| linkSpan.firstChild.src = image.substr(0, pos - 2) + image.substr(pos); | |
| } | |
| } | |
| // Copy the code from a colorized code block to the clipboard. | |
| function CopyColorizedCode(titleDiv) | |
| { | |
| var preTag, idx, line, block, htmlLines, lines, codeText, hasLineNos, | |
| hasRegions, clip, trans, copyObject, clipID; | |
| var reLineNo = /^\s*\d{1,4}/; | |
| var reRegion = /^\s*\d{1,4}\+.*?\d{1,4}-/; | |
| var reRegionText = /^\+.*?\-/; | |
| // Find the <pre> tag containing the code. It should be in the next | |
| // element or one of its children. | |
| block = titleDiv.nextSibling; | |
| while(block.nodeName == "#text") | |
| block = block.nextSibling; | |
| while(block.tagName != "PRE") | |
| { | |
| block = block.firstChild; | |
| while(block.nodeName == "#text") | |
| block = block.nextSibling; | |
| } | |
| if(block.innerText != undefined) | |
| codeText = block.innerText; | |
| else | |
| codeText = block.textContent; | |
| hasLineNos = block.innerHTML.indexOf("highlight-lineno"); | |
| hasRegions = block.innerHTML.indexOf("highlight-collapsebox"); | |
| htmlLines = block.innerHTML.split("\n"); | |
| lines = codeText.split("\n"); | |
| // Remove the line numbering and collapsible regions if present | |
| if(hasLineNos != -1 || hasRegions != -1) | |
| { | |
| codeText = ""; | |
| for(idx = 0; idx < lines.length; idx++) | |
| { | |
| line = lines[idx]; | |
| if(hasRegions && reRegion.test(line)) | |
| line = line.replace(reRegion, ""); | |
| else | |
| { | |
| line = line.replace(reLineNo, ""); | |
| // Lines in expanded blocks have an extra space | |
| if(htmlLines[idx].indexOf("highlight-expanded") != -1 || | |
| htmlLines[idx].indexOf("highlight-endblock") != -1) | |
| line = line.substr(1); | |
| } | |
| if(hasRegions && reRegionText.test(line)) | |
| line = line.replace(reRegionText, ""); | |
| codeText += line; | |
| // Not all browsers keep the line feed when split | |
| if(line[line.length - 1] != "\n") | |
| codeText += "\n"; | |
| } | |
| } | |
| // IE or FireFox/Netscape? | |
| if(window.clipboardData) | |
| window.clipboardData.setData("Text", codeText); | |
| else | |
| if(window.netscape) | |
| { | |
| // Give unrestricted access to browser APIs using XPConnect | |
| try | |
| { | |
| netscape.security.PrivilegeManager.enablePrivilege( | |
| "UniversalXPConnect"); | |
| } | |
| catch(e) | |
| { | |
| alert("Universal Connect was refused, cannot copy to " + | |
| "clipboard. Go to about:config and set " + | |
| "signed.applets.codebase_principal_support to true to " + | |
| "enable clipboard support."); | |
| return; | |
| } | |
| // Creates an instance of nsIClipboard | |
| clip = Components.classes[ | |
| "@mozilla.org/widget/clipboard;1"].createInstance( | |
| Components.interfaces.nsIClipboard); | |
| // Creates an instance of nsITransferable | |
| if(clip) | |
| trans = Components.classes[ | |
| "@mozilla.org/widget/transferable;1"].createInstance( | |
| Components.interfaces.nsITransferable); | |
| if(!trans) | |
| { | |
| alert("Copy to Clipboard is not supported by this browser"); | |
| return; | |
| } | |
| // Register the data flavor | |
| trans.addDataFlavor("text/unicode"); | |
| // Create object to hold the data | |
| copyObject = new Object(); | |
| // Creates an instance of nsISupportsString | |
| copyObject = Components.classes[ | |
| "@mozilla.org/supports-string;1"].createInstance( | |
| Components.interfaces.nsISupportsString); | |
| // Assign the data to be copied | |
| copyObject.data = codeText; | |
| // Add data objects to transferable | |
| trans.setTransferData("text/unicode", copyObject, | |
| codeText.length * 2); | |
| clipID = Components.interfaces.nsIClipboard; | |
| if(!clipID) | |
| { | |
| alert("Copy to Clipboard is not supported by this browser"); | |
| return; | |
| } | |
| // Transfer the data to the clipboard | |
| clip.setData(trans, null, clipID.kGlobalClipboard); | |
| } | |
| else | |
| alert("Copy to Clipboard is not supported by this browser"); | |
| } |