~testplan-team/testplan/source-collection

« back to all changes in this revision

Viewing changes to htmlunit-2.6/src/test/resources/MochiKit/1.4.1/examples/view-source/lib/SyntaxHighlighter/shCore.js

  • Committer: edA-qa mort-ora-y
  • Date: 2010-04-07 10:54:57 UTC
  • Revision ID: eda-qa@disemia.com-20100407105457-g46bvbsrjqtjujab
updating hmltunit src

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 * Code Syntax Highlighter.
 
3
 * Version 1.3.0
 
4
 * Copyright (C) 2004 Alex Gorbatchev.
 
5
 * http://www.dreamprojections.com/syntaxhighlighter/
 
6
 * 
 
7
 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General 
 
8
 * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) 
 
9
 * any later version.
 
10
 *
 
11
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
 
12
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
 
13
 * details.
 
14
 *
 
15
 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to 
 
16
 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
 
17
 */
 
18
 
 
19
//
 
20
// create namespaces
 
21
//
 
22
var dp = {
 
23
        sh :                                    // dp.sh
 
24
        {
 
25
                Utils   : {},           // dp.sh.Utils
 
26
                Brushes : {},           // dp.sh.Brushes
 
27
                Strings : {},
 
28
                Version : '1.3.0'
 
29
        }
 
30
};
 
31
 
 
32
dp.sh.Strings = {
 
33
        AboutDialog : '<html><head><title>About...</title></head><body class="dp-about"><table cellspacing="0"><tr><td class="copy"><p class="title">dp.SyntaxHighlighter</div><div class="para">Version: {V}</p><p><a href="http://www.dreamprojections.com/syntaxhighlighter/?ref=about" target="_blank">http://www.dreamprojections.com/SyntaxHighlighter</a></p>&copy;2004-2005 Alex Gorbatchev. All right reserved.</td></tr><tr><td class="footer"><input type="button" class="close" value="OK" onClick="window.close()"/></td></tr></table></body></html>',
 
34
        
 
35
        // tools
 
36
        ExpandCode : '+ expand code',
 
37
        ViewPlain : 'view plain',
 
38
        Print : 'print',
 
39
        CopyToClipboard : 'copy to clipboard',
 
40
        About : '?',
 
41
        
 
42
        CopiedToClipboard : 'The code is in your clipboard now.'
 
43
};
 
44
 
 
45
dp.SyntaxHighlighter = dp.sh;
 
46
 
 
47
//
 
48
// Dialog and toolbar functions
 
49
//
 
50
 
 
51
dp.sh.Utils.Expand = function(sender)
 
52
{
 
53
        var table = sender;
 
54
        var span = sender;
 
55
 
 
56
        // find the span in which the text label and pipe contained so we can hide it
 
57
        while(span != null && span.tagName.toUpperCase() != 'SPAN')
 
58
                span = span.parentNode;
 
59
 
 
60
        // find the table
 
61
        while(table != null && table.tagName.toUpperCase() != 'TABLE')
 
62
                table = table.parentNode;
 
63
        
 
64
        // remove the 'expand code' button
 
65
        span.parentNode.removeChild(span);
 
66
        
 
67
        table.tBodies[0].className = 'show';
 
68
        table.parentNode.style.height = '100%'; // containing div isn't getting updated properly when the TBODY is shown
 
69
}
 
70
 
 
71
// opens a new windows and puts the original unformatted source code inside.
 
72
dp.sh.Utils.ViewSource = function(sender)
 
73
{
 
74
        var code = sender.parentNode.originalCode;
 
75
        var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=1');
 
76
        
 
77
        code = code.replace(/</g, '&lt;');
 
78
        
 
79
        wnd.document.write('<pre>' + code + '</pre>');
 
80
        wnd.document.close();
 
81
}
 
82
 
 
83
// copies the original source code in to the clipboard (IE only)
 
84
dp.sh.Utils.ToClipboard = function(sender)
 
