From 2c459547e60e4a486c15af16edeec769b0d50598 Mon Sep 17 00:00:00 2001 From: Dayle Rees Date: Mon, 2 Apr 2012 10:03:02 +0100 Subject: [PATCH] styling, prettyprint and layout --- bundles/docs/public/css/style.css | 65 +- bundles/docs/public/img/laravel.png | Bin 53437 -> 0 bytes bundles/docs/public/img/logoback (copy).png | Bin 10459 -> 0 bytes bundles/docs/public/img/logoback.png | Bin bundles/docs/public/img/logobackfull.png | Bin 10862 -> 0 bytes bundles/docs/public/js/modernizr-2.5.3.min.js | 0 bundles/docs/public/js/prettify.js | 1477 +++++++++++++++++ bundles/docs/routes.php | 1 + bundles/docs/views/home.blade.php | 8 +- bundles/docs/views/template.blade.php | 11 +- 10 files changed, 1550 insertions(+), 12 deletions(-) mode change 100755 => 100644 bundles/docs/public/css/style.css delete mode 100755 bundles/docs/public/img/laravel.png delete mode 100755 bundles/docs/public/img/logoback (copy).png mode change 100755 => 100644 bundles/docs/public/img/logoback.png delete mode 100755 bundles/docs/public/img/logobackfull.png mode change 100755 => 100644 bundles/docs/public/js/modernizr-2.5.3.min.js create mode 100644 bundles/docs/public/js/prettify.js diff --git a/bundles/docs/public/css/style.css b/bundles/docs/public/css/style.css old mode 100755 new mode 100644 index 63e31a62..8dc76e05 --- a/bundles/docs/public/css/style.css +++ b/bundles/docs/public/css/style.css @@ -101,6 +101,7 @@ .sidebar { width:180px; float:left; + font-size:0.9em; } .content @@ -128,7 +129,6 @@ .menu list-style-type:none; margin:0; padding:0; - font-size:0.9em; } .menu ul @@ -138,9 +138,17 @@ .menu ul margin:0; } +.menu ul li:before +{ + content:"\2013"; + text-decoration:none; + color:#777; + margin-right:0.2em; +} + pre, code { - font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; } pre @@ -150,6 +158,7 @@ pre font-size:0.8em; background-color:#f5f5f5; text-shadow:1px 1px 0 #fff; + line-height:1.7em; } code @@ -162,17 +171,61 @@ code } +/* Prettify Styles -------------- */ + +.com { + color: #93a1a1; +} +.lit { + color: #195f91; +} +.pun, .opn, .clo { + color: #93a1a1; +} +.fun { + color: #dc322f; +} +.str, .atv { + color: #D14; +} +.kwd, .linenums .tag { + color: #1e347b; +} +.typ, +.atn, +.dec, +.var { + color: teal; +} +.pln { + color: #48484c; +} + +.prettyprint +{ + padding:0; + text-shadow:1px 1px 0 #fff; +} + +.prettyprint ol +{ + color:#ccc; +} + + +/* end ------------------------ */ + @media print { - * { background: transparent !important; color: black !important; box-shadow:none !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } + * { background: transparent !important; color: black !important; box-shadow:none !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } - .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } - thead { display: table-header-group; } + thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 0.5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } -} \ No newline at end of file +} diff --git a/bundles/docs/public/img/laravel.png b/bundles/docs/public/img/laravel.png deleted file mode 100755 index 44545b2c9d0b68f176f579571f5d8a0d076f92a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53437 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�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 G@&5o48bMS5 diff --git a/bundles/docs/public/img/logoback.png b/bundles/docs/public/img/logoback.png old mode 100755 new mode 100644 diff --git a/bundles/docs/public/img/logobackfull.png b/bundles/docs/public/img/logobackfull.png deleted file mode 100755 index 1827f572fa72dc0659c54361808c10b31ff5abf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10862 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 + * For a fairly comprehensive set of languages see the + * README + * file that came with this source. At a minimum, the lexer should work on a + * number of languages including C and friends, Java, Python, Bash, SQL, HTML, + * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk + * and a subset of Perl, but, because of commenting conventions, doesn't work on + * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. + *

+ * Usage:

    + *
  1. include this source file in an html page via + * {@code } + *
  2. define style rules. See the example page for examples. + *
  3. mark the {@code
    } and {@code } tags in your source with
    + *    {@code class=prettyprint.}
    + *    You can also use the (html deprecated) {@code } tag, but the pretty
    + *    printer needs to do more substantial DOM manipulations to support that, so
    + *    some css styles may not be preserved.
    + * </ol>
    + * That's it.  I wanted to keep the API as simple as possible, so there's no
    + * need to specify which language the code is in, but if you wish, you can add
    + * another class to the {@code <pre>} or {@code <code>} element to specify the
    + * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
    + * starts with "lang-" followed by a file extension, specifies the file type.
    + * See the "lang-*.js" files in this directory for code that implements
    + * per-language file handlers.
    + * <p>
    + * Change log:<br>
    + * cbeust, 2006/08/22
    + * <blockquote>
    + *   Java annotations (start with "@") are now captured as literals ("lit")
    + * </blockquote>
    + * @requires console
    + */
    +
    +// JSLint declarations
    +/*global console, document, navigator, setTimeout, window */
    +
    +/**
    + * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
    + * UI events.
    + * If set to {@code false}, {@code prettyPrint()} is synchronous.
    + */
    +window['PR_SHOULD_USE_CONTINUATION'] = true;
    +
    +(function () {
    +  // Keyword lists for various languages.
    +  // We use things that coerce to strings to make them compact when minified
    +  // and to defeat aggressive optimizers that fold large string constants.
    +  var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
    +  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," + 
    +      "double,enum,extern,float,goto,int,long,register,short,signed,sizeof," +
    +      "static,struct,switch,typedef,union,unsigned,void,volatile"];
    +  var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
    +      "new,operator,private,protected,public,this,throw,true,try,typeof"];
    +  var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
    +      "concept,concept_map,const_cast,constexpr,decltype," +
    +      "dynamic_cast,explicit,export,friend,inline,late_check," +
    +      "mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast," +
    +      "template,typeid,typename,using,virtual,where"];
    +  var JAVA_KEYWORDS = [COMMON_KEYWORDS,
    +      "abstract,boolean,byte,extends,final,finally,implements,import," +
    +      "instanceof,null,native,package,strictfp,super,synchronized,throws," +
    +      "transient"];
    +  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
    +      "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
    +      "fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock," +
    +      "object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed," +
    +      "stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];
    +  var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
    +      "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
    +      "true,try,unless,until,when,while,yes";
    +  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
    +      "debugger,eval,export,function,get,null,set,undefined,var,with," +
    +      "Infinity,NaN"];
    +  var PERL_KEYWORDS = "caller,delete,die,do,dump,elsif,eval,exit,foreach,for," +
    +      "goto,if,import,last,local,my,next,no,our,print,package,redo,require," +
    +      "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
    +  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
    +      "elif,except,exec,finally,from,global,import,in,is,lambda," +
    +      "nonlocal,not,or,pass,print,raise,try,with,yield," +
    +      "False,True,None"];
    +  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
    +      "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
    +      "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
    +      "BEGIN,END"];
    +  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
    +      "function,in,local,set,then,until"];
    +  var ALL_KEYWORDS = [
    +      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +
    +      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];
    +  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;
    +
    +  // token style names.  correspond to css classes
    +  /**
    +   * token style for a string literal
    +   * @const
    +   */
    +  var PR_STRING = 'str';
    +  /**
    +   * token style for a keyword
    +   * @const
    +   */
    +  var PR_KEYWORD = 'kwd';
    +  /**
    +   * token style for a comment
    +   * @const
    +   */
    +  var PR_COMMENT = 'com';
    +  /**
    +   * token style for a type
    +   * @const
    +   */
    +  var PR_TYPE = 'typ';
    +  /**
    +   * token style for a literal value.  e.g. 1, null, true.
    +   * @const
    +   */
    +  var PR_LITERAL = 'lit';
    +  /**
    +   * token style for a punctuation string.
    +   * @const
    +   */
    +  var PR_PUNCTUATION = 'pun';
    +  /**
    +   * token style for a punctuation string.
    +   * @const
    +   */
    +  var PR_PLAIN = 'pln';
    +
    +  /**
    +   * token style for an sgml tag.
    +   * @const
    +   */
    +  var PR_TAG = 'tag';
    +  /**
    +   * token style for a markup declaration such as a DOCTYPE.
    +   * @const
    +   */
    +  var PR_DECLARATION = 'dec';
    +  /**
    +   * token style for embedded source.
    +   * @const
    +   */
    +  var PR_SOURCE = 'src';
    +  /**
    +   * token style for an sgml attribute name.
    +   * @const
    +   */
    +  var PR_ATTRIB_NAME = 'atn';
    +  /**
    +   * token style for an sgml attribute value.
    +   * @const
    +   */
    +  var PR_ATTRIB_VALUE = 'atv';
    +
    +  /**
    +   * A class that indicates a section of markup that is not code, e.g. to allow
    +   * embedding of line numbers within code listings.
    +   * @const
    +   */
    +  var PR_NOCODE = 'nocode';
    +
    +
    +
    +/**
    + * A set of tokens that can precede a regular expression literal in
    + * javascript
    + * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
    + * has the full list, but I've removed ones that might be problematic when
    + * seen in languages that don't support regular expression literals.
    + *
    + * <p>Specifically, I've removed any keywords that can't precede a regexp
    + * literal in a syntactically legal javascript program, and I've removed the
    + * "in" keyword since it's not a keyword in many languages, and might be used
    + * as a count of inches.
    + *
    + * <p>The link a above does not accurately describe EcmaScript rules since
    + * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
    + * very well in practice.
    + *
    + * @private
    + * @const
    + */
    +var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
    +
    +// CAVEAT: this does not properly handle the case where a regular
    +// expression immediately follows another since a regular expression may
    +// have flags for case-sensitivity and the like.  Having regexp tokens
    +// adjacent is not valid in any language I'm aware of, so I'm punting.
    +// TODO: maybe style special characters inside a regexp as punctuation.
    +
    +
    +  /**
    +   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
    +   * matches the union of the sets of strings matched by the input RegExp.
    +   * Since it matches globally, if the input strings have a start-of-input
    +   * anchor (/^.../), it is ignored for the purposes of unioning.
    +   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
    +   * @return {RegExp} a global regex.
    +   */
    +  function combinePrefixPatterns(regexs) {
    +    var capturedGroupIndex = 0;
    +  
    +    var needToFoldCase = false;
    +    var ignoreCase = false;
    +    for (var i = 0, n = regexs.length; i < n; ++i) {
    +      var regex = regexs[i];
    +      if (regex.ignoreCase) {
    +        ignoreCase = true;
    +      } else if (/[a-z]/i.test(regex.source.replace(
    +                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
    +        needToFoldCase = true;
    +        ignoreCase = false;
    +        break;
    +      }
    +    }
    +  
    +    var escapeCharToCodeUnit = {
    +      'b': 8,
    +      't': 9,
    +      'n': 0xa,
    +      'v': 0xb,
    +      'f': 0xc,
    +      'r': 0xd
    +    };
    +  
    +    function decodeEscape(charsetPart) {
    +      var cc0 = charsetPart.charCodeAt(0);
    +      if (cc0 !== 92 /* \\ */) {
    +        return cc0;
    +      }
    +      var c1 = charsetPart.charAt(1);
    +      cc0 = escapeCharToCodeUnit[c1];
    +      if (cc0) {
    +        return cc0;
    +      } else if ('0' <= c1 && c1 <= '7') {
    +        return parseInt(charsetPart.substring(1), 8);
    +      } else if (c1 === 'u' || c1 === 'x') {
    +        return parseInt(charsetPart.substring(2), 16);
    +      } else {
    +        return charsetPart.charCodeAt(1);
    +      }
    +    }
    +  
    +    function encodeEscape(charCode) {
    +      if (charCode < 0x20) {
    +        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
    +      }
    +      var ch = String.fromCharCode(charCode);
    +      if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
    +        ch = '\\' + ch;
    +      }
    +      return ch;
    +    }
    +  
    +    function caseFoldCharset(charSet) {
    +      var charsetParts = charSet.substring(1, charSet.length - 1).match(
    +          new RegExp(
    +              '\\\\u[0-9A-Fa-f]{4}'
    +              + '|\\\\x[0-9A-Fa-f]{2}'
    +              + '|\\\\[0-3][0-7]{0,2}'
    +              + '|\\\\[0-7]{1,2}'
    +              + '|\\\\[\\s\\S]'
    +              + '|-'
    +              + '|[^-\\\\]',
    +              'g'));
    +      var groups = [];
    +      var ranges = [];
    +      var inverse = charsetParts[0] === '^';
    +      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
    +        var p = charsetParts[i];
    +        if (/\\[bdsw]/i.test(p)) {  // Don't muck with named groups.
    +          groups.push(p);
    +        } else {
    +          var start = decodeEscape(p);
    +          var end;
    +          if (i + 2 < n && '-' === charsetParts[i + 1]) {
    +            end = decodeEscape(charsetParts[i + 2]);
    +            i += 2;
    +          } else {
    +            end = start;
    +          }
    +          ranges.push([start, end]);
    +          // If the range might intersect letters, then expand it.
    +          // This case handling is too simplistic.
    +          // It does not deal with non-latin case folding.
    +          // It works for latin source code identifiers though.
    +          if (!(end < 65 || start > 122)) {
    +            if (!(end < 65 || start > 90)) {
    +              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
    +            }
    +            if (!(end < 97 || start > 122)) {
    +              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
    +            }
    +          }
    +        }
    +      }
    +  
    +      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
    +      // -> [[1, 12], [14, 14], [16, 17]]
    +      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
    +      var consolidatedRanges = [];
    +      var lastRange = [NaN, NaN];
    +      for (var i = 0; i < ranges.length; ++i) {
    +        var range = ranges[i];
    +        if (range[0] <= lastRange[1] + 1) {
    +          lastRange[1] = Math.max(lastRange[1], range[1]);
    +        } else {
    +          consolidatedRanges.push(lastRange = range);
    +        }
    +      }
    +  
    +      var out = ['['];
    +      if (inverse) { out.push('^'); }
    +      out.push.apply(out, groups);
    +      for (var i = 0; i < consolidatedRanges.length; ++i) {
    +        var range = consolidatedRanges[i];
    +        out.push(encodeEscape(range[0]));
    +        if (range[1] > range[0]) {
    +          if (range[1] + 1 > range[0]) { out.push('-'); }
    +          out.push(encodeEscape(range[1]));
    +        }
    +      }
    +      out.push(']');
    +      return out.join('');
    +    }
    +  
    +    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
    +      // Split into character sets, escape sequences, punctuation strings
    +      // like ('(', '(?:', ')', '^'), and runs of characters that do not
    +      // include any of the above.
    +      var parts = regex.source.match(
    +          new RegExp(
    +              '(?:'
    +              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
    +              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
    +              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
    +              + '|\\\\[0-9]+'  // a back-reference or octal escape
    +              + '|\\\\[^ux0-9]'  // other escape sequence
    +              + '|\\(\\?[:!=]'  // start of a non-capturing group
    +              + '|[\\(\\)\\^]'  // start/emd of a group, or line start
    +              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
    +              + ')',
    +              'g'));
    +      var n = parts.length;
    +  
    +      // Maps captured group numbers to the number they will occupy in
    +      // the output or to -1 if that has not been determined, or to
    +      // undefined if they need not be capturing in the output.
    +      var capturedGroups = [];
    +  
    +      // Walk over and identify back references to build the capturedGroups
    +      // mapping.
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        var p = parts[i];
    +        if (p === '(') {
    +          // groups are 1-indexed, so max group index is count of '('
    +          ++groupIndex;
    +        } else if ('\\' === p.charAt(0)) {
    +          var decimalValue = +p.substring(1);
    +          if (decimalValue && decimalValue <= groupIndex) {
    +            capturedGroups[decimalValue] = -1;
    +          }
    +        }
    +      }
    +  
    +      // Renumber groups and reduce capturing groups to non-capturing groups
    +      // where possible.
    +      for (var i = 1; i < capturedGroups.length; ++i) {
    +        if (-1 === capturedGroups[i]) {
    +          capturedGroups[i] = ++capturedGroupIndex;
    +        }
    +      }
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        var p = parts[i];
    +        if (p === '(') {
    +          ++groupIndex;
    +          if (capturedGroups[groupIndex] === undefined) {
    +            parts[i] = '(?:';
    +          }
    +        } else if ('\\' === p.charAt(0)) {
    +          var decimalValue = +p.substring(1);
    +          if (decimalValue && decimalValue <= groupIndex) {
    +            parts[i] = '\\' + capturedGroups[groupIndex];
    +          }
    +        }
    +      }
    +  
    +      // Remove any prefix anchors so that the output will match anywhere.
    +      // ^^ really does mean an anchored match though.
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
    +      }
    +  
    +      // Expand letters to groups to handle mixing of case-sensitive and
    +      // case-insensitive patterns if necessary.
    +      if (regex.ignoreCase && needToFoldCase) {
    +        for (var i = 0; i < n; ++i) {
    +          var p = parts[i];
    +          var ch0 = p.charAt(0);
    +          if (p.length >= 2 && ch0 === '[') {
    +            parts[i] = caseFoldCharset(p);
    +          } else if (ch0 !== '\\') {
    +            // TODO: handle letters in numeric escapes.
    +            parts[i] = p.replace(
    +                /[a-zA-Z]/g,
    +                function (ch) {
    +                  var cc = ch.charCodeAt(0);
    +                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
    +                });
    +          }
    +        }
    +      }
    +  
    +      return parts.join('');
    +    }
    +  
    +    var rewritten = [];
    +    for (var i = 0, n = regexs.length; i < n; ++i) {
    +      var regex = regexs[i];
    +      if (regex.global || regex.multiline) { throw new Error('' + regex); }
    +      rewritten.push(
    +          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
    +    }
    +  
    +    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
    +  }
    +
    +
    +  /**
    +   * Split markup into a string of source code and an array mapping ranges in
    +   * that string to the text nodes in which they appear.
    +   *
    +   * <p>
    +   * The HTML DOM structure:</p>
    +   * <pre>
    +   * (Element   "p"
    +   *   (Element "b"
    +   *     (Text  "print "))       ; #1
    +   *   (Text    "'Hello '")      ; #2
    +   *   (Element "br")            ; #3
    +   *   (Text    "  + 'World';")) ; #4
    +   * </pre>
    +   * <p>
    +   * corresponds to the HTML
    +   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>
    +   *
    +   * <p>
    +   * It will produce the output:</p>
    +   * <pre>
    +   * {
    +   *   sourceCode: "print 'Hello '\n  + 'World';",
    +   *   //                 1         2
    +   *   //       012345678901234 5678901234567
    +   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]
    +   * }
    +   * </pre>
    +   * <p>
    +   * where #1 is a reference to the {@code "print "} text node above, and so
    +   * on for the other text nodes.
    +   * </p>
    +   *
    +   * <p>
    +   * The {@code} spans array is an array of pairs.  Even elements are the start
    +   * indices of substrings, and odd elements are the text nodes (or BR elements)
    +   * that contain the text for those substrings.
    +   * Substrings continue until the next index or the end of the source.
    +   * </p>
    +   *
    +   * @param {Node} node an HTML DOM subtree containing source-code.
    +   * @return {Object} source code and the text nodes in which they occur.
    +   */
    +  function extractSourceSpans(node) {
    +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
    +  
    +    var chunks = [];
    +    var length = 0;
    +    var spans = [];
    +    var k = 0;
    +  
    +    var whitespace;
    +    if (node.currentStyle) {
    +      whitespace = node.currentStyle.whiteSpace;
    +    } else if (window.getComputedStyle) {
    +      whitespace = document.defaultView.getComputedStyle(node, null)
    +          .getPropertyValue('white-space');
    +    }
    +    var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
    +  
    +    function walk(node) {
    +      switch (node.nodeType) {
    +        case 1:  // Element
    +          if (nocode.test(node.className)) { return; }
    +          for (var child = node.firstChild; child; child = child.nextSibling) {
    +            walk(child);
    +          }
    +          var nodeName = node.nodeName;
    +          if ('BR' === nodeName || 'LI' === nodeName) {
    +            chunks[k] = '\n';
    +            spans[k << 1] = length++;
    +            spans[(k++ << 1) | 1] = node;
    +          }
    +          break;
    +        case 3: case 4:  // Text
    +          var text = node.nodeValue;
    +          if (text.length) {
    +            if (!isPreformatted) {
    +              text = text.replace(/[ \t\r\n]+/g, ' ');
    +            } else {
    +              text = text.replace(/\r\n?/g, '\n');  // Normalize newlines.
    +            }
    +            // TODO: handle tabs here?
    +            chunks[k] = text;
    +            spans[k << 1] = length;
    +            length += text.length;
    +            spans[(k++ << 1) | 1] = node;
    +          }
    +          break;
    +      }
    +    }
    +  
    +    walk(node);
    +  
    +    return {
    +      sourceCode: chunks.join('').replace(/\n$/, ''),
    +      spans: spans
    +    };
    +  }
    +
    +
    +  /**
    +   * Apply the given language handler to sourceCode and add the resulting
    +   * decorations to out.
    +   * @param {number} basePos the index of sourceCode within the chunk of source
    +   *    whose decorations are already present on out.
    +   */
    +  function appendDecorations(basePos, sourceCode, langHandler, out) {
    +    if (!sourceCode) { return; }
    +    var job = {
    +      sourceCode: sourceCode,
    +      basePos: basePos
    +    };
    +    langHandler(job);
    +    out.push.apply(out, job.decorations);
    +  }
    +
    +  var notWs = /\S/;
    +
    +  /**
    +   * Given an element, if it contains only one child element and any text nodes
    +   * it contains contain only space characters, return the sole child element.
    +   * Otherwise returns undefined.
    +   * <p>
    +   * This is meant to return the CODE element in {@code <pre><code ...>} when
    +   * there is a single child element that contains all the non-space textual
    +   * content, but not to return anything where there are multiple child elements
    +   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
    +   * is textual content.
    +   */
    +  function childContentWrapper(element) {
    +    var wrapper = undefined;
    +    for (var c = element.firstChild; c; c = c.nextSibling) {
    +      var type = c.nodeType;
    +      wrapper = (type === 1)  // Element Node
    +          ? (wrapper ? element : c)
    +          : (type === 3)  // Text Node
    +          ? (notWs.test(c.nodeValue) ? element : wrapper)
    +          : wrapper;
    +    }
    +    return wrapper === element ? undefined : wrapper;
    +  }
    +
    +  /** Given triples of [style, pattern, context] returns a lexing function,
    +    * The lexing function interprets the patterns to find token boundaries and
    +    * returns a decoration list of the form
    +    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
    +    * where index_n is an index into the sourceCode, and style_n is a style
    +    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
    +    * all characters in sourceCode[index_n-1:index_n].
    +    *
    +    * The stylePatterns is a list whose elements have the form
    +    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
    +    *
    +    * Style is a style constant like PR_PLAIN, or can be a string of the
    +    * form 'lang-FOO', where FOO is a language extension describing the
    +    * language of the portion of the token in $1 after pattern executes.
    +    * E.g., if style is 'lang-lisp', and group 1 contains the text
    +    * '(hello (world))', then that portion of the token will be passed to the
    +    * registered lisp handler for formatting.
    +    * The text before and after group 1 will be restyled using this decorator
    +    * so decorators should take care that this doesn't result in infinite
    +    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
    +    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
    +    * '<script>foo()<\/script>', which would cause the current decorator to
    +    * be called with '<script>' which would not match the same rule since
    +    * group 1 must not be empty, so it would be instead styled as PR_TAG by
    +    * the generic tag rule.  The handler registered for the 'js' extension would
    +    * then be called with 'foo()', and finally, the current decorator would
    +    * be called with '<\/script>' which would not match the original rule and
    +    * so the generic tag rule would identify it as a tag.
    +    *
    +    * Pattern must only match prefixes, and if it matches a prefix, then that
    +    * match is considered a token with the same style.
    +    *
    +    * Context is applied to the last non-whitespace, non-comment token
    +    * recognized.
    +    *
    +    * Shortcut is an optional string of characters, any of which, if the first
    +    * character, gurantee that this pattern and only this pattern matches.
    +    *
    +    * @param {Array} shortcutStylePatterns patterns that always start with
    +    *   a known character.  Must have a shortcut string.
    +    * @param {Array} fallthroughStylePatterns patterns that will be tried in
    +    *   order if the shortcut ones fail.  May have shortcuts.
    +    *
    +    * @return {function (Object)} a
    +    *   function that takes source code and returns a list of decorations.
    +    */
    +  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
    +    var shortcuts = {};
    +    var tokenizer;
    +    (function () {
    +      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
    +      var allRegexs = [];
    +      var regexKeys = {};
    +      for (var i = 0, n = allPatterns.length; i < n; ++i) {
    +        var patternParts = allPatterns[i];
    +        var shortcutChars = patternParts[3];
    +        if (shortcutChars) {
    +          for (var c = shortcutChars.length; --c >= 0;) {
    +            shortcuts[shortcutChars.charAt(c)] = patternParts;
    +          }
    +        }
    +        var regex = patternParts[1];
    +        var k = '' + regex;
    +        if (!regexKeys.hasOwnProperty(k)) {
    +          allRegexs.push(regex);
    +          regexKeys[k] = null;
    +        }
    +      }
    +      allRegexs.push(/[\0-\uffff]/);
    +      tokenizer = combinePrefixPatterns(allRegexs);
    +    })();
    +
    +    var nPatterns = fallthroughStylePatterns.length;
    +
    +    /**
    +     * Lexes job.sourceCode and produces an output array job.decorations of
    +     * style classes preceded by the position at which they start in
    +     * job.sourceCode in order.
    +     *
    +     * @param {Object} job an object like <pre>{
    +     *    sourceCode: {string} sourceText plain text,
    +     *    basePos: {int} position of job.sourceCode in the larger chunk of
    +     *        sourceCode.
    +     * }</pre>
    +     */
    +    var decorate = function (job) {
    +      var sourceCode = job.sourceCode, basePos = job.basePos;
    +      /** Even entries are positions in source in ascending order.  Odd enties
    +        * are style markers (e.g., PR_COMMENT) that run from that position until
    +        * the end.
    +        * @type {Array.<number|string>}
    +        */
    +      var decorations = [basePos, PR_PLAIN];
    +      var pos = 0;  // index into sourceCode
    +      var tokens = sourceCode.match(tokenizer) || [];
    +      var styleCache = {};
    +
    +      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
    +        var token = tokens[ti];
    +        var style = styleCache[token];
    +        var match = void 0;
    +
    +        var isEmbedded;
    +        if (typeof style === 'string') {
    +          isEmbedded = false;
    +        } else {
    +          var patternParts = shortcuts[token.charAt(0)];
    +          if (patternParts) {
    +            match = token.match(patternParts[1]);
    +            style = patternParts[0];
    +          } else {
    +            for (var i = 0; i < nPatterns; ++i) {
    +              patternParts = fallthroughStylePatterns[i];
    +              match = token.match(patternParts[1]);
    +              if (match) {
    +                style = patternParts[0];
    +                break;
    +              }
    +            }
    +
    +            if (!match) {  // make sure that we make progress
    +              style = PR_PLAIN;
    +            }
    +          }
    +
    +          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
    +          if (isEmbedded && !(match && typeof match[1] === 'string')) {
    +            isEmbedded = false;
    +            style = PR_SOURCE;
    +          }
    +
    +          if (!isEmbedded) { styleCache[token] = style; }
    +        }
    +
    +        var tokenStart = pos;
    +        pos += token.length;
    +
    +        if (!isEmbedded) {
    +          decorations.push(basePos + tokenStart, style);
    +        } else {  // Treat group 1 as an embedded block of source code.
    +          var embeddedSource = match[1];
    +          var embeddedSourceStart = token.indexOf(embeddedSource);
    +          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
    +          if (match[2]) {
    +            // If embeddedSource can be blank, then it would match at the
    +            // beginning which would cause us to infinitely recurse on the
    +            // entire token, so we catch the right context in match[2].
    +            embeddedSourceEnd = token.length - match[2].length;
    +            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
    +          }
    +          var lang = style.substring(5);
    +          // Decorate the left of the embedded source
    +          appendDecorations(
    +              basePos + tokenStart,
    +              token.substring(0, embeddedSourceStart),
    +              decorate, decorations);
    +          // Decorate the embedded source
    +          appendDecorations(
    +              basePos + tokenStart + embeddedSourceStart,
    +              embeddedSource,
    +              langHandlerForExtension(lang, embeddedSource),
    +              decorations);
    +          // Decorate the right of the embedded section
    +          appendDecorations(
    +              basePos + tokenStart + embeddedSourceEnd,
    +              token.substring(embeddedSourceEnd),
    +              decorate, decorations);
    +        }
    +      }
    +      job.decorations = decorations;
    +    };
    +    return decorate;
    +  }
    +
    +  /** returns a function that produces a list of decorations from source text.
    +    *
    +    * This code treats ", ', and ` as string delimiters, and \ as a string
    +    * escape.  It does not recognize perl's qq() style strings.
    +    * It has no special handling for double delimiter escapes as in basic, or
    +    * the tripled delimiters used in python, but should work on those regardless
    +    * although in those cases a single string literal may be broken up into
    +    * multiple adjacent string literals.
    +    *
    +    * It recognizes C, C++, and shell style comments.
    +    *
    +    * @param {Object} options a set of optional parameters.
    +    * @return {function (Object)} a function that examines the source code
    +    *     in the input job and builds the decoration list.
    +    */
    +  function sourceDecorator(options) {
    +    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
    +    if (options['tripleQuotedStrings']) {
    +      // '''multi-line-string''', 'single-line-string', and double-quoted
    +      shortcutStylePatterns.push(
    +          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
    +           null, '\'"']);
    +    } else if (options['multiLineStrings']) {
    +      // 'multi-line-string', "multi-line-string"
    +      shortcutStylePatterns.push(
    +          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
    +           null, '\'"`']);
    +    } else {
    +      // 'single-line-string', "single-line-string"
    +      shortcutStylePatterns.push(
    +          [PR_STRING,
    +           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
    +           null, '"\'']);
    +    }
    +    if (options['verbatimStrings']) {
    +      // verbatim-string-literal production from the C# grammar.  See issue 93.
    +      fallthroughStylePatterns.push(
    +          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
    +    }
    +    var hc = options['hashComments'];
    +    if (hc) {
    +      if (options['cStyleComments']) {
    +        if (hc > 1) {  // multiline hash comments
    +          shortcutStylePatterns.push(
    +              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
    +        } else {
    +          // Stop C preprocessor declarations at an unclosed open comment
    +          shortcutStylePatterns.push(
    +              [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
    +               null, '#']);
    +        }
    +        fallthroughStylePatterns.push(
    +            [PR_STRING,
    +             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
    +             null]);
    +      } else {
    +        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
    +      }
    +    }
    +    if (options['cStyleComments']) {
    +      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
    +      fallthroughStylePatterns.push(
    +          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
    +    }
    +    if (options['regexLiterals']) {
    +      /**
    +       * @const
    +       */
    +      var REGEX_LITERAL = (
    +          // A regular expression literal starts with a slash that is
    +          // not followed by * or / so that it is not confused with
    +          // comments.
    +          '/(?=[^/*])'
    +          // and then contains any number of raw characters,
    +          + '(?:[^/\\x5B\\x5C]'
    +          // escape sequences (\x5C),
    +          +    '|\\x5C[\\s\\S]'
    +          // or non-nesting character sets (\x5B\x5D);
    +          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
    +          // finally closed by a /.
    +          + '/');
    +      fallthroughStylePatterns.push(
    +          ['lang-regex',
    +           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
    +           ]);
    +    }
    +
    +    var types = options['types'];
    +    if (types) {
    +      fallthroughStylePatterns.push([PR_TYPE, types]);
    +    }
    +
    +    var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
    +    if (keywords.length) {
    +      fallthroughStylePatterns.push(
    +          [PR_KEYWORD,
    +           new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
    +           null]);
    +    }
    +
    +    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
    +    fallthroughStylePatterns.push(
    +        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
    +        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
    +        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null],
    +        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
    +        [PR_LITERAL,
    +         new RegExp(
    +             '^(?:'
    +             // A hex number
    +             + '0x[a-f0-9]+'
    +             // or an octal or decimal number,
    +             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
    +             // possibly in scientific notation
    +             + '(?:e[+\\-]?\\d+)?'
    +             + ')'
    +             // with an optional modifier like UL for unsigned long
    +             + '[a-z]*', 'i'),
    +         null, '0123456789'],
    +        // Don't treat escaped quotes in bash as starting strings.  See issue 144.
    +        [PR_PLAIN,       /^\\[\s\S]?/, null],
    +        [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null]);
    +
    +    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
    +  }
    +
    +  var decorateSource = sourceDecorator({
    +        'keywords': ALL_KEYWORDS,
    +        'hashComments': true,
    +        'cStyleComments': true,
    +        'multiLineStrings': true,
    +        'regexLiterals': true
    +      });
    +
    +  /**
    +   * Given a DOM subtree, wraps it in a list, and puts each line into its own
    +   * list item.
    +   *
    +   * @param {Node} node modified in place.  Its content is pulled into an
    +   *     HTMLOListElement, and each line is moved into a separate list item.
    +   *     This requires cloning elements, so the input might not have unique
    +   *     IDs after numbering.
    +   */
    +  function numberLines(node, opt_startLineNum) {
    +    var nocode = /(?:^|\s)nocode(?:\s|$)/;
    +    var lineBreak = /\r\n?|\n/;
    +  
    +    var document = node.ownerDocument;
    +  
    +    var whitespace;
    +    if (node.currentStyle) {
    +      whitespace = node.currentStyle.whiteSpace;
    +    } else if (window.getComputedStyle) {
    +      whitespace = document.defaultView.getComputedStyle(node, null)
    +          .getPropertyValue('white-space');
    +    }
    +    // If it's preformatted, then we need to split lines on line breaks
    +    // in addition to <BR>s.
    +    var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);
    +  
    +    var li = document.createElement('LI');
    +    while (node.firstChild) {
    +      li.appendChild(node.firstChild);
    +    }
    +    // An array of lines.  We split below, so this is initialized to one
    +    // un-split line.
    +    var listItems = [li];
    +  
    +    function walk(node) {
    +      switch (node.nodeType) {
    +        case 1:  // Element
    +          if (nocode.test(node.className)) { break; }
    +          if ('BR' === node.nodeName) {
    +            breakAfter(node);
    +            // Discard the <BR> since it is now flush against a </LI>.
    +            if (node.parentNode) {
    +              node.parentNode.removeChild(node);
    +            }
    +          } else {
    +            for (var child = node.firstChild; child; child = child.nextSibling) {
    +              walk(child);
    +            }
    +          }
    +          break;
    +        case 3: case 4:  // Text
    +          if (isPreformatted) {
    +            var text = node.nodeValue;
    +            var match = text.match(lineBreak);
    +            if (match) {
    +              var firstLine = text.substring(0, match.index);
    +              node.nodeValue = firstLine;
    +              var tail = text.substring(match.index + match[0].length);
    +              if (tail) {
    +                var parent = node.parentNode;
    +                parent.insertBefore(
    +                    document.createTextNode(tail), node.nextSibling);
    +              }
    +              breakAfter(node);
    +              if (!firstLine) {
    +                // Don't leave blank text nodes in the DOM.
    +                node.parentNode.removeChild(node);
    +              }
    +            }
    +          }
    +          break;
    +      }
    +    }
    +  
    +    // Split a line after the given node.
    +    function breakAfter(lineEndNode) {
    +      // If there's nothing to the right, then we can skip ending the line
    +      // here, and move root-wards since splitting just before an end-tag
    +      // would require us to create a bunch of empty copies.
    +      while (!lineEndNode.nextSibling) {
    +        lineEndNode = lineEndNode.parentNode;
    +        if (!lineEndNode) { return; }
    +      }
    +  
    +      function breakLeftOf(limit, copy) {
    +        // Clone shallowly if this node needs to be on both sides of the break.
    +        var rightSide = copy ? limit.cloneNode(false) : limit;
    +        var parent = limit.parentNode;
    +        if (parent) {
    +          // We clone the parent chain.
    +          // This helps us resurrect important styling elements that cross lines.
    +          // E.g. in <i>Foo<br>Bar</i>
    +          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
    +          var parentClone = breakLeftOf(parent, 1);
    +          // Move the clone and everything to the right of the original
    +          // onto the cloned parent.
    +          var next = limit.nextSibling;
    +          parentClone.appendChild(rightSide);
    +          for (var sibling = next; sibling; sibling = next) {
    +            next = sibling.nextSibling;
    +            parentClone.appendChild(sibling);
    +          }
    +        }
    +        return rightSide;
    +      }
    +  
    +      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
    +  
    +      // Walk the parent chain until we reach an unattached LI.
    +      for (var parent;
    +           // Check nodeType since IE invents document fragments.
    +           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
    +        copiedListItem = parent;
    +      }
    +      // Put it on the list of lines for later processing.
    +      listItems.push(copiedListItem);
    +    }
    +  
    +    // Split lines while there are lines left to split.
    +    for (var i = 0;  // Number of lines that have been split so far.
    +         i < listItems.length;  // length updated by breakAfter calls.
    +         ++i) {
    +      walk(listItems[i]);
    +    }
    +  
    +    // Make sure numeric indices show correctly.
    +    if (opt_startLineNum === (opt_startLineNum|0)) {
    +      listItems[0].setAttribute('value', opt_startLineNum);
    +    }
    +  
    +    var ol = document.createElement('OL');
    +    ol.className = 'linenums';
    +    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
    +    for (var i = 0, n = listItems.length; i < n; ++i) {
    +      li = listItems[i];
    +      // Stick a class on the LIs so that stylesheets can
    +      // color odd/even rows, or any other row pattern that
    +      // is co-prime with 10.
    +      li.className = 'L' + ((i + offset) % 10);
    +      if (!li.firstChild) {
    +        li.appendChild(document.createTextNode('\xA0'));
    +      }
    +      ol.appendChild(li);
    +    }
    +  
    +    node.appendChild(ol);
    +  }
    +
    +  /**
    +   * Breaks {@code job.sourceCode} around style boundaries in
    +   * {@code job.decorations} and modifies {@code job.sourceNode} in place.
    +   * @param {Object} job like <pre>{
    +   *    sourceCode: {string} source as plain text,
    +   *    spans: {Array.<number|Node>} alternating span start indices into source
    +   *       and the text node or element (e.g. {@code <BR>}) corresponding to that
    +   *       span.
    +   *    decorations: {Array.<number|string} an array of style classes preceded
    +   *       by the position at which they start in job.sourceCode in order
    +   * }</pre>
    +   * @private
    +   */
    +  function recombineTagsAndDecorations(job) {
    +    var isIE = /\bMSIE\b/.test(navigator.userAgent);
    +    var newlineRe = /\n/g;
    +  
    +    var source = job.sourceCode;
    +    var sourceLength = source.length;
    +    // Index into source after the last code-unit recombined.
    +    var sourceIndex = 0;
    +  
    +    var spans = job.spans;
    +    var nSpans = spans.length;
    +    // Index into spans after the last span which ends at or before sourceIndex.
    +    var spanIndex = 0;
    +  
    +    var decorations = job.decorations;
    +    var nDecorations = decorations.length;
    +    // Index into decorations after the last decoration which ends at or before
    +    // sourceIndex.
    +    var decorationIndex = 0;
    +  
    +    // Remove all zero-length decorations.
    +    decorations[nDecorations] = sourceLength;
    +    var decPos, i;
    +    for (i = decPos = 0; i < nDecorations;) {
    +      if (decorations[i] !== decorations[i + 2]) {
    +        decorations[decPos++] = decorations[i++];
    +        decorations[decPos++] = decorations[i++];
    +      } else {
    +        i += 2;
    +      }
    +    }
    +    nDecorations = decPos;
    +  
    +    // Simplify decorations.
    +    for (i = decPos = 0; i < nDecorations;) {
    +      var startPos = decorations[i];
    +      // Conflate all adjacent decorations that use the same style.
    +      var startDec = decorations[i + 1];
    +      var end = i + 2;
    +      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
    +        end += 2;
    +      }
    +      decorations[decPos++] = startPos;
    +      decorations[decPos++] = startDec;
    +      i = end;
    +    }
    +  
    +    nDecorations = decorations.length = decPos;
    +  
    +    var decoration = null;
    +    while (spanIndex < nSpans) {
    +      var spanStart = spans[spanIndex];
    +      var spanEnd = spans[spanIndex + 2] || sourceLength;
    +  
    +      var decStart = decorations[decorationIndex];
    +      var decEnd = decorations[decorationIndex + 2] || sourceLength;
    +  
    +      var end = Math.min(spanEnd, decEnd);
    +  
    +      var textNode = spans[spanIndex + 1];
    +      var styledText;
    +      if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s
    +          // Don't introduce spans around empty text nodes.
    +          && (styledText = source.substring(sourceIndex, end))) {
    +        // This may seem bizarre, and it is.  Emitting LF on IE causes the
    +        // code to display with spaces instead of line breaks.
    +        // Emitting Windows standard issue linebreaks (CRLF) causes a blank
    +        // space to appear at the beginning of every line but the first.
    +        // Emitting an old Mac OS 9 line separator makes everything spiffy.
    +        if (isIE) { styledText = styledText.replace(newlineRe, '\r'); }
    +        textNode.nodeValue = styledText;
    +        var document = textNode.ownerDocument;
    +        var span = document.createElement('SPAN');
    +        span.className = decorations[decorationIndex + 1];
    +        var parentNode = textNode.parentNode;
    +        parentNode.replaceChild(span, textNode);
    +        span.appendChild(textNode);
    +        if (sourceIndex < spanEnd) {  // Split off a text node.
    +          spans[spanIndex + 1] = textNode
    +              // TODO: Possibly optimize by using '' if there's no flicker.
    +              = document.createTextNode(source.substring(end, spanEnd));
    +          parentNode.insertBefore(textNode, span.nextSibling);
    +        }
    +      }
    +  
    +      sourceIndex = end;
    +  
    +      if (sourceIndex >= spanEnd) {
    +        spanIndex += 2;
    +      }
    +      if (sourceIndex >= decEnd) {
    +        decorationIndex += 2;
    +      }
    +    }
    +  }
    +
    +
    +  /** Maps language-specific file extensions to handlers. */
    +  var langHandlerRegistry = {};
    +  /** Register a language handler for the given file extensions.
    +    * @param {function (Object)} handler a function from source code to a list
    +    *      of decorations.  Takes a single argument job which describes the
    +    *      state of the computation.   The single parameter has the form
    +    *      {@code {
    +    *        sourceCode: {string} as plain text.
    +    *        decorations: {Array.<number|string>} an array of style classes
    +    *                     preceded by the position at which they start in
    +    *                     job.sourceCode in order.
    +    *                     The language handler should assigned this field.
    +    *        basePos: {int} the position of source in the larger source chunk.
    +    *                 All positions in the output decorations array are relative
    +    *                 to the larger source chunk.
    +    *      } }
    +    * @param {Array.<string>} fileExtensions
    +    */
    +  function registerLangHandler(handler, fileExtensions) {
    +    for (var i = fileExtensions.length; --i >= 0;) {
    +      var ext = fileExtensions[i];
    +      if (!langHandlerRegistry.hasOwnProperty(ext)) {
    +        langHandlerRegistry[ext] = handler;
    +      } else if (window['console']) {
    +        console['warn']('cannot override language handler %s', ext);
    +      }
    +    }
    +  }
    +  function langHandlerForExtension(extension, source) {
    +    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
    +      // Treat it as markup if the first non whitespace character is a < and
    +      // the last non-whitespace character is a >.
    +      extension = /^\s*</.test(source)
    +          ? 'default-markup'
    +          : 'default-code';
    +    }
    +    return langHandlerRegistry[extension];
    +  }
    +  registerLangHandler(decorateSource, ['default-code']);
    +  registerLangHandler(
    +      createSimpleLexer(
    +          [],
    +          [
    +           [PR_PLAIN,       /^[^<?]+/],
    +           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
    +           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
    +           // Unescaped content in an unknown language
    +           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    +           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    +           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
    +           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    +           // Unescaped content in javascript.  (Or possibly vbscript).
    +           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    +           // Contains unescaped stylesheet content
    +           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    +           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
    +          ]),
    +      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
    +  registerLangHandler(
    +      createSimpleLexer(
    +          [
    +           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
    +           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
    +           ],
    +          [
    +           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
    +           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
    +           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
    +           [PR_PUNCTUATION,  /^[=<>\/]+/],
    +           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
    +           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
    +           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
    +           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
    +           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
    +           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
    +           ]),
    +      ['in.tag']);
    +  registerLangHandler(
    +      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': CPP_KEYWORDS,
    +          'hashComments': true,
    +          'cStyleComments': true,
    +          'types': C_TYPES
    +        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': 'null,true,false'
    +        }), ['json']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': CSHARP_KEYWORDS,
    +          'hashComments': true,
    +          'cStyleComments': true,
    +          'verbatimStrings': true,
    +          'types': C_TYPES
    +        }), ['cs']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': JAVA_KEYWORDS,
    +          'cStyleComments': true
    +        }), ['java']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': SH_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true
    +        }), ['bsh', 'csh', 'sh']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': PYTHON_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'tripleQuotedStrings': true
    +        }), ['cv', 'py']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': PERL_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'regexLiterals': true
    +        }), ['perl', 'pl', 'pm']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': RUBY_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'regexLiterals': true
    +        }), ['rb']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': JSCRIPT_KEYWORDS,
    +          'cStyleComments': true,
    +          'regexLiterals': true
    +        }), ['js']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': COFFEE_KEYWORDS,
    +          'hashComments': 3,  // ### style block comments
    +          'cStyleComments': true,
    +          'multilineStrings': true,
    +          'tripleQuotedStrings': true,
    +          'regexLiterals': true
    +        }), ['coffee']);
    +  registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    +
    +  function applyDecorator(job) {
    +    var opt_langExtension = job.langExtension;
    +
    +    try {
    +      // Extract tags, and convert the source code to plain text.
    +      var sourceAndSpans = extractSourceSpans(job.sourceNode);
    +      /** Plain text. @type {string} */
    +      var source = sourceAndSpans.sourceCode;
    +      job.sourceCode = source;
    +      job.spans = sourceAndSpans.spans;
    +      job.basePos = 0;
    +
    +      // Apply the appropriate language handler
    +      langHandlerForExtension(opt_langExtension, source)(job);
    +
    +      // Integrate the decorations and tags back into the source code,
    +      // modifying the sourceNode in place.
    +      recombineTagsAndDecorations(job);
    +    } catch (e) {
    +      if ('console' in window) {
    +        console['log'](e && e['stack'] ? e['stack'] : e);
    +      }
    +    }
    +  }
    +
    +  /**
    +   * @param sourceCodeHtml {string} The HTML to pretty print.
    +   * @param opt_langExtension {string} The language name to use.
    +   *     Typically, a filename extension like 'cpp' or 'java'.
    +   * @param opt_numberLines {number|boolean} True to number lines,
    +   *     or the 1-indexed number of the first line in sourceCodeHtml.
    +   */
    +  function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
    +    var container = document.createElement('PRE');
    +    // This could cause images to load and onload listeners to fire.
    +    // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
    +    // We assume that the inner HTML is from a trusted source.
    +    container.innerHTML = sourceCodeHtml;
    +    if (opt_numberLines) {
    +      numberLines(container, opt_numberLines);
    +    }
    +
    +    var job = {
    +      langExtension: opt_langExtension,
    +      numberLines: opt_numberLines,
    +      sourceNode: container
    +    };
    +    applyDecorator(job);
    +    return container.innerHTML;
    +  }
    +
    +  function prettyPrint(opt_whenDone) {
    +    function byTagName(tn) { return document.getElementsByTagName(tn); }
    +    // fetch a list of nodes to rewrite
    +    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
    +    var elements = [];
    +    for (var i = 0; i < codeSegments.length; ++i) {
    +      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
    +        elements.push(codeSegments[i][j]);
    +      }
    +    }
    +    codeSegments = null;
    +
    +    var clock = Date;
    +    if (!clock['now']) {
    +      clock = { 'now': function () { return +(new Date); } };
    +    }
    +
    +    // The loop is broken into a series of continuations to make sure that we
    +    // don't make the browser unresponsive when rewriting a large page.
    +    var k = 0;
    +    var prettyPrintingJob;
    +
    +    var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
    +    var prettyPrintRe = /\bprettyprint\b/;
    +
    +    function doWork() {
    +      var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
    +                     clock['now']() + 250 /* ms */ :
    +                     Infinity);
    +      for (; k < elements.length && clock['now']() < endTime; k++) {
    +        var cs = elements[k];
    +        var className = cs.className;
    +        if (className.indexOf('prettyprint') >= 0) {
    +          // If the classes includes a language extensions, use it.
    +          // Language extensions can be specified like
    +          //     <pre class="prettyprint lang-cpp">
    +          // the language extension "cpp" is used to find a language handler as
    +          // passed to PR.registerLangHandler.
    +          // HTML5 recommends that a language be specified using "language-"
    +          // as the prefix instead.  Google Code Prettify supports both.
    +          // http://dev.w3.org/html5/spec-author-view/the-code-element.html
    +          var langExtension = className.match(langExtensionRe);
    +          // Support <pre class="prettyprint"><code class="language-c">
    +          var wrapper;
    +          if (!langExtension && (wrapper = childContentWrapper(cs))
    +              && "CODE" === wrapper.tagName) {
    +            langExtension = wrapper.className.match(langExtensionRe);
    +          }
    +
    +          if (langExtension) {
    +            langExtension = langExtension[1];
    +          }
    +
    +          // make sure this is not nested in an already prettified element
    +          var nested = false;
    +          for (var p = cs.parentNode; p; p = p.parentNode) {
    +            if ((p.tagName === 'pre' || p.tagName === 'code' ||
    +                 p.tagName === 'xmp') &&
    +                p.className && p.className.indexOf('prettyprint') >= 0) {
    +              nested = true;
    +              break;
    +            }
    +          }
    +          if (!nested) {
    +            // Look for a class like linenums or linenums:<n> where <n> is the
    +            // 1-indexed number of the first line.
    +            var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/);
    +            lineNums = lineNums
    +                  ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true
    +                  : false;
    +            if (lineNums) { numberLines(cs, lineNums); }
    +
    +            // do the pretty printing
    +            prettyPrintingJob = {
    +              langExtension: langExtension,
    +              sourceNode: cs,
    +              numberLines: lineNums
    +            };
    +            applyDecorator(prettyPrintingJob);
    +          }
    +        }
    +      }
    +      if (k < elements.length) {
    +        // finish up in a continuation
    +        setTimeout(doWork, 250);
    +      } else if (opt_whenDone) {
    +        opt_whenDone();
    +      }
    +    }
    +
    +    doWork();
    +  }
    +
    +   /**
    +    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    +    * {@code class=prettyprint} and prettify them.
    +    *
    +    * @param {Function?} opt_whenDone if specified, called when the last entry
    +    *     has been finished.
    +    */
    +  window['prettyPrintOne'] = prettyPrintOne;
    +   /**
    +    * Pretty print a chunk of code.
    +    *
    +    * @param {string} sourceCodeHtml code as html
    +    * @return {string} code as html, but prettier
    +    */
    +  window['prettyPrint'] = prettyPrint;
    +   /**
    +    * Contains functions for creating and registering new language handlers.
    +    * @type {Object}
    +    */
    +  window['PR'] = {
    +        'createSimpleLexer': createSimpleLexer,
    +        'registerLangHandler': registerLangHandler,
    +        'sourceDecorator': sourceDecorator,
    +        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
    +        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
    +        'PR_COMMENT': PR_COMMENT,
    +        'PR_DECLARATION': PR_DECLARATION,
    +        'PR_KEYWORD': PR_KEYWORD,
    +        'PR_LITERAL': PR_LITERAL,
    +        'PR_NOCODE': PR_NOCODE,
    +        'PR_PLAIN': PR_PLAIN,
    +        'PR_PUNCTUATION': PR_PUNCTUATION,
    +        'PR_SOURCE': PR_SOURCE,
    +        'PR_STRING': PR_STRING,
    +        'PR_TAG': PR_TAG,
    +        'PR_TYPE': PR_TYPE
    +      };
    +})();
    diff --git a/bundles/docs/routes.php b/bundles/docs/routes.php
    index f83ddaec..06ec77cf 100644
    --- a/bundles/docs/routes.php
    +++ b/bundles/docs/routes.php
    @@ -4,6 +4,7 @@
     {
     	Asset::add('stylesheet', 'css/style.css');
     	Asset::add('modernizr', 'js/modernizr-2.5.3.min.js');
    +	Asset::container('footer')->add('prettify', 'js/prettify.js');
     });
     
     
    diff --git a/bundles/docs/views/home.blade.php b/bundles/docs/views/home.blade.php
    index 6a2f230a..1a0cfca2 100644
    --- a/bundles/docs/views/home.blade.php
    +++ b/bundles/docs/views/home.blade.php
    @@ -10,6 +10,12 @@
     
     	<pre>APP_PATH/routes.php</pre>
     
    +<pre class="prettyprint lang-php linenums">
    +return array(
    +     'welcome' => 'Welcome to our website!',
    +);
    +</pre>
    +
     	<p>And the view sitting before you can be found at:</p>
     
     	<pre>APP_PATH/views/home/index.php</pre>
    @@ -26,4 +32,4 @@
     		<li><a href="http://forums.laravel.com">Laravel Forums</a></li>
     		<li><a href="http://github.com/laravel/laravel">GitHub Repository</a></li>
     	</ul>
    -@endsection
    \ No newline at end of file
    +@endsection
    diff --git a/bundles/docs/views/template.blade.php b/bundles/docs/views/template.blade.php
    index daa040a1..cab02147 100644
    --- a/bundles/docs/views/template.blade.php
    +++ b/bundles/docs/views/template.blade.php
    @@ -3,12 +3,12 @@
     <head>
     	<meta charset="utf-8">
     	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    -	<title></title>
    +	<title>Laravel: A Framework For Web Artisans</title>
     	<meta name="viewport" content="width=device-width">
     	{{ Asset::bundle('docs')->styles(); }}
     	{{ Asset::bundle('docs')->scripts(); }}
     </head>
    -<body>
    +<body onload="prettyPrint()">
     	<div class="wrapper">
     		<header>
     			<h1>Laravel</h1>
    @@ -25,9 +25,10 @@
     				@include('docs::menu')
     			</aside>
     			<div class="content">
    -				@yield('content')				
    +				@yield('content')
     			</div>
    -		</div>	
    +		</div>
     	</div>
    +	{{ Asset::container('footer')->bundle('docs')->scripts(); }}
     </body>
    -</html>
    \ No newline at end of file
    +</html>