codex 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +8 -0
- data/LICENSE.txt +29 -0
- data/Manifest.txt +95 -0
- data/PostInstall.txt +5 -0
- data/README.txt +31 -0
- data/Rakefile +4 -0
- data/app_generators/codex/USAGE +5 -0
- data/app_generators/codex/codex_generator.rb +106 -0
- data/app_generators/codex/templates/Rakefile +54 -0
- data/app_generators/codex/templates/bin/build_all.rb +47 -0
- data/app_generators/codex/templates/bin/postprocess_all.rb +5 -0
- data/app_generators/codex/templates/bin/pressie.rb +7 -0
- data/app_generators/codex/templates/code/control/basic_continuation.rb +11 -0
- data/app_generators/codex/templates/code/control/cc_throw_catch.rb +59 -0
- data/app_generators/codex/templates/code/control/closure_continuation.rb +8 -0
- data/app_generators/codex/templates/code/control/closure_continuation_2.rb +12 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/CSS.html +115 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/CSharp.html +134 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/CollapseCode.html +90 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Cpp.html +190 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/CrashTest.html +108 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Delphi.html +112 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/FirstLine.html +90 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Index.html +80 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Java.html +122 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/JavaScript.html +112 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/NoControls.html +89 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/NoGutter.html +89 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/PHP.html +102 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Python.html +121 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Ruby.html +131 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/SQL.html +98 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/clipboard.swf +0 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCSharp.js +32 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCpp.js +73 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushCss.js +52 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushDelphi.js +34 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushJScript.js +22 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushJava.js +28 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushPhp.js +60 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushPython.js +30 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushRuby.js +28 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushSql.js +42 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushVb.js +29 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shBrushXml.js +70 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shCore.js +414 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Scripts/shCore.uncompressed.js +674 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/ShowColumns.html +89 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/SmartTabs.html +88 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css +158 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Styles/TestPages.css +63 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/Templates/Test.dwt +80 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/VB.html +115 -0
- data/app_generators/codex/templates/dp.SyntaxHighlighter/XML.html +136 -0
- data/app_generators/codex/templates/html/all.html +0 -0
- data/app_generators/codex/templates/readme.txt +4 -0
- data/app_generators/codex/templates/slides/basics.slides +37 -0
- data/app_generators/codex/templates/slides/building.slides +27 -0
- data/app_generators/codex/templates/slides/example.slides +80 -0
- data/app_generators/codex/templates/slides/including_code.slides +80 -0
- data/app_generators/codex/templates/slides/metadata.yml +4 -0
- data/app_generators/codex/templates/slides/table_of_contents.slides +14 -0
- data/app_generators/codex/templates/ui/default/blank.gif +0 -0
- data/app_generators/codex/templates/ui/default/bodybg.gif +0 -0
- data/app_generators/codex/templates/ui/default/framing.css +23 -0
- data/app_generators/codex/templates/ui/default/iepngfix.htc +42 -0
- data/app_generators/codex/templates/ui/default/opera.css +7 -0
- data/app_generators/codex/templates/ui/default/outline.css +15 -0
- data/app_generators/codex/templates/ui/default/pretty.css +86 -0
- data/app_generators/codex/templates/ui/default/print.css +1 -0
- data/app_generators/codex/templates/ui/default/s5-core.css +9 -0
- data/app_generators/codex/templates/ui/default/slides.css +3 -0
- data/app_generators/codex/templates/ui/default/slides.js +553 -0
- data/bin/codex +17 -0
- data/codex.gemspec +30 -0
- data/config/hoe.rb +75 -0
- data/config/requirements.rb +15 -0
- data/lib/codex.rb +7 -0
- data/lib/codex/content.rb +160 -0
- data/lib/codex/pressie.rb +108 -0
- data/lib/codex/version.rb +9 -0
- data/lib/stylesheets/pressie.css +196 -0
- data/lib/stylesheets/print.css +149 -0
- data/lib/stylesheets/ruby.png +0 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +9 -0
- data/test/test_codex.rb +11 -0
- data/test/test_codex_generator.rb +78 -0
- data/test/test_generator_helper.rb +29 -0
- data/test/test_helper.rb +2 -0
- metadata +163 -0
@@ -0,0 +1,674 @@
|
|
1
|
+
/**
|
2
|
+
* Code Syntax Highlighter.
|
3
|
+
* Version 1.5
|
4
|
+
* Copyright (C) 2004-2007 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 :
|
24
|
+
{
|
25
|
+
Toolbar : {},
|
26
|
+
Utils : {},
|
27
|
+
RegexLib: {},
|
28
|
+
Brushes : {},
|
29
|
+
Strings : {
|
30
|
+
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>©2004-2007 Alex Gorbatchev.</td></tr><tr><td class="footer"><input type="button" class="close" value="OK" onClick="window.close()"/></td></tr></table></body></html>'
|
31
|
+
},
|
32
|
+
ClipboardSwf : null,
|
33
|
+
Version : '1.5'
|
34
|
+
}
|
35
|
+
};
|
36
|
+
|
37
|
+
// make an alias
|
38
|
+
dp.SyntaxHighlighter = dp.sh;
|
39
|
+
|
40
|
+
//
|
41
|
+
// Toolbar functions
|
42
|
+
//
|
43
|
+
|
44
|
+
dp.sh.Toolbar.Commands = {
|
45
|
+
ExpandSource: {
|
46
|
+
label: '+ expand source',
|
47
|
+
check: function(highlighter) { return highlighter.collapse; },
|
48
|
+
func: function(sender, highlighter)
|
49
|
+
{
|
50
|
+
sender.parentNode.removeChild(sender);
|
51
|
+
highlighter.div.className = highlighter.div.className.replace('collapsed', '');
|
52
|
+
}
|
53
|
+
},
|
54
|
+
|
55
|
+
// opens a new windows and puts the original unformatted source code inside.
|
56
|
+
ViewSource: {
|
57
|
+
label: 'view plain',
|
58
|
+
func: function(sender, highlighter)
|
59
|
+
{
|
60
|
+
var code = highlighter.originalCode.replace(/</g, '<');
|
61
|
+
var wnd = window.open('', '_blank', 'width=750, height=400, location=0, resizable=1, menubar=0, scrollbars=0');
|
62
|
+
wnd.document.write('<textarea style="width:99%;height:99%">' + code + '</textarea>');
|
63
|
+
wnd.document.close();
|
64
|
+
}
|
65
|
+
},
|
66
|
+
|
67
|
+
// Copies the original source code in to the clipboard. Uses either IE only method or Flash object if ClipboardSwf is set
|
68
|
+
CopyToClipboard: {
|
69
|
+
label: 'copy to clipboard',
|
70
|
+
check: function() { return window.clipboardData != null || dp.sh.ClipboardSwf != null; },
|
71
|
+
func: function(sender, highlighter)
|
72
|
+
{
|
73
|
+
var code = highlighter.originalCode;
|
74
|
+
|
75
|
+
if(window.clipboardData)
|
76
|
+
{
|
77
|
+
window.clipboardData.setData('text', code);
|
78
|
+
}
|
79
|
+
else if(dp.sh.ClipboardSwf != null)
|
80
|
+
{
|
81
|
+
var flashcopier = highlighter.flashCopier;
|
82
|
+
|
83
|
+
if(flashcopier == null)
|
84
|
+
{
|
85
|
+
flashcopier = document.createElement('div');
|
86
|
+
highlighter.flashCopier = flashcopier;
|
87
|
+
highlighter.div.appendChild(flashcopier);
|
88
|
+
}
|
89
|
+
|
90
|
+
flashcopier.innerHTML = '<embed src="' + dp.sh.ClipboardSwf + '" FlashVars="clipboard='+encodeURIComponent(code)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
|
91
|
+
}
|
92
|
+
|
93
|
+
alert('The code is in your clipboard now');
|
94
|
+
}
|
95
|
+
},
|
96
|
+
|
97
|
+
// creates an invisible iframe, puts the original source code inside and prints it
|
98
|
+
PrintSource: {
|
99
|
+
label: 'print',
|
100
|
+
func: function(sender, highlighter)
|
101
|
+
{
|
102
|
+
var iframe = document.createElement('IFRAME');
|
103
|
+
var doc = null;
|
104
|
+
|
105
|
+
// this hides the iframe
|
106
|
+
iframe.style.cssText = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;';
|
107
|
+
|
108
|
+
document.body.appendChild(iframe);
|
109
|
+
doc = iframe.contentWindow.document;
|
110
|
+
|
111
|
+
dp.sh.Utils.CopyStyles(doc, window.document);
|
112
|
+
doc.write('<div class="' + highlighter.div.className.replace('collapsed', '') + ' printing">' + highlighter.div.innerHTML + '</div>');
|
113
|
+
doc.close();
|
114
|
+
|
115
|
+
iframe.contentWindow.focus();
|
116
|
+
iframe.contentWindow.print();
|
117
|
+
|
118
|
+
alert('Printing...');
|
119
|
+
|
120
|
+
document.body.removeChild(iframe);
|
121
|
+
}
|
122
|
+
},
|
123
|
+
|
124
|
+
About: {
|
125
|
+
label: '?',
|
126
|
+
func: function(highlighter)
|
127
|
+
{
|
128
|
+
var wnd = window.open('', '_blank', 'dialog,width=300,height=150,scrollbars=0');
|
129
|
+
var doc = wnd.document;
|
130
|
+
|
131
|
+
dp.sh.Utils.CopyStyles(doc, window.document);
|
132
|
+
|
133
|
+
doc.write(dp.sh.Strings.AboutDialog.replace('{V}', dp.sh.Version));
|
134
|
+
doc.close();
|
135
|
+
wnd.focus();
|
136
|
+
}
|
137
|
+
}
|
138
|
+
};
|
139
|
+
|
140
|
+
// creates a <div /> with all toolbar links
|
141
|
+
dp.sh.Toolbar.Create = function(highlighter)
|
142
|
+
{
|
143
|
+
var div = document.createElement('DIV');
|
144
|
+
|
145
|
+
div.className = 'tools';
|
146
|
+
|
147
|
+
for(var name in dp.sh.Toolbar.Commands)
|
148
|
+
{
|
149
|
+
var cmd = dp.sh.Toolbar.Commands[name];
|
150
|
+
|
151
|
+
if(cmd.check != null && !cmd.check(highlighter))
|
152
|
+
continue;
|
153
|
+
|
154
|
+
div.innerHTML += '<a href="#" onclick="dp.sh.Toolbar.Command(\'' + name + '\',this);return false;">' + cmd.label + '</a>';
|
155
|
+
}
|
156
|
+
|
157
|
+
return div;
|
158
|
+
}
|
159
|
+
|
160
|
+
// executes toolbar command by name
|
161
|
+
dp.sh.Toolbar.Command = function(name, sender)
|
162
|
+
{
|
163
|
+
var n = sender;
|
164
|
+
|
165
|
+
while(n != null && n.className.indexOf('dp-highlighter') == -1)
|
166
|
+
n = n.parentNode;
|
167
|
+
|
168
|
+
if(n != null)
|
169
|
+
dp.sh.Toolbar.Commands[name].func(sender, n.highlighter);
|
170
|
+
}
|
171
|
+
|
172
|
+
// copies all <link rel="stylesheet" /> from 'target' window to 'dest'
|
173
|
+
dp.sh.Utils.CopyStyles = function(destDoc, sourceDoc)
|
174
|
+
{
|
175
|
+
var links = sourceDoc.getElementsByTagName('link');
|
176
|
+
|
177
|
+
for(var i = 0; i < links.length; i++)
|
178
|
+
if(links[i].rel.toLowerCase() == 'stylesheet')
|
179
|
+
destDoc.write('<link type="text/css" rel="stylesheet" href="' + links[i].href + '"></link>');
|
180
|
+
}
|
181
|
+
|
182
|
+
//
|
183
|
+
// Common reusable regular expressions
|
184
|
+
//
|
185
|
+
dp.sh.RegexLib = {
|
186
|
+
MultiLineCComments : new RegExp('/\\*[\\s\\S]*?\\*/', 'gm'),
|
187
|
+
SingleLineCComments : new RegExp('//.*$', 'gm'),
|
188
|
+
SingleLinePerlComments : new RegExp('#.*$', 'gm'),
|
189
|
+
DoubleQuotedString : new RegExp('"(?:\\.|(\\\\\\")|[^\\""])*"','g'),
|
190
|
+
SingleQuotedString : new RegExp("'(?:\\.|(\\\\\\')|[^\\''])*'", 'g')
|
191
|
+
};
|
192
|
+
|
193
|
+
//
|
194
|
+
// Match object
|
195
|
+
//
|
196
|
+
dp.sh.Match = function(value, index, css)
|
197
|
+
{
|
198
|
+
this.value = value;
|
199
|
+
this.index = index;
|
200
|
+
this.length = value.length;
|
201
|
+
this.css = css;
|
202
|
+
}
|
203
|
+
|
204
|
+
//
|
205
|
+
// Highlighter object
|
206
|
+
//
|
207
|
+
dp.sh.Highlighter = function()
|
208
|
+
{
|
209
|
+
this.noGutter = false;
|
210
|
+
this.addControls = true;
|
211
|
+
this.collapse = false;
|
212
|
+
this.tabsToSpaces = true;
|
213
|
+
this.wrapColumn = 80;
|
214
|
+
this.showColumns = true;
|
215
|
+
}
|
216
|
+
|
217
|
+
// static callback for the match sorting
|
218
|
+
dp.sh.Highlighter.SortCallback = function(m1, m2)
|
219
|
+
{
|
220
|
+
// sort matches by index first
|
221
|
+
if(m1.index < m2.index)
|
222
|
+
return -1;
|
223
|
+
else if(m1.index > m2.index)
|
224
|
+
return 1;
|
225
|
+
else
|
226
|
+
{
|
227
|
+
// if index is the same, sort by length
|
228
|
+
if(m1.length < m2.length)
|
229
|
+
return -1;
|
230
|
+
else if(m1.length > m2.length)
|
231
|
+
return 1;
|
232
|
+
}
|
233
|
+
return 0;
|
234
|
+
}
|
235
|
+
|
236
|
+
dp.sh.Highlighter.prototype.CreateElement = function(name)
|
237
|
+
{
|
238
|
+
var result = document.createElement(name);
|
239
|
+
result.highlighter = this;
|
240
|
+
return result;
|
241
|
+
}
|
242
|
+
|
243
|
+
// gets a list of all matches for a given regular expression
|
244
|
+
dp.sh.Highlighter.prototype.GetMatches = function(regex, css)
|
245
|
+
{
|
246
|
+
var index = 0;
|
247
|
+
var match = null;
|
248
|
+
|
249
|
+
while((match = regex.exec(this.code)) != null)
|
250
|
+
this.matches[this.matches.length] = new dp.sh.Match(match[0], match.index, css);
|
251
|
+
}
|
252
|
+
|
253
|
+
dp.sh.Highlighter.prototype.AddBit = function(str, css)
|
254
|
+
{
|
255
|
+
if(str == null || str.length == 0)
|
256
|
+
return;
|
257
|
+
|
258
|
+
var span = this.CreateElement('SPAN');
|
259
|
+
|
260
|
+
// str = str.replace(/&/g, '&');
|
261
|
+
str = str.replace(/ /g, ' ');
|
262
|
+
str = str.replace(/</g, '<');
|
263
|
+
// str = str.replace(/</g, '<');
|
264
|
+
// str = str.replace(/>/g, '>');
|
265
|
+
str = str.replace(/\n/gm, ' <br>');
|
266
|
+
|
267
|
+
// when adding a piece of code, check to see if it has line breaks in it
|
268
|
+
// and if it does, wrap individual line breaks with span tags
|
269
|
+
if(css != null)
|
270
|
+
{
|
271
|
+
if((/br/gi).test(str))
|
272
|
+
{
|
273
|
+
var lines = str.split(' <br>');
|
274
|
+
|
275
|
+
for(var i = 0; i < lines.length; i++)
|
276
|
+
{
|
277
|
+
span = this.CreateElement('SPAN');
|
278
|
+
span.className = css;
|
279
|
+
span.innerHTML = lines[i];
|
280
|
+
|
281
|
+
this.div.appendChild(span);
|
282
|
+
|
283
|
+
// don't add a <BR> for the last line
|
284
|
+
if(i + 1 < lines.length)
|
285
|
+
this.div.appendChild(this.CreateElement('BR'));
|
286
|
+
}
|
287
|
+
}
|
288
|
+
else
|
289
|
+
{
|
290
|
+
span.className = css;
|
291
|
+
span.innerHTML = str;
|
292
|
+
this.div.appendChild(span);
|
293
|
+
}
|
294
|
+
}
|
295
|
+
else
|
296
|
+
{
|
297
|
+
span.innerHTML = str;
|
298
|
+
this.div.appendChild(span);
|
299
|
+
}
|
300
|
+
}
|
301
|
+
|
302
|
+
// checks if one match is inside any other match
|
303
|
+
dp.sh.Highlighter.prototype.IsInside = function(match)
|
304
|
+
{
|
305
|
+
if(match == null || match.length == 0)
|
306
|
+
return false;
|
307
|
+
|
308
|
+
for(var i = 0; i < this.matches.length; i++)
|
309
|
+
{
|
310
|
+
var c = this.matches[i];
|
311
|
+
|
312
|
+
if(c == null)
|
313
|
+
continue;
|
314
|
+
|
315
|
+
if((match.index > c.index) && (match.index < c.index + c.length))
|
316
|
+
return true;
|
317
|
+
}
|
318
|
+
|
319
|
+
return false;
|
320
|
+
}
|
321
|
+
|
322
|
+
dp.sh.Highlighter.prototype.ProcessRegexList = function()
|
323
|
+
{
|
324
|
+
for(var i = 0; i < this.regexList.length; i++)
|
325
|
+
this.GetMatches(this.regexList[i].regex, this.regexList[i].css);
|
326
|
+
}
|
327
|
+
|
328
|
+
dp.sh.Highlighter.prototype.ProcessSmartTabs = function(code)
|
329
|
+
{
|
330
|
+
var lines = code.split('\n');
|
331
|
+
var result = '';
|
332
|
+
var tabSize = 4;
|
333
|
+
var tab = '\t';
|
334
|
+
|
335
|
+
// This function inserts specified amount of spaces in the string
|
336
|
+
// where a tab is while removing that given tab.
|
337
|
+
function InsertSpaces(line, pos, count)
|
338
|
+
{
|
339
|
+
var left = line.substr(0, pos);
|
340
|
+
var right = line.substr(pos + 1, line.length); // pos + 1 will get rid of the tab
|
341
|
+
var spaces = '';
|
342
|
+
|
343
|
+
for(var i = 0; i < count; i++)
|
344
|
+
spaces += ' ';
|
345
|
+
|
346
|
+
return left + spaces + right;
|
347
|
+
}
|
348
|
+
|
349
|
+
// This function process one line for 'smart tabs'
|
350
|
+
function ProcessLine(line, tabSize)
|
351
|
+
{
|
352
|
+
if(line.indexOf(tab) == -1)
|
353
|
+
return line;
|
354
|
+
|
355
|
+
var pos = 0;
|
356
|
+
|
357
|
+
while((pos = line.indexOf(tab)) != -1)
|
358
|
+
{
|
359
|
+
// This is pretty much all there is to the 'smart tabs' logic.
|
360
|
+
// Based on the position within the line and size of a tab,
|
361
|
+
// calculate the amount of spaces we need to insert.
|
362
|
+
var spaces = tabSize - pos % tabSize;
|
363
|
+
|
364
|
+
line = InsertSpaces(line, pos, spaces);
|
365
|
+
}
|
366
|
+
|
367
|
+
return line;
|
368
|
+
}
|
369
|
+
|
370
|
+
// Go through all the lines and do the 'smart tabs' magic.
|
371
|
+
for(var i = 0; i < lines.length; i++)
|
372
|
+
result += ProcessLine(lines[i], tabSize) + '\n';
|
373
|
+
|
374
|
+
return result;
|
375
|
+
}
|
376
|
+
|
377
|
+
dp.sh.Highlighter.prototype.SwitchToList = function()
|
378
|
+
{
|
379
|
+
// thanks to Lachlan Donald from SitePoint.com for this <br/> tag fix.
|
380
|
+
var html = this.div.innerHTML.replace(/<(br)\/?>/gi, '\n');
|
381
|
+
var lines = html.split('\n');
|
382
|
+
|
383
|
+
if(this.addControls == true)
|
384
|
+
this.bar.appendChild(dp.sh.Toolbar.Create(this));
|
385
|
+
|
386
|
+
// add columns ruler
|
387
|
+
if(this.showColumns)
|
388
|
+
{
|
389
|
+
var div = this.CreateElement('div');
|
390
|
+
var columns = this.CreateElement('div');
|
391
|
+
var showEvery = 10;
|
392
|
+
var i = 1;
|
393
|
+
|
394
|
+
while(i <= 150)
|
395
|
+
{
|
396
|
+
if(i % showEvery == 0)
|
397
|
+
{
|
398
|
+
div.innerHTML += i;
|
399
|
+
i += (i + '').length;
|
400
|
+
}
|
401
|
+
else
|
402
|
+
{
|
403
|
+
div.innerHTML += '·';
|
404
|
+
i++;
|
405
|
+
}
|
406
|
+
}
|
407
|
+
|
408
|
+
columns.className = 'columns';
|
409
|
+
columns.appendChild(div);
|
410
|
+
this.bar.appendChild(columns);
|
411
|
+
}
|
412
|
+
|
413
|
+
for(var i = 0, lineIndex = this.firstLine; i < lines.length - 1; i++, lineIndex++)
|
414
|
+
{
|
415
|
+
var li = this.CreateElement('LI');
|
416
|
+
var span = this.CreateElement('SPAN');
|
417
|
+
|
418
|
+
// uses .line1 and .line2 css styles for alternating lines
|
419
|
+
li.className = (i % 2 == 0) ? 'alt' : '';
|
420
|
+
span.innerHTML = lines[i] + ' ';
|
421
|
+
|
422
|
+
li.appendChild(span);
|
423
|
+
this.ol.appendChild(li);
|
424
|
+
}
|
425
|
+
|
426
|
+
this.div.innerHTML = '';
|
427
|
+
}
|
428
|
+
|
429
|
+
dp.sh.Highlighter.prototype.Highlight = function(code)
|
430
|
+
{
|
431
|
+
function Trim(str)
|
432
|
+
{
|
433
|
+
return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1');
|
434
|
+
}
|
435
|
+
|
436
|
+
function Chop(str)
|
437
|
+
{
|
438
|
+
return str.replace(/\n*$/, '').replace(/^\n*/, '');
|
439
|
+
}
|
440
|
+
|
441
|
+
function Unindent(str)
|
442
|
+
{
|
443
|
+
var lines = str.split('\n');
|
444
|
+
var indents = new Array();
|
445
|
+
var regex = new RegExp('^\\s*', 'g');
|
446
|
+
var min = 1000;
|
447
|
+
|
448
|
+
// go through every line and check for common number of indents
|
449
|
+
for(var i = 0; i < lines.length && min > 0; i++)
|
450
|
+
{
|
451
|
+
if(Trim(lines[i]).length == 0)
|
452
|
+
continue;
|
453
|
+
|
454
|
+
var matches = regex.exec(lines[i]);
|
455
|
+
|
456
|
+
if(matches != null && matches.length > 0)
|
457
|
+
min = Math.min(matches[0].length, min);
|
458
|
+
}
|
459
|
+
|
460
|
+
// trim minimum common number of white space from the begining of every line
|
461
|
+
if(min > 0)
|
462
|
+
for(var i = 0; i < lines.length; i++)
|
463
|
+
lines[i] = lines[i].substr(min);
|
464
|
+
|
465
|
+
return lines.join('\n');
|
466
|
+
}
|
467
|
+
|
468
|
+
// This function returns a portions of the string from pos1 to pos2 inclusive
|
469
|
+
function Copy(string, pos1, pos2)
|
470
|
+
{
|
471
|
+
return string.substr(pos1, pos2 - pos1);
|
472
|
+
}
|
473
|
+
|
474
|
+
var pos = 0;
|
475
|
+
|
476
|
+
if(code == null)
|
477
|
+
code = '';
|
478
|
+
|
479
|
+
this.originalCode = code;
|
480
|
+
this.code = Chop(Unindent(code));
|
481
|
+
this.div = this.CreateElement('DIV');
|
482
|
+
this.bar = this.CreateElement('DIV');
|
483
|
+
this.ol = this.CreateElement('OL');
|
484
|
+
this.matches = new Array();
|
485
|
+
|
486
|
+
this.div.className = 'dp-highlighter';
|
487
|
+
this.div.highlighter = this;
|
488
|
+
|
489
|
+
this.bar.className = 'bar';
|
490
|
+
|
491
|
+
// set the first line
|
492
|
+
this.ol.start = this.firstLine;
|
493
|
+
|
494
|
+
if(this.CssClass != null)
|
495
|
+
this.ol.className = this.CssClass;
|
496
|
+
|
497
|
+
if(this.collapse)
|
498
|
+
this.div.className += ' collapsed';
|
499
|
+
|
500
|
+
if(this.noGutter)
|
501
|
+
this.div.className += ' nogutter';
|
502
|
+
|
503
|
+
// replace tabs with spaces
|
504
|
+
if(this.tabsToSpaces == true)
|
505
|
+
this.code = this.ProcessSmartTabs(this.code);
|
506
|
+
|
507
|
+
this.ProcessRegexList();
|
508
|
+
|
509
|
+
// if no matches found, add entire code as plain text
|
510
|
+
if(this.matches.length == 0)
|
511
|
+
{
|
512
|
+
this.AddBit(this.code, null);
|
513
|
+
this.SwitchToList();
|
514
|
+
this.div.appendChild(this.ol);
|
515
|
+
return;
|
516
|
+
}
|
517
|
+
|
518
|
+
// sort the matches
|
519
|
+
this.matches = this.matches.sort(dp.sh.Highlighter.SortCallback);
|
520
|
+
|
521
|
+
// The following loop checks to see if any of the matches are inside
|
522
|
+
// of other matches. This process would get rid of highligted strings
|
523
|
+
// inside comments, keywords inside strings and so on.
|
524
|
+
for(var i = 0; i < this.matches.length; i++)
|
525
|
+
if(this.IsInside(this.matches[i]))
|
526
|
+
this.matches[i] = null;
|
527
|
+
|
528
|
+
// Finally, go through the final list of matches and pull the all
|
529
|
+
// together adding everything in between that isn't a match.
|
530
|
+
for(var i = 0; i < this.matches.length; i++)
|
531
|
+
{
|
532
|
+
var match = this.matches[i];
|
533
|
+
|
534
|
+
if(match == null || match.length == 0)
|
535
|
+
continue;
|
536
|
+
|
537
|
+
this.AddBit(Copy(this.code, pos, match.index), null);
|
538
|
+
this.AddBit(match.value, match.css);
|
539
|
+
|
540
|
+
pos = match.index + match.length;
|
541
|
+
}
|
542
|
+
|
543
|
+
this.AddBit(this.code.substr(pos), null);
|
544
|
+
|
545
|
+
this.SwitchToList();
|
546
|
+
this.div.appendChild(this.bar);
|
547
|
+
this.div.appendChild(this.ol);
|
548
|
+
}
|
549
|
+
|
550
|
+
dp.sh.Highlighter.prototype.GetKeywords = function(str)
|
551
|
+
{
|
552
|
+
return '\\b' + str.replace(/ /g, '\\b|\\b') + '\\b';
|
553
|
+
}
|
554
|
+
|
555
|
+
// highlightes all elements identified by name and gets source code from specified property
|
556
|
+
dp.sh.HighlightAll = function(name, showGutter /* optional */, showControls /* optional */, collapseAll /* optional */, firstLine /* optional */, showColumns /* optional */)
|
557
|
+
{
|
558
|
+
function FindValue()
|
559
|
+
{
|
560
|
+
var a = arguments;
|
561
|
+
|
562
|
+
for(var i = 0; i < a.length; i++)
|
563
|
+
{
|
564
|
+
if(a[i] == null)
|
565
|
+
continue;
|
566
|
+
|
567
|
+
if(typeof(a[i]) == 'string' && a[i] != '')
|
568
|
+
return a[i] + '';
|
569
|
+
|
570
|
+
if(typeof(a[i]) == 'object' && a[i].value != '')
|
571
|
+
return a[i].value + '';
|
572
|
+
}
|
573
|
+
|
574
|
+
return null;
|
575
|
+
}
|
576
|
+
|
577
|
+
function IsOptionSet(value, list)
|
578
|
+
{
|
579
|
+
for(var i = 0; i < list.length; i++)
|
580
|
+
if(list[i] == value)
|
581
|
+
return true;
|
582
|
+
|
583
|
+
return false;
|
584
|
+
}
|
585
|
+
|
586
|
+
function GetOptionValue(name, list, defaultValue)
|
587
|
+
{
|
588
|
+
var regex = new RegExp('^' + name + '\\[(\\w+)\\]$', 'gi');
|
589
|
+
var matches = null;
|
590
|
+
|
591
|
+
for(var i = 0; i < list.length; i++)
|
592
|
+
if((matches = regex.exec(list[i])) != null)
|
593
|
+
return matches[1];
|
594
|
+
|
595
|
+
return defaultValue;
|
596
|
+
}
|
597
|
+
|
598
|
+
function FindTagsByName(list, name, tagName)
|
599
|
+
{
|
600
|
+
var tags = document.getElementsByTagName(tagName);
|
601
|
+
|
602
|
+
for(var i = 0; i < tags.length; i++)
|
603
|
+
if(tags[i].getAttribute('name') == name)
|
604
|
+
list.push(tags[i]);
|
605
|
+
}
|
606
|
+
|
607
|
+
var elements = [];
|
608
|
+
var highlighter = null;
|
609
|
+
var registered = {};
|
610
|
+
var propertyName = 'innerHTML';
|
611
|
+
|
612
|
+
// for some reason IE doesn't find <pre/> by name, however it does see them just fine by tag name...
|
613
|
+
FindTagsByName(elements, name, 'pre');
|
614
|
+
FindTagsByName(elements, name, 'textarea');
|
615
|
+
|
616
|
+
if(elements.length == 0)
|
617
|
+
return;
|
618
|
+
|
619
|
+
// register all brushes
|
620
|
+
for(var brush in dp.sh.Brushes)
|
621
|
+
{
|
622
|
+
var aliases = dp.sh.Brushes[brush].Aliases;
|
623
|
+
|
624
|
+
if(aliases == null)
|
625
|
+
continue;
|
626
|
+
|
627
|
+
for(var i = 0; i < aliases.length; i++)
|
628
|
+
registered[aliases[i]] = brush;
|
629
|
+
}
|
630
|
+
|
631
|
+
for(var i = 0; i < elements.length; i++)
|
632
|
+
{
|
633
|
+
var element = elements[i];
|
634
|
+
var options = FindValue(
|
635
|
+
element.attributes['class'], element.className,
|
636
|
+
element.attributes['language'], element.language
|
637
|
+
);
|
638
|
+
var language = '';
|
639
|
+
|
640
|
+
if(options == null)
|
641
|
+
continue;
|
642
|
+
|
643
|
+
options = options.split(':');
|
644
|
+
|
645
|
+
language = options[0].toLowerCase();
|
646
|
+
|
647
|
+
if(registered[language] == null)
|
648
|
+
continue;
|
649
|
+
|
650
|
+
// instantiate a brush
|
651
|
+
highlighter = new dp.sh.Brushes[registered[language]]();
|
652
|
+
|
653
|
+
// hide the original element
|
654
|
+
element.style.display = 'none';
|
655
|
+
|
656
|
+
highlighter.noGutter = (showGutter == null) ? IsOptionSet('nogutter', options) : !showGutter;
|
657
|
+
highlighter.addControls = (showControls == null) ? !IsOptionSet('nocontrols', options) : showControls;
|
658
|
+
highlighter.collapse = (collapseAll == null) ? IsOptionSet('collapse', options) : collapseAll;
|
659
|
+
highlighter.showColumns = (showColumns == null) ? IsOptionSet('showcolumns', options) : showColumns;
|
660
|
+
|
661
|
+
// write out custom brush style
|
662
|
+
if(highlighter.Style)
|
663
|
+
document.write('<style>' + highlighter.Style + '</style>');
|
664
|
+
|
665
|
+
// first line idea comes from Andrew Collington, thanks!
|
666
|
+
highlighter.firstLine = (firstLine == null) ? parseInt(GetOptionValue('firstline', options, 1)) : firstLine;
|
667
|
+
|
668
|
+
highlighter.Highlight(element[propertyName]);
|
669
|
+
|
670
|
+
highlighter.source = element;
|
671
|
+
|
672
|
+
element.parentNode.insertBefore(highlighter.div, element);
|
673
|
+
}
|
674
|
+
}
|