mirror of
https://github.com/cnodejs/nodeclub.git
synced 2025-12-08 19:55:55 +00:00
137 lines
3.2 KiB
JavaScript
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, '&')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>')
|
|
.replace(/"/g, '"')
|
|
.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);
|
|
};
|