Skip to content

Commit 314f3c3

Browse files
committed
add typescript supports
1 parent 8ae9381 commit 314f3c3

18 files changed

+1691
-2153
lines changed

.vscode/launch.json

+9-1
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,19 @@
77
{
88
"type": "node",
99
"request": "launch",
10-
"name": "Launch Program",
10+
"name": "Demo",
1111
"skipFiles": [
1212
"<node_internals>/**"
1313
],
1414
"program": "${workspaceFolder}\\demo.js"
15+
},{
16+
"type": "node",
17+
"request": "launch",
18+
"name": "Launch Program",
19+
"skipFiles": [
20+
"<node_internals>/**"
21+
],
22+
"program": "${file}"
1523
},
1624
{
1725
"type": "node",

.vscode/settings.json

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"cSpell.words": [
3+
"logsets",
4+
"progressbar"
5+
]
6+
}

banner.demo.js

+8-8
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ let banner = logger.banner({
99

1010
banner.add("Logsets Utility Toolkit")
1111
banner.add("Output color elements at the terminal")
12-
banner.add("Version: ",1)
13-
banner.add("Release: ","2022-01-01")
12+
banner.add("Version:{} ",1)
13+
banner.add("Release:{#red} ","2022-01-01")
1414
banner.render()
1515

1616

@@ -19,11 +19,11 @@ banner = logger.banner({
1919
})
2020

2121
banner.add("Logsets工具库")
22-
banner.add("在终端命令行输出彩色文本",{style:"darkGray"})
22+
banner.add("在终端命令行输出彩色文本")
2323
banner.add()
24-
banner.add("版本: ",1)
25-
banner.add("网站: ","http://www.logsets.com",{align: 'left',style:["","lightBlue"]})
26-
banner.add("发布日期: ","2022-01-01",{align: 'right',style:["","lightMagenta"]})
27-
banner.add("作者: ","fisher",{align: 'right',style:["","lightCyan"]})
28-
banner.add("许可证: ","MIT ","GPL ","Apache 2.0",{style:["","red"]})
24+
banner.add("版本: {}",1)
25+
banner.add("网站: {}","http://www.logsets.com",{align: 'left'})
26+
banner.add("发布日期:{}","2022-01-01",{align: 'right'})
27+
banner.add("作者:{author}",{author:"fisher"},{align: 'right'})
28+
banner.add("许可证: {#lightYellow} {} {}",["MIT","GPL","Apache 2.0"])
2929
banner.render()

banner.plugin.d.ts

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
2+
export interface BannerPluginOptions {
3+
indent? : string // 横幅缩进
4+
border? : {
5+
style? : string // 边框颜色
6+
width? : 0 | 1 | 2 // 边框宽度,0-不显示,1-单线框,2-双线框
7+
},
8+
title? : {
9+
align? : 'left' | 'center' | 'right' // 标题对齐方式
10+
style? : string // 标题颜色
11+
wrapper? : string // 原本是使用☆ ☆ ☆标题包裹符号比较好看,但是
12+
},
13+
align? : 'left' | 'center' | 'right' // 横幅行默认对齐方式,默认居中
14+
paddingLeft? : number // 左右空白宽度
15+
paddingRight? : number
16+
paddingTop? : number // 顶部空白行
17+
paddingBottom?: number
18+
}
19+
20+
export interface Banner{
21+
add(text:string,vars?:any[] | Record<string>,options?:BannerPluginOptions):void
22+
render():void
23+
}
24+
25+
export declare const BannerPlugin: {
26+
(logsets:Logsets,options:DeepRequired<BannerPluginOptions>):Banner
27+
}
28+
29+
export default BannerPlugin
30+

banner.plugin.js

+33-47
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
★☆
2424
2525
*/
26-
import { consoleOutput, getLeftRepeatChars, getRightRepeatChars, getStringWidth, isPlainObject, paddingCenter,paddingStart, paddingEnd } from "./utils.js"
27-
import deepmerge from 'deepmerge'
26+
import { consoleOutput, getLeftRepeatChars, getRightRepeatChars, getStringWidth, paddingCenter,paddingStart, paddingEnd } from "./utils.js"
27+
import deepmerge from 'deepmerge'
2828

2929
const DefaultBannersOptions = {
3030
indent : " ", // 横幅缩进
@@ -34,34 +34,29 @@ const DefaultBannersOptions = {
3434
},
3535
title : {
3636
align : "center", // 标题对齐方式
37-
style : ["","","green,bright","",""], // 标题颜色
38-
wrapper : "===" // ☆ ☆ ☆标题包裹符号,用来装饰
37+
style : "green,bright", // 标题颜色
38+
wrapper : "--==" // 原本是使用☆ ☆ ☆标题包裹符号比较好看,但是
3939
},
4040
align : "center", // 横幅行默认对齐方式,默认居中
4141
paddingLeft : 4, // 左右空白宽度
4242
paddingRight : 4,
43-
paddingTop : 1,
43+
paddingTop : 0, // 顶部空白行
4444
paddingBottom: 1
4545
}
4646

4747
function createBanner(context,options){
4848
const logger = this
49-
let opts = deepmerge(DefaultBannersOptions,options)
50-
const colorizer = logger.getColorizer
51-
49+
let opts = deepmerge(DefaultBannersOptions,options)
5250
let lines = [] // [{text,style,align}]
5351
function renderBanner(){
5452
// 计算最大行宽度
5553
const paddingLeft = new Array(opts.paddingLeft).fill(" ").join("")
5654
const paddingRight = new Array(opts.paddingRight).fill(" ").join("")
5755
let totalWidth = lines.reduce((width,line,index)=>{
5856
if(index===0){ // 第一行视为标题行
59-
line.text.splice(0,0," ")
60-
line.text.splice(0,0,opts.title.wrapper)
61-
line.text.push(" ")
62-
line.text.push(opts.title.wrapper)
57+
line.text = `${opts.title.wrapper} ${logger.colorized(line.text,opts.title.style)} ${opts.title.wrapper.reverse()}`
6358
}
64-
return Math.max(width,getStringWidth(line.text.join("")))
59+
return Math.max(width,getStringWidth(line.text))
6560
},0) + opts.paddingLeft + opts.paddingRight
6661
if(typeof(opts.width)==="number" && opts.width > totalWidth){
6762
totalWidth = opts.width
@@ -74,38 +69,36 @@ function createBanner(context,options){
7469
consoleOutput("║"+new Array(totalWidth).fill(" ").join("")+"║")
7570
})
7671
//
77-
// ║ ║ line = {text:[],style,align}
72+
// ║ ║ line = {text:[],vars,align}
7873

7974
lines.map((line,index)=>{
80-
let lineText = line.text.join("")
75+
let lineText = (line.text || "").trim()
76+
let coloredLineText = lineText
8177
let t = ""
8278
let leftSpace="",rightSpace=""
8379
if(lineText.trim()===""){
8480
leftSpace=new Array(totalWidth).fill(" ").join("")
8581
}else{
82+
coloredLineText = logger.getColorizedTemplate(lineText,line.vars)
8683
if(line.align==="left"){
87-
t= paddingEnd(lineText,totalWidth-opts.paddingLeft-opts.paddingRight)
84+
t= paddingEnd(coloredLineText,totalWidth-opts.paddingLeft-opts.paddingRight)
8885
}else if(line.align==="right"){
89-
t= paddingStart(lineText,totalWidth-opts.paddingLeft-opts.paddingRight)
86+
t= paddingStart(coloredLineText,totalWidth-opts.paddingLeft-opts.paddingRight)
9087
}else{
91-
t= paddingCenter(lineText,totalWidth-opts.paddingLeft-opts.paddingRight)
88+
t= paddingCenter(coloredLineText,totalWidth-opts.paddingLeft-opts.paddingRight)
9289
}
9390
leftSpace = paddingLeft + getLeftRepeatChars(t) + (index==0 ? "" : "")
9491
rightSpace= paddingRight + getRightRepeatChars(t) + (index==0 ? "" : "")
9592
}
93+
9694

97-
let lineStyles =Array.isArray(line.style) ? line.style : (line.style ? [line.style] : [])
98-
if(lineStyles.length===0 && index===0) lineStyles = opts.title.style
9995

100-
const coloredLineTexts =lineStyles.length==0 ? line.text : line.text.map((t,i)=>{
101-
return colorizer(i<lineStyles.length ? lineStyles[i] : lineStyles[lineStyles.length-1])(t)
102-
})
103-
logger.print("║",leftSpace,...coloredLineTexts,rightSpace,"║",{append:""})
96+
logger.print("║",leftSpace,coloredLineText,rightSpace,"║",{append:""})
10497
// 在标题栏下增加一行分割线╟ ─ ╢
105-
// if(index===0){
106-
// //consoleOutput("║"+new Array(totalWidth).fill(" ").join("")+"║")
107-
// consoleOutput("╟"+new Array(totalWidth).fill("─").join("")+"╢")
108-
// }
98+
if(index===0){
99+
//consoleOutput("║"+new Array(totalWidth).fill(" ").join("")+"║")
100+
consoleOutput("╟"+new Array(totalWidth).fill("─").join("")+"╢")
101+
}
109102
})
110103

111104
// 留出空白行
@@ -115,32 +108,25 @@ function createBanner(context,options){
115108
// ╚═══════════╝
116109
consoleOutput("╚"+new Array(totalWidth).fill("═").join("")+"╝")
117110
}
118-
119-
function getLineFromArgs(){
120-
let linOptions = {align:opts.align,style:""}
121-
let text = []
122-
if(arguments.length>1 && isPlainObject(arguments[arguments.length-1])){
123-
Object.assign(linOptions,arguments[arguments.length-1])
124-
text = [...arguments].slice(0,-1)
125-
}else{
126-
text = [...arguments]
127-
}
128-
return {text,...linOptions}
129-
}
130-
return {
131-
addTitle(text,options={}){
132-
lines.splice(0,0,getLineFromArgs(...arguments))
133-
},
134-
// add(text,options={}) add([text,text,text])
135-
add(){
136-
lines.push(getLineFromArgs(...arguments))
111+
return {
112+
add(text,vars={},options={}){
113+
lines.push({
114+
text,
115+
vars,
116+
...options
117+
})
137118
},
138119
render:()=>{
139120
renderBanner()
140121
}
141122
}
142123

143124
}
125+
126+
127+
128+
129+
144130
/**
145131
*
146132
* @param {*} logger

colorize.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import stringifyObject from './stringify.js';
44
import deepmerge from "deepmerge"
55
import ansicolor from 'ansicolor'
6-
import { isClass,isPlainObject,isAsyncFunction,getDataType, isRegexp,firstUpper } from './utils.js';
6+
import { isPlainObject,getDataType } from './utils.js';
77
import { DefaultOptions } from './consts.js';
88

99
Object.assign(ansicolor.rgb,{
@@ -53,7 +53,9 @@ export function getColorizeFunction(style){
5353
}
5454
return func || ansicolor.dim
5555
}
56-
56+
export function colorizeString(text,style){
57+
return getColorizeFunction(style)(text)
58+
}
5759

5860
function colorizeBaseType(value,opts){
5961
let options = opts
@@ -73,7 +75,11 @@ function colorizeBaseType(value,opts){
7375
}
7476

7577
/**
78+
*
7679
* 返回着色后的字符串
80+
*
81+
* 不同的数据类型按不同的颜色进行显示
82+
*
7783
* @param {*} obj
7884
* @param {*} opts
7985
* @returns

demo.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ class MyError extends Error {
1717
super(message)
1818
}
1919
}
20-
async function delay(n=100){
20+
async function delay(n=50){
2121
return new Promise(resolve=>{
2222
setTimeout(resolve,n)
2323
})
2424
}
2525

2626

2727
logger.log("------------")
28-
for(let i = 0 ; i < 100; i++){
28+
for(let i = 0 ; i < 100; i=i+10){
2929
await delay(10)
3030
logger.print("已下载",i,"%",{end:"\r"})
3131
}
@@ -38,6 +38,10 @@ logger.print({z:()=>{}})
3838
logger.log("{a}+{b}={c}",{a:1,b:1,c:2})
3939
logger.log("My name is {}","tom")
4040
logger.log("{a}+{b}={c}",{a:1,b:1,c:2})
41+
logger.log("位置参数插值:{a}+{b}={c}",1,2,3)
42+
logger.log("指定颜色{#red a}+{#bgGreen,bgLightYellow b}={c} {x}",{a:1000,b:12222,c:2,x:"HELLO"})
43+
logger.log("Welcome to {#red VoerkaI18n}")
44+
4145

4246
logger.print("String",true,100,()=>{},[1,2,3])
4347
logger.print(null,undefined)

0 commit comments

Comments
 (0)