$("#ray_6139").html("\n
1<\/a>
2<\/a>
3<\/a>
4<\/a>
5<\/a>
6<\/a>
7<\/a>
8<\/a>
9<\/a>
10<\/a><\/strong>
11<\/a>
12<\/a>
13<\/a>
14<\/a>
15<\/a>
16<\/a>
17<\/a>
18<\/a>
19<\/a>
20<\/a><\/strong>
21<\/a>
22<\/a>
23<\/a>
24<\/a>
25<\/a>
26<\/a>
27<\/a>
28<\/a>
29<\/a>
30<\/a><\/strong>
31<\/a>
32<\/a>
33<\/a>
34<\/a>
35<\/a>
36<\/a>
37<\/a>
38<\/a>
39<\/a>
40<\/a><\/strong>
41<\/a>
42<\/a>
43<\/a>
44<\/a>
45<\/a>
46<\/a>
47<\/a>
48<\/a>
49<\/a>
50<\/a><\/strong>
51<\/a>
52<\/a>
53<\/a>
54<\/a>
55<\/a>
56<\/a>
57<\/a>
58<\/a>
59<\/a>
60<\/a><\/strong>
61<\/a>
62<\/a>
63<\/a>
64<\/a>
65<\/a>
66<\/a>
67<\/a>
68<\/a>
69<\/a>
70<\/a><\/strong>
71<\/a>
72<\/a>
73<\/a>
74<\/a>
75<\/a>
76<\/a>
77<\/a>
78<\/a>
79<\/a>
80<\/a><\/strong>
81<\/a>
82<\/a>
83<\/a>
84<\/a>
85<\/a>
86<\/a>
87<\/a>
88<\/a>
89<\/a>
90<\/a><\/strong>
91<\/a>
92<\/a>
93<\/a>
94<\/a>
95<\/a>
96<\/a>
97<\/a>
98<\/a>
99<\/a>
100<\/a><\/strong>
101<\/a>
102<\/a>
103<\/a>
104<\/a>
105<\/a>
106<\/a>
107<\/a>
108<\/a>
109<\/a>
110<\/a><\/strong>
111<\/a>
112<\/a>
113<\/a>
114<\/a>
115<\/a>
116<\/a>
117<\/a>
118<\/a>
119<\/a>
120<\/a><\/strong>
121<\/a>
122<\/a>
123<\/a>
124<\/a>
125<\/a>
126<\/a>
127<\/a>
128<\/a>
129<\/a>
130<\/a><\/strong>
131<\/a>
132<\/a>
133<\/a>
134<\/a>
135<\/a>
136<\/a>
137<\/a>
138<\/a>
139<\/a>
140<\/a><\/strong>
141<\/a>
142<\/a>
143<\/a>
144<\/a>
145<\/a>
146<\/a>
147<\/a>
148<\/a>
149<\/a>
150<\/a><\/strong>
151<\/a>
152<\/a>
153<\/a>
154<\/a>
155<\/a>
156<\/a>
157<\/a>
158<\/a>
159<\/a>
160<\/a><\/strong>
161<\/a>
162<\/a>
163<\/a>
164<\/a>
165<\/a>
166<\/a>
167<\/a>
168<\/a>
169<\/a>
170<\/a><\/strong>
171<\/a>
172<\/a>
173<\/a>
174<\/a>
175<\/a>
176<\/a>
177<\/a>
178<\/a>
179<\/a>
180<\/a><\/strong>
181<\/a>
182<\/a>
183<\/a>
184<\/a>
185<\/a>
186<\/a>
187<\/a>
188<\/a>
189<\/a>
190<\/a><\/strong>
191<\/a>
192<\/a>
193<\/a>
194<\/a>
195<\/a>
196<\/a>
197<\/a>
198<\/a>
199<\/a>
200<\/a><\/strong>
201<\/a>
202<\/a>
203<\/a>
204<\/a>
205<\/a>
206<\/a>
207<\/a>
208<\/a>
209<\/a>
210<\/a><\/strong>
211<\/a>
212<\/a>
213<\/a>
214<\/a>
215<\/a>
216<\/a>
217<\/a>
218<\/a>
219<\/a>
220<\/a><\/strong>
221<\/a>
222<\/a>
223<\/a>
224<\/a>
225<\/a>
226<\/a>
227<\/a>
228<\/a>
229<\/a>
230<\/a><\/strong>
231<\/a>
232<\/a>
233<\/a>
234<\/a>
235<\/a>
236<\/a>
237<\/a>
238<\/a>
239<\/a>
240<\/a><\/strong>
241<\/a>
242<\/a>
243<\/a>
244<\/a>
245<\/a>
246<\/a>
247<\/a>
248<\/a>
249<\/a>
250<\/a><\/strong>
251<\/a>
252<\/a>
253<\/a>
254<\/a>
255<\/a>
256<\/a>
257<\/a>
258<\/a>
259<\/a>
260<\/a><\/strong>
261<\/a>
262<\/a>
263<\/a>
264<\/a>
265<\/a>
266<\/a>
267<\/a>
268<\/a>
269<\/a>
270<\/a><\/strong>
271<\/a>
272<\/a>
273<\/a>
274<\/a>
275<\/a>
276<\/a>
277<\/a>
278<\/a>
279<\/a>
280<\/a><\/strong>
281<\/a>
282<\/a>
283<\/a>
284<\/a>
285<\/a>
286<\/a>
287<\/a>
288<\/a>
289<\/a>
290<\/a><\/strong>
291<\/a>
292<\/a>
293<\/a>
294<\/a>
295<\/a>
296<\/a>
297<\/a>
298<\/a>
299<\/a>
300<\/a><\/strong>
301<\/a>
302<\/a>
303<\/a>
304<\/a>
305<\/a>
306<\/a>
307<\/a>
308<\/a>
309<\/a>
310<\/a><\/strong>
311<\/a>
312<\/a>
313<\/a>
314<\/a>
315<\/a>
316<\/a>
317<\/a>
318<\/a>
319<\/a>
320<\/a><\/strong>
321<\/a>
322<\/a>
323<\/a>
324<\/a>
325<\/a>
326<\/a>
327<\/a>
328<\/a>
329<\/a>
330<\/a><\/strong>
331<\/a>
332<\/a>
333<\/a>
334<\/a>
335<\/a>
336<\/a>
337<\/a>
338<\/a>
339<\/a>
340<\/a><\/strong>
341<\/a>
342<\/a>
343<\/a>
344<\/a>
345<\/a>
346<\/a>
347<\/a>
348<\/a>
349<\/a>
350<\/a><\/strong>
351<\/a>
352<\/a>
353<\/a>
354<\/a>
355<\/a>
356<\/a>
357<\/a>
358<\/a>
359<\/a>
360<\/a><\/strong>
361<\/a>
362<\/a>
363<\/a>
364<\/a>
365<\/a>
366<\/a><\/pre><\/td>\n  
// Copyright (C) 2006 Google Inc.<\/span>
<\/span>//<\/span>
<\/span>// Licensed under the Apache License, Version 2.0 (the "License");<\/span>
<\/span>// you may not use this file except in compliance with the License.<\/span>
<\/span>// You may obtain a copy of the License at<\/span>
<\/span>//<\/span>
<\/span>//      http://www.apache.org/licenses/LICENSE-2.0<\/span>
<\/span>//<\/span>
<\/span>// Unless required by applicable law or agreed to in writing, software<\/span>
<\/span>// distributed under the License is distributed on an "AS IS" BASIS,<\/span>
<\/span>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<\/span>
<\/span>// See the License for the specific language governing permissions and<\/span>
<\/span>// limitations under the License.<\/span>


<\/span>/**
 * @fileoverview
 * some functions for browser-side pretty printing of code contained in html.
 *
 * 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 decent subset of Perl, but,
 * because of commenting conventions, doesn\'t work on Smalltalk, Lisp-like, or
 * CAML-like languages.
 *
 * If there\'s a language not mentioned here, then I don\'t know it, and don\'t
 * know whether it works.  If it has a C-like, Bash-like, or XML-like syntax
 * then it should work passably.
 *
 * Usage:
 * 1) include this source file in an html page via
 * <script type="text/javascript" src="/path/to/prettify.js"></script>
 * 2) define style rules.  See the example page for examples.
 * 3) mark the <pre> and <code> tags in your source with class=prettyprint.
 *    You can also use the (html deprecated) <xmp> tag, but the pretty printer
 *    needs to do more substantial DOM manipulations to support that, so some
 *    css styles may not be preserved.
 * 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.
 *
 * Change log:
 * cbeust, 2006/08/22
 *   Java annotations (start with "@") are now captured as literals ("lit")
 */<\/span>

<\/span>var<\/span> <\/span>PR_keywords<\/span> <\/span>=<\/span> <\/span>{<\/span>}<\/span>;<\/span>
<\/span>/** initialize the keyword list for our target languages. */<\/span>
<\/span>(<\/span>function<\/span> <\/span>(<\/span>)<\/span> <\/span>{<\/span>
  <\/span>var<\/span> <\/span>CPP_KEYWORDS<\/span> <\/span>=<\/span> <\/span>"<\/span>abstract bool break case catch char class const <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>const_cast continue default delete deprecated dllexport dllimport do <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>double dynamic_cast else enum explicit extern false float for friend <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>goto if inline int long mutable naked namespace new noinline noreturn <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>nothrow novtable operator private property protected public register <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>reinterpret_cast return selectany short signed sizeof static <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>static_cast struct switch template this thread throw true try typedef <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>typeid typename union unsigned using declaration, directive uuid <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>virtual void volatile while typeof<\/span>"<\/span><\/span>;<\/span>
  <\/span>var<\/span> <\/span>CSHARP_KEYWORDS<\/span> <\/span>=<\/span> <\/span>"<\/span>as base by byte checked decimal delegate descending <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>event finally fixed foreach from group implicit in interface internal <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>into is lock null object out override orderby params readonly ref sbyte <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>sealed stackalloc string select uint ulong unchecked unsafe ushort var<\/span>"<\/span><\/span>;<\/span>
  <\/span>var<\/span> <\/span>JAVA_KEYWORDS<\/span> <\/span>=<\/span> <\/span>"<\/span>package synchronized boolean implements import throws <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>instanceof transient extends final strictfp native super<\/span>"<\/span><\/span>;<\/span>
  <\/span>var<\/span> <\/span>JSCRIPT_KEYWORDS<\/span> <\/span>=<\/span> <\/span>"<\/span>debugger export function with NaN Infinity<\/span>"<\/span><\/span>;<\/span>
  <\/span>var<\/span> <\/span>PERL_KEYWORDS<\/span> <\/span>=<\/span> <\/span>"<\/span>require sub unless until use elsif BEGIN END<\/span>"<\/span><\/span>;<\/span>
  <\/span>var<\/span> <\/span>PYTHON_KEYWORDS<\/span> <\/span>=<\/span> <\/span>"<\/span>and assert def del elif except exec global lambda <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>not or pass print raise yield False True None<\/span>"<\/span><\/span>;<\/span>
  <\/span>var<\/span> <\/span>RUBY_KEYWORDS<\/span> <\/span>=<\/span> <\/span>"<\/span>then end begin rescue ensure module when undef next <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>redo retry alias defined has_many alias_method has_one belongs_to before_filter <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>after_filter<\/span>"<\/span><\/span>;<\/span> 
  <\/span>var<\/span> <\/span>SH_KEYWORDS<\/span> <\/span>=<\/span> <\/span>"<\/span>done fi test tail head grep sed seq sendmail cat through <\/span>"<\/span><\/span> <\/span>+<\/span>
    <\/span>"<\/span>cd sudo time<\/span>"<\/span><\/span>;<\/span>

  <\/span>var<\/span> <\/span>KEYWORDS<\/span> <\/span>=<\/span> <\/span>[<\/span>CPP_KEYWORDS<\/span>,<\/span> <\/span>CSHARP_KEYWORDS<\/span>,<\/span> <\/span>JAVA_KEYWORDS<\/span>,<\/span>
                  <\/span>JSCRIPT_KEYWORDS<\/span>,<\/span> <\/span>PERL_KEYWORDS<\/span>,<\/span> <\/span>PYTHON_KEYWORDS<\/span>,<\/span>
                  <\/span>RUBY_KEYWORDS<\/span>,<\/span> <\/span>SH_KEYWORDS<\/span>]<\/span>;<\/span>
  <\/span>for<\/span> <\/span>(<\/span>var<\/span> <\/span>k<\/span> <\/span>=<\/span> <\/span>0<\/span>;<\/span> <\/span>k<\/span> <\/span><<\/span> <\/span>KEYWORDS<\/span>.<\/span>length<\/span>;<\/span> <\/span>k<\/span>++<\/span>)<\/span> <\/span>{<\/span>
    <\/span>var<\/span> <\/span>kw<\/span> <\/span>=<\/span> <\/span>KEYWORDS<\/span>[<\/span>k<\/span>]<\/span>.<\/span>split<\/span>(<\/span>\'<\/span> <\/span>\'<\/span><\/span>)<\/span>;<\/span>
    <\/span>for<\/span> <\/span>(<\/span>var<\/span> <\/span>i<\/span> <\/span>=<\/span> <\/span>0<\/span>;<\/span> <\/span>i<\/span> <\/span><<\/span> <\/span>kw<\/span>.<\/span>length<\/span>;<\/span> <\/span>i<\/span>++<\/span>)<\/span> <\/span>{<\/span>
      <\/span>if<\/span> <\/span>(<\/span>kw<\/span>[<\/span>i<\/span>])<\/span> <\/span>{<\/span> <\/span>PR_keywords<\/span>[<\/span>kw<\/span>[<\/span>i<\/span>]]<\/span> <\/span>=<\/span> <\/span>true<\/span>;<\/span> <\/span>}<\/span>
    <\/span>}<\/span>
  <\/span>}<\/span>
<\/span>})<\/span>.<\/span>call<\/span>(<\/span>this<\/span>)<\/span>;<\/span>

<\/span>// token style names.  correspond to css classes<\/span>
<\/span>/** token style for a string literal */<\/span>
<\/span>var<\/span> <\/span>PR_STRING<\/span> <\/span>=<\/span> <\/span>\'<\/span>str<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for a keyword */<\/span>
<\/span>var<\/span> <\/span>PR_KEYWORD<\/span> <\/span>=<\/span> <\/span>\'<\/span>kwd<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for a comment */<\/span>
<\/span>var<\/span> <\/span>PR_COMMENT<\/span> <\/span>=<\/span> <\/span>\'<\/span>com<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for a type */<\/span>
<\/span>var<\/span> <\/span>PR_TYPE<\/span> <\/span>=<\/span> <\/span>\'<\/span>typ<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for a literal value.  e.g. 1, null, true. */<\/span>
<\/span>var<\/span> <\/span>PR_LITERAL<\/span> <\/span>=<\/span> <\/span>\'<\/span>lit<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for a punctuation string. */<\/span>
<\/span>var<\/span> <\/span>PR_PUNCTUATION<\/span> <\/span>=<\/span> <\/span>\'<\/span>pun<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for a punctuation string. */<\/span>
<\/span>var<\/span> <\/span>PR_PLAIN<\/span> <\/span>=<\/span> <\/span>\'<\/span>pln<\/span>\'<\/span><\/span>;<\/span>

<\/span>/** token style for an sgml tag. */<\/span>
<\/span>var<\/span> <\/span>PR_TAG<\/span> <\/span>=<\/span> <\/span>\'<\/span>tag<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for a markup declaration such as a DOCTYPE. */<\/span>
<\/span>var<\/span> <\/span>PR_DECLARATION<\/span> <\/span>=<\/span> <\/span>\'<\/span>dec<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for embedded source. */<\/span>
<\/span>var<\/span> <\/span>PR_SOURCE<\/span> <\/span>=<\/span> <\/span>\'<\/span>src<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for an sgml attribute name. */<\/span>
<\/span>var<\/span> <\/span>PR_ATTRIB_NAME<\/span> <\/span>=<\/span> <\/span>\'<\/span>atn<\/span>\'<\/span><\/span>;<\/span>
<\/span>/** token style for an sgml attribute value. */<\/span>
<\/span>var<\/span> <\/span>PR_ATTRIB_VALUE<\/span> <\/span>=<\/span> <\/span>\'<\/span>atv<\/span>\'<\/span><\/span>;<\/span>

<\/span>/** the number of characters between tab columns */<\/span>
<\/span>var<\/span> <\/span>PR_TAB_WIDTH<\/span> <\/span>=<\/span> <\/span>8<\/span>;<\/span>

<\/span>function<\/span> <\/span>PR_isWordChar<\/span>(<\/span>ch<\/span>)<\/span> <\/span>{<\/span>
  <\/span>return<\/span> <\/span>(<\/span>ch<\/span> <\/span>>=<\/span> <\/span>\'<\/span>a<\/span>\'<\/span><\/span> <\/span>&&<\/span> <\/span>ch<\/span> <\/span><=<\/span> <\/span>\'<\/span>z<\/span>\'<\/span><\/span>)<\/span> <\/span>||<\/span> <\/span>(<\/span>ch<\/span> <\/span>>=<\/span> <\/span>\'<\/span>A<\/span>\'<\/span><\/span> <\/span>&&<\/span> <\/span>ch<\/span> <\/span><=<\/span> <\/span>\'<\/span>Z<\/span>\'<\/span><\/span>)<\/span>;<\/span>
<\/span>}<\/span>

<\/span>function<\/span> <\/span>PR_isIE6<\/span>(<\/span>)<\/span> <\/span>{<\/span>
  <\/span>var<\/span> <\/span>isIE6<\/span> <\/span>=<\/span> <\/span>navigator<\/span> <\/span>&&<\/span> <\/span>navigator<\/span>.<\/span>userAgent<\/span>
      <\/span>&&<\/span> <\/span>/<\/span>\\b<\/span>MSIE 6<\/span>\\.<\/span>/<\/span><\/span>.<\/span>test<\/span>(<\/span>navigator<\/span>.<\/span>userAgent<\/span>)<\/span>;<\/span>
  <\/span>PR_isIE6<\/span> <\/span>=<\/span> <\/span>function<\/span> <\/span>(<\/span>)<\/span> <\/span>{<\/span> <\/span>return<\/span> <\/span>isIE6<\/span>;<\/span> <\/span>}<\/span>
  <\/span>return<\/span> <\/span>isIE6<\/span>;<\/span>
<\/span>}<\/span>

<\/span>/** Splice one array into another.
  * Like the python <code>
  * container[containerPosition:containerPosition + countReplaced] = inserted
  * </code>
  * @param {Array} inserted
  * @param {Array} container modified in place
  * @param {Number} containerPosition
  * @param {Number} countReplaced
  */<\/span>
<\/span>function<\/span> <\/span>PR_spliceArrayInto<\/span>(<\/span>
    <\/span>inserted<\/span>,<\/span> <\/span>container<\/span>,<\/span> <\/span>containerPosition<\/span>,<\/span> <\/span>countReplaced<\/span>)<\/span> <\/span>{<\/span>
  <\/span>inserted<\/span>.<\/span>unshift<\/span>(<\/span>containerPosition<\/span>,<\/span> <\/span>countReplaced<\/span> <\/span>||<\/span> <\/span>0<\/span>)<\/span>;<\/span>
  <\/span>try<\/span> <\/span>{<\/span>
    <\/span>container<\/span>.<\/span>splice<\/span>.<\/span>apply<\/span>(<\/span>container<\/span>,<\/span> <\/span>inserted<\/span>)<\/span>;<\/span>
  <\/span>}<\/span> <\/span>finally<\/span> <\/span>{<\/span>
    <\/span>inserted<\/span>.<\/span>splice<\/span>(<\/span>0<\/span>,<\/span> <\/span>2<\/span>)<\/span>;<\/span>
  <\/span>}<\/span>
<\/span>}<\/span>

<\/span>/** a set of tokens that can precede a regular expression literal in javascript.
  * 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.
  * @private
  */<\/span>
<\/span>var<\/span> <\/span>REGEXP_PRECEDER_PATTERN<\/span> <\/span>=<\/span> <\/span>(<\/span>function<\/span> <\/span>(<\/span>)<\/span> <\/span>{<\/span>
    <\/span>var<\/span> <\/span>preceders<\/span> <\/span>=<\/span> <\/span>[<\/span>
        <\/span>"<\/span>!<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>!=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>!==<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>#<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>%<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>%=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>&<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>&&<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>&&=<\/span>"<\/span><\/span>,<\/span>
        <\/span>"<\/span>&=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>(<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>*<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>*=<\/span>"<\/span><\/span>,<\/span> <\/span>/* "+", */<\/span> <\/span>"<\/span>+=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>,<\/span>"<\/span><\/span>,<\/span> <\/span>/* "-", */<\/span> <\/span>"<\/span>-=<\/span>"<\/span><\/span>,<\/span>
        <\/span>"<\/span>-><\/span>"<\/span><\/span>,<\/span> <\/span>/*".", "..", "...", handled below */<\/span> <\/span>"<\/span>/<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>/=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>:<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>::<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>;<\/span>"<\/span><\/span>,<\/span>
        <\/span>"<\/span><<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span><<<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span><<=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span><=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>==<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>===<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>><\/span>"<\/span><\/span>,<\/span>
        <\/span>"<\/span>>=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>>><\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>>>=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>>>><\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>>>>=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>?<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>@<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>[<\/span>"<\/span><\/span>,<\/span>
        <\/span>"<\/span>^<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>^=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>^^<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>^^=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>{<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>|<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>|=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>||<\/span>"<\/span><\/span>,<\/span>
        <\/span>"<\/span>||=<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>~<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>break<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>case<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>continue<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>delete<\/span>"<\/span><\/span>,<\/span>
        <\/span>"<\/span>do<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>else<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>finally<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>instanceof<\/span>"<\/span><\/span>,<\/span>
        <\/span>"<\/span>return<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>throw<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>try<\/span>"<\/span><\/span>,<\/span> <\/span>"<\/span>typeof<\/span>"<\/span><\/span>
        <\/span>]<\/span>;<\/span>
    <\/span>var<\/span> <\/span>pattern<\/span> <\/span>=<\/span> <\/span>\'<\/span>(?:<\/span>\'<\/span><\/span> <\/span>+<\/span>
      <\/span>\'<\/span>(?:(?:^|[^0-9<\/span>\\.<\/span>])<\/span>\\\\<\/span>.{1,3})|<\/span>\'<\/span><\/span> <\/span>+<\/span>  <\/span>// a dot that\'s not part of a number<\/span>
      <\/span>\'<\/span>(?:(?:^|[^<\/span>\\\\<\/span>+])<\/span>\\\\<\/span>+)|<\/span>\'<\/span><\/span> <\/span>+<\/span>  <\/span>// allow + but not ++<\/span>
      <\/span>\'<\/span>(?:(?:^|[^<\/span>\\\\<\/span>-])-)<\/span>\'<\/span><\/span>  <\/span>// allow - but not --<\/span>
      <\/span>;<\/span>
    <\/span>for<\/span> <\/span>(<\/span>var<\/span> <\/span>i<\/span> <\/span>=<\/span> <\/span>0<\/span>;<\/span> <\/span>i<\/span> <\/span><<\/span> <\/span>preceders<\/span>.<\/span>length<\/span>;<\/span> <\/span>++<\/span>i<\/span>)<\/span> <\/span>{<\/span>
      <\/span>var<\/span> <\/span>preceder<\/span> <\/span>=<\/span> <\/span>preceders<\/span>[<\/span>i<\/span>]<\/span>;<\/span>
      <\/span>if<\/span> <\/span>(<\/span>PR_isWordChar<\/span>(<\/span>preceder<\/span>.<\/span>charAt<\/span>(<\/span>0<\/span>)))<\/span> <\/span>{<\/span>
        <\/span>pattern<\/span> <\/span>+=<\/span> <\/span>\'<\/span>|<\/span>\\\\<\/span>b<\/span>\'<\/span><\/span> <\/span>+<\/span> <\/span>preceder<\/span>;<\/span>
      <\/span>}<\/span> <\/span>else<\/span> <\/span>{<\/span>
        <\/span>pattern<\/span> <\/span>+=<\/span> <\/span>\'<\/span>|<\/span>\'<\/span><\/span> <\/span>+<\/span> <\/span>preceder<\/span>.<\/span>replace<\/span>(<\/span>/<\/span>([^=<>:&])<\/span>/<\/span>g<\/span><\/span>,<\/span> <\/span>\'<\/span>\\\\<\/span>$1<\/span>\'<\/span><\/span>)<\/span>;<\/span>
      <\/span>}<\/span>
    <\/span>}<\/span>
    <\/span>pattern<\/span> <\/span>+=<\/span> <\/span>\'<\/span>|^)<\/span>\\\\<\/span>s*$<\/span>\'<\/span><\/span>;<\/span>  <\/span>// matches at end, and matches empty string<\/span>
    <\/span>return<\/span> <\/span>new<\/span> <\/span>RegExp<\/span>(<\/span>pattern<\/span>)<\/span>;<\/span>
    <\/span>// CAVEAT: this does not properly handle the case where a regular expression<\/span>
    <\/span>// immediately follows another since a regular expression may have flags<\/span>
    <\/span>// for case-sensitivity and the like.  Having regexp tokens adjacent is not<\/span>
    <\/span>// valid in any language I\'m aware of, so I\'m punting.<\/span>
    <\/span>// TODO: maybe style special characters inside a regexp as punctuation.<\/span>
  <\/span>})<\/span>(<\/span>)<\/span>;<\/span>

<\/span>// Define regexps here so that the interpreter doesn\'t have to create an object<\/span>
<\/span>// each time the function containing them is called.<\/span>
<\/span>// The language spec requires a new object created even if you don\'t access the<\/span>
<\/span>// $1 members.<\/span>
<\/span>var<\/span> <\/span>pr_amp<\/span> <\/span>=<\/span> <\/span>/<\/span>&<\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>var<\/span> <\/span>pr_lt<\/span> <\/span>=<\/span> <\/span>/<\/span><<\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>var<\/span> <\/span>pr_gt<\/span> <\/span>=<\/span> <\/span>/<\/span>><\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>var<\/span> <\/span>pr_quot<\/span> <\/span>=<\/span> <\/span>/<\/span>\\"<\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>/** like textToHtml but escapes double quotes to be attribute safe. */<\/span>
<\/span>function<\/span> <\/span>PR_attribToHtml<\/span>(<\/span>str<\/span>)<\/span> <\/span>{<\/span>
  <\/span>return<\/span> <\/span>str<\/span>.<\/span>replace<\/span>(<\/span>pr_amp<\/span>,<\/span> <\/span>\'<\/span>&amp;<\/span>\'<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_lt<\/span>,<\/span> <\/span>\'<\/span>&lt;<\/span>\'<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_gt<\/span>,<\/span> <\/span>\'<\/span>&gt;<\/span>\'<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_quot<\/span>,<\/span> <\/span>\'<\/span>&quot;<\/span>\'<\/span><\/span>)<\/span>;<\/span>
<\/span>}<\/span>

<\/span>/** escapest html special characters to html. */<\/span>
<\/span>function<\/span> <\/span>PR_textToHtml<\/span>(<\/span>str<\/span>)<\/span> <\/span>{<\/span>
  <\/span>return<\/span> <\/span>str<\/span>.<\/span>replace<\/span>(<\/span>pr_amp<\/span>,<\/span> <\/span>\'<\/span>&amp;<\/span>\'<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_lt<\/span>,<\/span> <\/span>\'<\/span>&lt;<\/span>\'<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_gt<\/span>,<\/span> <\/span>\'<\/span>&gt;<\/span>\'<\/span><\/span>)<\/span>;<\/span>
<\/span>}<\/span>


<\/span>var<\/span> <\/span>pr_ltEnt<\/span> <\/span>=<\/span> <\/span>/<\/span>&lt;<\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>var<\/span> <\/span>pr_gtEnt<\/span> <\/span>=<\/span> <\/span>/<\/span>&gt;<\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>var<\/span> <\/span>pr_aposEnt<\/span> <\/span>=<\/span> <\/span>/<\/span>&apos;<\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>var<\/span> <\/span>pr_quotEnt<\/span> <\/span>=<\/span> <\/span>/<\/span>&quot;<\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>var<\/span> <\/span>pr_ampEnt<\/span> <\/span>=<\/span> <\/span>/<\/span>&amp;<\/span>/<\/span>g<\/span><\/span>;<\/span>
<\/span>/** unescapes html to plain text. */<\/span>
<\/span>function<\/span> <\/span>PR_htmlToText<\/span>(<\/span>html<\/span>)<\/span> <\/span>{<\/span>
  <\/span>var<\/span> <\/span>pos<\/span> <\/span>=<\/span> <\/span>html<\/span>.<\/span>indexOf<\/span>(<\/span>\'<\/span>&<\/span>\'<\/span><\/span>)<\/span>;<\/span>
  <\/span>if<\/span> <\/span>(<\/span>pos<\/span> <\/span><<\/span> <\/span>0<\/span>)<\/span> <\/span>{<\/span> <\/span>return<\/span> <\/span>html<\/span>;<\/span> <\/span>}<\/span>
  <\/span>// Handle numeric entities specially.  We can\'t use functional substitution<\/span>
  <\/span>// since that doesn\'t work in older versions of Safari.<\/span>
  <\/span>// These should be rare since most browsers convert them to normal chars.<\/span>
  <\/span>for<\/span> <\/span>(--<\/span>pos<\/span>;<\/span> <\/span>(<\/span>pos<\/span> <\/span>=<\/span> <\/span>html<\/span>.<\/span>indexOf<\/span>(<\/span>\'<\/span>&#<\/span>\'<\/span><\/span>,<\/span> <\/span>pos<\/span> <\/span>+<\/span> <\/span>1<\/span>))<\/span> <\/span>>=<\/span> <\/span>0<\/span>;<\/span>)<\/span> <\/span>{<\/span>
    <\/span>var<\/span> <\/span>end<\/span> <\/span>=<\/span> <\/span>html<\/span>.<\/span>indexOf<\/span>(<\/span>\'<\/span>;<\/span>\'<\/span><\/span>,<\/span> <\/span>pos<\/span>)<\/span>;<\/span>
    <\/span>if<\/span> <\/span>(<\/span>end<\/span> <\/span>>=<\/span> <\/span>0<\/span>)<\/span> <\/span>{<\/span>
      <\/span>var<\/span> <\/span>num<\/span> <\/span>=<\/span> <\/span>html<\/span>.<\/span>substring<\/span>(<\/span>pos<\/span> <\/span>+<\/span> <\/span>3<\/span>,<\/span> <\/span>end<\/span>)<\/span>;<\/span>
      <\/span>var<\/span> <\/span>radix<\/span> <\/span>=<\/span> <\/span>10<\/span>;<\/span>
      <\/span>if<\/span> <\/span>(<\/span>num<\/span> <\/span>&&<\/span> <\/span>num<\/span>.<\/span>charAt<\/span>(<\/span>0<\/span>)<\/span> <\/span>==<\/span> <\/span>\'<\/span>x<\/span>\'<\/span><\/span>)<\/span> <\/span>{<\/span>
        <\/span>num<\/span> <\/span>=<\/span> <\/span>num<\/span>.<\/span>substring<\/span>(<\/span>1<\/span>)<\/span>;<\/span>
        <\/span>radix<\/span> <\/span>=<\/span> <\/span>16<\/span>;<\/span>
      <\/span>}<\/span>
      <\/span>var<\/span> <\/span>codePoint<\/span> <\/span>=<\/span> <\/span>parseInt<\/span>(<\/span>num<\/span>,<\/span> <\/span>radix<\/span>)<\/span>;<\/span>
      <\/span>if<\/span> <\/span>(!<\/span>isNaN<\/span>(<\/span>codePoint<\/span>))<\/span> <\/span>{<\/span>
        <\/span>html<\/span> <\/span>=<\/span> <\/span>(<\/span>html<\/span>.<\/span>substring<\/span>(<\/span>0<\/span>,<\/span> <\/span>pos<\/span>)<\/span> <\/span>+<\/span> <\/span>String<\/span>.<\/span>fromCharCode<\/span>(<\/span>codePoint<\/span>)<\/span> <\/span>+<\/span>
                <\/span>html<\/span>.<\/span>substring<\/span>(<\/span>end<\/span> <\/span>+<\/span> <\/span>1<\/span>))<\/span>;<\/span>
      <\/span>}<\/span>
    <\/span>}<\/span>
  <\/span>}<\/span>

  <\/span>return<\/span> <\/span>html<\/span>.<\/span>replace<\/span>(<\/span>pr_ltEnt<\/span>,<\/span> <\/span>\'<\/span><<\/span>\'<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_gtEnt<\/span>,<\/span> <\/span>\'<\/span>><\/span>\'<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_aposEnt<\/span>,<\/span> <\/span>"<\/span>\'<\/span>"<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_quotEnt<\/span>,<\/span> <\/span>\'<\/span>"<\/span>\'<\/span><\/span>)<\/span>
    <\/span>.<\/span>replace<\/span>(<\/span>pr_ampEnt<\/span>,<\/span> <\/span>\'<\/span>&<\/span>\'<\/span><\/span>)<\/span>;<\/span>
<\/span>}<\/span>

<\/span>/** is the given node\'s innerHTML normally unescaped? */<\/span>
<\/span>function<\/span> <\/span>PR_isRawContent<\/span>(<\/span>node<\/span>)<\/span> <\/span>{<\/span>
  <\/span>return<\/span> <\/span>\'<\/span>XMP<\/span>\'<\/span><\/span> <\/span>==<\/span> <\/span>node<\/span>.<\/span>tagName<\/span>;<\/span>
<\/span>}<\/span>

<\/span>var<\/span> <\/span>PR_innerHtmlWorks<\/span> <\/span>=<\/span> <\/span>null<\/span>;<\/span>
<\/span>function<\/span> <\/span>PR_getInnerHtml<\/span>(<\/span>node<\/span>)<\/span> <\/span>{<\/span>
  <\/span>// inner html is hopelessly broken in Safari 2.0.4 when the content is<\/span>
  <\/span>// an html description of well formed XML and the containing tag is a PRE<\/span>
  <\/span>// tag, so we detect that case and emulate innerHTML.<\/span>
  <\/span>if<\/span> <\/span>(<\/span>null<\/span> <\/span>===<\/span> <\/span>PR_innerHtmlWorks<\/span>)<\/span> <\/span>{<\/span>
    <\/span>var<\/span> <\/span>testNode<\/span> <\/span>=<\/span> <\/span>document<\/span>.<\/span>createElement<\/span>(<\/span>\'<\/span>PRE<\/span>\'<\/span><\/span>)<\/span>;<\/span>
    <\/span>testNode<\/span>.<\/span>appendChild<\/span>(<\/span>
        <\/span>document<\/span>.<\/span>createTextNode<\/span>(<\/span>\'<\/span><!DOCTYPE foo PUBLIC "foo bar"><\/span>\\n<\/span><foo /><\/span>\'<\/span><\/span>))<\/span>;<\/span>
    <\/span>PR_innerHtmlWorks<\/span> <\/span>=<\/span> <\/span>!<\/span>/<\/span><<\/span>/<\/span><\/span>.<\/span>test<\/span>(<\/span>testNode<\/span>.<\/span>innerHTML<\/span>)<\/span>;<\/span>
  <\/span>}<\/span>

  <\/span>if<\/span> <\/span>(<\/span>PR_innerHtmlWorks<\/span>)<\/span> <\/span>{<\/span>
    <\/span>var<\/span> <\/span>content<\/span> <\/span>=<\/span> <\/span>node<\/span>.<\/span>innerHTML<\/span>;<\/span>
    <\/span>// XMP tags contain unescaped entities so require special handling.<\/span>
    <\/span>if<\/span> <\/span>(<\/span>PR_isRawContent<\/span>(<\/span>node<\/span>))<\/span> <\/span>{<\/span>
      <\/span>content<\/span> <\/span>=<\/span> <\/span>PR_textToHtml<\/span>(<\/span>content<\/span>)<\/span>;<\/span>
    <\/span>}<\/span>
    <\/span>return<\/span> <\/span>content<\/span>;<\/span>
  <\/span>}<\/span>

  <\/span>var<\/span> <\/span>out<\/span> <\/span>=<\/span> <\/span>[<\/span>]<\/span>;<\/span>
  <\/span>for<\/span> <\/span>(<\/span>var<\/span> <\/span>child<\/span> <\/span>=<\/span> <\/span>node<\/span>.<\/span>firstChild<\/span>;<\/span> <\/span>child<\/span>;<\/span> <\/span>child<\/span> <\/span>=<\/span> <\/span>child<\/span>.<\/span>nextSibling<\/span>)<\/span> <\/span>{<\/span>
    <\/span>PR_normalizedHtml<\/span>(<\/span>child<\/span>,<\/span> <\/span>out<\/span>)<\/span>;<\/span>
  <\/span>}<\/span>
  <\/span>return<\/span> <\/span>out<\/span>.<\/span>join<\/span>(<\/span>\'<\/span>\'<\/span><\/span>)<\/span>;<\/span>
<\/span>}<\/span>

<\/span>/** walks the DOM returning a properly escaped version of innerHTML.
  */<\/span>
<\/span>function<\/span> <\/span>PR_normalizedHtml<\/span>(<\/span>node<\/span>,<\/span> <\/span>out<\/span>)<\/span> <\/span>{<\/span>
  <\/span>switch<\/span> <\/span>(<\/span>node<\/span>.<\/span>nodeType<\/span>)<\/span> <\/span>{<\/span>
    <\/span>case<\/span> <\/span>1<\/span>:<\/span>  <\/span>// an element<\/span>
      <\/span>var<\/span> <\/span>name<\/span> <\/span>=<\/span> <\/span>node<\/span>.<\/span>tagName<\/span>.<\/span>toLowerCase<\/span>(<\/span>)<\/span>;<\/span>
      <\/span>out<\/span>.<\/span>push<\/span>(<\/span>\'<\/span>\\074<\/span>\'<\/span><\/span>,<\/span> <\/span>name<\/span>)<\/span>;<\/span>
      <\/span>for<\/span> <\/span>(<\/span>var<\/span> <\/span>i<\/span> <\/span>=<\/span> <\/span>0<\/span>;<\/span> <\/span>i<\/span> <\/span><<\/span> <\/span>node<\/span>.<\/span>attributes<\/span>.<\/span>length<\/span>;<\/span> <\/span>++<\/span>i<\/span>)<\/span> <\/span>{<\/span>
        <\/span>var<\/span> <\/span>attr<\/span> <\/span>=<\/span> <\/span>node<\/span>.<\/span>attributes<\/span>[<\/span>i<\/span>]<\/span>;<\/span>
        <\/span>if<\/span> <\/span>(!<\/span>attr<\/span>.<\/span>specified<\/span>)<\/span> <\/span>{<\/span> <\/span>continue<\/span>;<\/span> <\/span>}<\/span>
        <\/span>out<\/span>.<\/span>push<\/span>(<\/span>\'<\/span> <\/span>\'<\/span><\/span>)<\/span>;<\/span>
        <\/span>PR_normalizedHtml<\/span>(<\/span>attr<\/span>,<\/span> <\/span>out<\/span>)<\/span>;<\/span>
      <\/span>}<\/span>
      <\/span>out<\/span>.<\/span>push<\/span>(<\/span>\'<\/span>><\/span>\'<\/span><\/span>)<\/span>;<\/span>
      <\/span>for<\/span> <\/span>(<\/span>var<\/span> <\/span>child<\/span> <\/span>=<\/span> <\/span>node<\/span>.<\/span>firstChild<\/span>;<\/span> <\/span>child<\/span>;<\/span> <\/span>child<\/span> <\/span>=<\/span> <\/span>child<\/span>.<\/span>nextSibling<\/span>)<\/span> <\/span>{<\/span>
        <\/span>PR_normalizedHtml<\/span>(<\/span>child<\/span>,<\/span> <\/span>out<\/span>)<\/span>;<\/span>
      <\/span>}<\/span>
      <\/span>if<\/span> <\/span>(<\/span>node<\/span>.<\/span>firstChild<\/span> <\/span>||<\/span> <\/span>!<\/span>/<\/span>^(?:br|link|img)$<\/span>/<\/span><\/span>.<\/span>test<\/span>(<\/span>name<\/span>))<\/span> <\/span>{<\/span>
        <\/span>out<\/span>.<\/span>push<\/span>(<\/span>\'<\/span><<\/span>\\/<\/span>\'<\/span><\/span>,<\/span> <\/span>name<\/span>,<\/span> <\/span>\'<\/span>><\/span>\'<\/span><\/span>)<\/span>;<\/span>
      <\/span>}<\/span>
      <\/span>break<\/span>;<\/span>
    <\/span>case<\/span> <\/span>2<\/span>:<\/span> <\/span>// an attribute<\/span>
      <\/span>out<\/span>.<\/span>push<\/span>(<\/span>node<\/span>.<\/span>name<\/span>.<\/span>toLowerCase<\/span>(<\/span>)<\/span>,<\/span> <\/span>\'<\/span>="<\/span>\'<\/span><\/span>,<\/span> <\/span>PR_attribToHtml<\/span>(<\/span>node<\/span>.<\/span>value<\/span>)<\/span>,<\/span> <\/span>\'<\/span>"<\/span>\'<\/span><\/span>)<\/span>;<\/span>
      <\/span>break<\/span>;<\/span>
    <\/span>case<\/span> <\/span>3<\/span>:<\/span> <\/span>case<\/span> <\/span>4<\/span>:<\/span> <\/span>// text<\/span>
      <\/span>out<\/span>.<\/span>push<\/span>(<\/span>PR_textToHtml<\/span>(<\/span>node<\/span>.<\/span>nodeValue<\/span>))<\/span>;<\/span>
      <\/span>break<\/span>;<\/span>
  <\/span>}<\/span>
<\/span>}<\/span>

<\/span>/** returns a function that expand tabs to spaces.  This function can be fed
  * successive chunks of text, and will maintain its own internal state to
  * keep track of how tabs are expanded.
  * @return {function (plainText : String) : String } a function that takes
  *   plain text and return the text with tabs expanded.
  * @private
  */<\/span>
<\/span>function<\/span> <\/span>PR_tabExpander<\/span>(<\/span>tabWidth<\/span>)<\/span> <\/span>{<\/span>
  <\/span>var<\/span> <\/span>SPACES<\/span> <\/span>=<\/span> <\/span>\'<\/span>                <\/span>\'<\/span><\/span>;<\/span>
  <\/span>var<\/span> <\/span>charInLine<\/span> <\/span>=<\/span> <\/span>0<\/span>;<\/span>

  <\/span>return<\/span> <\/span>function<\/span> <\/span>(<\/span>plainText<\/span>)<\/span> <\/span>{<\/span>
    <\/span>// walk over each character looking for tabs and newlines.<\/span>
    <\/span>// On tabs, expand them.  On newlines, reset charInLine.<\/span>
    <\/span>// Otherwise increment charInLine<\/span>
    <\/span>var<\/span> <\/span>out<\/span> <\/span>=<\/span> <\/span>null<\/span>;<\/span>
    <\/span>var<\/span> <\/span>pos<\/span> <\/span>=<\/span> <\/span>0<\/span>;<\/span>
    <\/span>for<\/span> <\/span>(<\/span>var<\/span> <\/span>i<\/span> <\/span>=<\/span> <\/span>0<\/span>,<\/span> <\/span>n<\/span> <\/span>=<\/span> <\/span>plainText<\/span>.<\/span>length<\/span>;<\/span> <\/span>i<\/span> <\/span><<\/span> <\/span>n<\/span>;<\/span> <\/span>++<\/span>i<\/span>)<\/span> <\/span>{<\/span>
      <\/span>var<\/span> <\/span>ch<\/span> <\/span>=<\/span> <\/span>plainText<\/span>.<\/span>charAt<\/span>(<\/span>i<\/span>)<\/span>;<\/span>

      <\/span>switch<\/span> <\/span>(<\/span>ch<\/span>)<\/span> <\/span>{<\/span>
        <\/span>case<\/span> <\/span>\'<\/span>\\t<\/span>\'<\/span><\/span>:<\/span>
          <\/span>if<\/span> <\/span>(!<\/span>out<\/span>)<\/span> <\/span>{<\/span> <\/span>out<\/span> <\/span>=<\/span> <\/span>[<\/span>]<\/span>;<\/span> <\/span>}<\/span>
          <\/span>out<\/span>.<\/span>push<\/span>(<\/span>plainText<\/span>.<\/span>substring<\/span>(<\/span>pos<\/span>,<\/span> <\/span>i<\/span>))<\/span>;<\/span>
          <\/span>// calculate how much space we need in front of this part<\/span>
          <\/span>// nSpaces is the amount of padding -- the number of spaces needed to<\/span>
          <\/span>// move us to the next column, where columns occur at factors of<\/span>
          <\/span>// tabWidth.<\/span>
          <\/span>var<\/span> <\/span>nSpaces<\/span> <\/span>=<\/span> <\/span>tabWidth<\/span> <\/span>-<\/span> <\/span>(<\/span>charInLine<\/span> <\/span>%<\/span> <\/span>tabWidth<\/span>)<\/span>;<\/span>
          <\/span>charInLine<\/span> <\/span>+=<\/span> <\/span>nSpaces<\/span>;<\/span>
          <\/span>for<\/span> <\/span>(;<\/span> <\/span>nSpaces<\/span> <\/span>>=<\/span> <\/span>0<\/span>;<\/span> <\/span>nSpaces<\/span> <\/span>-=<\/span> <\/span>SPACES<\/span>.<\/span>length<\/span>)<\/span> <\/span>{<\/span>
            <\/span>out<\/span>.<\/span>push<\/span>(<\/span>SPACES<\/span>.<\/span>substring<\/span>(<\/span>0<\/span>,<\/span> <\/span>nSpaces<\/span>))<\/span>;<\/span>
          <\/span>}<\/span>
          <\/span>pos<\/span> <\/span>=<\/span> <\/span>i<\/span> <\/span>+<\/span> <\/span>1<\/span>;<\/span>
          <\/span>break<\/span>;<\/span>
        <\/span>case<\/span> <\/span>\'<\/span>\\n<\/span>\'<\/span><\/span>:<\/span>
          <\/span>charInLine<\/span> <\/span>=<\/span> <\/span>0<\/span>;<\/span>
          <\/span>break<\/span>;<\/span>
        <\/span>default<\/span>:<\/span>
          <\/span>++<\/span>charInLine<\/span>;<\/span>
      <\/span>}<\/span>
    <\/span>}<\/span>
    <\/span>if<\/span> <\/span>(!<\/span>out<\/span>)<\/span> <\/span>{<\/span> <\/span>return<\/span> <\/span>plainText<\/span>;<\/span> <\/span>}<\/span>
    <\/span>out<\/span>.<\/span>push<\/span>(<\/span>plainText<\/span>.<\/span>substring<\/span>(<\/span>pos<\/span>))<\/span>;<\/span>
    <\/span>return<\/span> <\/span>out<\/span>.<\/span>join<\/span>(<\/span>\'<\/span>\'<\/span><\/span>)<\/span>;<\/span>
  <\/span>}<\/span>;<\/span>
<\/span>}<\/span>

<\/span>// The below pattern matches one of the following<\/span>
<\/span>// (1) /[^<]+/ : A run of characters other than \'<\'<\/span>
<\/span>// (2) /<!--.*?-->/: an HTML comment<\/span>
<\/span>// (3) /<!\\[CDATA\\[.*?\\]\\]>/: a cdata section<\/span>
<\/span>// (3) /<\\/?[a-zA-Z][^>]*>/ : A probably tag that should not be highlighted<\/span>
<\/span>// (4) /</ : A \'<\' that does not begin a larger chunk.  Treated as 1<\/span>
<\/span><\/pre><\/td>\n<\/tr><\/table>\n\n");