1 |
|
2 | var jade = (function(exports){
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | if (!Array.isArray) {
|
14 | Array.isArray = function(arr){
|
15 | return '[object Array]' == Object.prototype.toString.call(arr);
|
16 | };
|
17 | }
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | if (!Object.keys) {
|
24 | Object.keys = function(obj){
|
25 | var arr = [];
|
26 | for (var key in obj) {
|
27 | if (obj.hasOwnProperty(key)) {
|
28 | arr.push(key);
|
29 | }
|
30 | }
|
31 | return arr;
|
32 | }
|
33 | }
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 | exports.attrs = function attrs(obj){
|
44 | var buf = []
|
45 | , terse = obj.terse;
|
46 | delete obj.terse;
|
47 | var keys = Object.keys(obj)
|
48 | , len = keys.length;
|
49 | if (len) {
|
50 | buf.push('');
|
51 | for (var i = 0; i < len; ++i) {
|
52 | var key = keys[i]
|
53 | , val = obj[key];
|
54 | if ('boolean' == typeof val || null == val) {
|
55 | if (val) {
|
56 | terse
|
57 | ? buf.push(key)
|
58 | : buf.push(key + '="' + key + '"');
|
59 | }
|
60 | } else if ('class' == key && Array.isArray(val)) {
|
61 | buf.push(key + '="' + exports.escape(val.join(' ')) + '"');
|
62 | } else {
|
63 | buf.push(key + '="' + exports.escape(val) + '"');
|
64 | }
|
65 | }
|
66 | }
|
67 | return buf.join(' ');
|
68 | };
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 | exports.escape = function escape(html){
|
79 | return String(html)
|
80 | .replace(/&(?!\w+;)/g, '&')
|
81 | .replace(/</g, '<')
|
82 | .replace(/>/g, '>')
|
83 | .replace(/"/g, '"');
|
84 | };
|
85 |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 | exports.rethrow = function rethrow(err, filename, lineno){
|
97 | if (!filename) throw err;
|
98 |
|
99 | var context = 3
|
100 | , str = require('fs').readFileSync(filename, 'utf8')
|
101 | , lines = str.split('\n')
|
102 | , start = Math.max(lineno - context, 0)
|
103 | , end = Math.min(lines.length, lineno + context);
|
104 |
|
105 |
|
106 | var context = lines.slice(start, end).map(function(line, i){
|
107 | var curr = i + start + 1;
|
108 | return (curr == lineno ? ' > ' : ' ')
|
109 | + curr
|
110 | + '| '
|
111 | + line;
|
112 | }).join('\n');
|
113 |
|
114 |
|
115 | err.path = filename;
|
116 | err.message = (filename || 'Jade') + ':' + lineno
|
117 | + '\n' + context + '\n\n' + err.message;
|
118 | throw err;
|
119 | };
|
120 |
|
121 | return exports;
|
122 |
|
123 | })({}); |
\ | No newline at end of file |