//============================================================================= // 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
 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");
}