]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | Ext.define('KitchenSink.view.SourceItem', {\r |
2 | extend: 'Ext.Panel',\r | |
3 | xtype: 'sourceitem',\r | |
4 | \r | |
5 | config: {\r | |
6 | cls: 'ux-code',\r | |
7 | styleHtmlContent: true,\r | |
8 | scrollable: true\r | |
9 | },\r | |
10 | \r | |
11 | exampleRe: /^\s*\/\/\s*(\<\/?example\>)\s*$/,\r | |
12 | \r | |
13 | clearExampleTags: function (text) {\r | |
14 | var lines = text.split('\n'),\r | |
15 | removing = false,\r | |
16 | keepLines = [],\r | |
17 | len = lines.length,\r | |
18 | exampleRe = this.exampleRe,\r | |
19 | i, line;\r | |
20 | \r | |
21 | for (i = 0; i < len; ++i) {\r | |
22 | line = lines[i];\r | |
23 | if (removing) {\r | |
24 | if (exampleRe.test(line)) {\r | |
25 | removing = false;\r | |
26 | }\r | |
27 | } else if (exampleRe.test(line)) {\r | |
28 | removing = true;\r | |
29 | } else {\r | |
30 | keepLines.push(line);\r | |
31 | }\r | |
32 | }\r | |
33 | \r | |
34 | return keepLines.join('\n');\r | |
35 | },\r | |
36 | \r | |
37 | applyHtml: function(html) {\r | |
38 | html = this.clearExampleTags(html);\r | |
39 | this.matches = [];\r | |
40 | \r | |
41 | var v = html,\r | |
42 | fmt = '<span class="ux-code-{0}">{1}</span>';\r | |
43 | \r | |
44 | var between = Ext.Function.bind(function(idx, length) {\r | |
45 | for (var i = 0; i < this.matches.length; i++){\r | |
46 | var m = this.matches[i],\r | |
47 | s = m[0],\r | |
48 | e = m[1];\r | |
49 | /*if (s <= idx && (idx + length) <= e){\r | |
50 | return true;\r | |
51 | }*/\r | |
52 | if ((s <= idx && idx < e) || (s < (idx + length) && (idx + length) <= e)){\r | |
53 | return true;\r | |
54 | }\r | |
55 | }\r | |
56 | return false;\r | |
57 | }, this);\r | |
58 | \r | |
59 | var highlight = Ext.Function.bind(function(str, regex, cls, fn){\r | |
60 | regex.compile(regex);\r | |
61 | var match;\r | |
62 | \r | |
63 | while (match = regex.exec(str)) {\r | |
64 | var mdata = fn ? fn(match) : [match.index, match[0]],\r | |
65 | midx = mdata[0],\r | |
66 | mstr = mdata[1];\r | |
67 | if (!between(midx, mstr.length)){\r | |
68 | var replacement = Ext.util.Format.format(fmt, cls, mstr),\r | |
69 | diff = (replacement.length - mstr.length);\r | |
70 | str = str.slice(0, midx) + replacement + str.slice(midx + mstr.length);\r | |
71 | regex.lastIndex = midx + replacement.length;\r | |
72 | for (var i = 0; i < this.matches.length; i++){\r | |
73 | var m = this.matches[i];\r | |
74 | if (m[1] < midx) continue;\r | |
75 | \r | |
76 | m[0] += diff;\r | |
77 | m[1] += diff;\r | |
78 | }\r | |
79 | this.matches.push([midx, regex.lastIndex]);\r | |
80 | }\r | |
81 | else {\r | |
82 | break;\r | |
83 | }\r | |
84 | }\r | |
85 | return str;\r | |
86 | }, this);\r | |
87 | \r | |
88 | // Escape HTML...whatever\r | |
89 | \r | |
90 | // var htmlRE = /<((.|\w)*)>/ig, match;\r | |
91 | // while (match = htmlRE.exec(v)) {\r | |
92 | // v = v.slice(0, match.index) + Ext.util.Format.format('<{0}>', match[1]) + v.slice(match.index + match[0].length);\r | |
93 | // }\r | |
94 | \r | |
95 | v = v.replace(/</g, '<');\r | |
96 | v = v.replace(/</g, '>');\r | |
97 | \r | |
98 | // Block comments\r | |
99 | v = highlight(v, /\/\*(.|\s)*?\*\//ig, 'comment');\r | |
100 | \r | |
101 | // String literals\r | |
102 | v = highlight(v, (/("|')[^\1\n\r]*?\1/ig), 'string');\r | |
103 | \r | |
104 | // Line comments\r | |
105 | v = highlight(v, /\/\/[^\n\r]*/ig, 'comment');\r | |
106 | \r | |
107 | // Function names\r | |
108 | v = highlight(v, /(\w+)\s*\:\s*function/ig, 'function', function(match){\r | |
109 | return [match.index, match[1]];\r | |
110 | });\r | |
111 | \r | |
112 | v = highlight(v, /function (\w+)/ig, 'function', function(match){\r | |
113 | return [match.index + 9, match[1]];\r | |
114 | });\r | |
115 | \r | |
116 | // Keywords\r | |
117 | v = highlight(v, /\b(this|function|null|return|true|false|new|int|float|break|const|continue|delete|do|while|for|in|switch|case|throw|try|catch|typeof|instanceof|var|void|with|yield|if|else)\b/ig, 'keyword');\r | |
118 | \r | |
119 | // Operators\r | |
120 | v = highlight(v, /\.|\,|\:|\;|\=|\+|\-|\&|\%|\*|\/|\!|\?|\<|\>|\||\^|\~/ig, 'operator');\r | |
121 | \r | |
122 | return '<pre>' + v + '</pre>';\r | |
123 | }\r | |
124 | }); |