85
{
 
86
        var code = sender.parentNode.originalCode;
 
87
        
 
88
        // This works only for IE. There's a way to make it work with Mozilla as well,
 
89
        // but it requires security settings changed on the client, which isn't by
 
90
        // default, so 99% of users won't have it working anyways.
 
91
        if(window.clipboardData)
 
92
        {
 
93
                window.clipboardData.setData('text', code);
 
94
                
 
95
                alert(dp.sh.Strings.CopiedToClipboard);
 
96
        }
 
97
}
 
98
 
 
99
// creates an invisible iframe, puts the original source code inside and prints it
 
100
dp.sh.Utils.PrintSource = function(sender)
 
101
{
 
102
        var td          = sender.parentNode;
 
103
        var code        = td.processedCode;
 
104
        var iframe      = document.createElement('IFRAME');
 
105
        var doc         = null;
 
106
        var wnd         = 
 
107
 
 
108
        // this hides the iframe
 
109
        iframe.style.cssText = 'position:absolute; width:0px; height:0px; left:-5px; top:-5px;';
 
110
        
 
111
        td.appendChild(iframe);
 
112
        
 
113
        doc = iframe.contentWindow.document;
 
114
        code = code.replace(/</g, '&lt;');
 
115
        
 
116
        doc.open();
 
117
        doc.write('<pre>' + code + '</pre>');
 
118
        doc.close();
 
119
        
 
120
        iframe.contentWindow.focus();
 
121
        iframe.contentWindow.print();
 
122
        
 
123
        td.removeChild(iframe);
 
124
}
 
125
 
 
126
dp.sh.Utils.About = function()
 
127
{
 
128
        var wnd = window.open('', '_blank', 'dialog,width=320,height=150,scrollbars=0');
 
129
        var doc = wnd.document;
 
130
        
 
131
        var styles = document.getElementsByTagName('style');
 
132
        var links = document.getElementsByTagName('link');
 
133
        
 
134
        doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version));
 
135
        
 
136
        // copy over ALL the styles from the parent page
 
137
        for(var i = 0; i < styles.length; i++)
 
138
                doc.write('<style>' + styles[i].innerHTML + '</style>');
 
139
 
 
140
        for(var i = 0; i < links.length; i++)
 
141
                if(links[i].rel.toLowerCase() == 'stylesheet')
 
142
                        doc.write('<link type="text/css" rel="stylesheet" href="' + links[i].href + '"></link>');
 
143
        
 
144
        doc.close();
 
145
        wnd.focus();
 
146
}
 
147
 
 
148
//
 
149
// Match object
 
150
//
 
151
dp.sh.Match = function(value, index, css)
 
152
{
 
153
        this.value              = value;
 
154
        this.index              = index;
 
155
        this.length             = value.length;
 
156
        this.css                = css;
 
157
}
 
158
 
 
159
//
 
160
// Highlighter object
 
161
//
 
162
dp.sh.Highlighter = function()
 
163
{
 
164
        this.addGutter = true;
 
165
        this.addControls = true;
 
166
        this.collapse = false;
 
167
        this.tabsToSpaces = true;
 
168
}
 
169
 
 
170
// static callback for the match sorting
 
171
dp.sh.Highlighter.SortCallback = function(m1, m2)
 
172
{
 
173
        // sort matches by index first
 
174
        if(m1.index < m2.index)
 
175
                return -1;
 
176
        else if(m1.index > m2.index)
 
177
                return 1;
 
178
        else
 
179
        {
 
180
                // if index is the same, sort by length
 
181
                if(m1.length < m2.length)
 
182
                        return -1;
 
183
                else if(m1.length > m2.length)
 
184
                        return 1;
 
185
        }
 
186
        return 0;
 
187
}
 
188
 
 
189
// gets a list of all matches for a given regular expression
 
190
dp.sh.Highlighter.prototype.GetMatches = function(regex, css)
 
191
{
 
192
        var index = 0;
 
193
        var match = null;
 
194
 
 
195
        while((match = regex.exec(this.code)) != null)
 
196
        {
 
197
                this.matches[this.matches.length] = new dp.sh.Match(match[0], match.index, css);
 
198
        }
 
199
}
 
