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(/`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); };