UNPKG

2.55 kBJavaScriptView Raw
1
2var jade = (function(exports){
3/*!
4 * Jade - runtime
5 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
6 * MIT Licensed
7 */
8
9/**
10 * Lame Array.isArray() polyfill for now.
11 */
12
13if (!Array.isArray) {
14 Array.isArray = function(arr){
15 return '[object Array]' == Object.prototype.toString.call(arr);
16 };
17}
18
19/**
20 * Lame Object.keys() polyfill for now.
21 */
22
23if (!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 * Render the given attributes object.
37 *
38 * @param {Object} obj
39 * @return {String}
40 * @api private
41 */
42
43exports.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 * Escape the given string of `html`.
72 *
73 * @param {String} html
74 * @return {String}
75 * @api private
76 */
77
78exports.escape = function escape(html){
79 return String(html)
80 .replace(/&(?!\w+;)/g, '&amp;')
81 .replace(/</g, '&lt;')
82 .replace(/>/g, '&gt;')
83 .replace(/"/g, '&quot;');
84};
85
86/**
87 * Re-throw the given `err` in context to the
88 * the jade in `filename` at the given `lineno`.
89 *
90 * @param {Error} err
91 * @param {String} filename
92 * @param {String} lineno
93 * @api private
94 */
95
96exports.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 // Error context
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 // Alter exception message
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