200
 
 
201
dp.sh.Highlighter.prototype.AddBit = function(str, css)
 
202
{
 
203
        var span = document.createElement('span');
 
204
        
 
205
        str = str.replace(/&/g, '&amp;');
 
206
        str = str.replace(/ /g, '&nbsp;');
 
207
        str = str.replace(/</g, '&lt;');
 
208
        str = str.replace(/\n/gm, '&nbsp;<br>');
 
209
 
 
210
        // when adding a piece of code, check to see if it has line breaks in it 
 
211
        // and if it does, wrap individual line breaks with span tags
 
212
        if(css != null)
 
213
        {
 
214
                var regex = new RegExp('<br>', 'gi');
 
215
                
 
216
                if(regex.test(str))
 
217
                {
 
218
                        var lines = str.split('&nbsp;<br>');
 
219
                        
 
220
                        str = '';
 
221
                        
 
222
                        for(var i = 0; i < lines.length; i++)
 
223
                        {
 
224
                                span                    = document.createElement('SPAN');
 
225
                                span.className  = css;
 
226
                                span.innerHTML  = lines[i];
 
227
                                
 
228
                                this.div.appendChild(span);
 
229
                                
 
230
                                // don't add a <BR> for the last line
 
231
                                if(i + 1 < lines.length)
 
232
                                        this.div.appendChild(document.createElement('BR'));
 
233
                        }
 
234
                }
 
235
                else
 
236
                {
 
237
                        span.className = css;
 
238
                        span.innerHTML = str;
 
239
                        this.div.appendChild(span);
 
240
                }
 
241
        }
 
242
        else
 
243
        {
 
244
                span.innerHTML = str;
 
245
                this.div.appendChild(span);
 
246
        }
 
247
}
 
248
 
 
249
// checks if one match is inside any other match
 
250
dp.sh.Highlighter.prototype.IsInside = function(match)
 
251
{
 
252
        if(match == null || match.length == 0)
 
253
                return;
 
254
        
 
255
        for(var i = 0; i < this.matches.length; i++)
 
256
        {
 
257
                var c = this.matches[i];
 
258
                
 
259
                if(c == null)
 
260
                        continue;
 
261
                
 
262
                if((match.index > c.index) && (match.index <= c.index + c.length))
 
263
                        return true;
 
264
        }
 
265
        
 
266
        return false;
 
267
}
 
268
 
 
269
dp.sh.Highlighter.prototype.ProcessRegexList = function()
 
270
{
 
271
        for(var i = 0; i < this.regexList.length; i++)
 
272
                this.GetMatches(this.regexList[i].regex, this.regexList[i].css);
 
273
}
 
274
 
 
275
dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code)
 
276
{
 
277
        var lines       = code.split('\n');
 
278
        var result      = '';
 
279
        var tabSize     = 4;
 
280
        var tab         = '\t';
 
281
 
 
282
        // This function inserts specified amount of spaces in the string
 
283
        // where a tab is while removing that given tab. 
 
284
        function InsertSpaces(line, pos, count)
 
285
        {
 
286
                var left        = line.substr(0, pos);
 
287
                var right       = line.substr(pos + 1, line.length);    // pos + 1 will get rid of the tab
 
288
                var spaces      = '';
 
289
                
 
290
                for(var i = 0; i < count; i++)
 
291
                        spaces += ' ';
 
292
                
 
293
                return left + spaces + right;
 
294
        }
 
295
 
 
296
        // This function process one line for 'smart tabs'
 
297
        function ProcessLine(line, tabSize)
 
298
        {
 
299
                if(line.indexOf(tab) == -1)
 
300
                        return line;
 
301
 
 
302
                var pos = 0;
 
303
 
 
304
                while((pos = line.indexOf(tab)) != -1)
 
305
                {
 
306
                        // This is pretty much all there is to the 'smart tabs' logic.
 
307
                        // Based on the position within the line and size of a tab, 
 
308
                        // calculate the amount of spaces we need to insert.
 
309
                        var spaces = tabSize - pos % tabSize;
 
310
                        
 
311
                        line = InsertSpaces(line, pos, spaces);
 
312
                }
 
313
                
 
314
                return line;
 
315
        }
 
316
 
 
317
        // Go through all the lines and do the 'smart tabs' magic.
 
318
        for(var i = 0; i < lines.length; i++)
 
319
                result += ProcessLine(lines[i], tabSize) + '\n';
 
320
        
 
321
        return result;
 
322
}
 
