diff --git a/.eustia b/.eustia index f8ac421..9cad657 100644 --- a/.eustia +++ b/.eustia @@ -2,5 +2,6 @@ module.exports = { files: 'src/**/*.es6', ignore: '**/Info/defInfo.es6', output: 'src/lib/util.js', + exclude: ['createCfg'], format: 'commonjs' -}; \ No newline at end of file +}; diff --git a/src/Console/Log.es6 b/src/Console/Log.es6 index 047eb18..db243e7 100644 --- a/src/Console/Log.es6 +++ b/src/Console/Log.es6 @@ -127,6 +127,7 @@ export default class Log break; } + msg = recognizeUrl(msg); this.value = msg; msg = render({msg, type, icon, id, displayHeader, time, from}); @@ -361,11 +362,11 @@ function formatEl(val) return `
${highlight(beautify.html(val.outerHTML), 'html')}
`; } -function getCurTime() -{ - let d = new Date(); +var regUrl = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g; - return `${padZero(d.getHours())}:${padZero(d.getMinutes())}:${padZero(d.getSeconds())}`; +function recognizeUrl(str) +{ + return str.replace(regUrl, match => `${match}`); } function getFrom() @@ -387,7 +388,7 @@ function getFrom() return ret; } -var padZero = (num) => util.lpad(util.toStr(num), 2, '0'); +var getCurTime = () => util.dateFormat('HH:MM:ss'); var tpl = require('./Log.hbs'); var render = data => tpl(data); diff --git a/src/lib/util.js b/src/lib/util.js index 87b9365..921d3d8 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -410,6 +410,33 @@ module.exports = (function () return exports; })(); + /* ------------------------------ toStr ------------------------------ */ + + var toStr = _.toStr = (function () + { + /* Convert value to a string. + * + * |Name |Type |Desc | + * |------|------|----------------| + * |val |* |Value to convert| + * |return|string|Resulted string | + * + * ```javascript + * toStr(null); // -> '' + * toStr(1); // -> '1' + * toStr(false); // -> 'false' + * toStr([1, 2, 3]); // -> '1,2,3' + * ``` + */ + + function exports(val) + { + return val == null ? '' : val.toString(); + } + + return exports; + })(); + /* ------------------------------ keys ------------------------------ */ var keys = _.keys = (function (exports) @@ -485,7 +512,7 @@ module.exports = (function () return regTest.test(str) ? str.replace(regReplace, replaceFn) : str; } - var MAP = exports.MAP = { + var map = exports.map = { '&': '&', '<': '<', '>': '>', @@ -494,13 +521,13 @@ module.exports = (function () '`': '`' }; - var regSrc = '(?:' + keys(MAP).join('|') + ')', + var regSrc = '(?:' + keys(map).join('|') + ')', regTest = new RegExp(regSrc), regReplace = new RegExp(regSrc, 'g'); function replaceFn(match) { - return MAP[match]; + return map[match]; } return exports; @@ -713,6 +740,30 @@ module.exports = (function () return exports; })(); + /* ------------------------------ isDate ------------------------------ */ + + var isDate = _.isDate = (function () + { + /* Check if value is classified as a Date object. + * + * |Name |Type |Desc | + * |------|-------|------------------------------| + * |val |* |value to check | + * |return|boolean|True if value is a Date object| + * + * ```javascript + * isDate(new Date()); // -> true + * ``` + */ + + function exports(val) + { + return objToStr(val) === '[object Date]'; + } + + return exports; + })(); + /* ------------------------------ isNum ------------------------------ */ var isNum = _.isNum = (function () @@ -1516,6 +1567,169 @@ module.exports = (function () return exports; })(); + /* ------------------------------ dateFormat ------------------------------ */ + + var dateFormat = _.dateFormat = (function () + { + /* Simple but extremely useful date format function. + * + * |Name |Type |Desc | + * |---------------|-------|---------------------| + * |[date=new Date]|Date |Date object to format| + * |mask |string |Format mask | + * |[utc=false] |boolean|UTC or not | + * |[gmt=false] |boolean|GMT or not | + * + * |Mask|Description | + * |----|-----------------------------------------------------------------| + * |d |Day of the month as digits; no leading zero for single-digit days| + * |dd |Day of the month as digits; leading zero for single-digit days | + * |ddd |Day of the week as a three-letter abbreviation | + * |dddd|Day of the week as its full name | + * |m |Month as digits; no leading zero for single-digit months | + * |mm |Month as digits; leading zero for single-digit months | + * |mmm |Month as a three-letter abbreviation | + * |mmmm|Month as its full name | + * |yy |Year as last two digits; leading zero for years less than 10 | + * |yyyy|Year represented by four digits | + * |h |Hours; no leading zero for single-digit hours (12-hour clock) | + * |hh |Hours; leading zero for single-digit hours (12-hour clock) | + * |H |Hours; no leading zero for single-digit hours (24-hour clock) | + * |HH |Hours; leading zero for single-digit hours (24-hour clock) | + * |M |Minutes; no leading zero for single-digit minutes | + * |MM |Minutes; leading zero for single-digit minutes | + * |s |Seconds; no leading zero for single-digit seconds | + * |ss |Seconds; leading zero for single-digit seconds | + * |l L |Milliseconds. l gives 3 digits. L gives 2 digits | + * |t |Lowercase, single-character time marker string: a or p | + * |tt |Lowercase, two-character time marker string: am or pm | + * |T |Uppercase, single-character time marker string: A or P | + * |TT |Uppercase, two-character time marker string: AM or PM | + * |Z |US timezone abbreviation, e.g. EST or MDT | + * |o |GMT/UTC timezone offset, e.g. -0500 or +0230 | + * |S |The date's ordinal suffix (st, nd, rd, or th) | + * |UTC:|Must be the first four characters of the mask | + * + * ```javascript + * dateFormat('isoDate'); // -> 2016-11-19 + * dateFormat('yyyy-mm-dd HH:MM:ss'); // -> 2016-11-19 19:00:04 + * dateFormat(new Date(), 'yyyy-mm-dd'); // -> 2016-11-19 + * ``` + */ + + function exports(date, mask, utc, gmt) + { + if (arguments.length === 1 && + isStr(date) && + !regNum.test(date)) + { + mask = date; + date = undefined; + } + + date = date || new Date; + + if (!isDate(date)) date = new Date(date); + + mask = toStr(exports.masks[mask] || mask || exports.masks['default']); + + var maskSlice = mask.slice(0, 4); + + if (maskSlice === 'UTC:' || maskSlice === 'GMT:') + { + mask = mask.slice(4); + utc = true; + if (maskSlice === 'GMT:') gmt = true; + } + + var prefix = utc ? 'getUTC' : 'get', + d = date[prefix + 'Date'](), + D = date[prefix + 'Day'](), + m = date[prefix + 'Month'](), + y = date[prefix + 'FullYear'](), + H = date[prefix + 'Hours'](), + M = date[prefix + 'Minutes'](), + s = date[prefix + 'Seconds'](), + L = date[prefix + 'Milliseconds'](), + o = utc ? 0 : date.getTimezoneOffset(), + flags = { + d: d, + dd: padZero(d), + ddd: exports.i18n.dayNames[D], + dddd: exports.i18n.dayNames[D + 7], + m: m + 1, + mm: padZero(m + 1), + mmm: exports.i18n.monthNames[m], + mmmm: exports.i18n.monthNames[m + 12], + yy: toStr(y).slice(2), + yyyy: y, + h: H % 12 || 12, + hh: padZero(H % 12 || 12), + H: H, + HH: padZero(H), + M: M, + MM: padZero(M), + s: s, + ss: padZero(s), + l: padZero(L, 3), + L: padZero(Math.round(L / 10)), + t: H < 12 ? 'a' : 'p', + tt: H < 12 ? 'am' : 'pm', + T: H < 12 ? 'A' : 'P', + TT: H < 12 ? 'AM' : 'PM', + Z: gmt ? 'GMT' : utc ? 'UTC' : (toStr(date).match(regTimezone) || ['']).pop().replace(regTimezoneClip, ''), + o: (o > 0 ? '-' : '+') + padZero(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), + S: ['th', 'st', 'nd', 'rd'][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] + }; + + return mask.replace(regToken, function (match) + { + if (match in flags) return flags[match]; + + return match.slice(1, match.length - 1); + }); + } + + function padZero(str, len) + { + return lpad(toStr(str), len || 2, '0'); + } + + var regToken = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZWN]|'[^']*'|'[^']*'/g, + regTimezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, + regNum = /\d/, + regTimezoneClip = /[^-+\dA-Z]/g; + + exports.masks = { + 'default': 'ddd mmm dd yyyy HH:MM:ss', + 'shortDate': 'm/d/yy', + 'mediumDate': 'mmm d, yyyy', + 'longDate': 'mmmm d, yyyy', + 'fullDate': 'dddd, mmmm d, yyyy', + 'shortTime': 'h:MM TT', + 'mediumTime': 'h:MM:ss TT', + 'longTime': 'h:MM:ss TT Z', + 'isoDate': 'yyyy-mm-dd', + 'isoTime': 'HH:MM:ss', + 'isoDateTime': 'yyyy-mm-dd\'T\'HH:MM:sso', + 'isoUtcDateTime': 'UTC:yyyy-mm-dd\'T\'HH:MM:ss\'Z\'', + 'expiresHeaderFormat': 'ddd, dd mmm yyyy HH:MM:ss Z' + }; + + exports.i18n = { + dayNames: [ + 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', + 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' + ], + monthNames: [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', + 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' + ] + }; + + return exports; + })(); + /* ------------------------------ ltrim ------------------------------ */ var ltrim = _.ltrim = (function () @@ -3951,33 +4165,6 @@ module.exports = (function () return exports; })(); - /* ------------------------------ toStr ------------------------------ */ - - var toStr = _.toStr = (function () - { - /* Convert value to a string. - * - * |Name |Type |Desc | - * |------|------|----------------| - * |val |* |Value to convert| - * |return|string|Resulted string | - * - * ```javascript - * toStr(null); // -> '' - * toStr(1); // -> '1' - * toStr(false); // -> 'false' - * toStr([1, 2, 3]); // -> '1,2,3' - * ``` - */ - - function exports(val) - { - return val == null ? '' : val.toString(); - } - - return exports; - })(); - /* ------------------------------ uniqId ------------------------------ */ var uniqId = _.uniqId = (function () diff --git a/test/console.html b/test/console.html index 27c471a..0857f67 100644 --- a/test/console.html +++ b/test/console.html @@ -10,9 +10,8 @@ - - \ No newline at end of file + diff --git a/test/console.js b/test/console.js index ab520a3..4f52b92 100644 --- a/test/console.js +++ b/test/console.js @@ -17,6 +17,13 @@ describe('log', function () expect($tool.find('.eruda-log')).toHaveLength(0); }); + it('recognize url', function () + { + tool.clear(); + tool.log('http://liriliri.github.io/eruda/?plugin=fps'); + expect($tool.find('.eruda-log')).toContainHtml('http://liriliri.github.io/eruda/?plugin=fps'); + }); + it('basic object', function () { var obj = {a: 1};