@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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/text/list.mjs +89 -24
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sc-voice/tools",
3
- "version": "3.20.0",
3
+ "version": "3.21.0",
4
4
  "description": "Utilities for SC-Voice",
5
5
  "main": "index.mjs",
6
6
  "files": [
package/src/text/list.mjs CHANGED
@@ -27,7 +27,13 @@ export class ListFactory {
27
27
  }
28
28
 
29
29
  createList(opts = {}) {
30
- let { name, values=[], separator = ',' } = opts;
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
- writeable: true,
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
- writeable: true,
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
- return list.join(list.separator);
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
- s5s.push(v.toString());
85
+ s = v.toString();
70
86
  } else {
71
- s5s.push(JSON.stringify(v));
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
- s5s.push('' + v);
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 { name, values=[], separator = '\n' } = opts;
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({name, values, separator});
128
+ return this.createList({
129
+ name,
130
+ precision,
131
+ separator,
132
+ values,
133
+ });
96
134
  }
97
135
 
98
136
  createRow(opts = {}) {
99
- let { name, values=[], separator = '\t' } = opts;
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({name, values, separator});
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 = 'l9y.wrapList';
159
+ const msg = 'w6t.wrapList';
110
160
  const dbg = 0;
111
161
  let {
112
162
  name,
113
- rowSize = 2,
163
+ maxValues = 2,
114
164
  namePrefix = 'column',
115
165
  order = 'row-major',
116
- separator,
166
+ rowSeparator = '\n',
167
+ colSeparator = '|',
117
168
  } = opts;
118
169
 
119
- let singleList = List.createColumn({ name, separator });
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 / rowSize);
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 * rowSize; i++) {
147
- let ic = i % rowSize;
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 = List.createRow({values:[]});
206
+ row = newRow(colSeparator);
153
207
  }
154
- let ir = Math.floor(i / rowSize);
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 % rowSize;
226
+ let ic = i % maxValues;
173
227
  if (ic === 0) {
174
228
  if (row) {
175
229
  singleList.push(row);
176
230
  }
177
- row = List.createRow({values:[]});
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
  }