323
 
 
324
dp.sh.Highlighter.prototype.SwitchToTable = function()
 
325
{
 
326
        // thanks to Lachlan Donald from SitePoint.com for this <br/> tag fix.
 
327
        var html        = this.div.innerHTML.replace(/<(br)\/?>/gi, '\n');
 
328
        var lines       = html.split('\n');
 
329
        var row         = null;
 
330
        var cell        = null;
 
331
        var tBody       = null;
 
332
        var html        = '';
 
333
        var pipe        = ' | ';
 
334
 
 
335
        // creates an anchor to a utility
 
336
        function UtilHref(util, text)
 
337
        {
 
338
                return '<a href="#" onclick="dp.sh.Utils.' + util + '(this); return false;">' + text + '</a>';
 
339
        }
 
340
        
 
341
        tBody = document.createElement('TBODY');        // can be created and all others go to tBodies collection.
 
342
 
 
343
        this.table.appendChild(tBody);
 
344
                
 
345
        if(this.addGutter == true)
 
346
        {
 
347
                row = tBody.insertRow(-1);
 
348
                cell = row.insertCell(-1);
 
349
                cell.className = 'tools-corner';
 
350
        }
 
351
 
 
352
        if(this.addControls == true)
 
353
        {
 
354
                var tHead = document.createElement('THEAD');    // controls will be placed in here
 
355
                this.table.appendChild(tHead);
 
356
 
 
357
                row = tHead.insertRow(-1);
 
358
 
 
359
                // add corner if there's a gutter
 
360
                if(this.addGutter == true)
 
361
                {
 
362
                        cell = row.insertCell(-1);
 
363
                        cell.className = 'tools-corner';
 
364
                }
 
365
                
 
366
                cell = row.insertCell(-1);
 
367
                
 
368
                // preserve some variables for the controls
 
369
                cell.originalCode = this.originalCode;
 
370
                cell.processedCode = this.code;
 
371
                cell.className = 'tools';
 
372
                
 
373
                if(this.collapse == true)
 
374
                {
 
375
                        tBody.className = 'hide';
 
376
                        cell.innerHTML += '<span><b>' + UtilHref('Expand', dp.sh.Strings.ExpandCode) + '</b>' + pipe + '</span>';
 
377
                }
 
378
 
 
379
                cell.innerHTML += UtilHref('ViewSource', dp.sh.Strings.ViewPlain) + pipe + UtilHref('PrintSource', dp.sh.Strings.Print);
 
380
                
 
381
                // IE has this clipboard object which is easy enough to use
 
382
                if(window.clipboardData)
 
383
                        cell.innerHTML += pipe + UtilHref('ToClipboard', dp.sh.Strings.CopyToClipboard);
 
384
                
 
385
                cell.innerHTML += pipe + UtilHref('About', dp.sh.Strings.About);
 
386
        }
 
387
 
 
388
        for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, lineIndex++)
 
389
        {
 
390
                row = tBody.insertRow(-1);
 
391
                
 
392
                if(this.addGutter == true)
 
393
                {
 
394
                        cell = row.insertCell(-1);
 
395
                        cell.className = 'gutter';
 
396
                        cell.innerHTML = lineIndex;
 
397
                }
 
398
 
 
399
                cell = row.insertCell(-1);
 
400
                cell.className = 'line' + (i % 2 + 1);          // uses .line1 and .line2 css styles for alternating lines
 
401
                cell.innerHTML = lines[i];
 
402
        }
 
403
        
 
404
        this.div.innerHTML      = '';
 
405
}
 
406
 
 
407
dp.sh.Highlighter.prototype.Highlight = function(code)
 
