1 | 'use strict';
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | exports.merge = function merge(a, b) {
|
16 | if (arguments.length === 1) {
|
17 | var attrs = a[0];
|
18 | for (var i = 1; i < a.length; i++) {
|
19 | attrs = merge(attrs, a[i]);
|
20 | }
|
21 | return attrs;
|
22 | }
|
23 | var ac = a['class'];
|
24 | var bc = b['class'];
|
25 |
|
26 | if (ac || bc) {
|
27 | ac = ac || [];
|
28 | bc = bc || [];
|
29 | if (!Array.isArray(ac)) ac = [ac];
|
30 | if (!Array.isArray(bc)) bc = [bc];
|
31 | a['class'] = ac.concat(bc).filter(nulls);
|
32 | }
|
33 |
|
34 | for (var key in b) {
|
35 | if (key != 'class') {
|
36 | a[key] = b[key];
|
37 | }
|
38 | }
|
39 |
|
40 | return a;
|
41 | };
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 | function nulls(val) {
|
52 | return val != null && val !== '';
|
53 | }
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 | exports.joinClasses = joinClasses;
|
62 | function joinClasses(val) {
|
63 | return Array.isArray(val) ? val.map(joinClasses).filter(nulls).join(' ') : val;
|
64 | }
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 | exports.cls = function cls(classes, escaped) {
|
74 | var buf = [];
|
75 | for (var i = 0; i < classes.length; i++) {
|
76 | if (escaped && escaped[i]) {
|
77 | buf.push(exports.escape(joinClasses([classes[i]])));
|
78 | } else {
|
79 | buf.push(joinClasses(classes[i]));
|
80 | }
|
81 | }
|
82 | var text = joinClasses(buf);
|
83 | if (text.length) {
|
84 | return ' class="' + text + '"';
|
85 | } else {
|
86 | return '';
|
87 | }
|
88 | };
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 | exports.attr = function attr(key, val, escaped, terse) {
|
100 | if ('boolean' == typeof val || null == val) {
|
101 | if (val) {
|
102 | return ' ' + (terse ? key : key + '="' + key + '"');
|
103 | } else {
|
104 | return '';
|
105 | }
|
106 | } else if (0 == key.indexOf('data') && 'string' != typeof val) {
|
107 | return ' ' + key + "='" + JSON.stringify(val).replace(/'/g, ''') + "'";
|
108 | } else if (escaped) {
|
109 | return ' ' + key + '="' + exports.escape(val) + '"';
|
110 | } else {
|
111 | return ' ' + key + '="' + val + '"';
|
112 | }
|
113 | };
|
114 |
|
115 |
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 | exports.attrs = function attrs(obj, terse){
|
123 | var buf = [];
|
124 |
|
125 | var keys = Object.keys(obj);
|
126 |
|
127 | if (keys.length) {
|
128 | for (var i = 0; i < keys.length; ++i) {
|
129 | var key = keys[i]
|
130 | , val = obj[key];
|
131 |
|
132 | if ('class' == key) {
|
133 | if (val = joinClasses(val)) {
|
134 | buf.push(' ' + key + '="' + val + '"');
|
135 | }
|
136 | } else {
|
137 | buf.push(exports.attr(key, val, false, terse));
|
138 | }
|
139 | }
|
140 | }
|
141 |
|
142 | return buf.join('');
|
143 | };
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 | exports.escape = function escape(html){
|
154 | var result = String(html)
|
155 | .replace(/&/g, '&')
|
156 | .replace(/</g, '<')
|
157 | .replace(/>/g, '>')
|
158 | .replace(/"/g, '"');
|
159 | if (result === '' + html) return html;
|
160 | else return result;
|
161 | };
|
162 |
|
163 |
|
164 |
|
165 |
|
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 |
|
172 |
|
173 | exports.rethrow = function rethrow(err, filename, lineno, str){
|
174 | if (!(err instanceof Error)) throw err;
|
175 | if ((typeof window != 'undefined' || !filename) && !str) {
|
176 | err.message += ' on line ' + lineno;
|
177 | throw err;
|
178 | }
|
179 | try {
|
180 | str = str || require('fs').readFileSync(filename, 'utf8')
|
181 | } catch (ex) {
|
182 | rethrow(err, null, lineno)
|
183 | }
|
184 | var context = 3
|
185 | , lines = str.split('\n')
|
186 | , start = Math.max(lineno - context, 0)
|
187 | , end = Math.min(lines.length, lineno + context);
|
188 |
|
189 |
|
190 | var context = lines.slice(start, end).map(function(line, i){
|
191 | var curr = i + start + 1;
|
192 | return (curr == lineno ? ' > ' : ' ')
|
193 | + curr
|
194 | + '| '
|
195 | + line;
|
196 | }).join('\n');
|
197 |
|
198 |
|
199 | err.path = filename;
|
200 | err.message = (filename || 'Jade') + ':' + lineno
|
201 | + '\n' + context + '\n\n' + err.message;
|
202 | throw err;
|
203 | };
|