]> git.proxmox.com Git - extjs.git/blame - extjs/examples/kitchensink/modern/src/view/SourceItem.js
add extjs 6.0.1 sources
[extjs.git] / extjs / examples / kitchensink / modern / src / view / SourceItem.js
CommitLineData
6527f429
DM
1Ext.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('&lt;{0}&gt;', match[1]) + v.slice(match.index + match[0].length);\r
93 // }\r
94\r
95 v = v.replace(/</g, '&lt;');\r
96 v = v.replace(/</g, '&gt;');\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});