js 代码
- /**
- * Code Syntax Highlighter.
- * Version 1.3.0
- * Copyright (C) 2004 Alex Gorbatchev.
- * http://www.dreamprojections.com/syntaxhighlighter/
- *
- * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
- * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
- * any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
- * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
- * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- //
- // create namespaces
- //
- var dp = {
- sh :
- {
- Toolbar : {},
- Utils : {},
- RegexLib: {},
- Brushes : {},
- Strings : {},
- Version : '1.4.1'
- }
- };
- dp.sh.Strings = {
- AboutDialog : '
About... class="dp-about">"0">
'class="copy"> class="title">dp.SyntaxHighlighter
class="para">Version: {V}©2004-2005 Alex Gorbatchev. All right reserved.class="footer">"button" class="close" value="OK" onClick="window.close()"/> - };
- dp.SyntaxHighlighter = dp.sh;
- //
- // Toolbar functions
- //
- dp.sh.Toolbar.Commands = {
- ExpandSource: {
- label: '+ expand source',
- check: function(highlighter) { return highlighter.collapse; },
- func: function(sender, highlighter)
- {
- sender.parentNode.removeChild(sender);
- highlighter.div.className = highlighter.div.className.replace('collapsed', '');
- }
- },
- // opens a new windows and puts the original unformatted source code inside.
- ViewSource: {
- label: 'view plain',
- func: function(sender, highlighter)
- {
- var code = highlighter.originalCode.replace(/
- var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=1');
- wnd.document.write('>' + code + '');
- wnd.document.close();
- }
- },
- // copies the original source code in to the clipboard (IE only)
- CopyToClipboard: {
- label: 'copy to clipboard',
- check: function() { return window.clipboardData != null; },
- func: function(sender, highlighter)
- {
- window.clipboardData.setData('text', highlighter.originalCode);
- alert('The code is in your clipboard now');
- }
- },
- // creates an invisible iframe, puts the original source code inside and prints it
- PrintSource: {
- label: 'print',
- func: function(sender, highlighter)
- {
- var iframe = document.createElement('IFRAME');
- var doc = null;
- // this hides the iframe
- iframe.style.cssText = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;';
- document.body.appendChild(iframe);
- doc = iframe.contentWindow.document;
- dp.sh.Utils.CopyStyles(doc, window.document);
- doc.write('class="' + highlighter.div.className.replace('collapsed', '') + ' printing">' + highlighter.div.innerHTML + '');
- doc.close();
- iframe.contentWindow.focus();
- iframe.contentWindow.print();
- alert('Printing...');
- document.body.removeChild(iframe);
- }
- },
- About: {
- label: '?',
- func: function(highlighter)
- {
- var wnd = window.open('', '_blank', 'dialog,width=300,height=150,scrollbars=0');
- var doc = wnd.document;
- dp.sh.Utils.CopyStyles(doc, window.document);
- doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version));
- doc.close();
- wnd.focus();
- }
- }
- };
- // creates a with all toolbar links
- dp.sh.Toolbar.Create = function(highlighter)
- {
- var div = document.createElement('DIV');
- div.className = 'tools';
- for(var name in dp.sh.Toolbar.Commands)
- {
- var cmd = dp.sh.Toolbar.Commands[name];
- if(cmd.check != null && !cmd.check(highlighter))
- continue;
- div.innerHTML += '"#" onclick="dp.sh.Toolbar.Command(\'' + name + '\',this);return false;">' + cmd.label + '';
- }
- return div;
- }
- // executes toolbar command by name
- dp.sh.Toolbar.Command = function(name, sender)
- {
- var n = sender;
- while(n != null && n.className.indexOf('dp-highlighter') == -1)
- n = n.parentNode;
- if(n != null)
- dp.sh.Toolbar.Commands[name].func(sender, n.highlighter);
- }
- // copies all from 'target' window to 'dest'
- dp.sh.Utils.CopyStyles = function(destDoc, sourceDoc)
- {
- var links = sourceDoc.getElementsByTagName('link');
- for(var i = 0; i < links.length; i++)
- if(links[i].rel.toLowerCase() == 'stylesheet')
- destDoc.write('"text/css" rel="stylesheet" href="' + links[i].href + '">');
- }
- //
- // Common reusable regular expressions
- //
- dp.sh.RegexLib = {
- MultiLineCComments : new RegExp('/\\*[\\s\\S]*?\\*/', 'gm'),
- SingleLineCComments : new RegExp('//.*$', 'gm'),
- SingleLinePerlComments : new RegExp('#.*$', 'gm'),
- DoubleQuotedString : new RegExp('"(?:\\.|(\\\\\\")|[^\\""])*"','g'),
- SingleQuotedString : new RegExp("'(?:\\.|(\\\\\\')|[^\\''])*'", 'g')
- };
- //
- // Match object
- //
- dp.sh.Match = function(value, index, css)
- {
- this.value = value;
- this.index = index;
- this.length = value.length;
- this.css = css;
- }
- //
- // Highlighter object
- //
- dp.sh.Highlighter = function()
- {
- this.noGutter = false;
- this.addControls = true;
- this.collapse = false;
- this.tabsToSpaces = true;
- this.wrapColumn = 80;
- this.showColumns = true;
- }
- // static callback for the match sorting
- dp.sh.Highlighter.SortCallback = function(m1, m2)
- {
- // sort matches by index first
- if(m1.index < m2.index)
- return -1;
- else if(m1.index > m2.index)
- return 1;
- else
- {
- // if index is the same, sort by length
- if(m1.length < m2.length)
- return -1;
- else if(m1.length > m2.length)
- return 1;
- }
- return 0;
- }
- dp.sh.Highlighter.prototype.CreateElement = function(name)
- {
- var result = document.createElement(name);
- result.highlighter = this;
- return result;
- }
- // gets a list of all matches for a given regular expression
- dp.sh.Highlighter.prototype.GetMatches = function(regex, css)
- {
- var index = 0;
- var match = null;
- while((match = regex.exec(this.code)) != null)
- this.matches[this.matches.length] = new dp.sh.Match(match[0], match.index, css);
- }
- dp.sh.Highlighter.prototype.AddBit = function(str, css)
- {
- if(str == null || str.length == 0)
- return;
- var span = this.CreateElement('SPAN');
- str = str.replace(/&/g, '&');
- str = str.replace(/ /g, ' ');
- str = str.replace(/
- str = str.replace(/\n/gm, '
'); - // when adding a piece of code, check to see if it has line breaks in it
- // and if it does, wrap individual line breaks with span tags
- if(css != null)
- {
- var regex = new RegExp('
', 'gi'); - if(regex.test(str))
- {
- var lines = str.split('
'); - str = '';
- for(var i = 0; i < lines.length; i++)
- {
- span = this.CreateElement('SPAN');
- span.className = css;
- span.innerHTML = lines[i];
- this.div.appendChild(span);
- // don't add a
for the last line - if(i + 1 < lines.length)
- this.div.appendChild(this.CreateElement('BR'));
- }
- }
- else
- {
- span.className = css;
- span.innerHTML = str;
- this.div.appendChild(span);
- }
- }
- else
- {
- span.innerHTML = str;
- this.div.appendChild(span);
- }
- }
- // checks if one match is inside any other match
- dp.sh.Highlighter.prototype.IsInside = function(match)
- {
- if(match == null || match.length == 0)
- return false;
- for(var i = 0; i < this.matches.length; i++)
- {
- var c = this.matches[i];
- if(c == null)
- continue;
- if((match.index > c.index) && (match.index < c.index + c.length))
- return true;
- }
- return false;
- }
- dp.sh.Highlighter.prototype.ProcessRegexList = function()
- {
- for(var i = 0; i < this.regexList.length; i++)
- this.GetMatches(this.regexList[i].regex, this.regexList[i].css);
- }
- dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code)
- {
- var lines = code.split('\n');
- var result = '';
- var tabSize = 4;
- var tab = '\t';
- // This function inserts specified amount of spaces in the string
- // where a tab is while removing that given tab.
- function InsertSpaces(line, pos, count)
- {
- var left = line.substr(0, pos);
- var right = line.substr(pos + 1, line.length); // pos + 1 will get rid of the tab
- var spaces = '';
- for(var i = 0; i < count; i++)
- spaces += ' ';
- return left + spaces + right;
- }
- // This function process one line for 'smart tabs'
- function ProcessLine(line, tabSize)
- {
- if(line.indexOf(tab) == -1)
- return line;
- var pos = 0;
- while((pos = line.indexOf(tab)) != -1)
- {
- // This is pretty much all there is to the 'smart tabs' logic.
- // Based on the position within the line and size of a tab,
- // calculate the amount of spaces we need to insert.
- var spaces = tabSize - pos % tabSize;
- line = InsertSpaces(line, pos, spaces);
- }
- return line;
- }
- // Go through all the lines and do the 'smart tabs' magic.
- for(var i = 0; i < lines.length; i++)
- result += ProcessLine(lines[i], tabSize) + '\n';
- return result;
- }
- dp.sh.Highlighter.prototype.SwitchToList = function()
- {
- // thanks to Lachlan Donald from SitePoint.com for this
tag fix. - var html = this.div.innerHTML.replace(/<(br)\/?>/gi, '\n');
- var lines = html.split('\n');
- if(this.addControls == true)
- this.bar.appendChild(dp.sh.Toolbar.Create(this));
- // add columns ruler
- if(this.showColumns)
- {
- var div = this.CreateElement('div');
- var columns = this.CreateElement('div');
- var showEvery = 10;
- var i = 1;
- while(i <= 150)
- {
- if(i % showEvery == 0)
- {
- div.innerHTML += i;
- i += (i + '').length;
- }
- else
- {
- div.innerHTML += '·';
- i++;
- }
- }
- columns.className = 'columns';
- columns.appendChild(div);
- this.bar.appendChild(columns);
- }
- for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, lineIndex++)
- {
- var li = this.CreateElement('LI');
- var span = this.CreateElement('SPAN');
- // uses .line1 and .line2 css styles for alternating lines
- li.className = (i % 2 == 0) ? 'alt' : '';
- span.innerHTML = lines[i] + ' ';
- li.appendChild(span);
- this.ol.appendChild(li);
- }
- this.div.innerHTML = '';
- }
- dp.sh.Highlighter.prototype.Highlight = function(code)
- {
- function Trim(str)
- {
- return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1');
- }
- function Chop(str)
- {
- return str.replace(/\n*$/, '').replace(/^\n*/, '');
- }
- function Unindent(str)
- {
- var lines = str.split('\n');
- var indents = new Array();
- var regex = new RegExp('^\\s*', 'g');
- var min = 1000;
- // go through every line and check for common number of indents
- for(var i = 0; i < lines.length && min > 0; i++)
- {
- if(Trim(lines[i]).length == 0)
- continue;
- var matches = regex.exec(lines[i]);
- if(matches != null && matches.length > 0)
- min = Math.min(matches[0].length, min);
- }
- // trim minimum common number of white space from the begining of every line
- if(min > 0)
- for(var i = 0; i < lines.length; i++)
- lines[i] = lines[i].substr(min);
- return lines.join('\n');
- }
- // This function returns a portions of the string from pos1 to pos2 inclusive
- function Copy(string, pos1, pos2)
- {
- return string.substr(pos1, pos2 - pos1);
- }
- var pos = 0;
- this.originalCode = code;
- &nb