408
{
 
409
        function Trim(str)
 
410
        {
 
411
                return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1');
 
412
        }
 
413
        
 
414
        function Chop(str)
 
415
        {
 
416
                return str.replace(/\n*$/, '').replace(/^\n*/, '');
 
417
        }
 
418
 
 
419
        function Unindent(str)
 
420
        {
 
421
                var lines = str.split('\n');
 
422
                var indents = new Array();
 
423
                var regex = new RegExp('^\\s*', 'g');
 
424
                var min = 1000;
 
425
 
 
426
                // go through every line and check for common number of indents
 
427
                for(var i = 0; i < lines.length && min > 0; i++)
 
428
                {
 
429
                        if(Trim(lines[i]).length == 0)
 
430
                                continue;
 
431
                                
 
432
                        var matches = regex.exec(lines[i]);
 
433
 
 
434
                        if(matches != null && matches.length > 0)
 
435
                                min = Math.min(matches[0].length, min);
 
436
                }
 
437
 
 
438
                // trim minimum common number of white space from the begining of every line
 
439
                if(min > 0)
 
440
                        for(var i = 0; i < lines.length; i++)
 
441
                                lines[i] = lines[i].substr(min);
 
442
 
 
443
                return lines.join('\n');
 
444
        }
 
445
        
 
446
        // This function returns a portions of the string from pos1 to pos2 inclusive
 
447
        function Copy(string, pos1, pos2)
 
448
        {
 
449
                return string.substr(pos1, pos2 - pos1);
 
450
        }
 
451
 
 
452
        var pos = 0;
 
453
        
 
454
        this.originalCode = code;
 
455
        this.code = Chop(Unindent(code));
 
456
        this.div = document.createElement('DIV');
 
457
        this.table = document.createElement('TABLE');
 
458
        this.matches = new Array();
 
459
 
 
460
        if(this.CssClass != null)
 
461
                this.table.className = this.CssClass;
 
462
 
 
463
        // replace tabs with spaces
 
464
        if(this.tabsToSpaces == true)
 
465
                this.code = this.ProcessSmartTabs(this.code);
 
466
 
 
467
        this.table.border = 0;
 
468
        this.table.cellSpacing = 0;
 
469
        this.table.cellPadding = 0;
 
470
 
 
471
        this.ProcessRegexList();        
 
472
 
 
473
        // if no matches found, add entire code as plain text
 
474
        if(this.matches.length == 0)
 
475
        {
 
476
                this.AddBit(this.code, null);
 
477
                this.SwitchToTable();
 
478
                return;
 
479
        }
 
480
 
 
481
        // sort the matches
 
482
        this.matches = this.matches.sort(dp.sh.Highlighter.SortCallback);
 
483
 
 
484
        // The following loop checks to see if any of the matches are inside
 
485
        // of other matches. This process would get rid of highligting strings
 
486
        // inside comments, keywords inside strings and so on.
 
487
        for(var i = 0; i < this.matches.length; i++)
 
488
                if(this.IsInside(this.matches[i]))
 
489
                        this.matches[i] = null;
 
490
 
 
491
        // Finally, go through the final list of matches and pull the all
 
492
        // together adding everything in between that isn't a match.
 
493
        for(var i = 0; i < this.matches.length; i++)
 
494
        {
 
495
                var match = this.matches[i];
 
496
 
 
497
                if(match == null || match.length == 0)
 
498
                        continue;
 
499
                
 
500
                this.AddBit(Copy(this.code, pos, match.index), null);
 
501
                this.AddBit(match.value, match.css);
 
502
                
 
503
                pos = match.index + match.length;
 
504
        }
 
505
        
 
506
        this.AddBit(this.code.substr(pos), null);
 
507
 
 
508
        this.SwitchToTable();
 
509
}
 
510
 
 
511
dp.sh.Highlighter.prototype.GetKeywords = function(str) 
 
512
{
 
513
        return '\\b' + str.replace(/ /g, '\\b|\\b') + '\\b';
 
514
}
 
