diff --git a/tools/docs/config.ts b/tools/docs/config.ts index b65f93d71831c4ed1ca737c7b7269bd01e4764f6..e98328eb9fe3b09906bd92437b03aedb0d0731e8 100644 --- a/tools/docs/config.ts +++ b/tools/docs/config.ts @@ -1,4 +1,4 @@ -import table from 'markdown-table'; +import stringify from 'json-stringify-pretty-compact'; import { getOptions } from '../../lib/config/options'; import { getCliName } from '../../lib/workers/global/config/parse/cli'; import { getEnvName } from '../../lib/workers/global/config/parse/env'; @@ -6,6 +6,75 @@ import { readFile, updateFile } from '../utils'; const options = getOptions(); +/** + * Merge string arrays one by one + * Example: let arr1 = ['a','b','c'], arr2 = ['1','2','3','4','5'] + * merge(arr1,arr2) = ['a','1','b','2','c','3','4','5'] + * @param array1 + * @param array2 + */ +function merge(array1: string[], array2: string[]): string[] { + const arr1 = [...array1]; + const arr2 = [...array2]; + const merged: string[] = []; + + for (const str1 of arr1) { + merged.push(str1); + const str2 = arr2.pop(); + if (str2 !== undefined) { + merged.push(str2); + } + } + return merged.concat(arr2); +} + +function indent( + strings: TemplateStringsArray, + ...keys: (string | number | boolean)[] +): string { + const indent = ' '; + const strs = [...strings]; + let amount = 0; + // validate input + if (typeof keys[0] === 'number' && strings[0] === '') { + amount = keys.shift() as number; + strs.shift(); + } + return indent.repeat(amount) + merge(strs, keys.map(String)).join(''); +} + +function buildHtmlTable(data: string[][]): string { + // skip empty tables + if (data.length < 2) { + return ''; + } + let table = `<table>\n`; + for (const [i, row] of data.entries()) { + if (i === 0) { + table += indent`${1}<thead>\n`; + } + + if (i === 1) { + table += indent`${1}</thead>\n` + indent`${1}<tbody>\n`; + } + + table += indent`${2}<tr>\n`; + for (const col of row) { + if (i === 0) { + table += indent`${3}<th>${col}</th>\n`; + continue; + } + table += + indent`${3}<td>${col}` + + (`${col}`.endsWith('\n') ? indent`${3}` : '') + + `</td>\n`; + } + table += indent`${2}</tr>\n`; + } + table += indent`${1}</tbody>\n</table>\n`; + return table; +} + function genTable(obj: [string, string][], type: string, def: any): string { const data = [['Name', 'Value']]; const name = obj[0][1]; @@ -33,14 +102,14 @@ function genTable(obj: [string, string][], type: string, def: any): string { name !== 'prBody') ) { if (type === 'string' && el[0] === 'default') { - el[1] = `\`"${el[1]}"\``; + el[1] = `<code>"${el[1]}"</code>`; } if ( (type === 'boolean' && el[0] === 'default') || el[0] === 'cli' || el[0] === 'env' ) { - el[1] = `\`${el[1]}\``; + el[1] = `<code>${el[1]}</code>`; } if (type === 'string' && el[0] === 'default' && el[1].length > 200) { el[1] = `[template]`; @@ -51,7 +120,7 @@ function genTable(obj: [string, string][], type: string, def: any): string { if (Object.keys(el[1] ?? []).length === 0) { return; } - el[1] = `\`${JSON.stringify(el[1])}\``; + el[1] = `\n\`\`\`json\n${stringify(el[1], { indent: 2 })}\n\`\`\`\n`; } data.push(el); } @@ -61,15 +130,15 @@ function genTable(obj: [string, string][], type: string, def: any): string { data.push(['default', '`[]`']); } if (type === 'string' && def === undefined) { - data.push(['default', '`null`']); + data.push(['default', '<code>null</code>']); } if (type === 'boolean' && def === undefined) { - data.push(['default', '`true`']); + data.push(['default', '<code>true</code>']); } if (type === 'boolean' && def === null) { - data.push(['default', '`null`']); + data.push(['default', '<code>null</code>']); } - return table(data); + return buildHtmlTable(data); } export async function generateConfig(dist: string, bot = false): Promise<void> {