@sc-voice/tools 3.20.0 → 3.21.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/package.json +1 -1
- package/src/text/list.mjs +89 -24
package/package.json
CHANGED
package/src/text/list.mjs
CHANGED
|
@@ -27,7 +27,13 @@ export class ListFactory {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
createList(opts = {}) {
|
|
30
|
-
let {
|
|
30
|
+
let {
|
|
31
|
+
name, // title
|
|
32
|
+
values=[],
|
|
33
|
+
separator = ',', // join() separator
|
|
34
|
+
widths, // element string widths
|
|
35
|
+
precision = 3, // numeric precision
|
|
36
|
+
} = opts;
|
|
31
37
|
|
|
32
38
|
let list = [...values];
|
|
33
39
|
|
|
@@ -37,46 +43,68 @@ export class ListFactory {
|
|
|
37
43
|
}
|
|
38
44
|
|
|
39
45
|
Object.defineProperty(list, 'name', {
|
|
40
|
-
|
|
46
|
+
writable: true,
|
|
41
47
|
value: name,
|
|
42
48
|
});
|
|
49
|
+
Object.defineProperty(list, 'precision', {
|
|
50
|
+
writable: true,
|
|
51
|
+
value: precision,
|
|
52
|
+
});
|
|
43
53
|
Object.defineProperty(list, 'separator', {
|
|
44
|
-
|
|
54
|
+
writable: true,
|
|
45
55
|
value: separator,
|
|
46
56
|
});
|
|
57
|
+
Object.defineProperty(list, 'widths', {
|
|
58
|
+
writable: true,
|
|
59
|
+
value: widths,
|
|
60
|
+
});
|
|
47
61
|
Object.defineProperty(list, 'toString', {
|
|
48
62
|
value: () => {
|
|
49
|
-
|
|
63
|
+
let strs = list.toStrings();
|
|
64
|
+
return strs.join(list.separator);
|
|
50
65
|
}
|
|
51
66
|
});
|
|
52
67
|
Object.defineProperty(list, 'toStrings', {
|
|
53
68
|
value: () => {
|
|
54
69
|
let s5s = [];
|
|
55
70
|
let { showName = false } = opts;
|
|
56
|
-
let { name } = list;
|
|
71
|
+
let { name, widths } = list;
|
|
57
72
|
|
|
58
73
|
if (showName) {
|
|
59
74
|
s5s.push(name);
|
|
60
75
|
}
|
|
61
76
|
for (let i = 0; i < list.length; i++) {
|
|
62
77
|
let v = list[i];
|
|
78
|
+
let s = '';
|
|
63
79
|
switch (typeof v) {
|
|
64
80
|
case 'object':
|
|
65
81
|
if (
|
|
66
82
|
v?.constructor !== Object &&
|
|
67
83
|
typeof v?.toString === 'function'
|
|
68
84
|
) {
|
|
69
|
-
|
|
85
|
+
s = v.toString();
|
|
70
86
|
} else {
|
|
71
|
-
|
|
87
|
+
s = JSON.stringify(v);
|
|
72
88
|
}
|
|
73
89
|
break;
|
|
90
|
+
case 'number': {
|
|
91
|
+
let sRaw = precision ? v.toFixed(precision) : v+'';
|
|
92
|
+
let sShort = sRaw.replace(/\.?0+$/, '');
|
|
93
|
+
s = Number(sShort) === v ? sShort : sRaw;
|
|
94
|
+
}
|
|
95
|
+
break;
|
|
74
96
|
default:
|
|
75
|
-
|
|
97
|
+
s += v;
|
|
76
98
|
break;
|
|
77
99
|
}
|
|
100
|
+
let width = widths?.[i];
|
|
101
|
+
if (width) {
|
|
102
|
+
s = s.substring(0,width).padEnd(width);
|
|
103
|
+
}
|
|
104
|
+
s5s.push(s);
|
|
78
105
|
}
|
|
79
106
|
|
|
107
|
+
|
|
80
108
|
return s5s;
|
|
81
109
|
}
|
|
82
110
|
|
|
@@ -86,46 +114,72 @@ export class ListFactory {
|
|
|
86
114
|
}
|
|
87
115
|
|
|
88
116
|
createColumn(opts = {}) {
|
|
89
|
-
let {
|
|
117
|
+
let {
|
|
118
|
+
name,
|
|
119
|
+
values=[],
|
|
120
|
+
separator = '\n',
|
|
121
|
+
precision,
|
|
122
|
+
} = opts;
|
|
90
123
|
|
|
91
124
|
this.nColumns++;
|
|
92
125
|
if (name == null) {
|
|
93
126
|
name = 'column' + this.nColumns;
|
|
94
127
|
}
|
|
95
|
-
return this.createList({
|
|
128
|
+
return this.createList({
|
|
129
|
+
name,
|
|
130
|
+
precision,
|
|
131
|
+
separator,
|
|
132
|
+
values,
|
|
133
|
+
});
|
|
96
134
|
}
|
|
97
135
|
|
|
98
136
|
createRow(opts = {}) {
|
|
99
|
-
let {
|
|
137
|
+
let {
|
|
138
|
+
name,
|
|
139
|
+
values=[],
|
|
140
|
+
separator = '\t',
|
|
141
|
+
widths,
|
|
142
|
+
precision,
|
|
143
|
+
} = opts;
|
|
100
144
|
|
|
101
145
|
this.nRows++;
|
|
102
146
|
if (name == null) {
|
|
103
147
|
name = 'row' + this.nRows;
|
|
104
148
|
}
|
|
105
|
-
return this.createList({
|
|
149
|
+
return this.createList({
|
|
150
|
+
name,
|
|
151
|
+
precision,
|
|
152
|
+
separator,
|
|
153
|
+
values,
|
|
154
|
+
widths,
|
|
155
|
+
});
|
|
106
156
|
}
|
|
107
157
|
|
|
108
158
|
wrapList(list, opts = {}) {
|
|
109
|
-
const msg = '
|
|
159
|
+
const msg = 'w6t.wrapList';
|
|
110
160
|
const dbg = 0;
|
|
111
161
|
let {
|
|
112
162
|
name,
|
|
113
|
-
|
|
163
|
+
maxValues = 2,
|
|
114
164
|
namePrefix = 'column',
|
|
115
165
|
order = 'row-major',
|
|
116
|
-
|
|
166
|
+
rowSeparator = '\n',
|
|
167
|
+
colSeparator = '|',
|
|
117
168
|
} = opts;
|
|
118
169
|
|
|
119
|
-
let singleList = List.createColumn({
|
|
170
|
+
let singleList = List.createColumn({
|
|
171
|
+
name,
|
|
172
|
+
separator:rowSeparator,
|
|
173
|
+
});
|
|
174
|
+
let newRow = (separator) => List.createRow({ separator });
|
|
120
175
|
name = name || singleList.name;
|
|
121
|
-
separator = separator || singleList.separator;
|
|
122
176
|
switch (order) {
|
|
123
177
|
case 'col-major':
|
|
124
178
|
case 'column-major':
|
|
125
179
|
{
|
|
126
180
|
let transpose = [];
|
|
127
181
|
let col;
|
|
128
|
-
let nRows = Math.ceil(list.length /
|
|
182
|
+
let nRows = Math.ceil(list.length / maxValues);
|
|
129
183
|
dbg > 1 && cc.fyi1(msg + 0.1, { nRows });
|
|
130
184
|
for (let i = 0; i < list.length; i++) {
|
|
131
185
|
let ir = i % nRows;
|
|
@@ -143,15 +197,15 @@ export class ListFactory {
|
|
|
143
197
|
transpose.push(col);
|
|
144
198
|
}
|
|
145
199
|
let row;
|
|
146
|
-
for (let i = 0; i < nRows *
|
|
147
|
-
let ic = i %
|
|
200
|
+
for (let i = 0; i < nRows * maxValues; i++) {
|
|
201
|
+
let ic = i % maxValues;
|
|
148
202
|
if (ic === 0) {
|
|
149
203
|
if (row) {
|
|
150
204
|
singleList.push(row);
|
|
151
205
|
}
|
|
152
|
-
row =
|
|
206
|
+
row = newRow(colSeparator);
|
|
153
207
|
}
|
|
154
|
-
let ir = Math.floor(i /
|
|
208
|
+
let ir = Math.floor(i / maxValues);
|
|
155
209
|
dbg > 1 && cc.fyi1(msg + 0.2, { ic, ir });
|
|
156
210
|
let vc = transpose[ic];
|
|
157
211
|
if (vc !== undefined) {
|
|
@@ -169,12 +223,12 @@ export class ListFactory {
|
|
|
169
223
|
{
|
|
170
224
|
let row;
|
|
171
225
|
for (let i = 0; i < list.length; i++) {
|
|
172
|
-
let ic = i %
|
|
226
|
+
let ic = i % maxValues;
|
|
173
227
|
if (ic === 0) {
|
|
174
228
|
if (row) {
|
|
175
229
|
singleList.push(row);
|
|
176
230
|
}
|
|
177
|
-
row =
|
|
231
|
+
row = newRow(colSeparator);
|
|
178
232
|
}
|
|
179
233
|
row.push(list[i]);
|
|
180
234
|
}
|
|
@@ -185,6 +239,17 @@ export class ListFactory {
|
|
|
185
239
|
break;
|
|
186
240
|
}
|
|
187
241
|
|
|
242
|
+
// compute row element widths
|
|
243
|
+
let widths = new Array(maxValues).fill(0);
|
|
244
|
+
singleList.forEach(row => {
|
|
245
|
+
let strs = row.toStrings();
|
|
246
|
+
strs.map((s,i)=> {
|
|
247
|
+
widths[i] = Math.max(s.length, widths[i]);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
singleList.forEach(row => row.widths = widths);
|
|
251
|
+
dbg && cc.ok1(msg+1, widths[0], maxValues, 'widths:', widths);
|
|
252
|
+
|
|
188
253
|
return singleList;
|
|
189
254
|
}
|
|
190
255
|
}
|