colored-table 0.1.0-alpha.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,7 +1,7 @@
1
1
  # MIT License
2
-
3
- Copyright (c) <2025> <earthnut.dev>
4
2
 
3
+ Copyright (c) <2025> <earthnutDev>
4
+
5
5
  Permission to use, copy, modify, and/or distribute this software for any
6
6
  purpose with or without fee is hereby granted, provided that the above
7
7
  copyright notice and this permission notice appear in all copies.
package/README.md CHANGED
@@ -70,4 +70,4 @@ table.setFontSize(16); // 渲染表格会在控制台显示更大
70
70
 
71
71
  ## 文档地址
72
72
 
73
- [colored-table](https://earthnut.dev/colored-table)
73
+ [colored-table](https://earthnut.dev/nmp/colored-table)
package/index.cjs CHANGED
@@ -1 +1,20 @@
1
- "use strict";var e=require("a-js-tools"),t=require("a-type-of-js"),o=require("color-pen"),r=require("@color-pen/static");const n=e.createConstructor(function(e){return this.data=[],Object.setPrototypeOf(this,e),this});function l(e,o){if(o.align&&(e.align=o.align),o.bgColor&&(e.bgColor=o.bgColor),o.color&&(e.color=o.color),o.italic&&(e.italic=o.italic),o.underline&&(e.underline=o.underline),o.border)if(t.isType(o.border,e=>t.isString(e))){const t=o.border;e.border={left:{color:void 0,style:t},right:{color:void 0,style:t},top:{color:void 0,style:t},bottom:{color:void 0,style:t}}}else if(t.isType(o.border,e=>["color","style"].some(o=>!t.isUndefined(e[o])))){const t=o.border,r=t.style,n=t.color||void 0;e.border=JSON.parse(JSON.stringify({left:{color:n,style:r},right:{color:n,style:r},top:{color:n,style:r},bottom:{color:n,style:r}},(e,t)=>""===t?void 0:t))}else t.isType(o.border,e=>["left","right","top","bottom"].some(o=>!t.isUndefined(e[o])))&&(e.border=o.border)}class i{}function s(e,o){t.isArray(e)&&(e={data:e});const r=new i;l(r,e);const s=new n(r);return Object.setPrototypeOf(r,o),e.data?.forEach(e=>{e&&s.data.push(function(e,o){if(t.isUndefined(e))return;t.isType(e,e=>!t.isPlainObject(e))&&(e={content:e});const r={content:e.content};return l(r,e),Object.setPrototypeOf(r,o),r}(e,r))}),s}class c extends i{border={left:{style:"bold",color:void 0},right:{style:"bold",color:void 0},top:{style:"bold",color:void 0},bottom:{style:"bold",color:void 0}}}function a(e){const t=new c;return Object.setPrototypeOf(t,e),t}const d=!e.isNode(),u={emojiLength:2.08,emojiRegex:/[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F900}-\u{1F9FF}]/gu,chineseLength:1.8,chineseRegex:/[\u4E00-\u9FFF]/g};const f=new class{align="left";color="";bgColor="";bold=!1;underline=!1;italic=!1;border={left:{color:void 0,style:"simple"},right:{color:void 0,style:"simple"},top:{color:void 0,style:"simple"},bottom:{color:void 0,style:"simple"}}},h=e.createConstructor(function(e){return this.body=[],this.header=void 0,Object.setPrototypeOf(this,e),this});class b{}function g(e){let r=o.pen;return t.isType(e)&&(e.bold&&(r=r.bold),t.isBusinessEmptyString(e.bgColor)||t.isUndefined(e.bgColor)||(r=r.bgColor(e.bgColor)),t.isBusinessEmptyString(e.color)||t.isUndefined(e.color)||(r=r.color(e.color)),e.italic&&(r=r.italic),e.underline&&(r=r.underline)),r}const y={fine:{lt:"┌",ct:"┬",rt:"┐",lc:"├",c:"┼",rc:"┤",lb:"└",cb:"┴",rb:"┘",l:"─",v:"│"}};function p(e){let t=0;return[...e].forEach(e=>{u.emojiRegex.lastIndex=0,u.chineseRegex.lastIndex=0,e.match(u.emojiRegex)?t+=u.emojiLength:e.match(u.chineseRegex)?t+=u.chineseLength:t++}),Math.ceil(t)}function m(e,n){const l=function(e){const t=[];return e.header&&e.header.data.forEach((e,r)=>{const n=e?.content?.toString()??"";t[r]=Math.max(t[r]??0,d?p(n):o.strInTerminalLength(n))}),e.body&&e.body.forEach(e=>{e.data.forEach((e,r)=>{const n=e?.content?.toString()??"";t[r]=Math.max(t[r]??0,d?p(n):o.strInTerminalLength(n))})}),t}(e);let i=!1,s="";e.header&&(i=!0,s+=function(e,n){let l="";const i=n.length-1,{fine:s}=y,c=g(e);return n.forEach((e,t)=>{0===t&&(l+=s.lt),l+=r.terminalResetStyle,l+=s.l.repeat(e+2),t===i?(l+=r.terminalResetStyle,l+=s.rt):(l+=r.terminalResetStyle,l+=s.ct)}),l+="\n",n.forEach((n,a)=>{l+=r.terminalResetStyle,l+=s.v;const d=e.data[a];if(t.isUndefined(d)||t.isNull(d))l+=r.terminalResetStyle,l+=c(" ".repeat(n+2));else{const e=g(d);let t=d.content?.toString()??"";t=t.replace(/[\n]/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"),l+=r.terminalResetStyle,l+=e`\u2002${o.cutoffStringWithChar(t,n)}\u2002`}a===i&&(l+=s.v)}),l+="\n",l}(e.header,l)),s+=function(e,n,l){let i="";const s=n.length-1,{fine:c}=y;return n.forEach((e,t)=>{0===t&&(i+=r.terminalResetStyle,i+=l?c.lc:c.lt),i+=r.terminalResetStyle,i+=c.l.repeat(e+2),t===s?(i+=r.terminalResetStyle,i+=l?c.rc:c.rt):(i+=r.terminalResetStyle,i+=l?c.c:c.ct)}),i+="\n",e.forEach((l,a)=>{const d=g(l);n.forEach((e,n)=>{i+=r.terminalResetStyle,i+=c.v;const a=l.data[n];if(t.isUndefined(a)||t.isNull(a))i+=d`${" ".repeat(e+2)}`;else{const t=g(a);let n=a.content?.toString()||"";n=n.replace(/[\n]/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"),i+=r.terminalResetStyle,i+=t`\u2002${o.cutoffStringWithChar(n,e)}\u2002`}n===s&&(i+=r.terminalResetStyle,i+=c.v)}),i+="\n";const u=e.length-1===a;n.forEach((e,t)=>{0===t&&(i+=r.terminalResetStyle,i+=u?c.lb:c.lc),i+=r.terminalResetStyle,i+=c.l.repeat(e+2),t===s?(i+=r.terminalResetStyle,i+=u?c.rb:c.rc):(i+=r.terminalResetStyle,i+=u?c.cb:c.c)}),i+="\n"}),i}(e.body,l,i);const c=o.colorText(s);if(d){const e=c[0].split("%c"),t=c.map((t,r)=>{if(r>0){const l=[...e[r]].reduce((e,t)=>o.strInTerminalLength(t)>1?(u.emojiRegex.lastIndex=0,t.match(u.emojiRegex)?e-(u.emojiLength-2):e+(2-u.chineseLength)):e,0);return t+"font-family: Consolas,Monaco,Courier,'Courier New','等宽字体',monospace; font-size:"+n+"px;word-spacing:normal;padding:0;margin:0;padding-right:"+l*n+"px"}return t});console.log(...t)}else console.log(...c)}const S=e.createConstructor(function(e){const[o,r]=function(e){t.isUndefined(e)&&(e={}),t.isArray(e)&&(e={body:e});const o=new b;l(o,e),Object.setPrototypeOf(o,f);const r=new h(o);return e.header&&(r.header=s(e.header,a(o))),e.body?.forEach(e=>r.body.push(s(e,o))),[r,o]}(e);let n=12;const i=()=>m(o,n);return Object.setPrototypeOf(i,this),Object.defineProperties(i,{addRow:{value:e=>(o.body.push(s(e,r)),i),configurable:!1,writable:!1,enumerable:!1},setHeader:{value:e=>(o.header=s(e,a(r)),i),configurable:!1,writable:!1,enumerable:!1},setFontSize:{value:e=>(n=e,i)}}),i});exports.ColoredTable=S,exports.ColoredTableGlobalData=f,exports.Table=S;
1
+ 'use strict';
2
+
3
+ var aJsTools = require('a-js-tools');
4
+ var core = require('./src/core.cjs');
5
+ var global = require('./src/global.cjs');
6
+
7
+ /**
8
+ *
9
+ * # 构建 DIY 表单
10
+ *
11
+ * 使用 console.table 构建的表单默认不支持彩色文本(目前我没找到支持的方法),遂花几日写该方法
12
+ *
13
+ *
14
+ *
15
+ */
16
+ const tableClass = aJsTools.createConstructor(core.table);
17
+
18
+ exports.ColoredTableGlobalData = global.globalData;
19
+ exports.ColoredTable = tableClass;
20
+ exports.Table = tableClass;
package/index.mjs CHANGED
@@ -1 +1,16 @@
1
- import{createConstructor as o,isNode as e}from"a-js-tools";import{isType as t,isString as r,isUndefined as n,isPlainObject as l,isArray as c,isBusinessEmptyString as i,isNull as s}from"a-type-of-js";import{pen as a,cutoffStringWithChar as d,strInTerminalLength as b,colorText as u}from"color-pen";import{terminalResetStyle as f}from"@color-pen/static";const h=o(function(o){return this.data=[],Object.setPrototypeOf(this,o),this});function g(o,e){if(e.align&&(o.align=e.align),e.bgColor&&(o.bgColor=e.bgColor),e.color&&(o.color=e.color),e.italic&&(o.italic=e.italic),e.underline&&(o.underline=e.underline),e.border)if(t(e.border,o=>r(o))){const t=e.border;o.border={left:{color:void 0,style:t},right:{color:void 0,style:t},top:{color:void 0,style:t},bottom:{color:void 0,style:t}}}else if(t(e.border,o=>["color","style"].some(e=>!n(o[e])))){const t=e.border,r=t.style,n=t.color||void 0;o.border=JSON.parse(JSON.stringify({left:{color:n,style:r},right:{color:n,style:r},top:{color:n,style:r},bottom:{color:n,style:r}},(o,e)=>""===e?void 0:e))}else t(e.border,o=>["left","right","top","bottom"].some(e=>!n(o[e])))&&(o.border=e.border)}class p{}function m(o,e){c(o)&&(o={data:o});const r=new p;g(r,o);const i=new h(r);return Object.setPrototypeOf(r,e),o.data?.forEach(o=>{o&&i.data.push(function(o,e){if(n(o))return;t(o,o=>!l(o))&&(o={content:o});const r={content:o.content};return g(r,o),Object.setPrototypeOf(r,e),r}(o,r))}),i}class y extends p{border={left:{style:"bold",color:void 0},right:{style:"bold",color:void 0},top:{style:"bold",color:void 0},bottom:{style:"bold",color:void 0}}}function v(o){const e=new y;return Object.setPrototypeOf(e,o),e}const F=!e(),j={emojiLength:2.08,emojiRegex:/[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F900}-\u{1F9FF}]/gu,chineseLength:1.8,chineseRegex:/[\u4E00-\u9FFF]/g};const x=new class{align="left";color="";bgColor="";bold=!1;underline=!1;italic=!1;border={left:{color:void 0,style:"simple"},right:{color:void 0,style:"simple"},top:{color:void 0,style:"simple"},bottom:{color:void 0,style:"simple"}}},O=o(function(o){return this.body=[],this.header=void 0,Object.setPrototypeOf(this,o),this});class C{}function E(o){let e=a;return t(o)&&(o.bold&&(e=e.bold),i(o.bgColor)||n(o.bgColor)||(e=e.bgColor(o.bgColor)),i(o.color)||n(o.color)||(e=e.color(o.color)),o.italic&&(e=e.italic),o.underline&&(e=e.underline)),e}const w={fine:{lt:"┌",ct:"┬",rt:"┐",lc:"├",c:"┼",rc:"┤",lb:"└",cb:"┴",rb:"┘",l:"─",v:"│"}};function R(o){let e=0;return[...o].forEach(o=>{j.emojiRegex.lastIndex=0,j.chineseRegex.lastIndex=0,o.match(j.emojiRegex)?e+=j.emojiLength:o.match(j.chineseRegex)?e+=j.chineseLength:e++}),Math.ceil(e)}function P(o,e){const t=function(o){const e=[];return o.header&&o.header.data.forEach((o,t)=>{const r=o?.content?.toString()??"";e[t]=Math.max(e[t]??0,F?R(r):b(r))}),o.body&&o.body.forEach(o=>{o.data.forEach((o,t)=>{const r=o?.content?.toString()??"";e[t]=Math.max(e[t]??0,F?R(r):b(r))})}),e}(o);let r=!1,l="";o.header&&(r=!0,l+=function(o,e){let t="";const r=e.length-1,{fine:l}=w,c=E(o);return e.forEach((o,e)=>{0===e&&(t+=l.lt),t+=f,t+=l.l.repeat(o+2),e===r?(t+=f,t+=l.rt):(t+=f,t+=l.ct)}),t+="\n",e.forEach((e,i)=>{t+=f,t+=l.v;const a=o.data[i];if(n(a)||s(a))t+=f,t+=c(" ".repeat(e+2));else{const o=E(a);let r=a.content?.toString()??"";r=r.replace(/[\n]/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"),t+=f,t+=o`\u2002${d(r,e)}\u2002`}i===r&&(t+=l.v)}),t+="\n",t}(o.header,t)),l+=function(o,e,t){let r="";const l=e.length-1,{fine:c}=w;return e.forEach((o,e)=>{0===e&&(r+=f,r+=t?c.lc:c.lt),r+=f,r+=c.l.repeat(o+2),e===l?(r+=f,r+=t?c.rc:c.rt):(r+=f,r+=t?c.c:c.ct)}),r+="\n",o.forEach((t,i)=>{const a=E(t);e.forEach((o,e)=>{r+=f,r+=c.v;const i=t.data[e];if(n(i)||s(i))r+=a`${" ".repeat(o+2)}`;else{const e=E(i);let t=i.content?.toString()||"";t=t.replace(/[\n]/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t"),r+=f,r+=e`\u2002${d(t,o)}\u2002`}e===l&&(r+=f,r+=c.v)}),r+="\n";const b=o.length-1===i;e.forEach((o,e)=>{0===e&&(r+=f,r+=b?c.lb:c.lc),r+=f,r+=c.l.repeat(o+2),e===l?(r+=f,r+=b?c.rb:c.rc):(r+=f,r+=b?c.cb:c.c)}),r+="\n"}),r}(o.body,t,r);const c=u(l);if(F){const o=c[0].split("%c"),t=c.map((t,r)=>{if(r>0){const n=[...o[r]].reduce((o,e)=>b(e)>1?(j.emojiRegex.lastIndex=0,e.match(j.emojiRegex)?o-(j.emojiLength-2):o+(2-j.chineseLength)):o,0);return t+"font-family: Consolas,Monaco,Courier,'Courier New','等宽字体',monospace; font-size:"+e+"px;word-spacing:normal;padding:0;margin:0;padding-right:"+n*e+"px"}return t});console.log(...t)}else console.log(...c)}const S=o(function(o){const[e,t]=function(o){n(o)&&(o={}),c(o)&&(o={body:o});const e=new C;g(e,o),Object.setPrototypeOf(e,x);const t=new O(e);return o.header&&(t.header=m(o.header,v(e))),o.body?.forEach(o=>t.body.push(m(o,e))),[t,e]}(o);let r=12;const l=()=>P(e,r);return Object.setPrototypeOf(l,this),Object.defineProperties(l,{addRow:{value:o=>(e.body.push(m(o,t)),l),configurable:!1,writable:!1,enumerable:!1},setHeader:{value:o=>(e.header=m(o,v(t)),l),configurable:!1,writable:!1,enumerable:!1},setFontSize:{value:o=>(r=o,l)}}),l});export{S as ColoredTable,x as ColoredTableGlobalData,S as Table};
1
+ import { createConstructor } from 'a-js-tools';
2
+ import { table } from './src/core.mjs';
3
+ export { globalData as ColoredTableGlobalData } from './src/global.mjs';
4
+
5
+ /**
6
+ *
7
+ * # 构建 DIY 表单
8
+ *
9
+ * 使用 console.table 构建的表单默认不支持彩色文本(目前我没找到支持的方法),遂花几日写该方法
10
+ *
11
+ *
12
+ *
13
+ */
14
+ const tableClass = createConstructor(table);
15
+
16
+ export { tableClass as ColoredTable, tableClass as Table };
package/package.json CHANGED
@@ -1,24 +1,26 @@
1
1
  {
2
+ "main": "index.cjs",
3
+ "module": "index.mjs",
4
+ "types": "index.d.ts",
2
5
  "name": "colored-table",
6
+ "version": "0.1.0",
3
7
  "type": "module",
4
- "version": "0.1.0-alpha.0",
5
- "description": "一个简单的在控制台及控制台构建彩色文本表格的工具 🔧",
8
+ "description": "一个简单的在控制台及控制台构建彩色文本表格的工具",
6
9
  "license": "MIT",
7
10
  "dependencies": {
8
- "@color-pen/static": "^1.0.0",
9
- "a-js-tools": "^1.0.8",
10
- "a-type-of-js": "^1.0.5",
11
- "color-pen": "^2.0.12"
11
+ "@color-pen/static": "^1.0.1",
12
+ "a-js-tools": "^1.0.10",
13
+ "a-type-of-js": "^1.0.7",
14
+ "color-pen": "^2.0.13"
12
15
  },
13
- "author": {
14
- "name": "earthnut",
15
- "email": "earthnut.dev@outlook.com",
16
- "url": "https://earthnut.dev"
16
+ "publishConfig": {
17
+ "access": "public",
18
+ "registry": "https://registry.npmjs.org/"
17
19
  },
18
20
  "files": [
21
+ "index.d.ts",
19
22
  "index.mjs",
20
23
  "index.cjs",
21
- "index.d.ts",
22
24
  "src"
23
25
  ],
24
26
  "exports": {
@@ -33,23 +35,28 @@
33
35
  }
34
36
  }
35
37
  },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/earthnutDev/colored-table.git"
