UNPKG

watch12306

Version:

检测12306网站,并在有余票时候通知

206 lines (194 loc) 6.77 kB
/** * 仿照 colors的api,借助ansi字符,做一个带有颜色的输出 * 对于不支持颜色的控制台来说,可能会输出一些奇怪的ansi字符 * 线上则统一取消颜色输出 */ var util = require('util'); // 原样输出 function noop(){ return util.format.apply(util,arguments); } // console.log(noop(1,2,3,4,5,6,[1,2,3],{x:1})); function isNotNaN(o){ return o===o; } function isCorrectCode(o){ return o!==null && o!==undefined && isNotNaN(o); } var colorToAnsi = { style: { normal: 0, bold: 1, underline: 4, blink: 5, strike: 9 }, fore: { black: 30, red: 31, green: 32, yellow: 33, blue: 34, magenta: 35, cyan: 36, white: 37, gray: 90, grey: 90, brightBlack: 90, brightRed: 91, brightGreen: 92, brightYellow: 99, brightBlue: 94, brightMagenta: 95, brightCyan: 96, brightWhite: 97 }, back: { black: 40, red: 41, green: 42, yellow: 43, blue: 44, magenta: 45, cyan: 46, white: 47, gray:100, grey:100, brightBlack: 100, brightRed: 101, brightGreen: 102, brightYellow: 103, brightBlue: 104, brightMagenta: 105, brightCyan: 106, brightWhite: 107 } }; function colorify(text, fore, back, style) { if(global && global.document && global.document.nodeType === 9) return text; if(!fore) return text; var attrCode, backCode, foreCode, octpfx, reset, result, suffix, _ref; if (style == null) { style = "normal"; } if (typeof fore !== "string") { _ref = fore; fore = _ref.fore; back = _ref.back; style = _ref.style; } result = []; foreCode = colorToAnsi.fore[fore] || parseInt(fore); isCorrectCode(foreCode) && result.push(foreCode); backCode = colorToAnsi.back[back] || parseInt(back); isCorrectCode(backCode) && result.push(backCode); attrCode = colorToAnsi.style[style] || parseInt(style); isCorrectCode(attrCode) && result.push(attrCode); suffix = result.join(";"); octpfx = "\033"; reset = "" + octpfx + "[0m"; // var outStr = "" + octpfx + "[" + suffix + "m" + text + reset; // console.log(JSON.stringify(outStr)); return "" + octpfx + "[" + suffix + "m" + text + reset; } var arrF = ["black","white","blue","red","green","yellow","cyan","magenta","gray","grey", "brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite"//特有 ]; var arrB = ["bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite", "bgBrightBlack","bgBrightRed","bgBrightGreen","bgBrightYellow","bgBrightBlue","bgBrightMagenta","bgBrightCyan","bgBrightWhite"//特有 ]; var arrS = ["normal","bold","underline","blink","strike", "reset","dim","italic","inverse","hidden","strikethrough"//这排只是兼容colors处理,其实废弃无用 ]; function genFn(mainProp,bgProp,subProp){ var empty = false; if(!mainProp && !bgProp && !subProp){ empty = true; } return function(){ var aLen = arguments.length; if(aLen<=1){ var str = aLen ? arguments[0] : ""; return empty ? str : colorify(str,mainProp,bgProp,subProp); }else{ var result = ""; var i; for(i=0;i<aLen;i++){ var out = (typeof arguments[i] !== "object" ? arguments[i] : JSON.stringify(arguments[i])); result += (i==0?"":" ") + (empty ? out : colorify(out,mainProp,bgProp,subProp)); } return result; } }; } /** * expose * @param needColor 是否需要颜色 * @returns {Object} * 用法: var colors = config(1); * colors.fore.bg.style(text) fore,bg,style可以缺省,但是前后顺序不能乱 fore > bg > style * eg: colors.bgYellow.bold 可以, * 但是 colors.bold.bgYellow不可以,因为顺序不对 */ function config(needColor){ var colorsTool = {};//这里为一个局部变量,为了方便多次初始化,每次执行都返回一个新的对象 var isProdEnv = process.env.NODE_ENV==="production"; //参数缺省时,非production环境变量,都需要带上颜色 needColor = needColor===undefined ? !isProdEnv : !!needColor; var f,b,s; var len1 = arrF.length; var len2 = arrB.length; var len3 = arrS.length; // colors.red for(f=0;f<len1;f++){ colorsTool[arrF[f]] = needColor ? genFn(arrF[f],null,null) : noop; // colors.red.bgYellow var i1; for(i1=0;i1<len2;i1++){ var bName = arrB[i1].split("bg")[1]; bName = bName.substring(0,1).toLowerCase() + bName.substr(1);// 仅首字母转成小写 colorsTool[arrF[f]][arrB[i1]] = needColor ? genFn(arrF[f],bName,null) : noop; // colors.red.bgYellow.bold var j1; for(j1=0;j1<len3;j1++){ colorsTool[arrF[f]][arrB[i1]][arrS[j1]] = needColor ? genFn(arrF[f],bName,arrS[j1]) : noop; } } // colors.red.bold var k1; for(k1=0;k1<len3;k1++){ colorsTool[arrF[f]][arrS[k1]] = needColor ? genFn(arrF[f],null,arrS[k1]) : noop; } } // colors.bgYellow for(b=0;b<len2;b++){ var bName2 = arrB[b].split("bg")[1].toLowerCase(); colorsTool[arrB[b]] = needColor ? genFn(null,bName2,null) : noop; // colors.bgYellow.bold var i2; for(i2=0;i2<len3;i2++){ colorsTool[arrB[b]][arrS[i2]] = needColor ? genFn(null,bName2,arrS[i2]) : noop; } } // colors.bold for(s=0;s<len3;s++){ colorsTool[arrS[s]] = needColor ? genFn(null,null,arrS[s]) : noop; } // 常规组合:warn error success fail colorsTool.warn = function(str){ return colorsTool.red.bgYellow("[warning]") + " " + colorsTool.yellow(str); }; colorsTool.error = function(str){ return colorsTool.red.bgBrightYellow.bold("[error]") + " " + colorsTool.red.bold(str); }; colorsTool.success = function(str){ return colorsTool.green.bold(str); }; colorsTool.fail = function(str){ return colorsTool.gray.bold(str); }; return colorsTool; } // module.exports = config(1); module.exports.create = config;