515
 
 
516
// highlightes all elements identified by name and gets source code from specified property
 
517
dp.sh.HighlightAll = function(name, showGutter /* optional */, showControls /* optional */, collapseAll /* optional */, firstLine /* optional */)
 
518
{
 
519
        function FindValue()
 
520
        {
 
521
                var a = arguments;
 
522
                
 
523
                for(var i = 0; i < a.length; i++)
 
524
                {
 
525
                        if(a[i] == null)
 
526
                                continue;
 
527
                                
 
528
                        if(typeof(a[i]) == 'string' && a[i] != '')
 
529
                                return a[i] + '';
 
530
                
 
531
                        if(typeof(a[i]) == 'object' && a[i].value != '')
 
532
                                return a[i].value + '';
 
533
                }
 
534
                
 
535
                return null;
 
536
        }
 
537
        
 
538
        function IsOptionSet(value, list)
 
539
        {
 
540
                for(var i = 0; i < list.length; i++)
 
541
                        if(list[i] == value)
 
542
                                return true;
 
543
                
 
544
                return false;
 
545
        }
 
546
        
 
547
        function GetOptionValue(name, list, defaultValue)
 
548
        {
 
549
                var regex = new RegExp('^' + name + '\\[(\\w+)\\]$', 'gi');
 
550
                var matches = null;
 
551
 
 
552
                for(var i = 0; i < list.length; i++)
 
553
                        if((matches = regex.exec(list[i])) != null)
 
554
                                return matches[1];
 
555
                
 
556
                return defaultValue;
 
557
        }
 
558
 
 
559
        var elements = document.getElementsByName(name);
 
560
        var highlighter = null;
 
561
        var registered = new Object();
 
562
        var propertyName = 'value';
 
563
        
 
564
        // if no code blocks found, leave
 
565
        if(elements == null)
 
566
                return;
 
567
 
 
568
        // register all brushes
 
569
        for(var brush in dp.sh.Brushes)
 
570
        {
 
571
                var aliases = dp.sh.Brushes[brush].Aliases;
 
572
                
 
573
                if(aliases == null)
 
574
                        continue;
 
575
                
 
576
                for(var i = 0; i < aliases.length; i++)
 
577
                        registered[aliases[i]] = brush;
 
578
        }
 
579
 
 
580
        for(var i = 0; i < elements.length; i++)
 
581
        {
 
582
                var element = elements[i];
 
583
                var options = FindValue(
 
584
                                element.attributes['class'], element.className, 
 
585
                                element.attributes['language'], element.language
 
586
                                );
 
587
                var language = '';
 
588
                
 
589
                if(options == null)
 
590
                        continue;
 
591
                
 
592
                options = options.split(':');
 
593
                
 
594
                language = options[0].toLowerCase();
 
595
                
 
596
                if(registered[language] == null)
 
597
                        continue;
 
598
                
 
599
                // instantiate a brush
 
600
                highlighter = new dp.sh.Brushes[registered[language]]();
 
601
                
 
602
                // hide the original element
 
603
                element.style.display = 'none';
 
604
 
 
605
                highlighter.addGutter = (showGutter == null) ? !IsOptionSet('nogutter', options) : showGutter;
 
606
                highlighter.addControls = (showControls == null) ? !IsOptionSet('nocontrols', options) : showControls;
 
607
                highlighter.collapse = (collapseAll == null) ? IsOptionSet('collapse', options) : collapseAll;
 
608
                
 
609
                // first line idea comes from Andrew Collington, thanks!
 
610
                highlighter.firstLine = (firstLine == null) ? parseInt(GetOptionValue('firstline', options, 1)) : firstLine;
 
611
 
 
612
                highlighter.Highlight(element[propertyName]);
 
613
 
 
614
                // place the result table inside a div
 
615
                var div = document.createElement('DIV');
 
616
                
 
617
                div.className = 'dp-highlighter';
 
618
                div.appendChild(highlighter.table);
 
619
 
 
620
                element.parentNode.insertBefore(div, element);          
 
621
        }       
 
622
}