diff --git a/package.json b/package.json index e504be6..2db6996 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "base64-img": "^1.0.4", "canvas": "^2.11.2", "cli-progress": "^3.12.0", + "cli-table": "^0.3.4", "commander": "^11.0.0", "figlet": "^1.6.0", "is-image-url": "^1.1.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc1fa34..b22d797 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ dependencies: cli-progress: specifier: ^3.12.0 version: 3.12.0 + cli-table: + specifier: ^0.3.4 + version: 0.3.4 commander: specifier: ^11.0.0 version: 11.1.0 @@ -602,7 +605,6 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -843,7 +845,6 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -890,6 +891,14 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + /cli-table@0.3.4: + resolution: {integrity: sha512-1vinpnX/ZERcmE443i3SZTmU5DF0rPO9DrL4I2iVAllhxzCM9SzPlHnz19fsZB78htkKZvYBvj6SZ6vXnaxmTA==} + engines: {node: '>= 10.0.0'} + dependencies: + chalk: 2.4.2 + string-width: 4.2.3 + dev: false + /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -920,7 +929,6 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -930,7 +938,6 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1343,7 +1350,6 @@ packages: /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: true /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -1950,7 +1956,6 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -3433,7 +3438,6 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} diff --git a/src/cmd/generate.js b/src/cmd/generate.js index 9de0c12..aec7845 100644 --- a/src/cmd/generate.js +++ b/src/cmd/generate.js @@ -73,11 +73,12 @@ const calculateSeparator = (separator, usedContent) => { en: 'space', 'zh-cn': 'empty' } + try { if (supportSeparator.includes(separator)) return separator const languages = langdetect.detect(usedContent) const languageSeparator = separatorMap[languages[0].lang] - return languageSeparator in separatorMap ? languageSeparator : defaultSeparator + return languageSeparator ?? defaultSeparator } catch (error) { return defaultSeparator } diff --git a/src/draw.js b/src/draw.js index 8829052..dde9f6b 100644 --- a/src/draw.js +++ b/src/draw.js @@ -1,5 +1,6 @@ const { createCanvas, registerFont, loadImage, deregisterAllFonts } = require('canvas') -const { barWatcher, formatDateTime, colorTip, color } = require('./util') +const Table = require('cli-table') +const { barWatcher, formatDateTime, colorTip, color, truncateString } = require('./util') const HeaderCpu = require('./headerCpu') const FooterCpu = require('./footerCpu') const UnderLineCpu = require('./underlineCpu') @@ -29,7 +30,6 @@ class Drawer { from, underline } = anyPhotoConfig.canvasSetting - console.log(anyPhotoConfig) deregisterAllFonts() if (customFontPath) { registerFont(customFontPath, { @@ -38,7 +38,6 @@ class Drawer { } this.content = content this.anyPhotoConfig = anyPhotoConfig - // separator this.separator = this.anyPhotoConfig.separator this.width = width this.fontWeight = fontWeight @@ -78,6 +77,47 @@ class Drawer { this.underline = underline } + async setupTable() { + const { separator, content, title, anyPhotoConfig, color, backgroundColor, width } = this + const { + canvasSetting: { + header: { headerAlign }, + from: { name }, + footer: { slogan } + } + } = anyPhotoConfig + const table = new Table({ + style: { head: ['green'] }, + head: [ + 'separator', + 'header-align', + 'image-width', + 'title', + 'content', + 'background-color', + 'content-color', + 'from', + 'slogan' + ], + colWidths: [15, 15, 15, 20, 20, 20, 20, 20, 20] + }) + table.push([ + separator, + headerAlign, + width, + truncateString(title), + truncateString(content), + backgroundColor, + color, + truncateString(name), + truncateString(slogan) + ]) + + console.log(table.toString()) + + return this + } + async setupCpu() { const { from = {}, @@ -150,9 +190,11 @@ class Drawer { if (Array.isArray(backgroundColor)) { const directionPoint = this.getLinearGradientDirection gradientController = ctx.createLinearGradient(...directionPoint) - backgroundColor.forEach((color, index) => { - gradientController.addColorStop(index, color) - }) + const backgroundColorLength = backgroundColor.length + const intervalSize = 1 / (backgroundColorLength - 1) + for (let i = 0; i < backgroundColorLength; i++) { + gradientController.addColorStop(i * intervalSize, backgroundColor[i]) + } } ctx.textBaseline = textBaseline @@ -756,7 +798,8 @@ const draw = async ({ content, anyPhotoConfig }) => { const drawer = new Drawer({ content, anyPhotoConfig: handledAnyPhotoConfig }) return ( drawer - .setupCpu() + .setupTable() + .then(drawer => drawer.setupCpu()) .then(drawer => drawer.setupCanvas()) // .then(drawer => drawer.drawBackground()) .then(drawer => drawer.drawAvatar()) diff --git a/src/util.js b/src/util.js index 438f24d..fed26b2 100644 --- a/src/util.js +++ b/src/util.js @@ -8,9 +8,7 @@ const generateOra = options => ora(options) const sleep = time => { return new Promise(resolve => { - setTimeout(() => { - resolve() - }, time * 1000) + setTimeout(resolve, time * 1000) }) } @@ -72,6 +70,14 @@ const showAnyPhotoFiglet = () => { console.log(color(figlet.textSync('AnyPhoto'), 'green', 'bold')) } +const truncateString = (str, length = 7) => { + if (str.length > length) { + return str.substring(0, length) + '...' + } else { + return str + } +} + const barWatcher = new cliProgress.SingleBar({ format: 'Generate Progress ' + color('{bar}', 'green') + ' now status is => ' + color('{step}', 'green'), barCompleteChar: '\u2588', @@ -87,6 +93,7 @@ module.exports = { colorTip, checkRemoteFileExists, showAnyPhotoFiglet, + truncateString, barWatcher, formatDateTime }