diff --git a/aboutus.html b/aboutus.html index 70f3e0fcc..6737bda47 100644 --- a/aboutus.html +++ b/aboutus.html @@ -1,169 +1,169 @@ - -
- - - - -PHPMailer is the world's leading email transport class and downloaded an -average of more than 32,000 each month. In March 2009, PHPMailer was downloaded -more than 31,000 times -- that's an average of 1,000 downloads daily. Our thanks -to our new users and loyal users. We understand you have many choices available -to select from and we thank you for select our fast and stable tool for your -website and projects.
-Credits:
-PHPMailer's original founder is Brent Matzelle. The current team is:
-Project Administrator: Andy Prevost (codeworxtech),
-
-codeworxtech@users.sourceforge.net
-Author: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net
-Author: Marcus Bointon (coolbru)
-coolbru@users.sourceforge.net
PHPMailer is used in many projects ranging from Open Source to commercial -packages. Our LGPL licensing terms are very flexible and allow for including -PHPMailer to enhance projects of all types. If you discover PHPMailer being used -in a project, please let us know about it.
-WHY USE OUR TOOLS & WHAT'S IN IT FOR YOU?
-A valid question. We're developers too. We've been writing software, primarily for the internet, for more than 15 years. Along the way, there are two major things that had tremendous impact of our company: PHP and Open Source. PHP is without doubt the most popular platform for the internet. There has been more progress in this area of technology because of Open Source software than in any other IT segment. We have used many open source tools, some as learning tools, some as components in projects we were working on. To us, it's not about popularity ... we're committed to robust, stable, and efficient tools you can use to get your projects in your user's hands quickly. So the shorter answer: what's in it for you? rapid development and rapid deployment without fuss and with straight forward open source licensing.
-Now, here's our team:
-About Andy Prevost, AKA "codeworxtech". | -About Marcus Bointon, AKA "coolbru". | -
---|---|
- www.codeworxtech.com for more information. Our company, Worx International Inc., is the publisher of several Open Source applications and developer tools as well as several commercial PHP applications. The Open Source applications are ttCMS and DCP Portal. The Open Source developer tools include QuickComponents (QuickSkin and QuickCache) and now PHPMailer. - We have staff and offices in the United States, Caribbean, the Middle - East, and our primary development center in Canada. Our company is represented by - agents and resellers globally. -Worx International Inc. is at the forefront of developing PHP applications. Our staff are all Zend Certified university educated and experts at object oriented programming. While Worx International Inc. can handle any project from trouble shooting programs written by others all the way to finished mission-critical applications, we specialize in taking projects from inception all the way through to implementation - on budget, and on time. If you need help with your projects, we're the team to get it done right at a reasonable price. -Over the years, there have been a number of tools that have been constant favorites in all of our projects. We have become the project administrators for most of these tools. -Our developer tools are all Open Source. Here's a brief description: -
We're committed to PHP and to the Open Source community. -Opportunities with Worx International Inc.: -
- Andy Prevost (aka, codeworxtech) - codeworxtech@users.sourceforge.net - - We now also offer website design. hosting, and remote forms processing. Visit WorxStudio.com for more information. - |
-
- Marcus is the technical director of Synchromedia Limited, a UK-based company providing online business services. Synchromedia's main services are: -Smartmessages.net-
info@hand-
How can we help you?-In addition to our headline services, we also provide consulting, development, hosting and sysadmin services, so if you just need a simple web hosting package, we can do that too. Not surprisingly, we know rather a lot about email, so you can talk to us about that too. -Please contact us if you'd like to know more. -Marcus is a regular attendee at PHP London, and occasionally speaks on email at technical conferences. - |
-
PHPMailer is the world's leading email transport class and downloaded an +average of more than 32,000 each month. In March 2009, PHPMailer was downloaded +more than 31,000 times -- that's an average of 1,000 downloads daily. Our thanks +to our new users and loyal users. We understand you have many choices available +to select from and we thank you for select our fast and stable tool for your +website and projects.
+Credits:
+PHPMailer's original founder is Brent Matzelle. The current team is:
+Project Administrator: Andy Prevost (codeworxtech),
+
+codeworxtech@users.sourceforge.net
+Author: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net
+Author: Marcus Bointon (coolbru)
+coolbru@users.sourceforge.net
PHPMailer is used in many projects ranging from Open Source to commercial +packages. Our LGPL licensing terms are very flexible and allow for including +PHPMailer to enhance projects of all types. If you discover PHPMailer being used +in a project, please let us know about it.
+WHY USE OUR TOOLS & WHAT'S IN IT FOR YOU?
+A valid question. We're developers too. We've been writing software, primarily for the internet, for more than 15 years. Along the way, there are two major things that had tremendous impact of our company: PHP and Open Source. PHP is without doubt the most popular platform for the internet. There has been more progress in this area of technology because of Open Source software than in any other IT segment. We have used many open source tools, some as learning tools, some as components in projects we were working on. To us, it's not about popularity ... we're committed to robust, stable, and efficient tools you can use to get your projects in your user's hands quickly. So the shorter answer: what's in it for you? rapid development and rapid deployment without fuss and with straight forward open source licensing.
+Now, here's our team:
+About Andy Prevost, AKA "codeworxtech". | +About Marcus Bointon, AKA "coolbru". | +
---|---|
+ www.codeworxtech.com for more information. Our company, Worx International Inc., is the publisher of several Open Source applications and developer tools as well as several commercial PHP applications. The Open Source applications are ttCMS and DCP Portal. The Open Source developer tools include QuickComponents (QuickSkin and QuickCache) and now PHPMailer. + We have staff and offices in the United States, Caribbean, the Middle + East, and our primary development center in Canada. Our company is represented by + agents and resellers globally. +Worx International Inc. is at the forefront of developing PHP applications. Our staff are all Zend Certified university educated and experts at object oriented programming. While Worx International Inc. can handle any project from trouble shooting programs written by others all the way to finished mission-critical applications, we specialize in taking projects from inception all the way through to implementation - on budget, and on time. If you need help with your projects, we're the team to get it done right at a reasonable price. +Over the years, there have been a number of tools that have been constant favorites in all of our projects. We have become the project administrators for most of these tools. +Our developer tools are all Open Source. Here's a brief description: +
We're committed to PHP and to the Open Source community. +Opportunities with Worx International Inc.: +
+ Andy Prevost (aka, codeworxtech) + codeworxtech@users.sourceforge.net + + We now also offer website design. hosting, and remote forms processing. Visit WorxStudio.com for more information. + |
+
+ Marcus is the technical director of Synchromedia Limited, a UK-based company providing online business services. Synchromedia's main services are: +Smartmessages.net+
info@hand+
How can we help you?+In addition to our headline services, we also provide consulting, development, hosting and sysadmin services, so if you just need a simple web hosting package, we can do that too. Not surprisingly, we know rather a lot about email, so you can talk to us about that too. +Please contact us if you'd like to know more. +Marcus is a regular attendee at PHP London, and occasionally speaks on email at technical conferences. + |
+
+ +This demonstrates sending out multiple email messages with binary attachments +from a MySQL database with multipart/alternative support.
+
++require("class.phpmailer.php"); + +$mail = new phpmailer(); + +$mail->From = "list@example.com"; +$mail->FromName = "List manager"; +$mail->Host = "smtp1.example.com;smtp2.example.com"; +$mail->Mailer = "smtp"; + +@MYSQL_CONNECT("localhost","root","password"); +@mysql_select_db("my_company"); +$query = "SELECT full_name, email, photo FROM employee WHERE id=$id"; +$result = @MYSQL_QUERY($query); + +while ($row = mysql_fetch_array ($result)) +{ + // HTML body + $body = "Hello <font size=\"4\">" . $row["full_name"] . "</font>, <p>"; + $body .= "<i>Your</i> personal photograph to this message.<p>"; + $body .= "Sincerely, <br>"; + $body .= "phpmailer List manager"; + + // Plain text body (for mail clients that cannot read HTML) + $text_body = "Hello " . $row["full_name"] . ", \n\n"; + $text_body .= "Your personal photograph to this message.\n\n"; + $text_body .= "Sincerely, \n"; + $text_body .= "phpmailer List manager"; + + $mail->Body = $body; + $mail->AltBody = $text_body; + $mail->AddAddress($row["email"], $row["full_name"]); + $mail->AddStringAttachment($row["photo"], "YourPhoto.jpg"); + + if(!$mail->Send()) + echo "There has been a mail error sending to " . $row["email"] . "<br>"; + + // Clear all addresses and attachments for next loop + $mail->ClearAddresses(); + $mail->ClearAttachments(); +} ++ |
+
+ +
+ +Extending classes with inheritance is one of the most +powerful features of object-oriented +programming. It allows you to make changes to the +original class for your +own personal use without hacking the original +classes. Plus, it is very +easy to do. I've provided an example: + +
+Here's a class that extends the phpmailer class and sets the defaults
+for the particular site:
+PHP include file: mail.inc.php
+
+ +
++require("class.phpmailer.php"); + +class my_phpmailer extends phpmailer { + // Set default variables for all new objects + var $From = "from@example.com"; + var $FromName = "Mailer"; + var $Host = "smtp1.example.com;smtp2.example.com"; + var $Mailer = "smtp"; // Alternative to IsSMTP() + var $WordWrap = 75; + + // Replace the default error_handler + function error_handler($msg) { + print("My Site Error"); + print("Description:"); + printf("%s", $msg); + exit; + } + + // Create an additional function + function do_something($something) { + // Place your new code here + } +} + |
+
+ +
++require("mail.inc.php"); + +// Instantiate your new class +$mail = new my_phpmailer; + +// Now you only need to add the necessary stuff +$mail->AddAddress("josh@example.com", "Josh Adams"); +$mail->Subject = "Here is the subject"; +$mail->Body = "This is the message body"; +$mail->AddAttachment("c:/temp/11-10-00.zip", "new_name.zip"); // optional name + +if(!$mail->Send()) +{ + echo "There was an error sending the message"; + exit; +} + +echo "Message was sent successfully"; ++ |
+
-class phpmailerAppException extends Exception { - public function errorMessage() { - $errorMsg = '' . $this->getMessage() . "- - - - - - - + + + +
"; - return $errorMsg; - } -} - -try { - $to = ; - if(filter_var($to, FILTER_VALIDATE_EMAIL) === FALSE) { - throw new phpmailerAppException("Email address " . $to . " is invalid -- aborting!
"); - } -} catch (phpmailerAppException $e) { - echo $e->errorMessage(); - return false; -} - -require_once("../class.phpmailer.php"); - -$mail = new PHPMailer(); - -getFile(\'contents.html\');' . "\n"; - echo '$body = eregi_replace("[\]",\'\',$body);' . "\n"; -} else { - echo '$body = ' . $_POST['Message'] . "\n"; -} - -echo "\n"; - -if ( $_POST['test_type'] == "smtp" ) { - echo '$mail->IsSMTP(); // telling the class to use SMTP' . "\n"; - echo '$mail->SMTPDebug = ' . $_POST['smtp_debug'] . "\n"; - echo '$mail->SMTPAuth = ' . $_POST['smtp_authenticate']; // enable SMTP authentication' . "\n"; - echo '$mail->Port = ' . $_POST['smtp_port']; // set the SMTP port' . "\n"; - echo '$mail->Host = ' . $_POST['smtp_server']; // SMTP server' . "\n"; - echo '$mail->Username = ' . $_POST['authenticate_username']; // SMTP account username' . "\n"; - echo '$mail->Password = ' . $_POST['authenticate_password']; // SMTP account password' . "\n"; -} elseif ( $_POST['test_type'] == "mail" ) { - echo '$mail->IsMail(); // telling the class to use PHP\'s Mail()' . "\n"; -} elseif ( $_POST['test_type'] == "sendmail" ) { - echo '$mail->IsSendmail(); // telling the class to use Sendmail' . "\n"; -} elseif ( $_POST['test_type'] == "qmail" ) { - echo '$mail->IsQmail(); // telling the class to use Qmail' . "\n"; -} -?> - -$mail->AddReplyTo('',''); - -$mail->From = ''; -$mail->FromName = ''; - - -$mail->AddAddress('',''); - -$mail->AddAddress(''); - $value) { -echo '$mail->AddBCC(\'' . $value . '\');
'; - } -} - -if ( $_POST['cc_Email'] != '' ) { - $indiCC = explode(" ", $_POST['cc_Email']); - foreach ($indiCC as $key => $value) { -echo '$mail->AddCC(\'' . $value . '\');
'; - } -} -?> - -$mail->Subject = (PHPMailer test using ) - -require_once('../class.html2text.inc.php'); -$h2t =& new html2text($body); -$mail->AltBody = $h2t->get_text(); -$mail->WordWrap = 80; // set word wrap - -$mail->MsgHTML($body); - -$mail->AddAttachment("images/aikido.gif", "aikido.gif"); // optional name -$mail->AddAttachment("images/phpmailer.gif", "phpmailer.gif"); // optional name - -try { - if ( !$mail->Send() ) { - $error = "Unable to send to: " . $to . "
"; - throw new phpmailerAppException($error); - } else { - echo 'Message has been sent using
'; - } -} catch (phpmailerAppException $e) { - $errorMsg[] = $e->errorMessage(); -} - -if ( count($errorMsg) > 0 ) { - foreach ($errorMsg as $key => $value) { - $thisError = $key + 1; - echo $thisError . ': ' . $value; - } -} -
+class phpmailerAppException extends Exception { + public function errorMessage() { + $errorMsg = '' . $this->getMessage() . "+ + + + + + + \ No newline at end of file diff --git a/test_script/scripts/shBrushBash.js b/test_script/scripts/shBrushBash.js index 378df9399..8137f7864 100644 --- a/test_script/scripts/shBrushBash.js +++ b/test_script/scripts/shBrushBash.js @@ -1,59 +1,59 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/ - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate - * - * @version - * 2.0.296 (March 01 2009) - * - * @copyright - * Copyright (C) 2004-2009 Alex Gorbatchev. - * - * @license - * This file is part of SyntaxHighlighter. - * - * SyntaxHighlighter is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * SyntaxHighlighter 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with SyntaxHighlighter. If not, see
"; + return $errorMsg; + } +} + +try { + $to = ; + if(filter_var($to, FILTER_VALIDATE_EMAIL) === FALSE) { + throw new phpmailerAppException("Email address " . $to . " is invalid -- aborting!
"); + } +} catch (phpmailerAppException $e) { + echo $e->errorMessage(); + return false; +} + +require_once("../class.phpmailer.php"); + +$mail = new PHPMailer(); + +getFile(\'contents.html\');' . "\n"; + echo '$body = eregi_replace("[\]",\'\',$body);' . "\n"; +} else { + echo '$body = ' . $_POST['Message'] . "\n"; +} + +echo "\n"; + +if ( $_POST['test_type'] == "smtp" ) { + echo '$mail->IsSMTP(); // telling the class to use SMTP' . "\n"; + echo '$mail->SMTPDebug = ' . $_POST['smtp_debug'] . "\n"; + echo '$mail->SMTPAuth = ' . $_POST['smtp_authenticate']; // enable SMTP authentication' . "\n"; + echo '$mail->Port = ' . $_POST['smtp_port']; // set the SMTP port' . "\n"; + echo '$mail->Host = ' . $_POST['smtp_server']; // SMTP server' . "\n"; + echo '$mail->Username = ' . $_POST['authenticate_username']; // SMTP account username' . "\n"; + echo '$mail->Password = ' . $_POST['authenticate_password']; // SMTP account password' . "\n"; +} elseif ( $_POST['test_type'] == "mail" ) { + echo '$mail->IsMail(); // telling the class to use PHP\'s Mail()' . "\n"; +} elseif ( $_POST['test_type'] == "sendmail" ) { + echo '$mail->IsSendmail(); // telling the class to use Sendmail' . "\n"; +} elseif ( $_POST['test_type'] == "qmail" ) { + echo '$mail->IsQmail(); // telling the class to use Qmail' . "\n"; +} +?> + +$mail->AddReplyTo('',''); + +$mail->From = ''; +$mail->FromName = ''; + + +$mail->AddAddress('',''); + +$mail->AddAddress(''); + $value) { +echo '$mail->AddBCC(\'' . $value . '\');
'; + } +} + +if ( $_POST['cc_Email'] != '' ) { + $indiCC = explode(" ", $_POST['cc_Email']); + foreach ($indiCC as $key => $value) { +echo '$mail->AddCC(\'' . $value . '\');
'; + } +} +?> + +$mail->Subject = (PHPMailer test using ) + +require_once('../class.html2text.inc.php'); +$h2t =& new html2text($body); +$mail->AltBody = $h2t->get_text(); +$mail->WordWrap = 80; // set word wrap + +$mail->MsgHTML($body); + +$mail->AddAttachment("images/aikido.gif", "aikido.gif"); // optional name +$mail->AddAttachment("images/phpmailer.gif", "phpmailer.gif"); // optional name + +try { + if ( !$mail->Send() ) { + $error = "Unable to send to: " . $to . "
"; + throw new phpmailerAppException($error); + } else { + echo 'Message has been sent using
'; + } +} catch (phpmailerAppException $e) { + $errorMsg[] = $e->errorMessage(); +} + +if ( count($errorMsg) > 0 ) { + foreach ($errorMsg as $key => $value) { + $thisError = $key + 1; + echo $thisError . ': ' . $value; + } +} +
clipboardSwf
is configured.
- */
- copyToClipboard : function(highlighter)
- {
- var flashDiv, flashSwf,
- highlighterId = highlighter.id
- ;
-
- this.create = function()
- {
- var config = sh.config;
-
- // disable functionality if running locally
- if (config.clipboardSwf == null)
- return null;
-
- function params(list)
- {
- var result = '';
-
- for (var name in list)
- result += "";
-
- return result;
- };
-
- function attributes(list)
- {
- var result = '';
-
- for (var name in list)
- result += " " + name + "='" + list[name] + "'";
-
- return result;
- };
-
- var args1 = {
- width : config.toolbarItemWidth,
- height : config.toolbarItemHeight,
- id : highlighterId + '_clipboard',
- type : 'application/x-shockwave-flash',
- title : sh.config.strings.copyToClipboard
- },
-
- // these arguments are used in IE's collection
- args2 = {
- allowScriptAccess : 'always',
- wmode : 'transparent',
- flashVars : 'highlighterId=' + highlighterId,
- menu : 'false'
- },
- swf = config.clipboardSwf,
- html
- ;
-
- if (/msie/i.test(navigator.userAgent))
- {
- html = ''
- ;
- }
- else
- {
- html = ''
- ;
- }
-
- flashDiv = document.createElement('div');
- flashDiv.innerHTML = html;
-
- return flashDiv;
- };
-
- this.execute = function(sender, event, args)
- {
- var command = args.command;
-
- switch (command)
- {
- case 'get':
- var code = sh.utils.unindent(
- sh.utils.fixForBlogger(highlighter.originalCode)
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/&/g, '&')
- );
-
- if(window.clipboardData)
- // will fall through to the confirmation because there isn't a break
- window.clipboardData.setData('text', code);
- else
- return sh.utils.unindent(code);
-
- case 'ok':
- sh.utils.alert(sh.config.strings.copyToClipboardConfirmation);
- break;
-
- case 'error':
- sh.utils.alert(args.message);
- break;
- }
- };
- },
-
- /** Command to print the colored source code. */
- printSource : function(highlighter)
- {
- this.create = function()
- {
- return sh.config.strings.print;
- };
-
- this.execute = function(sender, event, args)
- {
- var iframe = document.createElement('IFRAME'),
- doc = null
- ;
-
- // make sure there is never more than one hidden iframe created by SH
- if (sh.vars.printFrame != null)
- document.body.removeChild(sh.vars.printFrame);
-
- sh.vars.printFrame = iframe;
-
- // 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;
-
- copyStyles(doc, window.document);
- doc.write('
tag with given style applied to it.
- *
- * @param {String} str Input string.
- * @param {String} css Style name to apply to the string.
- * @return {String} Returns input string with each line surrounded by tag.
- */
- decorate: function(str, css)
- {
- if (str == null || str.length == 0 || str == '\n')
- return str;
-
- str = str.replace(/... to them so that
- // leading spaces aren't included.
- if (css != null)
- str = sh.utils.eachLine(str, function(line)
- {
- if (line.length == 0)
- return '';
-
- var spaces = '';
-
- line = line.replace(/^( | )+/, function(s)
- {
- spaces = s;
- return '';
- });
-
- if (line.length == 0)
- return spaces;
-
- return spaces + '' + line + '
';
- });
-
- return str;
- },
-
- /**
- * Pads number with zeros until it's length is the same as given length.
- *
- * @param {Number} number Number to pad.
- * @param {Number} length Max string length with.
- * @return {String} Returns a string padded with proper amount of '0'.
- */
- padNumber : function(number, length)
- {
- var result = number.toString();
-
- while (result.length < length)
- result = '0' + result;
-
- return result;
- },
-
- /**
- * Measures width of a single space character.
- * @return {Number} Returns width of a single space character.
- */
- measureSpace : function()
- {
- var container = document.createElement('div'),
- span,
- result = 0,
- body = document.body,
- id = sh.utils.guid('measureSpace'),
-
- // variable names will be compressed, so it's better than a plain string
- divOpen = 'regexList
collection.
- * @return {Array} Returns a list of Match objects.
- */
- getMatches: function(code, regexInfo)
- {
- function defaultAdd(match, regexInfo)
- {
- return [new sh.Match(match[0], match.index, regexInfo.css)];
- };
-
- var index = 0,
- match = null,
- result = [],
- func = regexInfo.func ? regexInfo.func : defaultAdd
- ;
-
- while((match = regexInfo.regex.exec(code)) != null)
- result = result.concat(func(match, regexInfo));
-
- return result;
- },
-
- processUrls: function(code)
- {
- return code.replace(sh.regexLib.url, function(m)
- {
- return '' + m + '';
- });
- }
- }, // end of utils
-
- /**
- * Shorthand to highlight all elements on the page that are marked as
- * SyntaxHighlighter source code.
- *
- * @param {Object} globalParams Optional parameters which override element's
- * parameters. Only used if element is specified.
- *
- * @param {Object} element Optional element to highlight. If none is
- * provided, all elements in the current document
- * are highlighted.
- */
- highlight : function(globalParams, element)
- {
- function toArray(source)
- {
- var result = [];
-
- for (var i = 0; i < source.length; i++)
- result.push(source[i]);
-
- return result;
- };
-
- var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)),
- propertyName = 'innerHTML',
- highlighter = null
- ;
-
- if (elements.length === 0)
- return;
-
- for (var i = 0; i < elements.length; i++)
- {
- var target = elements[i],
- params = sh.utils.parseParams(target.className),
- brushName
- ;
-
- // local params take precedence over globals
- params = sh.utils.merge(globalParams, params);
- brushName = params['brush'];
-
- if (brushName == null)
- continue;
-
- // Instantiate a brush
- if (params['html-script'] == 'true')
- {
- highlighter = new sh.HtmlScript(brushName);
- }
- else
- {
- var brush = sh.utils.findBrush(brushName);
-
- if (brush)
- highlighter = new brush();
- else
- continue;
- }
-
- highlighter.highlight(target[propertyName], params);
-
- var result = highlighter.div;
-
- if (sh.config.debug)
- {
- result = document.createElement('textarea');
- result.value = highlighter.div.innerHTML;
- result.style.width = '70em';
- result.style.height = '30em';
- }
-
- target.parentNode.replaceChild(result, target);
- }
- },
-
- /**
- * Main entry point for the SyntaxHighlighter.
- * @param {Object} params Optional params to apply to all highlighted elements.
- */
- all : function(params)
- {
- sh.utils.addEvent(
- window,
- 'load',
- function() { sh.highlight(params); }
- );
- }
-}; // end of sh
-
-/** Match object */
-sh.Match = function(value, index, css)
-{
- this.value = value;
- this.index = index;
- this.length = value.length;
- this.css = css;
-};
-
-sh.Match.prototype.toString = function()
-{
- return this.value;
-};
-
-/**
- * Simulates HTML code with a scripting language embedded.
- *
- * @param {String} scriptBrushName Brush name of the scripting language.
- */
-sh.HtmlScript = function(scriptBrushName)
-{
- var scriptBrush = sh.utils.findBrush(scriptBrushName),
- xmlBrush = new sh.brushes.Xml(),
- bracketsRegex = null
- ;
-
- if (scriptBrush == null)
- return;
-
- scriptBrush = new scriptBrush();
- this.xmlBrush = xmlBrush;
-
- if (scriptBrush.htmlScript == null)
- {
- sh.utils.alert(sh.config.strings.brushNotHtmlScript + scriptBrushName);
- return;
- }
-
- xmlBrush.regexList.push(
- { regex: scriptBrush.htmlScript.code, func: process }
- );
-
- function offsetMatches(matches, offset)
- {
- for (var j = 0; j < matches.length; j++)
- matches[j].index += offset;
- }
-
- function process(match, info)
- {
- var code = match.code,
- matches = [],
- regexList = scriptBrush.regexList,
- offset = match.index + match.left.length,
- htmlScript = scriptBrush.htmlScript,
- result
- ;
-
- for (var i = 0; i < regexList.length; i++)
- {
- result = sh.utils.getMatches(code, regexList[i]);
- offsetMatches(result, offset);
- matches = matches.concat(result);
- }
-
- if (htmlScript.left != null && match.left != null)
- {
- result = sh.utils.getMatches(match.left, htmlScript.left);
- offsetMatches(result, match.index);
- matches = matches.concat(result);
- }
-
- if (htmlScript.right != null && match.right != null)
- {
- result = sh.utils.getMatches(match.right, htmlScript.right);
- offsetMatches(result, match.index + match[0].lastIndexOf(match.right));
- matches = matches.concat(result);
- }
-
- return matches;
- }
-};
-
-sh.HtmlScript.prototype.highlight = function(code, params)
-{
- this.xmlBrush.highlight(code, params);
- this.div = this.xmlBrush.div;
-}
-
-/**
- * Main Highlither class.
- * @constructor
- */
-sh.Highlighter = function()
-{
-};
-
-sh.Highlighter.prototype = {
- /**
- * Returns value of the parameter passed to the highlighter.
- * @param {String} name Name of the parameter.
- * @param {Object} defaultValue Default value.
- * @return {Object} Returns found value or default value otherwise.
- */
- getParam : function(name, defaultValue)
- {
- var result = this.params[name];
- return sh.utils.toBoolean(result == null ? defaultValue : result);
- },
-
- /**
- * Shortcut to document.createElement().
- * @param {String} name Name of the element to create (DIV, A, etc).
- * @return {HTMLElement} Returns new HTML element.
- */
- create: function(name)
- {
- return document.createElement(name);
- },
-
- /**
- * Checks if one match is inside another.
- * @param {Match} match Match object to check.
- * @return {Boolean} Returns true if given match was inside another, false otherwise.
- */
- isMatchNested: function(match)
- {
- for (var i = 0; i < this.matches.length; i++)
- {
- var item = this.matches[i];
-
- if (item === null)
- continue;
-
- if ((match.index > item.index) && (match.index < item.index + item.length))
- return true;
- }
-
- return false;
- },
-
- /**
- * Applies all regular expression to the code and stores all found
- * matches in the `this.matches` array.
- * @param {Array} regexList List of regular expressions.
- * @param {String} code Source code.
- * @return {Array} Returns list of matches.
- */
- findMatches: function(regexList, code)
- {
- var result = [];
-
- if (regexList != null)
- for (var i = 0; i < regexList.length; i++)
- result = result.concat(sh.utils.getMatches(code, regexList[i]));
-
- // sort the matches
- result = result.sort(sh.utils.matchesSortCallback);
-
- return result;
- },
-
- /**
- * Checks to see if any of the matches are inside of other matches.
- * This process would get rid of highligted strings inside comments,
- * keywords inside strings and so on.
- */
- removeNestedMatches: function()
- {
- for (var i = 0; i < this.matches.length; i++)
- if (this.isMatchNested(this.matches[i]))
- this.matches[i] = null;
- },
-
- /**
- * Splits block of text into individual DIV lines.
- * @param {String} code Code to highlight.
- * @return {String} Returns highlighted code in HTML form.
- */
- createDisplayLines : function(code)
- {
- var lines = code.split(/\n/g),
- firstLine = parseInt(this.getParam('first-line')),
- padLength = (firstLine + lines.length).toString().length,
- highlightedLines = this.getParam('highlight', [])
- ;
-
- code = '';
-
- for (var i = 0; i < lines.length; i++)
- {
- var line = lines[i],
- indent = /^( |\s)+/.exec(line),
- lineClass = 'line alt' + (i % 2 == 0 ? 1 : 2),
- lineNumber = sh.utils.padNumber(firstLine + i, padLength),
- highlighted = highlightedLines.indexOf((firstLine + i).toString()) != -1,
- spaces = null
- ;
-
- if (indent != null)
- {
- spaces = indent[0].toString();
- line = line.substr(spaces.length);
- spaces = spaces.replace(/ /g, ' ');
- indent = sh.vars.spaceWidth * spaces.length;
- }
- else
- {
- indent = 0;
- }
-
- line = sh.utils.trim(line);
-
- if (line.length == 0)
- line = ' ';
-
- if (highlighted)
- lineClass += ' highlighted';
-
- code +=
- '' + lineNumber + '.
'
- + ''
- + (spaces != null ? '' + spaces.replace(/\s/g, ' ') + '
' : '')
- + '' + line + ''
- + ''
- + '.*?)" +
- "(?" + regexGroup.right.source + ")",
- "sgi"
- )
- };
- }
-}; // end of Highlighter
-
-return sh;
-}(); // end of anonymous function
-
-if (!Array.indexOf)
- /**
- * Finds an index of element in the array.
- * @ignore
- * @param {Object} searchElement
- * @param {Number} fromIndex
- * @return {Number} Returns index of element if found; -1 otherwise.
- */
- Array.prototype.indexOf = function (searchElement, fromIndex)
- {
- fromIndex = Math.max(fromIndex || 0, 0);
-
- for (var i = fromIndex; i < this.length; i++)
- if(this[i] == searchElement)
- return i;
-
- return -1;
- };
-
-/**
- * XRegExp 0.6.1
- * (c) 2007-2008 Steven Levithan
- *
- * MIT License
- *
- * provides an augmented, cross-browser implementation of regular expressions
- * including support for additional modifiers and syntax. several convenience
- * methods and a recursive-construct parser are also included.
- */
-
-// prevent running twice, which would break references to native globals
-if (!window.XRegExp) {
-// anonymous function to avoid global variables
-(function () {
-// copy various native globals for reference. can't use the name ``native``
-// because it's a reserved JavaScript keyword.
-var real = {
- exec: RegExp.prototype.exec,
- match: String.prototype.match,
- replace: String.prototype.replace,
- split: String.prototype.split
- },
- /* regex syntax parsing with support for all the necessary cross-
- browser and context issues (escapings, character classes, etc.) */
- lib = {
- part: /(?:[^\\([#\s.]+|\\(?!k<[\w$]+>|[pP]{[^}]+})[\S\s]?|\((?=\?(?!#|<[\w$]+>)))+|(\()(?:\?(?:(#)[^)]*\)|<([$\w]+)>))?|\\(?:k<([\w$]+)>|[pP]{([^}]+)})|(\[\^?)|([\S\s])/g,
- replaceVar: /(?:[^$]+|\$(?![1-9$&`']|{[$\w]+}))+|\$(?:([1-9]\d*|[$&`'])|{([$\w]+)})/g,
- extended: /^(?:\s+|#.*)+/,
- quantifier: /^(?:[?*+]|{\d+(?:,\d*)?})/,
- classLeft: /&&\[\^?/g,
- classRight: /]/g
- },
- indexOf = function (array, item, from) {
- for (var i = from || 0; i < array.length; i++)
- if (array[i] === item) return i;
- return -1;
- },
- brokenExecUndef = /()??/.exec("")[1] !== undefined,
- plugins = {};
-
-/**
- * Accepts a pattern and flags, returns a new, extended RegExp object.
- * differs from a native regex in that additional flags and syntax are
- * supported and browser inconsistencies are ameliorated.
- * @ignore
- */
-XRegExp = function (pattern, flags) {
- if (pattern instanceof RegExp) {
- if (flags !== undefined)
- throw TypeError("can't supply flags when constructing one RegExp from another");
- return pattern.addFlags(); // new copy
- }
-
- var flags = flags || "",
- singleline = flags.indexOf("s") > -1,
- extended = flags.indexOf("x") > -1,
- hasNamedCapture = false,
- captureNames = [],
- output = [],
- part = lib.part,
- match, cc, len, index, regex;
-
- part.lastIndex = 0; // in case the last XRegExp compilation threw an error (unbalanced character class)
-
- while (match = real.exec.call(part, pattern)) {
- // comment pattern. this check must come before the capturing group check,
- // because both match[1] and match[2] will be non-empty.
- if (match[2]) {
- // keep tokens separated unless the following token is a quantifier
- if (!lib.quantifier.test(pattern.slice(part.lastIndex)))
- output.push("(?:)");
- // capturing group
- } else if (match[1]) {
- captureNames.push(match[3] || null);
- if (match[3])
- hasNamedCapture = true;
- output.push("(");
- // named backreference
- } else if (match[4]) {
- index = indexOf(captureNames, match[4]);
- // keep backreferences separate from subsequent literal numbers
- // preserve backreferences to named groups that are undefined at this point as literal strings
- output.push(index > -1 ?
- "\\" + (index + 1) + (isNaN(pattern.charAt(part.lastIndex)) ? "" : "(?:)") :
- match[0]
- );
- // unicode element (requires plugin)
- } else if (match[5]) {
- output.push(plugins.unicode ?
- plugins.unicode.get(match[5], match[0].charAt(1) === "P") :
- match[0]
- );
- // character class opening delimiter ("[" or "[^")
- // (non-native unicode elements are not supported within character classes)
- } else if (match[6]) {
- if (pattern.charAt(part.lastIndex) === "]") {
- // for cross-browser compatibility with ECMA-262 v3 behavior,
- // convert [] to (?!) and [^] to [\S\s].
- output.push(match[6] === "[" ? "(?!)" : "[\\S\\s]");
- part.lastIndex++;
- } else {
- // parse the character class with support for inner escapes and
- // ES4's infinitely nesting intersection syntax ([&&[^&&[]]]).
- cc = XRegExp.matchRecursive("&&" + pattern.slice(match.index), lib.classLeft, lib.classRight, "", {escapeChar: "\\"})[0];
- output.push(match[6] + cc + "]");
- part.lastIndex += cc.length + 1;
- }
- // dot ("."), pound sign ("#"), or whitespace character
- } else if (match[7]) {
- if (singleline && match[7] === ".") {
- output.push("[\\S\\s]");
- } else if (extended && lib.extended.test(match[7])) {
- len = real.exec.call(lib.extended, pattern.slice(part.lastIndex - 1))[0].length;
- // keep tokens separated unless the following token is a quantifier
- if (!lib.quantifier.test(pattern.slice(part.lastIndex - 1 + len)))
- output.push("(?:)");
- part.lastIndex += len - 1;
- } else {
- output.push(match[7]);
- }
- } else {
- output.push(match[0]);
- }
- }
-
- regex = RegExp(output.join(""), real.replace.call(flags, /[sx]+/g, ""));
- regex._x = {
- source: pattern,
- captureNames: hasNamedCapture ? captureNames : null
- };
- return regex;
-};
-
-/**
- * Barebones plugin support for now (intentionally undocumented)
- * @ignore
- * @param {Object} name
- * @param {Object} o
- */
-XRegExp.addPlugin = function (name, o) {
- plugins[name] = o;
-};
-
-/**
- * Adds named capture support, with values returned as ``result.name``.
- *
- * Also fixes two cross-browser issues, following the ECMA-262 v3 spec:
- * - captured values for non-participating capturing groups should be returned
- * as ``undefined``, rather than the empty string.
- * - the regex's ``lastIndex`` should not be incremented after zero-length
- * matches.
- * @ignore
- */
-RegExp.prototype.exec = function (str) {
- var match = real.exec.call(this, str),
- name, i, r2;
- if (match) {
- // fix browsers whose exec methods don't consistently return
- // undefined for non-participating capturing groups
- if (brokenExecUndef && match.length > 1) {
- // r2 doesn't need /g or /y, but they shouldn't hurt
- r2 = new RegExp("^" + this.source + "$(?!\\s)", this.getNativeFlags());
- real.replace.call(match[0], r2, function () {
- for (i = 1; i < arguments.length - 2; i++) {
- if (arguments[i] === undefined) match[i] = undefined;
- }
- });
- }
- // attach named capture properties
- if (this._x && this._x.captureNames) {
- for (i = 1; i < match.length; i++) {
- name = this._x.captureNames[i - 1];
- if (name) match[name] = match[i];
- }
- }
- // fix browsers that increment lastIndex after zero-length matches
- if (this.global && this.lastIndex > (match.index + match[0].length))
- this.lastIndex--;
- }
- return match;
-};
-})(); // end anonymous function
-} // end if(!window.XRegExp)
-
-/**
- * intentionally undocumented
- * @ignore
- */
-RegExp.prototype.getNativeFlags = function () {
- return (this.global ? "g" : "") +
- (this.ignoreCase ? "i" : "") +
- (this.multiline ? "m" : "") +
- (this.extended ? "x" : "") +
- (this.sticky ? "y" : "");
-};
-
-/**
- * Accepts flags; returns a new XRegExp object generated by recompiling
- * the regex with the additional flags (may include non-native flags).
- * The original regex object is not altered.
- * @ignore
- */
-RegExp.prototype.addFlags = function (flags) {
- var regex = new XRegExp(this.source, (flags || "") + this.getNativeFlags());
- if (this._x) {
- regex._x = {
- source: this._x.source,
- captureNames: this._x.captureNames ? this._x.captureNames.slice(0) : null
- };
- }
- return regex;
-};
-
-/**
- * Accepts a context object and string; returns the result of calling
- * ``exec`` with the provided string. the context is ignored but is
- * accepted for congruity with ``Function.prototype.call``.
- * @ignore
- */
-RegExp.prototype.call = function (context, str) {
- return this.exec(str);
-};
-
-/**
- * Accepts a context object and arguments array; returns the result of
- * calling ``exec`` with the first value in the arguments array. the context
- * is ignored but is accepted for congruity with ``Function.prototype.apply``.
- * @ignore
- */
-RegExp.prototype.apply = function (context, args) {
- return this.exec(args[0]);
-};
-
-/**
- * Accepts a pattern and flags; returns an XRegExp object. if the pattern
- * and flag combination has previously been cached, the cached copy is
- * returned, otherwise the new object is cached.
- * @ignore
- */
-XRegExp.cache = function (pattern, flags) {
- var key = "/" + pattern + "/" + (flags || "");
- return XRegExp.cache[key] || (XRegExp.cache[key] = new XRegExp(pattern, flags));
-};
-
-/**
- * Accepts a string; returns the string with regex metacharacters escaped.
- * the returned string can safely be used within a regex to match a literal
- * string. escaped characters are [, ], {, }, (, ), -, *, +, ?, ., \, ^, $,
- * |, #, [comma], and whitespace.
- * @ignore
- */
-XRegExp.escape = function (str) {
- return str.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&");
-};
-
-/**
- * Accepts a string to search, left and right delimiters as regex pattern
- * strings, optional regex flags (may include non-native s, x, and y flags),
- * and an options object which allows setting an escape character and changing
- * the return format from an array of matches to a two-dimensional array of
- * string parts with extended position data. returns an array of matches
- * (optionally with extended data), allowing nested instances of left and right
- * delimiters. use the g flag to return all matches, otherwise only the first
- * is returned. if delimiters are unbalanced within the subject data, an error
- * is thrown.
- *
- * This function admittedly pushes the boundaries of what can be accomplished
- * sensibly without a "real" parser. however, by doing so it provides flexible
- * and powerful recursive parsing capabilities with minimal code weight.
- *
- * Warning: the ``escapeChar`` option is considered experimental and might be
- * changed or removed in future versions of XRegExp.
- *
- * unsupported features:
- * - backreferences within delimiter patterns when using ``escapeChar``.
- * - although providing delimiters as regex objects adds the minor feature of
- * independent delimiter flags, it introduces other limitations and is only
- * intended to be done by the ``XRegExp`` constructor (which can't call
- * itself while building a regex).
- *
- * @ignore
- */
-XRegExp.matchRecursive = function (str, left, right, flags, options) {
- var options = options || {},
- escapeChar = options.escapeChar,
- vN = options.valueNames,
- flags = flags || "",
- global = flags.indexOf("g") > -1,
- ignoreCase = flags.indexOf("i") > -1,
- multiline = flags.indexOf("m") > -1,
- sticky = flags.indexOf("y") > -1,
- /* sticky mode has its own handling in this function, which means you
- can use flag "y" even in browsers which don't support it natively */
- flags = flags.replace(/y/g, ""),
- left = left instanceof RegExp ? (left.global ? left : left.addFlags("g")) : new XRegExp(left, "g" + flags),
- right = right instanceof RegExp ? (right.global ? right : right.addFlags("g")) : new XRegExp(right, "g" + flags),
- output = [],
- openTokens = 0,
- delimStart = 0,
- delimEnd = 0,
- lastOuterEnd = 0,
- outerStart, innerStart, leftMatch, rightMatch, escaped, esc;
-
- if (escapeChar) {
- if (escapeChar.length > 1) throw SyntaxError("can't supply more than one escape character");
- if (multiline) throw TypeError("can't supply escape character when using the multiline flag");
- escaped = XRegExp.escape(escapeChar);
- /* Escape pattern modifiers:
- /g - not needed here
- /i - included
- /m - **unsupported**, throws error
- /s - handled by XRegExp when delimiters are provided as strings
- /x - handled by XRegExp when delimiters are provided as strings
- /y - not needed here; supported by other handling in this function
- */
- esc = new RegExp(
- "^(?:" + escaped + "[\\S\\s]|(?:(?!" + left.source + "|" + right.source + ")[^" + escaped + "])+)+",
- ignoreCase ? "i" : ""
- );
- }
-
- while (true) {
- /* advance the starting search position to the end of the last delimiter match.
- a couple special cases are also covered:
- - if using an escape character, advance to the next delimiter's starting position,
- skipping any escaped characters
- - first time through, reset lastIndex in case delimiters were provided as regexes
- */
- left.lastIndex = right.lastIndex = delimEnd +
- (escapeChar ? (esc.exec(str.slice(delimEnd)) || [""])[0].length : 0);
-
- leftMatch = left.exec(str);
- rightMatch = right.exec(str);
-
- // only keep the result which matched earlier in the string
- if (leftMatch && rightMatch) {
- if (leftMatch.index <= rightMatch.index)
- rightMatch = null;
- else leftMatch = null;
- }
-
- /* paths*:
- leftMatch | rightMatch | openTokens | result
- 1 | 0 | 1 | ...
- 1 | 0 | 0 | ...
- 0 | 1 | 1 | ...
- 0 | 1 | 0 | throw
- 0 | 0 | 1 | throw
- 0 | 0 | 0 | break
- * - does not include the sticky mode special case
- - the loop ends after the first completed match if not in global mode
- */
-
- if (leftMatch || rightMatch) {
- delimStart = (leftMatch || rightMatch).index;
- delimEnd = (leftMatch ? left : right).lastIndex;
- } else if (!openTokens) {
- break;
- }
-
- if (sticky && !openTokens && delimStart > lastOuterEnd)
- break;
-
- if (leftMatch) {
- if (!openTokens++) {
- outerStart = delimStart;
- innerStart = delimEnd;
- }
- } else if (rightMatch && openTokens) {
- if (!--openTokens) {
- if (vN) {
- if (vN[0] && outerStart > lastOuterEnd)
- output.push([vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart]);
- if (vN[1]) output.push([vN[1], str.slice(outerStart, innerStart), outerStart, innerStart]);
- if (vN[2]) output.push([vN[2], str.slice(innerStart, delimStart), innerStart, delimStart]);
- if (vN[3]) output.push([vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd]);
- } else {
- output.push(str.slice(innerStart, delimStart));
- }
- lastOuterEnd = delimEnd;
- if (!global)
- break;
- }
- } else {
- // reset lastIndex in case delimiters were provided as regexes
- left.lastIndex = right.lastIndex = 0;
- throw Error("subject data contains unbalanced delimiters");
- }
-
- // if the delimiter matched an empty string, advance delimEnd to avoid an infinite loop
- if (delimStart === delimEnd)
- delimEnd++;
- }
-
- if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd)
- output.push([vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length]);
-
- // reset lastIndex in case delimiters were provided as regexes
- left.lastIndex = right.lastIndex = 0;
-
- return output;
-};
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+//
+// Begin anonymous function. This is used to contain local scope variables without polutting global scope.
+//
+if (!window.SyntaxHighlighter) var SyntaxHighlighter = function() {
+
+// Shortcut object which will be assigned to the SyntaxHighlighter variable.
+// This is a shorthand for local reference in order to avoid long namespace
+// references to SyntaxHighlighter.whatever...
+var sh = {
+ defaults : {
+ /** Additional CSS class names to be added to highlighter elements. */
+ 'class-name' : '',
+
+ /** First line number. */
+ 'first-line' : 1,
+
+ /** Font size of the SyntaxHighlighter block. */
+ 'font-size' : null,
+
+ /** Lines to highlight. */
+ 'highlight' : null,
+
+ /** Enables or disables smart tabs. */
+ 'smart-tabs' : true,
+
+ /** Gets or sets tab size. */
+ 'tab-size' : 4,
+
+ /** Enables or disables ruler. */
+ 'ruler' : false,
+
+ /** Enables or disables gutter. */
+ 'gutter' : true,
+
+ /** Enables or disables toolbar. */
+ 'toolbar' : true,
+
+ /** Forces code view to be collapsed. */
+ 'collapse' : false,
+
+ /** Enables or disables automatic links. */
+ 'auto-links' : true,
+
+ /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */
+ 'light' : false
+ },
+
+ config : {
+ /** Path to the copy to clipboard SWF file. */
+ clipboardSwf : null,
+
+ /** Width of an item in the toolbar. */
+ toolbarItemWidth : 16,
+
+ /** Height of an item in the toolbar. */
+ toolbarItemHeight : 16,
+
+ /** Blogger mode flag. */
+ bloggerMode : false,
+
+ /** Name of the tag that SyntaxHighlighter will automatically look for. */
+ tagName : 'pre',
+
+ strings : {
+ expandSource : 'expand source',
+ viewSource : 'view source',
+ copyToClipboard : 'copy to clipboard',
+ copyToClipboardConfirmation : 'The code is in your clipboard now',
+ print : 'print',
+ help : '?',
+ alert: 'SyntaxHighlighter\n\n',
+ noBrush : 'Can\'t find brush for: ',
+ brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
+
+ // this is populated by the build script
+ aboutDialog : 'About SyntaxHighlighter SyntaxHighlighterversion 2.0.296 (March 01 2009)JavaScript code syntax highlighter.Copyright 2004-2009 Alex Gorbatchev.'
+ },
+
+ /** If true, output will show HTML produces instead. */
+ debug : false
+ },
+
+ /** Internal 'global' variables. */
+ vars : {
+ discoveredBrushes : null,
+ spaceWidth : null,
+ printFrame : null,
+ highlighters : {}
+ },
+
+ /** This object is populated by user included external brush files. */
+ brushes : {},
+
+ /** Common regular expressions. */
+ regexLib : {
+ multiLineCComments : /\/\*[\s\S]*?\*\//gm,
+ singleLineCComments : /\/\/.*$/gm,
+ singleLinePerlComments : /#.*$/gm,
+ doubleQuotedString : /"(?:\.|(\\\")|[^\""\n])*"/g,
+ singleQuotedString : /'(?:\.|(\\\')|[^\''\n])*'/g,
+ multiLineDoubleQuotedString : /"(?:\.|(\\\")|[^\""])*"/g,
+ multiLineSingleQuotedString : /'(?:\.|(\\\')|[^\''])*'/g,
+ url : /\w+:\/\/[\w-.\/?%&=]*/g,
+
+ /** = ?> tags. */
+ phpScriptTags : { left: /(<|<)\?=?/g, right: /\?(>|>)/g },
+
+ /** <%= %> tags. */
+ aspScriptTags : { left: /(<|<)%=?/g, right: /%(>|>)/g },
+
+ /** tags. */
+ scriptScriptTags : { left: /(<|<)\s*script.*?(>|>)/gi, right: /(<|<)\/\s*script\s*(>|>)/gi }
+ },
+
+ toolbar : {
+ /**
+ * Creates new toolbar for a highlighter.
+ * @param {Highlighter} highlighter Target highlighter.
+ */
+ create : function(highlighter)
+ {
+ var div = document.createElement('DIV'),
+ items = sh.toolbar.items
+ ;
+
+ div.className = 'toolbar';
+
+ for (var name in items)
+ {
+ var constructor = items[name],
+ command = new constructor(highlighter),
+ element = command.create()
+ ;
+
+ highlighter.toolbarCommands[name] = command;
+
+ if (element == null)
+ continue;
+
+ if (typeof(element) == 'string')
+ element = sh.toolbar.createButton(element, highlighter.id, name);
+
+ element.className += 'item ' + name;
+ div.appendChild(element);
+ }
+
+ return div;
+ },
+
+ /**
+ * Create a standard anchor button for the toolbar.
+ * @param {String} label Label text to display.
+ * @param {String} highlighterId Highlighter ID that this button would belong to.
+ * @param {String} commandName Command name that would be executed.
+ * @return {Element} Returns an 'A' element.
+ */
+ createButton : function(label, highlighterId, commandName)
+ {
+ var a = document.createElement('a'),
+ style = a.style,
+ config = sh.config,
+ width = config.toolbarItemWidth,
+ height = config.toolbarItemHeight
+ ;
+
+ a.href = '#' + commandName;
+ a.title = label;
+ a.highlighterId = highlighterId;
+ a.commandName = commandName;
+ a.innerHTML = label;
+
+ if (isNaN(width) == false)
+ style.width = width + 'px';
+
+ if (isNaN(height) == false)
+ style.height = height + 'px';
+
+ a.onclick = function(e)
+ {
+ try
+ {
+ sh.toolbar.executeCommand(
+ this,
+ e || window.event,
+ this.highlighterId,
+ this.commandName
+ );
+ }
+ catch(e)
+ {
+ sh.utils.alert(e.message);
+ }
+
+ return false;
+ };
+
+ return a;
+ },
+
+ /**
+ * Executes a toolbar command.
+ * @param {Element} sender Sender element.
+ * @param {MouseEvent} event Original mouse event object.
+ * @param {String} highlighterId Highlighter DIV element ID.
+ * @param {String} commandName Name of the command to execute.
+ * @return {Object} Passes out return value from command execution.
+ */
+ executeCommand : function(sender, event, highlighterId, commandName, args)
+ {
+ var highlighter = sh.vars.highlighters[highlighterId],
+ command
+ ;
+
+ if (highlighter == null || (command = highlighter.toolbarCommands[commandName]) == null)
+ return null;
+
+ return command.execute(sender, event, args);
+ },
+
+ /** Collection of toolbar items. */
+ items : {
+ expandSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ if (highlighter.getParam('collapse') != true)
+ return;
+
+ return sh.config.strings.expandSource;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var div = highlighter.div;
+
+ sender.parentNode.removeChild(sender);
+ div.className = div.className.replace('collapsed', '');
+ };
+ },
+
+ /**
+ * Command to open a new window and display the original unformatted source code inside.
+ */
+ viewSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.viewSource;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var code = sh.utils.fixForBlogger(highlighter.originalCode).replace(/' + code + '');
+ wnd.document.close();
+ };
+ },
+
+ /**
+ * Command to copy the original source code in to the clipboard.
+ * Uses Flash method if clipboardSwf
is configured.
+ */
+ copyToClipboard : function(highlighter)
+ {
+ var flashDiv, flashSwf,
+ highlighterId = highlighter.id
+ ;
+
+ this.create = function()
+ {
+ var config = sh.config;
+
+ // disable functionality if running locally
+ if (config.clipboardSwf == null)
+ return null;
+
+ function params(list)
+ {
+ var result = '';
+
+ for (var name in list)
+ result += "";
+
+ return result;
+ };
+
+ function attributes(list)
+ {
+ var result = '';
+
+ for (var name in list)
+ result += " " + name + "='" + list[name] + "'";
+
+ return result;
+ };
+
+ var args1 = {
+ width : config.toolbarItemWidth,
+ height : config.toolbarItemHeight,
+ id : highlighterId + '_clipboard',
+ type : 'application/x-shockwave-flash',
+ title : sh.config.strings.copyToClipboard
+ },
+
+ // these arguments are used in IE's collection
+ args2 = {
+ allowScriptAccess : 'always',
+ wmode : 'transparent',
+ flashVars : 'highlighterId=' + highlighterId,
+ menu : 'false'
+ },
+ swf = config.clipboardSwf,
+ html
+ ;
+
+ if (/msie/i.test(navigator.userAgent))
+ {
+ html = ''
+ ;
+ }
+ else
+ {
+ html = ''
+ ;
+ }
+
+ flashDiv = document.createElement('div');
+ flashDiv.innerHTML = html;
+
+ return flashDiv;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var command = args.command;
+
+ switch (command)
+ {
+ case 'get':
+ var code = sh.utils.unindent(
+ sh.utils.fixForBlogger(highlighter.originalCode)
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+ .replace(/&/g, '&')
+ );
+
+ if(window.clipboardData)
+ // will fall through to the confirmation because there isn't a break
+ window.clipboardData.setData('text', code);
+ else
+ return sh.utils.unindent(code);
+
+ case 'ok':
+ sh.utils.alert(sh.config.strings.copyToClipboardConfirmation);
+ break;
+
+ case 'error':
+ sh.utils.alert(args.message);
+ break;
+ }
+ };
+ },
+
+ /** Command to print the colored source code. */
+ printSource : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.print;
+ };
+
+ this.execute = function(sender, event, args)
+ {
+ var iframe = document.createElement('IFRAME'),
+ doc = null
+ ;
+
+ // make sure there is never more than one hidden iframe created by SH
+ if (sh.vars.printFrame != null)
+ document.body.removeChild(sh.vars.printFrame);
+
+ sh.vars.printFrame = iframe;
+
+ // 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;
+
+ copyStyles(doc, window.document);
+ doc.write('' + highlighter.div.innerHTML + '');
+ doc.close();
+
+ iframe.contentWindow.focus();
+ iframe.contentWindow.print();
+
+ function copyStyles(destDoc, sourceDoc)
+ {
+ var links = sourceDoc.getElementsByTagName('link');
+
+ for(var i = 0; i < links.length; i++)
+ if(links[i].rel.toLowerCase() == 'stylesheet' && /shCore\.css$/.test(links[i].href))
+ destDoc.write('');
+ };
+ };
+ },
+
+ /** Command to display the about dialog window. */
+ about : function(highlighter)
+ {
+ this.create = function()
+ {
+ return sh.config.strings.help;
+ };
+
+ this.execute = function(sender, event)
+ {
+ var wnd = sh.utils.popup('', '_blank', 500, 250, 'scrollbars=0'),
+ doc = wnd.document
+ ;
+
+ doc.write(sh.config.strings.aboutDialog);
+ doc.close();
+ wnd.focus();
+ };
+ }
+ }
+ },
+
+ utils : {
+ guid : function(prefix)
+ {
+ return prefix + Math.round(Math.random() * 1000000).toString();
+ },
+
+ /**
+ * Merges two objects. Values from obj2 override values in obj1.
+ * Function is NOT recursive and works only for one dimensional objects.
+ * @param {Object} obj1 First object.
+ * @param {Object} obj2 Second object.
+ * @return {Object} Returns combination of both objects.
+ */
+ merge: function(obj1, obj2)
+ {
+ var result = {}, name;
+
+ for (name in obj1)
+ result[name] = obj1[name];
+
+ for (name in obj2)
+ result[name] = obj2[name];
+
+ return result;
+ },
+
+ /**
+ * Attempts to convert string to boolean.
+ * @param {String} value Input string.
+ * @return {Boolean} Returns true if input was "true", false if input was "false" and value otherwise.
+ */
+ toBoolean: function(value)
+ {
+ switch (value)
+ {
+ case "true":
+ return true;
+
+ case "false":
+ return false;
+ }
+
+ return value;
+ },
+
+ /**
+ * Opens up a centered popup window.
+ * @param {String} url URL to open in the window.
+ * @param {String} name Popup name.
+ * @param {int} width Popup width.
+ * @param {int} height Popup height.
+ * @param {String} options window.open() options.
+ * @return {Window} Returns window instance.
+ */
+ popup: function(url, name, width, height, options)
+ {
+ var x = (screen.width - width) / 2,
+ y = (screen.height - height) / 2
+ ;
+
+ options += ', left=' + x +
+ ', top=' + y +
+ ', width=' + width +
+ ', height=' + height
+ ;
+ options = options.replace(/^,/, '');
+
+ var win = window.open(url, name, options);
+ win.focus();
+ return win;
+ },
+
+ /**
+ * Adds event handler to the target object.
+ * @param {Object} obj Target object.
+ * @param {String} type Name of the event.
+ * @param {Function} func Handling function.
+ */
+ addEvent: function(obj, type, func)
+ {
+ if (obj.attachEvent)
+ {
+ obj['e' + type + func] = func;
+ obj[type + func] = function()
+ {
+ obj['e' + type + func](window.event);
+ }
+ obj.attachEvent('on' + type, obj[type + func]);
+ }
+ else
+ {
+ obj.addEventListener(type, func, false);
+ }
+ },
+
+ /**
+ * Displays an alert.
+ * @param {String} str String to display.
+ */
+ alert: function(str)
+ {
+ alert(sh.config.strings.alert + str)
+ },
+
+ /**
+ * Finds a brush by its alias.
+ *
+ * @param {String} alias Brush alias.
+ * @param {Boolean} alert Suppresses the alert if false.
+ * @return {Brush} Returns bursh constructor if found, null otherwise.
+ */
+ findBrush: function(alias, alert)
+ {
+ var brushes = sh.vars.discoveredBrushes,
+ result = null
+ ;
+
+ if (brushes == null)
+ {
+ brushes = {};
+
+ // Find all brushes
+ for (var brush in sh.brushes)
+ {
+ var aliases = sh.brushes[brush].aliases;
+
+ if (aliases == null)
+ continue;
+
+ for (var i = 0; i < aliases.length; i++)
+ brushes[aliases[i]] = brush;
+ }
+
+ sh.vars.discoveredBrushes = brushes;
+ }
+
+ result = sh.brushes[brushes[alias]];
+
+ if (result == null && alert != false)
+ sh.utils.alert(sh.config.strings.noBrush + alias);
+
+ return result;
+ },
+
+ /**
+ * Executes a callback on each line and replaces each line with result from the callback.
+ * @param {Object} str Input string.
+ * @param {Object} callback Callback function taking one string argument and returning a string.
+ */
+ eachLine: function(str, callback)
+ {
+ var lines = str.split('\n');
+
+ for (var i = 0; i < lines.length; i++)
+ lines[i] = callback(lines[i]);
+
+ return lines.join('\n');
+ },
+
+ /**
+ * Creates rules looking div.
+ */
+ createRuler: function()
+ {
+ var div = document.createElement('div'),
+ ruler = document.createElement('div'),
+ showEvery = 10,
+ i = 1
+ ;
+
+ while (i <= 150)
+ {
+ if (i % showEvery === 0)
+ {
+ div.innerHTML += i;
+ i += (i + '').length;
+ }
+ else
+ {
+ div.innerHTML += '·';
+ i++;
+ }
+ }
+
+ ruler.className = 'ruler line';
+ ruler.appendChild(div);
+
+ return ruler;
+ },
+
+ /**
+ * This is a special trim which only removes first and last empty lines
+ * and doesn't affect valid leading space on the first line.
+ *
+ * @param {String} str Input string
+ * @return {String} Returns string without empty first and last lines.
+ */
+ trimFirstAndLastLines: function(str)
+ {
+ return str.replace(/^[ ]*[\n]+|[\n]*[ ]*$/g, '');
+ },
+
+ /**
+ * Parses key/value pairs into hash object.
+ *
+ * Understands the following formats:
+ * - name: word;
+ * - name: [word, word];
+ * - name: "string";
+ * - name: 'string';
+ *
+ * For example:
+ * name1: value; name2: [value, value]; name3: 'value'
+ *
+ * @param {String} str Input string.
+ * @return {Object} Returns deserialized object.
+ */
+ parseParams: function(str)
+ {
+ var match,
+ result = {},
+ arrayRegex = new XRegExp("^\\[(?(.*?))\\]$"),
+ regex = new XRegExp(
+ "(?[\\w-]+)" +
+ "\\s*:\\s*" +
+ "(?" +
+ "[\\w-%#]+|" + // word
+ "\\[.*?\\]|" + // [] array
+ '".*?"|' + // "" string
+ "'.*?'" + // '' string
+ ")\\s*;?",
+ "g"
+ )
+ ;
+
+ while ((match = regex.exec(str)) != null)
+ {
+ var value = match.value
+ .replace(/^['"]|['"]$/g, '') // strip quotes from end of strings
+ ;
+
+ // try to parse array value
+ if (value != null && arrayRegex.test(value))
+ {
+ var m = arrayRegex.exec(value);
+ value = m.values.length > 0 ? m.values.split(/\s*,\s*/) : [];
+ }
+
+ result[match.name] = value;
+ }
+
+ return result;
+ },
+
+ /**
+ * Wraps each line of the string into
tag with given style applied to it.
+ *
+ * @param {String} str Input string.
+ * @param {String} css Style name to apply to the string.
+ * @return {String} Returns input string with each line surrounded by tag.
+ */
+ decorate: function(str, css)
+ {
+ if (str == null || str.length == 0 || str == '\n')
+ return str;
+
+ str = str.replace(/...
' + line + '
';
+ });
+
+ return str;
+ },
+
+ /**
+ * Pads number with zeros until it's length is the same as given length.
+ *
+ * @param {Number} number Number to pad.
+ * @param {Number} length Max string length with.
+ * @return {String} Returns a string padded with proper amount of '0'.
+ */
+ padNumber : function(number, length)
+ {
+ var result = number.toString();
+
+ while (result.length < length)
+ result = '0' + result;
+
+ return result;
+ },
+
+ /**
+ * Measures width of a single space character.
+ * @return {Number} Returns width of a single space character.
+ */
+ measureSpace : function()
+ {
+ var container = document.createElement('div'),
+ span,
+ result = 0,
+ body = document.body,
+ id = sh.utils.guid('measureSpace'),
+
+ // variable names will be compressed, so it's better than a plain string
+ divOpen = 'regexList
collection.
+ * @return {Array} Returns a list of Match objects.
+ */
+ getMatches: function(code, regexInfo)
+ {
+ function defaultAdd(match, regexInfo)
+ {
+ return [new sh.Match(match[0], match.index, regexInfo.css)];
+ };
+
+ var index = 0,
+ match = null,
+ result = [],
+ func = regexInfo.func ? regexInfo.func : defaultAdd
+ ;
+
+ while((match = regexInfo.regex.exec(code)) != null)
+ result = result.concat(func(match, regexInfo));
+
+ return result;
+ },
+
+ processUrls: function(code)
+ {
+ return code.replace(sh.regexLib.url, function(m)
+ {
+ return '' + m + '';
+ });
+ }
+ }, // end of utils
+
+ /**
+ * Shorthand to highlight all elements on the page that are marked as
+ * SyntaxHighlighter source code.
+ *
+ * @param {Object} globalParams Optional parameters which override element's
+ * parameters. Only used if element is specified.
+ *
+ * @param {Object} element Optional element to highlight. If none is
+ * provided, all elements in the current document
+ * are highlighted.
+ */
+ highlight : function(globalParams, element)
+ {
+ function toArray(source)
+ {
+ var result = [];
+
+ for (var i = 0; i < source.length; i++)
+ result.push(source[i]);
+
+ return result;
+ };
+
+ var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)),
+ propertyName = 'innerHTML',
+ highlighter = null
+ ;
+
+ if (elements.length === 0)
+ return;
+
+ for (var i = 0; i < elements.length; i++)
+ {
+ var target = elements[i],
+ params = sh.utils.parseParams(target.className),
+ brushName
+ ;
+
+ // local params take precedence over globals
+ params = sh.utils.merge(globalParams, params);
+ brushName = params['brush'];
+
+ if (brushName == null)
+ continue;
+
+ // Instantiate a brush
+ if (params['html-script'] == 'true')
+ {
+ highlighter = new sh.HtmlScript(brushName);
+ }
+ else
+ {
+ var brush = sh.utils.findBrush(brushName);
+
+ if (brush)
+ highlighter = new brush();
+ else
+ continue;
+ }
+
+ highlighter.highlight(target[propertyName], params);
+
+ var result = highlighter.div;
+
+ if (sh.config.debug)
+ {
+ result = document.createElement('textarea');
+ result.value = highlighter.div.innerHTML;
+ result.style.width = '70em';
+ result.style.height = '30em';
+ }
+
+ target.parentNode.replaceChild(result, target);
+ }
+ },
+
+ /**
+ * Main entry point for the SyntaxHighlighter.
+ * @param {Object} params Optional params to apply to all highlighted elements.
+ */
+ all : function(params)
+ {
+ sh.utils.addEvent(
+ window,
+ 'load',
+ function() { sh.highlight(params); }
+ );
+ }
+}; // end of sh
+
+/** Match object */
+sh.Match = function(value, index, css)
+{
+ this.value = value;
+ this.index = index;
+ this.length = value.length;
+ this.css = css;
+};
+
+sh.Match.prototype.toString = function()
+{
+ return this.value;
+};
+
+/**
+ * Simulates HTML code with a scripting language embedded.
+ *
+ * @param {String} scriptBrushName Brush name of the scripting language.
+ */
+sh.HtmlScript = function(scriptBrushName)
+{
+ var scriptBrush = sh.utils.findBrush(scriptBrushName),
+ xmlBrush = new sh.brushes.Xml(),
+ bracketsRegex = null
+ ;
+
+ if (scriptBrush == null)
+ return;
+
+ scriptBrush = new scriptBrush();
+ this.xmlBrush = xmlBrush;
+
+ if (scriptBrush.htmlScript == null)
+ {
+ sh.utils.alert(sh.config.strings.brushNotHtmlScript + scriptBrushName);
+ return;
+ }
+
+ xmlBrush.regexList.push(
+ { regex: scriptBrush.htmlScript.code, func: process }
+ );
+
+ function offsetMatches(matches, offset)
+ {
+ for (var j = 0; j < matches.length; j++)
+ matches[j].index += offset;
+ }
+
+ function process(match, info)
+ {
+ var code = match.code,
+ matches = [],
+ regexList = scriptBrush.regexList,
+ offset = match.index + match.left.length,
+ htmlScript = scriptBrush.htmlScript,
+ result
+ ;
+
+ for (var i = 0; i < regexList.length; i++)
+ {
+ result = sh.utils.getMatches(code, regexList[i]);
+ offsetMatches(result, offset);
+ matches = matches.concat(result);
+ }
+
+ if (htmlScript.left != null && match.left != null)
+ {
+ result = sh.utils.getMatches(match.left, htmlScript.left);
+ offsetMatches(result, match.index);
+ matches = matches.concat(result);
+ }
+
+ if (htmlScript.right != null && match.right != null)
+ {
+ result = sh.utils.getMatches(match.right, htmlScript.right);
+ offsetMatches(result, match.index + match[0].lastIndexOf(match.right));
+ matches = matches.concat(result);
+ }
+
+ return matches;
+ }
+};
+
+sh.HtmlScript.prototype.highlight = function(code, params)
+{
+ this.xmlBrush.highlight(code, params);
+ this.div = this.xmlBrush.div;
+}
+
+/**
+ * Main Highlither class.
+ * @constructor
+ */
+sh.Highlighter = function()
+{
+};
+
+sh.Highlighter.prototype = {
+ /**
+ * Returns value of the parameter passed to the highlighter.
+ * @param {String} name Name of the parameter.
+ * @param {Object} defaultValue Default value.
+ * @return {Object} Returns found value or default value otherwise.
+ */
+ getParam : function(name, defaultValue)
+ {
+ var result = this.params[name];
+ return sh.utils.toBoolean(result == null ? defaultValue : result);
+ },
+
+ /**
+ * Shortcut to document.createElement().
+ * @param {String} name Name of the element to create (DIV, A, etc).
+ * @return {HTMLElement} Returns new HTML element.
+ */
+ create: function(name)
+ {
+ return document.createElement(name);
+ },
+
+ /**
+ * Checks if one match is inside another.
+ * @param {Match} match Match object to check.
+ * @return {Boolean} Returns true if given match was inside another, false otherwise.
+ */
+ isMatchNested: function(match)
+ {
+ for (var i = 0; i < this.matches.length; i++)
+ {
+ var item = this.matches[i];
+
+ if (item === null)
+ continue;
+
+ if ((match.index > item.index) && (match.index < item.index + item.length))
+ return true;
+ }
+
+ return false;
+ },
+
+ /**
+ * Applies all regular expression to the code and stores all found
+ * matches in the `this.matches` array.
+ * @param {Array} regexList List of regular expressions.
+ * @param {String} code Source code.
+ * @return {Array} Returns list of matches.
+ */
+ findMatches: function(regexList, code)
+ {
+ var result = [];
+
+ if (regexList != null)
+ for (var i = 0; i < regexList.length; i++)
+ result = result.concat(sh.utils.getMatches(code, regexList[i]));
+
+ // sort the matches
+ result = result.sort(sh.utils.matchesSortCallback);
+
+ return result;
+ },
+
+ /**
+ * Checks to see if any of the matches are inside of other matches.
+ * This process would get rid of highligted strings inside comments,
+ * keywords inside strings and so on.
+ */
+ removeNestedMatches: function()
+ {
+ for (var i = 0; i < this.matches.length; i++)
+ if (this.isMatchNested(this.matches[i]))
+ this.matches[i] = null;
+ },
+
+ /**
+ * Splits block of text into individual DIV lines.
+ * @param {String} code Code to highlight.
+ * @return {String} Returns highlighted code in HTML form.
+ */
+ createDisplayLines : function(code)
+ {
+ var lines = code.split(/\n/g),
+ firstLine = parseInt(this.getParam('first-line')),
+ padLength = (firstLine + lines.length).toString().length,
+ highlightedLines = this.getParam('highlight', [])
+ ;
+
+ code = '';
+
+ for (var i = 0; i < lines.length; i++)
+ {
+ var line = lines[i],
+ indent = /^( |\s)+/.exec(line),
+ lineClass = 'line alt' + (i % 2 == 0 ? 1 : 2),
+ lineNumber = sh.utils.padNumber(firstLine + i, padLength),
+ highlighted = highlightedLines.indexOf((firstLine + i).toString()) != -1,
+ spaces = null
+ ;
+
+ if (indent != null)
+ {
+ spaces = indent[0].toString();
+ line = line.substr(spaces.length);
+ spaces = spaces.replace(/ /g, ' ');
+ indent = sh.vars.spaceWidth * spaces.length;
+ }
+ else
+ {
+ indent = 0;
+ }
+
+ line = sh.utils.trim(line);
+
+ if (line.length == 0)
+ line = ' ';
+
+ if (highlighted)
+ lineClass += ' highlighted';
+
+ code +=
+ '' + lineNumber + '.
'
+ + ''
+ + (spaces != null ? '' + spaces.replace(/\s/g, ' ') + '
' : '')
+ + '' + line + ''
+ + ''
+ + '.*?)" +
+ "(?" + regexGroup.right.source + ")",
+ "sgi"
+ )
+ };
+ }
+}; // end of Highlighter
+
+return sh;
+}(); // end of anonymous function
+
+if (!Array.indexOf)
+ /**
+ * Finds an index of element in the array.
+ * @ignore
+ * @param {Object} searchElement
+ * @param {Number} fromIndex
+ * @return {Number} Returns index of element if found; -1 otherwise.
+ */
+ Array.prototype.indexOf = function (searchElement, fromIndex)
+ {
+ fromIndex = Math.max(fromIndex || 0, 0);
+
+ for (var i = fromIndex; i < this.length; i++)
+ if(this[i] == searchElement)
+ return i;
+
+ return -1;
+ };
+
+/**
+ * XRegExp 0.6.1
+ * (c) 2007-2008 Steven Levithan
+ *
+ * MIT License
+ *
+ * provides an augmented, cross-browser implementation of regular expressions
+ * including support for additional modifiers and syntax. several convenience
+ * methods and a recursive-construct parser are also included.
+ */
+
+// prevent running twice, which would break references to native globals
+if (!window.XRegExp) {
+// anonymous function to avoid global variables
+(function () {
+// copy various native globals for reference. can't use the name ``native``
+// because it's a reserved JavaScript keyword.
+var real = {
+ exec: RegExp.prototype.exec,
+ match: String.prototype.match,
+ replace: String.prototype.replace,
+ split: String.prototype.split
+ },
+ /* regex syntax parsing with support for all the necessary cross-
+ browser and context issues (escapings, character classes, etc.) */
+ lib = {
+ part: /(?:[^\\([#\s.]+|\\(?!k<[\w$]+>|[pP]{[^}]+})[\S\s]?|\((?=\?(?!#|<[\w$]+>)))+|(\()(?:\?(?:(#)[^)]*\)|<([$\w]+)>))?|\\(?:k<([\w$]+)>|[pP]{([^}]+)})|(\[\^?)|([\S\s])/g,
+ replaceVar: /(?:[^$]+|\$(?![1-9$&`']|{[$\w]+}))+|\$(?:([1-9]\d*|[$&`'])|{([$\w]+)})/g,
+ extended: /^(?:\s+|#.*)+/,
+ quantifier: /^(?:[?*+]|{\d+(?:,\d*)?})/,
+ classLeft: /&&\[\^?/g,
+ classRight: /]/g
+ },
+ indexOf = function (array, item, from) {
+ for (var i = from || 0; i < array.length; i++)
+ if (array[i] === item) return i;
+ return -1;
+ },
+ brokenExecUndef = /()??/.exec("")[1] !== undefined,
+ plugins = {};
+
+/**
+ * Accepts a pattern and flags, returns a new, extended RegExp object.
+ * differs from a native regex in that additional flags and syntax are
+ * supported and browser inconsistencies are ameliorated.
+ * @ignore
+ */
+XRegExp = function (pattern, flags) {
+ if (pattern instanceof RegExp) {
+ if (flags !== undefined)
+ throw TypeError("can't supply flags when constructing one RegExp from another");
+ return pattern.addFlags(); // new copy
+ }
+
+ var flags = flags || "",
+ singleline = flags.indexOf("s") > -1,
+ extended = flags.indexOf("x") > -1,
+ hasNamedCapture = false,
+ captureNames = [],
+ output = [],
+ part = lib.part,
+ match, cc, len, index, regex;
+
+ part.lastIndex = 0; // in case the last XRegExp compilation threw an error (unbalanced character class)
+
+ while (match = real.exec.call(part, pattern)) {
+ // comment pattern. this check must come before the capturing group check,
+ // because both match[1] and match[2] will be non-empty.
+ if (match[2]) {
+ // keep tokens separated unless the following token is a quantifier
+ if (!lib.quantifier.test(pattern.slice(part.lastIndex)))
+ output.push("(?:)");
+ // capturing group
+ } else if (match[1]) {
+ captureNames.push(match[3] || null);
+ if (match[3])
+ hasNamedCapture = true;
+ output.push("(");
+ // named backreference
+ } else if (match[4]) {
+ index = indexOf(captureNames, match[4]);
+ // keep backreferences separate from subsequent literal numbers
+ // preserve backreferences to named groups that are undefined at this point as literal strings
+ output.push(index > -1 ?
+ "\\" + (index + 1) + (isNaN(pattern.charAt(part.lastIndex)) ? "" : "(?:)") :
+ match[0]
+ );
+ // unicode element (requires plugin)
+ } else if (match[5]) {
+ output.push(plugins.unicode ?
+ plugins.unicode.get(match[5], match[0].charAt(1) === "P") :
+ match[0]
+ );
+ // character class opening delimiter ("[" or "[^")
+ // (non-native unicode elements are not supported within character classes)
+ } else if (match[6]) {
+ if (pattern.charAt(part.lastIndex) === "]") {
+ // for cross-browser compatibility with ECMA-262 v3 behavior,
+ // convert [] to (?!) and [^] to [\S\s].
+ output.push(match[6] === "[" ? "(?!)" : "[\\S\\s]");
+ part.lastIndex++;
+ } else {
+ // parse the character class with support for inner escapes and
+ // ES4's infinitely nesting intersection syntax ([&&[^&&[]]]).
+ cc = XRegExp.matchRecursive("&&" + pattern.slice(match.index), lib.classLeft, lib.classRight, "", {escapeChar: "\\"})[0];
+ output.push(match[6] + cc + "]");
+ part.lastIndex += cc.length + 1;
+ }
+ // dot ("."), pound sign ("#"), or whitespace character
+ } else if (match[7]) {
+ if (singleline && match[7] === ".") {
+ output.push("[\\S\\s]");
+ } else if (extended && lib.extended.test(match[7])) {
+ len = real.exec.call(lib.extended, pattern.slice(part.lastIndex - 1))[0].length;
+ // keep tokens separated unless the following token is a quantifier
+ if (!lib.quantifier.test(pattern.slice(part.lastIndex - 1 + len)))
+ output.push("(?:)");
+ part.lastIndex += len - 1;
+ } else {
+ output.push(match[7]);
+ }
+ } else {
+ output.push(match[0]);
+ }
+ }
+
+ regex = RegExp(output.join(""), real.replace.call(flags, /[sx]+/g, ""));
+ regex._x = {
+ source: pattern,
+ captureNames: hasNamedCapture ? captureNames : null
+ };
+ return regex;
+};
+
+/**
+ * Barebones plugin support for now (intentionally undocumented)
+ * @ignore
+ * @param {Object} name
+ * @param {Object} o
+ */
+XRegExp.addPlugin = function (name, o) {
+ plugins[name] = o;
+};
+
+/**
+ * Adds named capture support, with values returned as ``result.name``.
+ *
+ * Also fixes two cross-browser issues, following the ECMA-262 v3 spec:
+ * - captured values for non-participating capturing groups should be returned
+ * as ``undefined``, rather than the empty string.
+ * - the regex's ``lastIndex`` should not be incremented after zero-length
+ * matches.
+ * @ignore
+ */
+RegExp.prototype.exec = function (str) {
+ var match = real.exec.call(this, str),
+ name, i, r2;
+ if (match) {
+ // fix browsers whose exec methods don't consistently return
+ // undefined for non-participating capturing groups
+ if (brokenExecUndef && match.length > 1) {
+ // r2 doesn't need /g or /y, but they shouldn't hurt
+ r2 = new RegExp("^" + this.source + "$(?!\\s)", this.getNativeFlags());
+ real.replace.call(match[0], r2, function () {
+ for (i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined) match[i] = undefined;
+ }
+ });
+ }
+ // attach named capture properties
+ if (this._x && this._x.captureNames) {
+ for (i = 1; i < match.length; i++) {
+ name = this._x.captureNames[i - 1];
+ if (name) match[name] = match[i];
+ }
+ }
+ // fix browsers that increment lastIndex after zero-length matches
+ if (this.global && this.lastIndex > (match.index + match[0].length))
+ this.lastIndex--;
+ }
+ return match;
+};
+})(); // end anonymous function
+} // end if(!window.XRegExp)
+
+/**
+ * intentionally undocumented
+ * @ignore
+ */
+RegExp.prototype.getNativeFlags = function () {
+ return (this.global ? "g" : "") +
+ (this.ignoreCase ? "i" : "") +
+ (this.multiline ? "m" : "") +
+ (this.extended ? "x" : "") +
+ (this.sticky ? "y" : "");
+};
+
+/**
+ * Accepts flags; returns a new XRegExp object generated by recompiling
+ * the regex with the additional flags (may include non-native flags).
+ * The original regex object is not altered.
+ * @ignore
+ */
+RegExp.prototype.addFlags = function (flags) {
+ var regex = new XRegExp(this.source, (flags || "") + this.getNativeFlags());
+ if (this._x) {
+ regex._x = {
+ source: this._x.source,
+ captureNames: this._x.captureNames ? this._x.captureNames.slice(0) : null
+ };
+ }
+ return regex;
+};
+
+/**
+ * Accepts a context object and string; returns the result of calling
+ * ``exec`` with the provided string. the context is ignored but is
+ * accepted for congruity with ``Function.prototype.call``.
+ * @ignore
+ */
+RegExp.prototype.call = function (context, str) {
+ return this.exec(str);
+};
+
+/**
+ * Accepts a context object and arguments array; returns the result of
+ * calling ``exec`` with the first value in the arguments array. the context
+ * is ignored but is accepted for congruity with ``Function.prototype.apply``.
+ * @ignore
+ */
+RegExp.prototype.apply = function (context, args) {
+ return this.exec(args[0]);
+};
+
+/**
+ * Accepts a pattern and flags; returns an XRegExp object. if the pattern
+ * and flag combination has previously been cached, the cached copy is
+ * returned, otherwise the new object is cached.
+ * @ignore
+ */
+XRegExp.cache = function (pattern, flags) {
+ var key = "/" + pattern + "/" + (flags || "");
+ return XRegExp.cache[key] || (XRegExp.cache[key] = new XRegExp(pattern, flags));
+};
+
+/**
+ * Accepts a string; returns the string with regex metacharacters escaped.
+ * the returned string can safely be used within a regex to match a literal
+ * string. escaped characters are [, ], {, }, (, ), -, *, +, ?, ., \, ^, $,
+ * |, #, [comma], and whitespace.
+ * @ignore
+ */
+XRegExp.escape = function (str) {
+ return str.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&");
+};
+
+/**
+ * Accepts a string to search, left and right delimiters as regex pattern
+ * strings, optional regex flags (may include non-native s, x, and y flags),
+ * and an options object which allows setting an escape character and changing
+ * the return format from an array of matches to a two-dimensional array of
+ * string parts with extended position data. returns an array of matches
+ * (optionally with extended data), allowing nested instances of left and right
+ * delimiters. use the g flag to return all matches, otherwise only the first
+ * is returned. if delimiters are unbalanced within the subject data, an error
+ * is thrown.
+ *
+ * This function admittedly pushes the boundaries of what can be accomplished
+ * sensibly without a "real" parser. however, by doing so it provides flexible
+ * and powerful recursive parsing capabilities with minimal code weight.
+ *
+ * Warning: the ``escapeChar`` option is considered experimental and might be
+ * changed or removed in future versions of XRegExp.
+ *
+ * unsupported features:
+ * - backreferences within delimiter patterns when using ``escapeChar``.
+ * - although providing delimiters as regex objects adds the minor feature of
+ * independent delimiter flags, it introduces other limitations and is only
+ * intended to be done by the ``XRegExp`` constructor (which can't call
+ * itself while building a regex).
+ *
+ * @ignore
+ */
+XRegExp.matchRecursive = function (str, left, right, flags, options) {
+ var options = options || {},
+ escapeChar = options.escapeChar,
+ vN = options.valueNames,
+ flags = flags || "",
+ global = flags.indexOf("g") > -1,
+ ignoreCase = flags.indexOf("i") > -1,
+ multiline = flags.indexOf("m") > -1,
+ sticky = flags.indexOf("y") > -1,
+ /* sticky mode has its own handling in this function, which means you
+ can use flag "y" even in browsers which don't support it natively */
+ flags = flags.replace(/y/g, ""),
+ left = left instanceof RegExp ? (left.global ? left : left.addFlags("g")) : new XRegExp(left, "g" + flags),
+ right = right instanceof RegExp ? (right.global ? right : right.addFlags("g")) : new XRegExp(right, "g" + flags),
+ output = [],
+ openTokens = 0,
+ delimStart = 0,
+ delimEnd = 0,
+ lastOuterEnd = 0,
+ outerStart, innerStart, leftMatch, rightMatch, escaped, esc;
+
+ if (escapeChar) {
+ if (escapeChar.length > 1) throw SyntaxError("can't supply more than one escape character");
+ if (multiline) throw TypeError("can't supply escape character when using the multiline flag");
+ escaped = XRegExp.escape(escapeChar);
+ /* Escape pattern modifiers:
+ /g - not needed here
+ /i - included
+ /m - **unsupported**, throws error
+ /s - handled by XRegExp when delimiters are provided as strings
+ /x - handled by XRegExp when delimiters are provided as strings
+ /y - not needed here; supported by other handling in this function
+ */
+ esc = new RegExp(
+ "^(?:" + escaped + "[\\S\\s]|(?:(?!" + left.source + "|" + right.source + ")[^" + escaped + "])+)+",
+ ignoreCase ? "i" : ""
+ );
+ }
+
+ while (true) {
+ /* advance the starting search position to the end of the last delimiter match.
+ a couple special cases are also covered:
+ - if using an escape character, advance to the next delimiter's starting position,
+ skipping any escaped characters
+ - first time through, reset lastIndex in case delimiters were provided as regexes
+ */
+ left.lastIndex = right.lastIndex = delimEnd +
+ (escapeChar ? (esc.exec(str.slice(delimEnd)) || [""])[0].length : 0);
+
+ leftMatch = left.exec(str);
+ rightMatch = right.exec(str);
+
+ // only keep the result which matched earlier in the string
+ if (leftMatch && rightMatch) {
+ if (leftMatch.index <= rightMatch.index)
+ rightMatch = null;
+ else leftMatch = null;
+ }
+
+ /* paths*:
+ leftMatch | rightMatch | openTokens | result
+ 1 | 0 | 1 | ...
+ 1 | 0 | 0 | ...
+ 0 | 1 | 1 | ...
+ 0 | 1 | 0 | throw
+ 0 | 0 | 1 | throw
+ 0 | 0 | 0 | break
+ * - does not include the sticky mode special case
+ - the loop ends after the first completed match if not in global mode
+ */
+
+ if (leftMatch || rightMatch) {
+ delimStart = (leftMatch || rightMatch).index;
+ delimEnd = (leftMatch ? left : right).lastIndex;
+ } else if (!openTokens) {
+ break;
+ }
+
+ if (sticky && !openTokens && delimStart > lastOuterEnd)
+ break;
+
+ if (leftMatch) {
+ if (!openTokens++) {
+ outerStart = delimStart;
+ innerStart = delimEnd;
+ }
+ } else if (rightMatch && openTokens) {
+ if (!--openTokens) {
+ if (vN) {
+ if (vN[0] && outerStart > lastOuterEnd)
+ output.push([vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart]);
+ if (vN[1]) output.push([vN[1], str.slice(outerStart, innerStart), outerStart, innerStart]);
+ if (vN[2]) output.push([vN[2], str.slice(innerStart, delimStart), innerStart, delimStart]);
+ if (vN[3]) output.push([vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd]);
+ } else {
+ output.push(str.slice(innerStart, delimStart));
+ }
+ lastOuterEnd = delimEnd;
+ if (!global)
+ break;
+ }
+ } else {
+ // reset lastIndex in case delimiters were provided as regexes
+ left.lastIndex = right.lastIndex = 0;
+ throw Error("subject data contains unbalanced delimiters");
+ }
+
+ // if the delimiter matched an empty string, advance delimEnd to avoid an infinite loop
+ if (delimStart === delimEnd)
+ delimEnd++;
+ }
+
+ if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd)
+ output.push([vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length]);
+
+ // reset lastIndex in case delimiters were provided as regexes
+ left.lastIndex = right.lastIndex = 0;
+
+ return output;
+};
diff --git a/test_script/src/shLegacy.js b/test_script/src/shLegacy.js
index 7859029a1..f5cb8d22e 100644
--- a/test_script/src/shLegacy.js
+++ b/test_script/src/shLegacy.js
@@ -1,32 +1,32 @@
-/**
- * SyntaxHighlighter
- * http://alexgorbatchev.com/
- *
- * SyntaxHighlighter is donationware. If you are using it, please donate.
- * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
- *
- * @version
- * 2.0.296 (March 01 2009)
- *
- * @copyright
- * Copyright (C) 2004-2009 Alex Gorbatchev.
- *
- * @license
- * This file is part of SyntaxHighlighter.
- *
- * SyntaxHighlighter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SyntaxHighlighter 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with SyntaxHighlighter. If not, see .
- */
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
var dp = {
SyntaxHighlighter : {}
};
diff --git a/test_script/styles/shCore.css b/test_script/styles/shCore.css
index 62e815191..b720e73bd 100644
--- a/test_script/styles/shCore.css
+++ b/test_script/styles/shCore.css
@@ -1,321 +1,321 @@
-/**
- * SyntaxHighlighter
- * http://alexgorbatchev.com/
- *
- * SyntaxHighlighter is donationware. If you are using it, please donate.
- * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
- *
- * @version
- * 2.0.296 (March 01 2009)
- *
- * @copyright
- * Copyright (C) 2004-2009 Alex Gorbatchev.
- *
- * @license
- * This file is part of SyntaxHighlighter.
- *
- * SyntaxHighlighter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SyntaxHighlighter 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with SyntaxHighlighter. If not, see .
- */
-.syntaxhighlighter,
-.syntaxhighlighter div,
-.syntaxhighlighter code,
-.syntaxhighlighter span
-{
- margin: 0 !important;
- padding: 0 !important;
- border: 0 !important;
- outline: 0 !important;
- background: none !important;
- text-align: left !important;
- float: none !important;
- vertical-align: baseline !important;
- position: static !important;
- left: auto !important;
- top: auto !important;
- right: auto !important;
- bottom: auto !important;
- height: auto !important;
- width: auto !important;
- line-height: 1.1em !important;
- font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
- font-weight: normal !important;
- font-style: normal !important;
- font-size: 1em !important;
-}
-
-.syntaxhighlighter
-{
- width: 100% !important;
- margin: 1em 0 1em 0 !important;
- padding: 1px !important; /* adds a little border on top and bottom */
- position: relative !important;
-}
-
-.syntaxhighlighter .bold {
- font-weight: bold !important;
-}
-
-.syntaxhighlighter .italic {
- font-style: italic !important;
-}
-
-.syntaxhighlighter .line .number
-{
- float: left !important;
- width: 3em !important;
- padding-right: .3em !important;
- text-align: right !important;
- display: block !important;
-}
-
-/* Disable numbers when no gutter option is set */
-.syntaxhighlighter.nogutter .line .number
-{
- display: none !important;
-}
-
-.syntaxhighlighter .line .content
-{
- margin-left: 3.3em !important;
- padding-left: .5em !important;
- display: block !important;
-}
-
-.syntaxhighlighter .line .content .block
-{
- display: block !important;
- padding-left: 1.5em !important;
- text-indent: -1.5em !important;
-}
-
-.syntaxhighlighter .line .content .spaces
-{
- display: none !important;
-}
-
-/* Disable border and margin on the lines when no gutter option is set */
-.syntaxhighlighter.nogutter .line .content
-{
- margin-left: 0 !important;
- border-left: none !important;
-}
-
-.syntaxhighlighter .bar
-{
-}
-
-.syntaxhighlighter.collapsed .bar
-{
-
-}
-
-.syntaxhighlighter.nogutter .ruler
-{
- margin-left: 0 !important;
- padding-left: 0 !important;
-}
-
-.syntaxhighlighter .ruler
-{
- padding: 0 0 .5em .5em !important;
- margin-left: 3.3em !important;
- overflow: hidden !important;
-}
-
-/* Adjust some properties when collapsed */
-
-.syntaxhighlighter.collapsed .lines,
-.syntaxhighlighter.collapsed .ruler
-{
- display: none !important;
-}
-
-/* Styles for the toolbar */
-
-.syntaxhighlighter .toolbar
-{
- position: absolute !important;
- right: 0px !important;
- top: 0px !important;
- font-size: 1px !important;
- padding: 8px 8px 8px 0 !important; /* in px because images don't scale with ems */
-}
-
-.syntaxhighlighter.collapsed .toolbar
-{
- font-size: 80% !important;
- padding: .2em 0 .5em .5em !important;
- position: static !important;
-}
-
-.syntaxhighlighter .toolbar a.item,
-.syntaxhighlighter .toolbar .item
-{
- display: block !important;
- float: left !important;
- margin-left: 8px !important;
- background-repeat: no-repeat !important;
- overflow: hidden !important;
- text-indent: -5000px !important;
-}
-
-.syntaxhighlighter.collapsed .toolbar .item
-{
- display: none !important;
-}
-
-.syntaxhighlighter.collapsed .toolbar .item.expandSource
-{
- background-image: url(magnifier.png) !important;
- display: inline !important;
- text-indent: 0 !important;
- width: auto !important;
- float: none !important;
- height: 16px !important;
- padding-left: 20px !important;
-}
-
-.syntaxhighlighter .toolbar .item.viewSource
-{
- background-image: url(page_white_code.png) !important;
-}
-
-.syntaxhighlighter .toolbar .item.printSource
-{
- background-image: url(printer.png) !important;
-}
-
-.syntaxhighlighter .toolbar .item.copyToClipboard
-{
- text-indent: 0 !important;
- background: none !important;
- overflow: visible !important;
-}
-
-.syntaxhighlighter .toolbar .item.about
-{
- background-image: url(help.png) !important;
-}
-
-/**
- * Print view.
- * Colors are based on the default theme without background.
- */
-
-.syntaxhighlighter.printing,
-.syntaxhighlighter.printing .line.alt1 .content,
-.syntaxhighlighter.printing .line.alt2 .content,
-.syntaxhighlighter.printing .line.highlighted .number,
-.syntaxhighlighter.printing .line.highlighted.alt1 .content,
-.syntaxhighlighter.printing .line.highlighted.alt2 .content,
-.syntaxhighlighter.printing .line .content .block
-{
- background: none !important;
-}
-
-/* Gutter line numbers */
-.syntaxhighlighter.printing .line .number
-{
- color: #bbb !important;
-}
-
-/* Add border to the lines */
-.syntaxhighlighter.printing .line .content
-{
- color: #000 !important;
-}
-
-/* Toolbar when visible */
-.syntaxhighlighter.printing .toolbar,
-.syntaxhighlighter.printing .ruler
-{
- display: none !important;
-}
-
-.syntaxhighlighter.printing a
-{
- text-decoration: none !important;
-}
-
-.syntaxhighlighter.printing .plain,
-.syntaxhighlighter.printing .plain a
-{
- color: #000 !important;
-}
-
-.syntaxhighlighter.printing .comments,
-.syntaxhighlighter.printing .comments a
-{
- color: #008200 !important;
-}
-
-.syntaxhighlighter.printing .string,
-.syntaxhighlighter.printing .string a
-{
- color: blue !important;
-}
-
-.syntaxhighlighter.printing .keyword
-{
- color: #069 !important;
- font-weight: bold !important;
-}
-
-.syntaxhighlighter.printing .preprocessor
-{
- color: gray !important;
-}
-
-.syntaxhighlighter.printing .variable
-{
- color: #a70 !important;
-}
-
-.syntaxhighlighter.printing .value
-{
- color: #090 !important;
-}
-
-.syntaxhighlighter.printing .functions
-{
- color: #ff1493 !important;
-}
-
-.syntaxhighlighter.printing .constants
-{
- color: #0066CC !important;
-}
-
-.syntaxhighlighter.printing .script
-{
- font-weight: bold !important;
-}
-
-.syntaxhighlighter.printing .color1,
-.syntaxhighlighter.printing .color1 a
-{
- color: #808080 !important;
-}
-
-.syntaxhighlighter.printing .color2,
-.syntaxhighlighter.printing .color2 a
-{
- color: #ff1493 !important;
-}
-
-.syntaxhighlighter.printing .color3,
-.syntaxhighlighter.printing .color3 a
-{
- color: red !important;
-}
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+.syntaxhighlighter,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter span
+{
+ margin: 0 !important;
+ padding: 0 !important;
+ border: 0 !important;
+ outline: 0 !important;
+ background: none !important;
+ text-align: left !important;
+ float: none !important;
+ vertical-align: baseline !important;
+ position: static !important;
+ left: auto !important;
+ top: auto !important;
+ right: auto !important;
+ bottom: auto !important;
+ height: auto !important;
+ width: auto !important;
+ line-height: 1.1em !important;
+ font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+}
+
+.syntaxhighlighter
+{
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ padding: 1px !important; /* adds a little border on top and bottom */
+ position: relative !important;
+}
+
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+
+.syntaxhighlighter .line .number
+{
+ float: left !important;
+ width: 3em !important;
+ padding-right: .3em !important;
+ text-align: right !important;
+ display: block !important;
+}
+
+/* Disable numbers when no gutter option is set */
+.syntaxhighlighter.nogutter .line .number
+{
+ display: none !important;
+}
+
+.syntaxhighlighter .line .content
+{
+ margin-left: 3.3em !important;
+ padding-left: .5em !important;
+ display: block !important;
+}
+
+.syntaxhighlighter .line .content .block
+{
+ display: block !important;
+ padding-left: 1.5em !important;
+ text-indent: -1.5em !important;
+}
+
+.syntaxhighlighter .line .content .spaces
+{
+ display: none !important;
+}
+
+/* Disable border and margin on the lines when no gutter option is set */
+.syntaxhighlighter.nogutter .line .content
+{
+ margin-left: 0 !important;
+ border-left: none !important;
+}
+
+.syntaxhighlighter .bar
+{
+}
+
+.syntaxhighlighter.collapsed .bar
+{
+
+}
+
+.syntaxhighlighter.nogutter .ruler
+{
+ margin-left: 0 !important;
+ padding-left: 0 !important;
+}
+
+.syntaxhighlighter .ruler
+{
+ padding: 0 0 .5em .5em !important;
+ margin-left: 3.3em !important;
+ overflow: hidden !important;
+}
+
+/* Adjust some properties when collapsed */
+
+.syntaxhighlighter.collapsed .lines,
+.syntaxhighlighter.collapsed .ruler
+{
+ display: none !important;
+}
+
+/* Styles for the toolbar */
+
+.syntaxhighlighter .toolbar
+{
+ position: absolute !important;
+ right: 0px !important;
+ top: 0px !important;
+ font-size: 1px !important;
+ padding: 8px 8px 8px 0 !important; /* in px because images don't scale with ems */
+}
+
+.syntaxhighlighter.collapsed .toolbar
+{
+ font-size: 80% !important;
+ padding: .2em 0 .5em .5em !important;
+ position: static !important;
+}
+
+.syntaxhighlighter .toolbar a.item,
+.syntaxhighlighter .toolbar .item
+{
+ display: block !important;
+ float: left !important;
+ margin-left: 8px !important;
+ background-repeat: no-repeat !important;
+ overflow: hidden !important;
+ text-indent: -5000px !important;
+}
+
+.syntaxhighlighter.collapsed .toolbar .item
+{
+ display: none !important;
+}
+
+.syntaxhighlighter.collapsed .toolbar .item.expandSource
+{
+ background-image: url(magnifier.png) !important;
+ display: inline !important;
+ text-indent: 0 !important;
+ width: auto !important;
+ float: none !important;
+ height: 16px !important;
+ padding-left: 20px !important;
+}
+
+.syntaxhighlighter .toolbar .item.viewSource
+{
+ background-image: url(page_white_code.png) !important;
+}
+
+.syntaxhighlighter .toolbar .item.printSource
+{
+ background-image: url(printer.png) !important;
+}
+
+.syntaxhighlighter .toolbar .item.copyToClipboard
+{
+ text-indent: 0 !important;
+ background: none !important;
+ overflow: visible !important;
+}
+
+.syntaxhighlighter .toolbar .item.about
+{
+ background-image: url(help.png) !important;
+}
+
+/**
+ * Print view.
+ * Colors are based on the default theme without background.
+ */
+
+.syntaxhighlighter.printing,
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content,
+.syntaxhighlighter.printing .line .content .block
+{
+ background: none !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter.printing .line .number
+{
+ color: #bbb !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter.printing .line .content
+{
+ color: #000 !important;
+}
+
+/* Toolbar when visible */
+.syntaxhighlighter.printing .toolbar,
+.syntaxhighlighter.printing .ruler
+{
+ display: none !important;
+}
+
+.syntaxhighlighter.printing a
+{
+ text-decoration: none !important;
+}
+
+.syntaxhighlighter.printing .plain,
+.syntaxhighlighter.printing .plain a
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter.printing .comments,
+.syntaxhighlighter.printing .comments a
+{
+ color: #008200 !important;
+}
+
+.syntaxhighlighter.printing .string,
+.syntaxhighlighter.printing .string a
+{
+ color: blue !important;
+}
+
+.syntaxhighlighter.printing .keyword
+{
+ color: #069 !important;
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter.printing .preprocessor
+{
+ color: gray !important;
+}
+
+.syntaxhighlighter.printing .variable
+{
+ color: #a70 !important;
+}
+
+.syntaxhighlighter.printing .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter.printing .functions
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter.printing .constants
+{
+ color: #0066CC !important;
+}
+
+.syntaxhighlighter.printing .script
+{
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter.printing .color1,
+.syntaxhighlighter.printing .color1 a
+{
+ color: #808080 !important;
+}
+
+.syntaxhighlighter.printing .color2,
+.syntaxhighlighter.printing .color2 a
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter.printing .color3,
+.syntaxhighlighter.printing .color3 a
+{
+ color: red !important;
+}
diff --git a/test_script/styles/shThemeDefault.css b/test_script/styles/shThemeDefault.css
index a4b2f8206..e466c97de 100644
--- a/test_script/styles/shThemeDefault.css
+++ b/test_script/styles/shThemeDefault.css
@@ -1,191 +1,191 @@
-/**
- * SyntaxHighlighter
- * http://alexgorbatchev.com/
- *
- * SyntaxHighlighter is donationware. If you are using it, please donate.
- * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
- *
- * @version
- * 2.0.296 (March 01 2009)
- *
- * @copyright
- * Copyright (C) 2004-2009 Alex Gorbatchev.
- *
- * @license
- * This file is part of SyntaxHighlighter.
- *
- * SyntaxHighlighter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SyntaxHighlighter 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with SyntaxHighlighter. If not, see .
- */
-/************************************
- * Default Syntax Highlighter theme.
- *
- * Interface elements.
- ************************************/
-
-.syntaxhighlighter
-{
- background-color: #E7E5DC !important;
-}
-
-/* Highlighed line number */
-.syntaxhighlighter .line.highlighted .number
-{
- background-color: #6CE26C !important;
- color: black !important;
-}
-
-/* Highlighed line */
-.syntaxhighlighter .line.highlighted.alt1 .content,
-.syntaxhighlighter .line.highlighted.alt2 .content
-{
- background-color: #6CE26C !important;
-}
-
-/* Gutter line numbers */
-.syntaxhighlighter .line .number
-{
- color: #5C5C5C !important;
-}
-
-/* Add border to the lines */
-.syntaxhighlighter .line .content
-{
- border-left: 3px solid #6CE26C !important;
- color: #000 !important;
-}
-
-.syntaxhighlighter.printing .line .content
-{
- border: 0 !important;
-}
-
-/* First line */
-.syntaxhighlighter .line.alt1 .content
-{
- background-color: #fff !important;
-}
-
-/* Second line */
-.syntaxhighlighter .line.alt2 .content
-{
- background-color: #F8F8F8 !important;
-}
-
-.syntaxhighlighter .line .content .block
-{
- background: url(wrapping.png) 0 1.1em no-repeat !important;
-}
-
-.syntaxhighlighter .ruler
-{
- color: silver !important;
- background-color: #F8F8F8 !important;
- border-left: 3px solid #6CE26C !important;
-}
-
-.syntaxhighlighter.nogutter .ruler
-{
- border: 0 !important;
-}
-
-.syntaxhighlighter .toolbar
-{
- background-color: #F8F8F8 !important;
- border: #E7E5DC solid 1px !important;
-}
-
-.syntaxhighlighter .toolbar a
-{
- color: #a0a0a0 !important;
-}
-
-.syntaxhighlighter .toolbar a:hover
-{
- color: red !important;
-}
-
-/************************************
- * Actual syntax highlighter colors.
- ************************************/
-.syntaxhighlighter .plain,
-.syntaxhighlighter .plain a
-{
- color: #000 !important;
-}
-
-.syntaxhighlighter .comments,
-.syntaxhighlighter .comments a
-{
- color: #008200 !important;
-}
-
-.syntaxhighlighter .string,
-.syntaxhighlighter .string a
-{
- color: blue !important;
-}
-
-.syntaxhighlighter .keyword
-{
- color: #069 !important;
- font-weight: bold !important;
-}
-
-.syntaxhighlighter .preprocessor
-{
- color: gray !important;
-}
-
-.syntaxhighlighter .variable
-{
- color: #a70 !important;
-}
-
-.syntaxhighlighter .value
-{
- color: #090 !important;
-}
-
-.syntaxhighlighter .functions
-{
- color: #ff1493 !important;
-}
-
-.syntaxhighlighter .constants
-{
- color: #0066CC !important;
-}
-
-.syntaxhighlighter .script
-{
- background-color: yellow !important;
-}
-
-.syntaxhighlighter .color1,
-.syntaxhighlighter .color1 a
-{
- color: #808080 !important;
-}
-
-.syntaxhighlighter .color2,
-.syntaxhighlighter .color2 a
-{
- color: #ff1493 !important;
-}
-
-.syntaxhighlighter .color3,
-.syntaxhighlighter .color3 a
-{
- color: red !important;
-}
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
+/************************************
+ * Default Syntax Highlighter theme.
+ *
+ * Interface elements.
+ ************************************/
+
+.syntaxhighlighter
+{
+ background-color: #E7E5DC !important;
+}
+
+/* Highlighed line number */
+.syntaxhighlighter .line.highlighted .number
+{
+ background-color: #6CE26C !important;
+ color: black !important;
+}
+
+/* Highlighed line */
+.syntaxhighlighter .line.highlighted.alt1 .content,
+.syntaxhighlighter .line.highlighted.alt2 .content
+{
+ background-color: #6CE26C !important;
+}
+
+/* Gutter line numbers */
+.syntaxhighlighter .line .number
+{
+ color: #5C5C5C !important;
+}
+
+/* Add border to the lines */
+.syntaxhighlighter .line .content
+{
+ border-left: 3px solid #6CE26C !important;
+ color: #000 !important;
+}
+
+.syntaxhighlighter.printing .line .content
+{
+ border: 0 !important;
+}
+
+/* First line */
+.syntaxhighlighter .line.alt1 .content
+{
+ background-color: #fff !important;
+}
+
+/* Second line */
+.syntaxhighlighter .line.alt2 .content
+{
+ background-color: #F8F8F8 !important;
+}
+
+.syntaxhighlighter .line .content .block
+{
+ background: url(wrapping.png) 0 1.1em no-repeat !important;
+}
+
+.syntaxhighlighter .ruler
+{
+ color: silver !important;
+ background-color: #F8F8F8 !important;
+ border-left: 3px solid #6CE26C !important;
+}
+
+.syntaxhighlighter.nogutter .ruler
+{
+ border: 0 !important;
+}
+
+.syntaxhighlighter .toolbar
+{
+ background-color: #F8F8F8 !important;
+ border: #E7E5DC solid 1px !important;
+}
+
+.syntaxhighlighter .toolbar a
+{
+ color: #a0a0a0 !important;
+}
+
+.syntaxhighlighter .toolbar a:hover
+{
+ color: red !important;
+}
+
+/************************************
+ * Actual syntax highlighter colors.
+ ************************************/
+.syntaxhighlighter .plain,
+.syntaxhighlighter .plain a
+{
+ color: #000 !important;
+}
+
+.syntaxhighlighter .comments,
+.syntaxhighlighter .comments a
+{
+ color: #008200 !important;
+}
+
+.syntaxhighlighter .string,
+.syntaxhighlighter .string a
+{
+ color: blue !important;
+}
+
+.syntaxhighlighter .keyword
+{
+ color: #069 !important;
+ font-weight: bold !important;
+}
+
+.syntaxhighlighter .preprocessor
+{
+ color: gray !important;
+}
+
+.syntaxhighlighter .variable
+{
+ color: #a70 !important;
+}
+
+.syntaxhighlighter .value
+{
+ color: #090 !important;
+}
+
+.syntaxhighlighter .functions
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter .constants
+{
+ color: #0066CC !important;
+}
+
+.syntaxhighlighter .script
+{
+ background-color: yellow !important;
+}
+
+.syntaxhighlighter .color1,
+.syntaxhighlighter .color1 a
+{
+ color: #808080 !important;
+}
+
+.syntaxhighlighter .color2,
+.syntaxhighlighter .color2 a
+{
+ color: #ff1493 !important;
+}
+
+.syntaxhighlighter .color3,
+.syntaxhighlighter .color3 a
+{
+ color: red !important;
+}
diff --git a/test_script/styles/shThemeDjango.css b/test_script/styles/shThemeDjango.css
index 12433540c..65a7f0672 100644
--- a/test_script/styles/shThemeDjango.css
+++ b/test_script/styles/shThemeDjango.css
@@ -1,32 +1,32 @@
-/**
- * SyntaxHighlighter
- * http://alexgorbatchev.com/
- *
- * SyntaxHighlighter is donationware. If you are using it, please donate.
- * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
- *
- * @version
- * 2.0.296 (March 01 2009)
- *
- * @copyright
- * Copyright (C) 2004-2009 Alex Gorbatchev.
- *
- * @license
- * This file is part of SyntaxHighlighter.
- *
- * SyntaxHighlighter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SyntaxHighlighter 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with SyntaxHighlighter. If not, see .
- */
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
/**
* Django SyntaxHighlighter theme
*/
diff --git a/test_script/styles/shThemeEmacs.css b/test_script/styles/shThemeEmacs.css
index d1710a6e8..e4eed1654 100644
--- a/test_script/styles/shThemeEmacs.css
+++ b/test_script/styles/shThemeEmacs.css
@@ -1,32 +1,32 @@
-/**
- * SyntaxHighlighter
- * http://alexgorbatchev.com/
- *
- * SyntaxHighlighter is donationware. If you are using it, please donate.
- * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
- *
- * @version
- * 2.0.296 (March 01 2009)
- *
- * @copyright
- * Copyright (C) 2004-2009 Alex Gorbatchev.
- *
- * @license
- * This file is part of SyntaxHighlighter.
- *
- * SyntaxHighlighter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SyntaxHighlighter 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with SyntaxHighlighter. If not, see .
- */
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
/**
* Emacs SyntaxHighlighter theme based on theme by Joshua Emmons
* http://www.skia.net/
diff --git a/test_script/styles/shThemeFadeToGrey.css b/test_script/styles/shThemeFadeToGrey.css
index 0d036c1cb..b19c3be39 100644
--- a/test_script/styles/shThemeFadeToGrey.css
+++ b/test_script/styles/shThemeFadeToGrey.css
@@ -1,32 +1,32 @@
-/**
- * SyntaxHighlighter
- * http://alexgorbatchev.com/
- *
- * SyntaxHighlighter is donationware. If you are using it, please donate.
- * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
- *
- * @version
- * 2.0.296 (March 01 2009)
- *
- * @copyright
- * Copyright (C) 2004-2009 Alex Gorbatchev.
- *
- * @license
- * This file is part of SyntaxHighlighter.
- *
- * SyntaxHighlighter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SyntaxHighlighter 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with SyntaxHighlighter. If not, see .
- */
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
/**
* Fade to Grey SyntaxHighlighter theme based on theme by Brasten Sager
* http://www.ibrasten.com/
diff --git a/test_script/styles/shThemeMidnight.css b/test_script/styles/shThemeMidnight.css
index f49a7b3e3..0f39d0c80 100644
--- a/test_script/styles/shThemeMidnight.css
+++ b/test_script/styles/shThemeMidnight.css
@@ -1,32 +1,32 @@
-/**
- * SyntaxHighlighter
- * http://alexgorbatchev.com/
- *
- * SyntaxHighlighter is donationware. If you are using it, please donate.
- * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
- *
- * @version
- * 2.0.296 (March 01 2009)
- *
- * @copyright
- * Copyright (C) 2004-2009 Alex Gorbatchev.
- *
- * @license
- * This file is part of SyntaxHighlighter.
- *
- * SyntaxHighlighter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SyntaxHighlighter 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with SyntaxHighlighter. If not, see .
- */
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
/**
* Midnight SyntaxHighlighter theme based on theme by J.D. Myers
* http://webdesign.lsnjd.com/
diff --git a/test_script/styles/shThemeRDark.css b/test_script/styles/shThemeRDark.css
index 618554b98..308db5989 100644
--- a/test_script/styles/shThemeRDark.css
+++ b/test_script/styles/shThemeRDark.css
@@ -1,32 +1,32 @@
-/**
- * SyntaxHighlighter
- * http://alexgorbatchev.com/
- *
- * SyntaxHighlighter is donationware. If you are using it, please donate.
- * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
- *
- * @version
- * 2.0.296 (March 01 2009)
- *
- * @copyright
- * Copyright (C) 2004-2009 Alex Gorbatchev.
- *
- * @license
- * This file is part of SyntaxHighlighter.
- *
- * SyntaxHighlighter is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * SyntaxHighlighter 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with SyntaxHighlighter. If not, see .
- */
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate
+ *
+ * @version
+ * 2.0.296 (March 01 2009)
+ *
+ * @copyright
+ * Copyright (C) 2004-2009 Alex Gorbatchev.
+ *
+ * @license
+ * This file is part of SyntaxHighlighter.
+ *
+ * SyntaxHighlighter is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * SyntaxHighlighter 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with SyntaxHighlighter. If not, see .
+ */
/**
* RDark SyntaxHighlighter theme based on theme by Radu Dineiu
* http://www.vim.org/scripts/script.php?script_id=1732
diff --git a/test_script/test.html b/test_script/test.html
index 5c5a725b3..97caee08d 100644
--- a/test_script/test.html
+++ b/test_script/test.html
@@ -1,46 +1,46 @@
-
-
-
-
- SyntaxHighlighter Build Test Page
-
-
-
-
-
-
-
-
-
-
-SyntaxHihglighter Test
-This is a test file to insure that everything is working well.
-
-
-function test() : String
-{
- return 10;
-}
-
-
+
+
+
+
+ SyntaxHighlighter Build Test Page
+
+
+
+
+
+
+
+
+
+
+SyntaxHihglighter Test
+This is a test file to insure that everything is working well.
+
+
+function test() : String
+{
+ return 10;
+}
+
+