41
+ },
42
+ "author": {
43
+ "name": "花生亻",
44
+ "email": "earthnut.dev@outlook.com",
45
+ "url": "https://earthnut.dev"
46
+ },
47
+ "browserslist": [
48
+ "node>=18.0.0"
49
+ ],
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ },
36
53
  "keywords": [
37
54
  "colored-table",
38
- "qqi",
39
- "@qqi",
40
- "@qqi/table"
55
+ "colored-table"
41
56
  ],
42
- "homepage": "https://earthnut.dev/colored-table",
57
+ "homepage": "https://earthnut.dev/npm/colored-table",
43
58
  "bugs": {
44
- "url": "https://github.com/earthnutDev/qqi/issues",
59
+ "url": "https://github.com/earthnutDev/colored-table/issues",
45
60
  "email": "earthnut.dev@outlook.com"
46
- },
47
- "repository": {
48
- "type": "git",
49
- "url": "git+https://github.com/earthnutDev/qqi.git"
50
- },
51
- "publishConfig": {
52
- "access": "public",
53
- "registry": "https://registry.npmjs.org/"
54
61
  }
55
62
  }
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ var aTypeOfJs = require('a-type-of-js');
4
+ var createPen = require('./createPen.cjs');
5
+ var colorPen = require('color-pen');
6
+ var lines = require('../lines.cjs');
7
+ var _static = require('@color-pen/static');
8
+
9
+ /** 构建表头 */
10
+ function buildBody(body, lineList, hasHeader) {
11
+ /** 结果 */
12
+ let result = '';
13
+ /** 最大的下标 */
14
+ const lineMaxIndex = lineList.length - 1;
15
+ const { fine } = lines.lines;
16
+ lineList.forEach((e, i) => {
17
+ if (i === 0) {
18
+ result += _static.terminalResetStyle;
19
+ result += hasHeader ? fine.lc : fine.lt;
20
+ }
21
+ result += _static.terminalResetStyle;
22
+ result += fine.l.repeat(e + 2);
23
+ if (i === lineMaxIndex) {
24
+ result += _static.terminalResetStyle;
25
+ result += hasHeader ? fine.rc : fine.rt;
26
+ }
27
+ else {
28
+ result += _static.terminalResetStyle;
29
+ result += hasHeader ? fine.c : fine.ct;
30
+ }
31
+ });
32
+ result += '\n';
33
+ body.forEach((row, index) => {
34
+ /** 默认的画笔 (用于绘制空值时的表格) */
35
+ const defaultPen = createPen.createPen(row);
36
+ lineList.forEach((e, i) => {
37
+ result += _static.terminalResetStyle;
38
+ result += fine.v;
39
+ /** 当前的元素 */
40
+ const ele = row.data[i];
41
+ // 元素为空则输出默认的样式
42
+ if (aTypeOfJs.isUndefined(ele) || aTypeOfJs.isNull(ele)) {
43
+ result += defaultPen `${'\u2002'.repeat(e + 2)}`;
44
+ }
45
+ else {
46
+ /** 默认的画笔 (用于绘制空值时的表格) */
47
+ const cellPen = createPen.createPen(ele);
48
+ let str = ele.content?.toString() || '';
49
+ str = str
50
+ .replace(/[\n]/g, '\\n')
51
+ .replace(/\r/g, '\\r')
52
+ .replace(/\t/g, '\\t');
53
+ result += _static.terminalResetStyle;
54
+ result += cellPen `\u2002${colorPen.cutoffStringWithChar(str, e)}\u2002`;
55
+ }
56
+ if (i === lineMaxIndex) {
57
+ result += _static.terminalResetStyle;
58
+ result += fine.v;
59
+ }
60
+ });
61
+ result += '\n';
62
+ const isLastRow = body.length - 1 === index;
63
+ lineList.forEach((e, i) => {
64
+ if (i === 0) {
65
+ result += _static.terminalResetStyle;
66
+ result += isLastRow ? fine.lb : fine.lc;
67
+ }
68
+ result += _static.terminalResetStyle;
69
+ result += fine.l.repeat(e + 2);
70
+ if (i === lineMaxIndex) {
71
+ // 最后一行的最后一个
72
+ result += _static.terminalResetStyle;
73
+ result += isLastRow ? fine.rb : fine.rc;
74
+ }
75
+ else {
76
+ result += _static.terminalResetStyle;
77
+ result += isLastRow ? fine.cb : fine.c;
78
+ }
79
+ });
80
+ result += '\n';
81
+ });
82
+ return result;
83
+ }
84
+
85
+ exports.buildBody = buildBody;
@@ -0,0 +1,83 @@
1
+ import { isUndefined, isNull } from 'a-type-of-js';
2
+ import { createPen } from './createPen.mjs';
3
+ import { cutoffStringWithChar } from 'color-pen';
4
+ import { lines } from '../lines.mjs';
5
+ import { terminalResetStyle } from '@color-pen/static';
6
+
7
+ /** 构建表头 */
8
+ function buildBody(body, lineList, hasHeader) {
9
+ /** 结果 */
10
+ let result = '';
11
+ /** 最大的下标 */
12
+ const lineMaxIndex = lineList.length - 1;
13
+ const { fine } = lines;
14
+ lineList.forEach((e, i) => {
15
+ if (i === 0) {
16
+ result += terminalResetStyle;
17
+ result += hasHeader ? fine.lc : fine.lt;
18
+ }
19
+ result += terminalResetStyle;
20
+ result += fine.l.repeat(e + 2);
21
+ if (i === lineMaxIndex) {
22
+ result += terminalResetStyle;
23
+ result += hasHeader ? fine.rc : fine.rt;
24
+ }
25
+ else {
26
+ result += terminalResetStyle;
27
+ result += hasHeader ? fine.c : fine.ct;
28
+ }
29
+ });
30
+ result += '\n';
31
+ body.forEach((row, index) => {
32
+ /** 默认的画笔 (用于绘制空值时的表格) */
33
+ const defaultPen = createPen(row);
34
+ lineList.forEach((e, i) => {
35
+ result += terminalResetStyle;
36
+ result += fine.v;
37
+ /** 当前的元素 */
38
+ const ele = row.data[i];
39
+ // 元素为空则输出默认的样式
40
+ if (isUndefined(ele) || isNull(ele)) {
41
+ result += defaultPen `${'\u2002'.repeat(e + 2)}`;
42
+ }
43
+ else {
44
+ /** 默认的画笔 (用于绘制空值时的表格) */
45
+ const cellPen = createPen(ele);
46
+ let str = ele.content?.toString() || '';
47
+ str = str
48
+ .replace(/[\n]/g, '\\n')
49
+ .replace(/\r/g, '\\r')
50
+ .replace(/\t/g, '\\t');
51
+ result += terminalResetStyle;
52
+ result += cellPen `\u2002${cutoffStringWithChar(str, e)}\u2002`;
53
+ }
54
+ if (i === lineMaxIndex) {
55
+ result += terminalResetStyle;
56
+ result += fine.v;
57
+ }
58
+ });
59
+ result += '\n';
60
+ const isLastRow = body.length - 1 === index;
61
+ lineList.forEach((e, i) => {
62
+ if (i === 0) {
63
+ result += terminalResetStyle;
64
+ result += isLastRow ? fine.lb : fine.lc;
65
+ }
66
+ result += terminalResetStyle;
67
+ result += fine.l.repeat(e + 2);
68
+ if (i === lineMaxIndex) {
69
+ // 最后一行的最后一个
70
+ result += terminalResetStyle;
71
+ result += isLastRow ? fine.rb : fine.rc;
72
+ }
73
+ else {
74
+ result += terminalResetStyle;
75
+ result += isLastRow ? fine.cb : fine.c;
76
+ }
77
+ });
78
+ result += '\n';
79
+ });
80
+ return result;
81
+ }
82
+
83
+ export { buildBody };
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var aTypeOfJs = require('a-type-of-js');
4
+ var createPen = require('./createPen.cjs');
5
+ var colorPen = require('color-pen');
6
+ var lines = require('../lines.cjs');
7
+ var _static = require('@color-pen/static');
8
+
9
+ /** 构建表头 */
10
+ function buildHeader(header, lineList) {
11
+ /** 结果 */
12
+ let result = '';
13
+ /** 最大的下标 */
14
+ const lineMaxIndex = lineList.length - 1;
15
+ const { fine } = lines.lines;
16
+ /** 默认的画笔 (用于绘制空值时的表格) */
17
+ const defaultPen = createPen.createPen(header);
18
+ lineList.forEach((e, i) => {
19
+ if (i === 0) {
20
+ result += fine.lt;
21
+ }
22
+ result += _static.terminalResetStyle;
23
+ result += fine.l.repeat(e + 2);
24
+ if (i === lineMaxIndex) {
25
+ result += _static.terminalResetStyle;
26
+ result += fine.rt;
27
+ }
28
+ else {
29
+ result += _static.terminalResetStyle;
30
+ result += fine.ct;
31
+ }
32
+ });
33
+ result += '\n';
34
+ lineList.forEach((e, i) => {
35
+ result += _static.terminalResetStyle;
36
+ result += fine.v;
37
+ /** 当前的元素 */
38
+ const ele = header.data[i];
39
+ // 元素为空则输出默认的样式
40
+ if (aTypeOfJs.isUndefined(ele) || aTypeOfJs.isNull(ele)) {
41
+ result += _static.terminalResetStyle;
42
+ result += defaultPen('\u2002'.repeat(e + 2));
43
+ }
44
+ else {
45
+ /** 默认的画笔 (用于绘制空值时的表格) */
46
+ const cellPen = createPen.createPen(ele);
47
+ let str = ele.content?.toString() ?? '';
48
+ str = str
49
+ .replace(/[\n]/g, '\\n')
50
+ .replace(/\r/g, '\\r')
51
+ .replace(/\t/g, '\\t');
52
+ result += _static.terminalResetStyle;
53
+ result += cellPen `\u2002${colorPen.cutoffStringWithChar(str, e)}\u2002`;
54
+ }
55
+ if (i === lineMaxIndex) {
56
+ result += fine.v;
57
+ }
58
+ });
59
+ result += '\n';
60
+ return result;
61
+ }
62
+
63
+ exports.buildHeader = buildHeader;
@@ -0,0 +1,61 @@
1
+ import { isUndefined, isNull } from 'a-type-of-js';
2
+ import { createPen } from './createPen.mjs';
3
+ import { cutoffStringWithChar } from 'color-pen';
4
+ import { lines } from '../lines.mjs';
5
+ import { terminalResetStyle } from '@color-pen/static';
6
+
7
+ /** 构建表头 */
8
+ function buildHeader(header, lineList) {
9
+ /** 结果 */
10
+ let result = '';
11
+ /** 最大的下标 */
12
+ const lineMaxIndex = lineList.length - 1;
13
+ const { fine } = lines;
14
+ /** 默认的画笔 (用于绘制空值时的表格) */
15
+ const defaultPen = createPen(header);
16
+ lineList.forEach((e, i) => {
17
+ if (i === 0) {
18
+ result += fine.lt;
19
+ }
20
+ result += terminalResetStyle;
21
+ result += fine.l.repeat(e + 2);
22
+ if (i === lineMaxIndex) {
23
+ result += terminalResetStyle;
24
+ result += fine.rt;
25
+ }
26
+ else {
27
+ result += terminalResetStyle;
28
+ result += fine.ct;
29
+ }
30
+ });
31
+ result += '\n';
32
+ lineList.forEach((e, i) => {
33
+ result += terminalResetStyle;
34
+ result += fine.v;
35
+ /** 当前的元素 */
36
+ const ele = header.data[i];
37
+ // 元素为空则输出默认的样式
38
+ if (isUndefined(ele) || isNull(ele)) {
39
+ result += terminalResetStyle;
40
+ result += defaultPen('\u2002'.repeat(e + 2));
41
+ }
42
+ else {
43
+ /** 默认的画笔 (用于绘制空值时的表格) */
44
+ const cellPen = createPen(ele);
45
+ let str = ele.content?.toString() ?? '';
46
+ str = str
47
+ .replace(/[\n]/g, '\\n')
48
+ .replace(/\r/g, '\\r')
49
+ .replace(/\t/g, '\\t');
50
+ result += terminalResetStyle;
51
+ result += cellPen `\u2002${cutoffStringWithChar(str, e)}\u2002`;
52
+ }
53
+ if (i === lineMaxIndex) {
54
+ result += fine.v;
55
+ }
56
+ });
57
+ result += '\n';
58
+ return result;
59
+ }
60
+
61
+ export { buildHeader };
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ var colorPen = require('color-pen');
4
+ var global = require('../global.cjs');
5
+
6
+ /** 计算得到最大的值 */
7
+ function computerMaxLen(data) {
8
+ const result = [];
9
+ /** 计算 */
10
+ if (data.header) {
11
+ data.header.data.forEach((e, i) => {
12
+ const current = e?.content?.toString() ?? '';
13
+ result[i] = Math.max(result[i] ?? 0, global.browserEnv ? strInBrowserLength(current) : colorPen.strInTerminalLength(current));
14
+ });
15
+ }
16
+ if (data.body) {
17
+ data.body.forEach(row => {
18
+ row.data.forEach((e, i) => {
19
+ const current = e?.content?.toString() ?? '';
20
+ result[i] = Math.max(result[i] ?? 0, global.browserEnv
21
+ ? strInBrowserLength(current)
22
+ : colorPen.strInTerminalLength(current));
23
+ });
24
+ });
25
+ }
26
+ return result;
27
+ }
28
+ /** 字符串在浏览器环境的字符长度 */
29
+ function strInBrowserLength(str) {
30
+ /** */
31
+ let result = 0;
32
+ [...str].forEach(e => {
33
+ global.data.emojiRegex.lastIndex = 0;
34
+ global.data.chineseRegex.lastIndex = 0;
35
+ if (e.match(global.data.emojiRegex)) {
36
+ result += global.data.emojiLength;
37
+ }
38
+ else if (e.match(global.data.chineseRegex)) {
39
+ result += global.data.chineseLength;
40
+ }
41
+ else {
42
+ result++;
43
+ }
44
+ });
45
+ return Math.ceil(result);
46
+ }
47
+
48
+ exports.computerMaxLen = computerMaxLen;
@@ -0,0 +1,46 @@
1
+ import { strInTerminalLength } from 'color-pen';
2
+ import { browserEnv, data } from '../global.mjs';
3
+
4
+ /** 计算得到最大的值 */
5
+ function computerMaxLen(data) {
6
+ const result = [];
7
+ /** 计算 */
8
+ if (data.header) {
9
+ data.header.data.forEach((e, i) => {
10
+ const current = e?.content?.toString() ?? '';
11
+ result[i] = Math.max(result[i] ?? 0, browserEnv ? strInBrowserLength(current) : strInTerminalLength(current));
12
+ });
13
+ }
14
+ if (data.body) {
15
+ data.body.forEach(row => {
16
+ row.data.forEach((e, i) => {
17
+ const current = e?.content?.toString() ?? '';
18
+ result[i] = Math.max(result[i] ?? 0, browserEnv
19
+ ? strInBrowserLength(current)
20
+ : strInTerminalLength(current));
21
+ });
22
+ });
23
+ }
24
+ return result;
25
+ }
26
+ /** 字符串在浏览器环境的字符长度 */
27
+ function strInBrowserLength(str) {
28
+ /** */
29
+ let result = 0;
30
+ [...str].forEach(e => {
31
+ data.emojiRegex.lastIndex = 0;
32
+ data.chineseRegex.lastIndex = 0;
33
+ if (e.match(data.emojiRegex)) {
34
+ result += data.emojiLength;
35
+ }
36
+ else if (e.match(data.chineseRegex)) {
37
+ result += data.chineseLength;
38
+ }
39
+ else {
40
+ result++;
41
+ }
42
+ });
43
+ return Math.ceil(result);
44
+ }
45
+
46
+ export { computerMaxLen };
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ var aTypeOfJs = require('a-type-of-js');
4
+ var colorPen = require('color-pen');
5
+
6
+ /** 默认的笔 */
7
+ function createPen(options) {
8
+ let defaultPen = colorPen.pen;
9
+ if (aTypeOfJs.isType(options)) {
10
+ if (options.bold)
11
+ defaultPen = defaultPen.bold;
12
+ if (!aTypeOfJs.isBusinessEmptyString(options.bgColor) &&
13
+ !aTypeOfJs.isUndefined(options.bgColor))
14
+ defaultPen = defaultPen.bgColor(options.bgColor);
15
+ if (!aTypeOfJs.isBusinessEmptyString(options.color) && !aTypeOfJs.isUndefined(options.color))
16
+ defaultPen = defaultPen.color(options.color);
17
+ if (options.italic)
18
+ defaultPen = defaultPen.italic;
19
+ if (options.underline)
20
+ defaultPen = defaultPen.underline;
21
+ }
22
+ return defaultPen;
23
+ }
24
+
25
+ exports.createPen = createPen;
@@ -0,0 +1,23 @@
1
+ import { isType, isBusinessEmptyString, isUndefined } from 'a-type-of-js';
2
+ import { pen } from 'color-pen';
3
+
4
+ /** 默认的笔 */
5
+ function createPen(options) {
6
+ let defaultPen = pen;
7
+ if (isType(options)) {
8
+ if (options.bold)
9
+ defaultPen = defaultPen.bold;
10
+ if (!isBusinessEmptyString(options.bgColor) &&
11
+ !isUndefined(options.bgColor))
12
+ defaultPen = defaultPen.bgColor(options.bgColor);
13
+ if (!isBusinessEmptyString(options.color) && !isUndefined(options.color))
14
+ defaultPen = defaultPen.color(options.color);
15
+ if (options.italic)
16
+ defaultPen = defaultPen.italic;
17
+ if (options.underline)
18
+ defaultPen = defaultPen.underline;
19
+ }
20
+ return defaultPen;
21
+ }
22
+
23
+ export { createPen };
@@ -0,0 +1,56 @@
1
+ 'use strict';
2
+
3
+ var colorPen = require('color-pen');
4
+ var buildBody = require('./buildBody.cjs');
5
+ var buildHeader = require('./buildHeader.cjs');
6
+ var computerMaxLen = require('./computerMaxLen.cjs');
7
+ var global = require('../global.cjs');
8
+
9
+ /** 渲染 */
10
+ function render(table, fontSize) {
11
+ /** 获取每一行最大宽度的元素的宽度组成的数组 */
12
+ const lineLen = computerMaxLen.computerMaxLen(table);
13
+ /** 是否有表头 */
14
+ let hasHeader = false;
15
+ let buildStr = '';
16
+ // 构建表头
17
+ if (table.header) {
18
+ hasHeader = true;
19
+ buildStr += buildHeader.buildHeader(table.header, lineLen);
20
+ }
21
+ buildStr += buildBody.buildBody(table.body, lineLen, hasHeader);
22
+ /** 彩色数组 */
23
+ const colorTextArr = colorPen.colorText(buildStr);
24
+ if (global.browserEnv) {
25
+ const strList = colorTextArr[0].split('%c');
26
+ const result = colorTextArr.map((e, i) => {
27
+ if (i > 0) {
28
+ /** 构建最小的单位的组 */
29
+ const doubleByteCharNumber = [...strList[i]].reduce((v, e) => {
30
+ if (colorPen.strInTerminalLength(e) > 1) {
31
+ global.data.emojiRegex.lastIndex = 0;
32
+ if (e.match(global.data.emojiRegex))
33
+ return v - (global.data.emojiLength - 2);
34
+ return v + (2 - global.data.chineseLength);
35
+ }
36
+ return v;
37
+ }, 0);
38
+ const newStr = e +
39
+ "font-family: Consolas,Monaco,Courier,'Courier New','等宽字体',monospace; font-size:" +
40
+ fontSize +
41
+ 'px;word-spacing:normal;padding:0;margin:0;padding-right:' +
42
+ doubleByteCharNumber * fontSize +
43
+ 'px';
44
+ return newStr;
45
+ }
46
+ return e;
47
+ });
48
+ /// 渲染表格
49
+ console.log(...result);
50
+ }
51
+ else {
52
+ console.log(...colorTextArr);
53
+ }
54
+ }
55
+
56
+ exports.render = render;