nodeclub/common/util.js
2014-09-06 18:04:34 +08:00

137 lines
3.2 KiB
JavaScript

var xss = require('xss');
exports.format_date = function (date, friendly) {
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hour = date.getHours();
var minute = date.getMinutes();
var second = date.getSeconds();
if (friendly) {
var now = new Date();
var mseconds = -(date.getTime() - now.getTime());
var time_std = [ 1000, 60 * 1000, 60 * 60 * 1000, 24 * 60 * 60 * 1000 ];
if (mseconds < time_std[3]) {
if (mseconds > 0 && mseconds < time_std[1]) {
return Math.floor(mseconds / time_std[0]).toString() + ' 秒前';
}
if (mseconds > time_std[1] && mseconds < time_std[2]) {
return Math.floor(mseconds / time_std[1]).toString() + ' 分钟前';
}
if (mseconds > time_std[2]) {
return Math.floor(mseconds / time_std[2]).toString() + ' 小时前';
}
}
}
//month = ((month < 10) ? '0' : '') + month;
//day = ((day < 10) ? '0' : '') + day;
hour = ((hour < 10) ? '0' : '') + hour;
minute = ((minute < 10) ? '0' : '') + minute;
second = ((second < 10) ? '0' : '') + second;
var thisYear = new Date().getFullYear();
year = (thisYear === year) ? '' : (year + '-');
return year + month + '-' + day + ' ' + hour + ':' + minute;
};
/**
* Escape the given string of `html`.
*
* @param {String} html
* @return {String}
* @api private
*/
exports.escape = function (html) {
var codeSpan = /(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm;
var codeBlock = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g;
var spans = [];
var blocks = [];
var text = String(html).replace(/\r\n/g, '\n')
.replace('/\r/g', '\n');
text = '\n\n' + text + '\n\n';
text = text.replace(codeSpan, function (code) {
spans.push(code);
return '`span`';
});
text += '~0';
return text.replace(codeBlock, function (whole, code, nextChar) {
blocks.push(code);
return '\n\tblock' + nextChar;
})
.replace(/&(?!\w+;)/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/`span`/g, function () {
return spans.shift();
})
.replace(/\n\tblock/g, function () {
return blocks.shift();
})
.replace(/~0$/, '')
.replace(/^\n\n/, '')
.replace(/\n\n$/, '');
};
/**
* XSS模块配置
*/
var xssOptions = {
whiteList: {
h1: [],
h2: [],
h3: [],
h4: [],
h5: [],
h6: [],
hr: [],
span: [],
strong: [],
b: [],
i: [],
br: [],
p: [],
pre: ['class'],
code: [],
a: ['target', 'href', 'title'],
img: ['src', 'alt', 'title'],
div: [],
table: ['width', 'border'],
tr: [],
td: ['width', 'colspan'],
th: ['width', 'colspan'],
tbody: [],
thead: [],
ul: [],
li: [],
ol: [],
dl: [],
dt: [],
em: [],
cite: [],
section: [],
header: [],
footer: [],
blockquote: [],
audio: ['autoplay', 'controls', 'loop', 'preload', 'src'],
video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width']
}
};
/**
* 过滤XSS攻击代码
*
* @param {string} html
* @return {string}
*/
exports.xss = function (html) {
return xss(html, xssOptions);
};