1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | exports.attrs = function attrs(obj){
|
17 | var buf = []
|
18 | , terse = obj.terse;
|
19 | delete obj.terse;
|
20 | var keys = Object.keys(obj)
|
21 | , len = keys.length;
|
22 | if (len) {
|
23 | buf.push('');
|
24 | for (var i = 0; i < len; ++i) {
|
25 | var key = keys[i]
|
26 | , val = obj[key];
|
27 | if ('boolean' == typeof val || null == val) {
|
28 | if (val) {
|
29 | terse
|
30 | ? buf.push(key)
|
31 | : buf.push(key + '="' + key + '"');
|
32 | }
|
33 | } else if ('class' == key && Array.isArray(val)) {
|
34 | buf.push(key + '="' + escape(val.join(' ')) + '"');
|
35 | } else {
|
36 | buf.push(key + '="' + escape(val) + '"');
|
37 | }
|
38 | }
|
39 | }
|
40 | return buf.join(' ');
|
41 | };
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 | exports.escape = function escape(html){
|
52 | return String(html)
|
53 | .replace(/&(?!\w+;)/g, '&')
|
54 | .replace(/</g, '<')
|
55 | .replace(/>/g, '>')
|
56 | .replace(/"/g, '"');
|
57 | };
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 | exports.rethrow = function rethrow(err, str, filename, lineno){
|
71 | var context = 3
|
72 | , lines = str.split('\n')
|
73 | , start = Math.max(lineno - context, 0)
|
74 | , end = Math.min(lines.length, lineno + context);
|
75 |
|
76 |
|
77 | var context = lines.slice(start, end).map(function(line, i){
|
78 | var curr = i + start + 1;
|
79 | return (curr == lineno ? ' > ' : ' ')
|
80 | + curr
|
81 | + '| '
|
82 | + line;
|
83 | }).join('\n');
|
84 |
|
85 |
|
86 | err.path = filename;
|
87 | err.message = (filename || 'Jade') + ':' + lineno
|
88 | + '\n' + context + '\n\n' + err.message;
|
89 | throw err;
|
90 | };
|