@thi.ng/strings 3.7.32 → 3.7.34
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/CHANGELOG.md +8 -1
- package/README.md +2 -2
- package/ansi.d.ts +4 -2
- package/api.d.ts +1 -1
- package/case.d.ts +4 -2
- package/center.d.ts +7 -5
- package/center.js +1 -2
- package/cursor.d.ts +7 -3
- package/cursor.js +2 -4
- package/escape.d.ts +7 -3
- package/float.js +4 -4
- package/groups.js +7 -7
- package/hollerith.d.ts +10 -7
- package/initials.d.ts +12 -4
- package/interpolate.d.ts +18 -7
- package/join.d.ts +7 -3
- package/package.json +11 -11
- package/pad-left.js +1 -2
- package/pad-right.js +1 -2
- package/ruler.d.ts +2 -2
- package/slugify.d.ts +8 -4
- package/slugify.js +4 -4
- package/stringify.d.ts +10 -4
- package/tabs.d.ts +2 -2
- package/tabs.js +3 -3
- package/trim.d.ts +7 -3
- package/utf8.d.ts +2 -3
- package/utf8.js +5 -8
- package/uuid.d.ts +1 -1
- package/word-wrap.js +6 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
-
- **Last updated**: 2024-
|
|
3
|
+
- **Last updated**: 2024-06-21T19:34:38Z
|
|
4
4
|
- **Generator**: [thi.ng/monopub](https://thi.ng/monopub)
|
|
5
5
|
|
|
6
6
|
All notable changes to this project will be documented in this file.
|
|
@@ -9,6 +9,13 @@ See [Conventional Commits](https://conventionalcommits.org/) for commit guidelin
|
|
|
9
9
|
**Note:** Unlisted _patch_ versions only involve non-code or otherwise excluded changes
|
|
10
10
|
and/or version bumps of transitive dependencies.
|
|
11
11
|
|
|
12
|
+
### [3.7.34](https://github.com/thi-ng/umbrella/tree/@thi.ng/strings@3.7.34) (2024-06-21)
|
|
13
|
+
|
|
14
|
+
#### ♻️ Refactoring
|
|
15
|
+
|
|
16
|
+
- rename various rest args to be more semantically meaningful ([8088a56](https://github.com/thi-ng/umbrella/commit/8088a56))
|
|
17
|
+
- enforce uniform naming convention of internal functions ([56992b2](https://github.com/thi-ng/umbrella/commit/56992b2))
|
|
18
|
+
|
|
12
19
|
### [3.7.31](https://github.com/thi-ng/umbrella/tree/@thi.ng/strings@3.7.31) (2024-04-20)
|
|
13
20
|
|
|
14
21
|
#### ♻️ Refactoring
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://mastodon.thi.ng/@toxi)
|
|
8
8
|
|
|
9
9
|
> [!NOTE]
|
|
10
|
-
> This is one of
|
|
10
|
+
> This is one of 193 standalone projects, maintained as part
|
|
11
11
|
> of the [@thi.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo
|
|
12
12
|
> and anti-framework.
|
|
13
13
|
>
|
|
@@ -151,7 +151,7 @@ For Node.js REPL:
|
|
|
151
151
|
const str = await import("@thi.ng/strings");
|
|
152
152
|
```
|
|
153
153
|
|
|
154
|
-
Package sizes (brotli'd, pre-treeshake): ESM: 5.
|
|
154
|
+
Package sizes (brotli'd, pre-treeshake): ESM: 5.43 KB
|
|
155
155
|
|
|
156
156
|
## Dependencies
|
|
157
157
|
|
package/ansi.d.ts
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* Removes all ANSI control sequences from given string.
|
|
3
3
|
*
|
|
4
4
|
* @example
|
|
5
|
-
* ```ts
|
|
5
|
+
* ```ts tangle:../export/strip-ansi.ts
|
|
6
6
|
* import { stripAnsi } from "@thi.ng/strings";
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* console.log(
|
|
9
|
+
* stripAnsi("\x1B[32mhello\x1B[0m \x1B[91mworld\x1B[0m!")
|
|
10
|
+
* );
|
|
9
11
|
* // 'hello world!'
|
|
10
12
|
* ```
|
|
11
13
|
*
|
package/api.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { Fn, Fn2, FnU } from "@thi.ng/api";
|
|
|
4
4
|
* https://en.wikipedia.org/wiki/Byte_order_mark
|
|
5
5
|
*/
|
|
6
6
|
export declare const BOM = "\uFEFF";
|
|
7
|
-
export type Stringer<T> = (x: T, ...
|
|
7
|
+
export type Stringer<T> = (x: T, ...args: any[]) => string;
|
|
8
8
|
export type FnS = FnU<string>;
|
|
9
9
|
export interface WordWrapOpts {
|
|
10
10
|
/**
|
package/case.d.ts
CHANGED
|
@@ -22,10 +22,12 @@ export declare const capitalize: FnS;
|
|
|
22
22
|
* delimiter (`-` by default).
|
|
23
23
|
*
|
|
24
24
|
* @example
|
|
25
|
-
* ```ts
|
|
25
|
+
* ```ts tangle:../export/kebab.ts
|
|
26
26
|
* import { kebab } from "@thi.ng/strings";
|
|
27
27
|
*
|
|
28
|
-
*
|
|
28
|
+
* console.log(
|
|
29
|
+
* kebab("FooBar23Baz")
|
|
30
|
+
* );
|
|
29
31
|
* // "foo-bar23-baz"
|
|
30
32
|
* ```
|
|
31
33
|
*
|
package/center.d.ts
CHANGED
|
@@ -10,22 +10,24 @@ import type { Stringer } from "./api.js";
|
|
|
10
10
|
* Note: The padding string can contain multiple characters.
|
|
11
11
|
*
|
|
12
12
|
* @example
|
|
13
|
-
* ```ts
|
|
14
|
-
* import { center
|
|
13
|
+
* ```ts tangle:../export/center.ts
|
|
14
|
+
* import { center } from "@thi.ng/strings";
|
|
15
15
|
*
|
|
16
|
-
*
|
|
16
|
+
* console.log(
|
|
17
|
+
* center(20, "<>")(" thi.ng ")
|
|
18
|
+
* );
|
|
17
19
|
* // "<><><> thi.ng <><><>"
|
|
18
20
|
* ```
|
|
19
21
|
*
|
|
20
22
|
* @example
|
|
21
|
-
* ```ts
|
|
23
|
+
* ```ts tangle:../export/center-2.ts
|
|
22
24
|
* import { comp } from "@thi.ng/compose";
|
|
23
25
|
* import { center, wrap } from "@thi.ng/strings";
|
|
24
26
|
*
|
|
25
27
|
* // compose formatting function
|
|
26
28
|
* const fmt = comp(center(20,"<>"), wrap(" "));
|
|
27
29
|
*
|
|
28
|
-
* fmt("thi.ng")
|
|
30
|
+
* console.log(fmt("thi.ng"));
|
|
29
31
|
* // "<><><> thi.ng <><><>"
|
|
30
32
|
* ```
|
|
31
33
|
*
|
package/center.js
CHANGED
|
@@ -5,8 +5,7 @@ const center = memoizeJ(
|
|
|
5
5
|
(n, pad = " ") => {
|
|
6
6
|
const buf = repeat(String(pad), n);
|
|
7
7
|
return (x) => {
|
|
8
|
-
if (x == null)
|
|
9
|
-
return buf;
|
|
8
|
+
if (x == null) return buf;
|
|
10
9
|
x = x.toString();
|
|
11
10
|
const r = (n - x.length) / 2;
|
|
12
11
|
return x.length < n ? buf.substring(0, r) + x + buf.substring(
|
package/cursor.d.ts
CHANGED
|
@@ -8,14 +8,18 @@
|
|
|
8
8
|
* optional `offset` arg (also in `[line,column]` order).
|
|
9
9
|
*
|
|
10
10
|
* @example
|
|
11
|
-
* ```ts
|
|
11
|
+
* ```ts tangle:../export/compute-cursor-pos.ts
|
|
12
12
|
* import { computeCursorPos } from "@thi.ng/strings";
|
|
13
13
|
*
|
|
14
|
-
*
|
|
14
|
+
* console.log(
|
|
15
|
+
* computeCursorPos("thi.ng\numbrella", 10)
|
|
16
|
+
* );
|
|
15
17
|
* // [ 2, 4 ]
|
|
16
18
|
*
|
|
17
19
|
* // w/ custom offset
|
|
18
|
-
*
|
|
20
|
+
* console.log(
|
|
21
|
+
* computeCursorPos("thi.ng\numbrella", 10, "\n", [11, 1])
|
|
22
|
+
* );
|
|
19
23
|
* // [ 12, 4 ]
|
|
20
24
|
* ```
|
|
21
25
|
*
|
package/cursor.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
const computeCursorPos = (str, pos, delim = "\n", offset = [1, 1]) => {
|
|
2
|
-
if (!str.length)
|
|
3
|
-
return [1, 1];
|
|
2
|
+
if (!str.length) return [1, 1];
|
|
4
3
|
pos = Math.min(Math.max(0, pos), str.length);
|
|
5
4
|
const lines = str.split(delim);
|
|
6
5
|
const n = lines.length;
|
|
7
6
|
for (let i = 0; i < n; i++) {
|
|
8
7
|
const l = lines[i];
|
|
9
|
-
if (pos <= l.length)
|
|
10
|
-
return [i + offset[0], pos + offset[1]];
|
|
8
|
+
if (pos <= l.length) return [i + offset[0], pos + offset[1]];
|
|
11
9
|
pos -= l.length + 1;
|
|
12
10
|
}
|
|
13
11
|
return [n + offset[0] - 1, offset[1]];
|
package/escape.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export declare const ESCAPES_REV: Record<number, string>;
|
|
|
10
10
|
* - Non-BMP chars will be escaped using `\Uxxxxxxxx`
|
|
11
11
|
* - Chars outside 0x20 - 0x7e range will be escaped using `\uxxxxx`
|
|
12
12
|
*
|
|
13
|
+
* Also see {@link unescape}.
|
|
14
|
+
*
|
|
13
15
|
* @param src -
|
|
14
16
|
*/
|
|
15
17
|
export declare const escape: (src: string) => string;
|
|
@@ -26,11 +28,13 @@ export declare const escape: (src: string) => string;
|
|
|
26
28
|
* - https://www.branah.com/unicode-converter
|
|
27
29
|
*
|
|
28
30
|
* @example
|
|
29
|
-
* ```ts
|
|
31
|
+
* ```ts tangle:../export/unescape.ts
|
|
30
32
|
* import { unescape } from "@thi.ng/strings";
|
|
31
33
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
+
* console.log(
|
|
35
|
+
* unescape("\\ud83d\\ude0e \\U0001f60e")
|
|
36
|
+
* );
|
|
37
|
+
* // '😎 😎'
|
|
34
38
|
* ```
|
|
35
39
|
*
|
|
36
40
|
* @param src -
|
package/float.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { memoizeJ } from "@thi.ng/memoize/memoizej";
|
|
2
2
|
import { padLeft } from "./pad-left.js";
|
|
3
3
|
const float = memoizeJ(
|
|
4
|
-
(prec, special = false) => special ? (x) =>
|
|
4
|
+
(prec, special = false) => special ? (x) => __nanOrInf(x) || x.toFixed(prec) : (x) => x.toFixed(prec)
|
|
5
5
|
);
|
|
6
6
|
const floatFixedWidth = memoizeJ((width, prec = 3) => {
|
|
7
7
|
const l = width - prec - 1;
|
|
@@ -12,17 +12,17 @@ const floatFixedWidth = memoizeJ((width, prec = 3) => {
|
|
|
12
12
|
return (x) => {
|
|
13
13
|
const ax = Math.abs(x);
|
|
14
14
|
return pad(
|
|
15
|
-
|
|
15
|
+
__nanOrInf(x) || (x === 0 ? "0" : ax < pr || ax >= pl ? __exp(x, width) : x.toFixed(prec - (x < pln ? 1 : 0)))
|
|
16
16
|
);
|
|
17
17
|
};
|
|
18
18
|
});
|
|
19
|
-
const
|
|
19
|
+
const __exp = (x, w) => x.toExponential(
|
|
20
20
|
Math.max(
|
|
21
21
|
w - 4 - (Math.log(Math.abs(x)) / Math.LN10 >= 10 ? 2 : 1) - (x < 0 ? 1 : 0),
|
|
22
22
|
0
|
|
23
23
|
)
|
|
24
24
|
);
|
|
25
|
-
const
|
|
25
|
+
const __nanOrInf = (x) => isNaN(x) ? "NaN" : x === Infinity ? "+\u221E" : x === -Infinity ? "-\u221E" : void 0;
|
|
26
26
|
export {
|
|
27
27
|
float,
|
|
28
28
|
floatFixedWidth
|
package/groups.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { charRange } from "./range.js";
|
|
2
|
-
const
|
|
2
|
+
const __defGroup = (...ranges) => {
|
|
3
3
|
const acc = {};
|
|
4
|
-
for (let range of
|
|
4
|
+
for (let range of ranges) {
|
|
5
5
|
for (let c of range) {
|
|
6
6
|
acc[c] = true;
|
|
7
7
|
}
|
|
@@ -16,21 +16,21 @@ const WS = Object.freeze({
|
|
|
16
16
|
"\r": true,
|
|
17
17
|
" ": true
|
|
18
18
|
});
|
|
19
|
-
const DIGITS =
|
|
20
|
-
const HEX =
|
|
19
|
+
const DIGITS = __defGroup(charRange("0", "9"));
|
|
20
|
+
const HEX = __defGroup(
|
|
21
21
|
charRange("0", "9"),
|
|
22
22
|
charRange("A", "F"),
|
|
23
23
|
charRange("a", "f")
|
|
24
24
|
);
|
|
25
|
-
const LOWER =
|
|
26
|
-
const UPPER =
|
|
25
|
+
const LOWER = __defGroup(charRange("a", "z"));
|
|
26
|
+
const UPPER = __defGroup(charRange("A", "Z"));
|
|
27
27
|
const ALPHA = Object.freeze({ ...UPPER, ...LOWER });
|
|
28
28
|
const ALPHA_NUM = Object.freeze({
|
|
29
29
|
...ALPHA,
|
|
30
30
|
...DIGITS,
|
|
31
31
|
_: true
|
|
32
32
|
});
|
|
33
|
-
const PUNCTUATION =
|
|
33
|
+
const PUNCTUATION = __defGroup(
|
|
34
34
|
charRange("!", "/"),
|
|
35
35
|
charRange(":", "@"),
|
|
36
36
|
charRange("[", "`"),
|
package/hollerith.d.ts
CHANGED
|
@@ -2,18 +2,21 @@ import type { Stringer } from "./api.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* Formats given value `x` as Fortran style Hollerith string.
|
|
4
4
|
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* References:
|
|
7
|
+
* - https://en.wikipedia.org/wiki/Hollerith_constant
|
|
8
|
+
* - https://en.wikipedia.org/wiki/IGES#File_format
|
|
9
|
+
*
|
|
5
10
|
* @example
|
|
6
|
-
* ```ts
|
|
11
|
+
* ```ts tangle:../export/hstr.ts
|
|
7
12
|
* import { hstr } from "@thi.ng/strings";
|
|
8
13
|
*
|
|
9
|
-
* hstr("abc") // "3Habc"
|
|
10
|
-
* hstr(123.45) // "6H123.45"
|
|
11
|
-
* hstr("") // "0H"
|
|
12
|
-
* hstr(null) // ""
|
|
14
|
+
* console.log(hstr("abc")); // "3Habc"
|
|
15
|
+
* console.log(hstr(123.45)); // "6H123.45"
|
|
16
|
+
* console.log(hstr("")); // "0H"
|
|
17
|
+
* console.log(hstr(null)); // ""
|
|
13
18
|
* ```
|
|
14
19
|
*
|
|
15
|
-
* https://en.wikipedia.org/wiki/Hollerith_constant
|
|
16
|
-
*
|
|
17
20
|
* @param x -
|
|
18
21
|
*/
|
|
19
22
|
export declare const hstr: Stringer<any>;
|
package/initials.d.ts
CHANGED
|
@@ -4,14 +4,22 @@
|
|
|
4
4
|
* (default: uppercase). If `mode` is null, the original casing will be kept.
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
|
-
* ```ts
|
|
8
|
-
* initials
|
|
7
|
+
* ```ts tangle:../export/initials.ts
|
|
8
|
+
* import { initials } from "@thi.ng/strings";
|
|
9
|
+
*
|
|
10
|
+
* console.log(
|
|
11
|
+
* initials(["alicia", "bella", "carerra"])
|
|
12
|
+
* );
|
|
9
13
|
* // "ABC"
|
|
10
14
|
*
|
|
11
|
-
*
|
|
15
|
+
* console.log(
|
|
16
|
+
* initials("shader-ast-GLSL".split("-"))
|
|
17
|
+
* );
|
|
12
18
|
* // "SAG"
|
|
13
19
|
*
|
|
14
|
-
*
|
|
20
|
+
* console.log(
|
|
21
|
+
* initials("Ludwig van Beethoven".split(" "), null)
|
|
22
|
+
* );
|
|
15
23
|
* // "LvB"
|
|
16
24
|
* ```
|
|
17
25
|
*
|
package/interpolate.d.ts
CHANGED
|
@@ -4,9 +4,16 @@ import type { IObjectOf, NumOrString } from "@thi.ng/api";
|
|
|
4
4
|
* number of args. Replaces numbered terms with their respective args
|
|
5
5
|
* given.
|
|
6
6
|
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* Also see {@link interpolateKeys}.
|
|
9
|
+
*
|
|
7
10
|
* @example
|
|
8
|
-
* ```ts
|
|
9
|
-
*
|
|
11
|
+
* ```ts tangle:../export/interpolate.ts
|
|
12
|
+
* import { interpolate } from "@thi.ng/strings";
|
|
13
|
+
*
|
|
14
|
+
* console.log(
|
|
15
|
+
* interpolate("let {0}: {2} = {1};", "a", 42, "number")
|
|
16
|
+
* );
|
|
10
17
|
* // "let a: number = 42;"
|
|
11
18
|
* ```
|
|
12
19
|
*
|
|
@@ -19,11 +26,15 @@ export declare const interpolate: (src: string, ...args: any[]) => string;
|
|
|
19
26
|
* template string and an object of values for the stated keys.
|
|
20
27
|
*
|
|
21
28
|
* @example
|
|
22
|
-
* ```ts
|
|
23
|
-
* interpolateKeys
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
29
|
+
* ```ts tangle:../export/interpolate-keys.ts
|
|
30
|
+
* import { interpolateKeys } from "@thi.ng/strings";
|
|
31
|
+
*
|
|
32
|
+
* console.log(
|
|
33
|
+
* interpolateKeys(
|
|
34
|
+
* "let {id}: {type} = {val};",
|
|
35
|
+
* { id: "a", type: "number", val: 42 }
|
|
36
|
+
* )
|
|
37
|
+
* );
|
|
27
38
|
* // "let a: number = 42;"
|
|
28
39
|
* ```
|
|
29
40
|
*
|
package/join.d.ts
CHANGED
|
@@ -5,13 +5,15 @@ import type { Stringer } from "./api.js";
|
|
|
5
5
|
* separator into a result string.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
|
-
* ```ts
|
|
8
|
+
* ```ts tangle:../export/join.ts
|
|
9
9
|
* import { format, join } from "@thi.ng/strings";
|
|
10
10
|
* import { partial } from "@thi.ng/compose";
|
|
11
11
|
*
|
|
12
12
|
* const slashes = join("/");
|
|
13
13
|
*
|
|
14
|
-
*
|
|
14
|
+
* console.log(
|
|
15
|
+
* slashes([1, 2, 3])
|
|
16
|
+
* );
|
|
15
17
|
* // "1/2/3"
|
|
16
18
|
*
|
|
17
19
|
* // pre-compose formatter function w/ partial arguments
|
|
@@ -19,7 +21,9 @@ import type { Stringer } from "./api.js";
|
|
|
19
21
|
* format, ["f ", slashes, " ", slashes, " ", slashes]
|
|
20
22
|
* );
|
|
21
23
|
*
|
|
22
|
-
*
|
|
24
|
+
* console.log(
|
|
25
|
+
* formatOBJFace([1, 2], [3, 4], [5, 6])
|
|
26
|
+
* );
|
|
23
27
|
* // "f 1/2 3/4 5/6"
|
|
24
28
|
* ```
|
|
25
29
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thi.ng/strings",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.34",
|
|
4
4
|
"description": "Various string formatting & utility functions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "./index.js",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"type": "git",
|
|
11
11
|
"url": "https://github.com/thi-ng/umbrella.git"
|
|
12
12
|
},
|
|
13
|
-
"homepage": "https://
|
|
13
|
+
"homepage": "https://thi.ng/format",
|
|
14
14
|
"funding": [
|
|
15
15
|
{
|
|
16
16
|
"type": "github",
|
|
@@ -36,16 +36,16 @@
|
|
|
36
36
|
"tool:tangle": "../../node_modules/.bin/tangle src/**/*.ts"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@thi.ng/api": "^8.11.
|
|
40
|
-
"@thi.ng/errors": "^2.5.
|
|
41
|
-
"@thi.ng/hex": "^2.3.
|
|
42
|
-
"@thi.ng/memoize": "^3.3.
|
|
39
|
+
"@thi.ng/api": "^8.11.3",
|
|
40
|
+
"@thi.ng/errors": "^2.5.8",
|
|
41
|
+
"@thi.ng/hex": "^2.3.47",
|
|
42
|
+
"@thi.ng/memoize": "^3.3.5"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@microsoft/api-extractor": "^7.
|
|
46
|
-
"esbuild": "^0.
|
|
47
|
-
"typedoc": "^0.25.
|
|
48
|
-
"typescript": "^5.
|
|
45
|
+
"@microsoft/api-extractor": "^7.47.0",
|
|
46
|
+
"esbuild": "^0.21.5",
|
|
47
|
+
"typedoc": "^0.25.13",
|
|
48
|
+
"typescript": "^5.5.2"
|
|
49
49
|
},
|
|
50
50
|
"keywords": [
|
|
51
51
|
"ansi",
|
|
@@ -203,5 +203,5 @@
|
|
|
203
203
|
"thi.ng": {
|
|
204
204
|
"year": 2015
|
|
205
205
|
},
|
|
206
|
-
"gitHead": "
|
|
206
|
+
"gitHead": "154c95cf9d6bab32174498ec3b5b5d87e42be7f9\n"
|
|
207
207
|
}
|
package/pad-left.js
CHANGED
|
@@ -3,8 +3,7 @@ import { repeat } from "./repeat.js";
|
|
|
3
3
|
const padLeft = memoizeJ((n, ch = " ") => {
|
|
4
4
|
const buf = repeat(String(ch), n);
|
|
5
5
|
return (x, len) => {
|
|
6
|
-
if (x == null)
|
|
7
|
-
return buf;
|
|
6
|
+
if (x == null) return buf;
|
|
8
7
|
x = x.toString();
|
|
9
8
|
len = len !== void 0 ? len : x.length;
|
|
10
9
|
return len < n ? buf.substring(len) + x : x;
|
package/pad-right.js
CHANGED
|
@@ -3,8 +3,7 @@ import { repeat } from "./repeat.js";
|
|
|
3
3
|
const padRight = memoizeJ((n, ch = " ") => {
|
|
4
4
|
const buf = repeat(String(ch), n);
|
|
5
5
|
return (x, len) => {
|
|
6
|
-
if (x == null)
|
|
7
|
-
return buf;
|
|
6
|
+
if (x == null) return buf;
|
|
8
7
|
x = x.toString();
|
|
9
8
|
len = len !== void 0 ? len : x.length;
|
|
10
9
|
return len < n ? x + buf.substring(len) : x;
|
package/ruler.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* ticks and `b` for minor ticks.
|
|
4
4
|
*
|
|
5
5
|
* @example
|
|
6
|
-
* ```ts
|
|
6
|
+
* ```ts tangle:../export/ruler.ts
|
|
7
7
|
* import { ruler } from "@thi.ng/strings";
|
|
8
8
|
*
|
|
9
9
|
* console.log(ruler(40))
|
|
@@ -24,7 +24,7 @@ export declare const ruler: (width: number, major?: number, a?: string, b?: stri
|
|
|
24
24
|
* `h`. The optional `chars` can be used to customize the grid.
|
|
25
25
|
*
|
|
26
26
|
* @example
|
|
27
|
-
* ```ts
|
|
27
|
+
* ```ts tangle:../export/grid.ts
|
|
28
28
|
* import { grid } from "@thi.ng/strings";
|
|
29
29
|
*
|
|
30
30
|
* console.log(grid(3, 3, 4, 2));
|
package/slugify.d.ts
CHANGED
|
@@ -4,10 +4,12 @@ import type { Stringer } from "./api.js";
|
|
|
4
4
|
* https://medium.com/@matthagemann/the-ultimate-way-to-slugify-a-url-string-in-javascript-b8e4a0d849e1
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
|
-
* ```ts
|
|
7
|
+
* ```ts tangle:../export/slugify.ts
|
|
8
8
|
* import { slugify } from "@thi.ng/strings";
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* console.log(
|
|
11
|
+
* slugify("Me, myself (& ëye) 😀!")
|
|
12
|
+
* );
|
|
11
13
|
* // "me-myself-and-eye"
|
|
12
14
|
* ```
|
|
13
15
|
*
|
|
@@ -19,10 +21,12 @@ export declare const slugify: Stringer<string>;
|
|
|
19
21
|
* for headings in markdown files (AFAICT).
|
|
20
22
|
*
|
|
21
23
|
* @example
|
|
22
|
-
* ```ts
|
|
24
|
+
* ```ts tangle:../export/slugify-gh.ts
|
|
23
25
|
* import { slugifyGH } from "@thi.ng/strings";
|
|
24
26
|
*
|
|
25
|
-
*
|
|
27
|
+
* console.log(
|
|
28
|
+
* slugifyGH("Me, myself (& ëye) 😀!")
|
|
29
|
+
* );
|
|
26
30
|
* // "me-myself--ëye-"
|
|
27
31
|
* ```
|
|
28
32
|
*
|
package/slugify.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
const
|
|
1
|
+
const SRC = "\xE0\xE1\xE4\xE2\xE3\xE5\xE8\xE9\xEB\xEA\xEC\xED\xEF\xEE\xF2\xF3\xF6\xF4\xF9\xFA\xFC\xFB\xF1\xE7\xDF\xFF\u0153\xE6\u0155\u015B\u0144\u1E55\u1E83\u01F5\u01F9\u1E3F\u01D8\u1E8D\u017A\u1E27\xB7/_,:;";
|
|
2
|
+
const DEST = "aaaaaaeeeeiiiioooouuuuncsyoarsnpwgnmuxzh------";
|
|
3
|
+
const RE = new RegExp(SRC.split("").join("|"), "g");
|
|
4
4
|
const slugify = (str) => {
|
|
5
|
-
return str.toLowerCase().replace(/\s+/g, "-").replace(
|
|
5
|
+
return str.toLowerCase().replace(/\s+/g, "-").replace(RE, (c) => DEST[SRC.indexOf(c)]).replace(/&+/g, "-and-").replace(/[^\w-]+/g, "").replace(/\p{Emoji_Presentation}/gu, "").replace(/-{2,}/g, "-").replace(/(^-+)|(-+$)/g, "");
|
|
6
6
|
};
|
|
7
7
|
const slugifyGH = (str) => {
|
|
8
8
|
return str.toLowerCase().replace(
|
package/stringify.d.ts
CHANGED
|
@@ -7,16 +7,22 @@ import type { Stringer } from "./api.js";
|
|
|
7
7
|
* null, indent)`
|
|
8
8
|
*
|
|
9
9
|
* @example
|
|
10
|
-
* ```ts
|
|
10
|
+
* ```ts tangle:../export/stringify.ts
|
|
11
11
|
* import { stringify } from "@thi.ng/strings";
|
|
12
12
|
*
|
|
13
|
-
*
|
|
13
|
+
* console.log(
|
|
14
|
+
* stringify()("hello")
|
|
15
|
+
* );
|
|
14
16
|
* // hello
|
|
15
17
|
*
|
|
16
|
-
*
|
|
18
|
+
* console.log(
|
|
19
|
+
* stringify(true)("hello")
|
|
20
|
+
* );
|
|
17
21
|
* // "hello"
|
|
18
22
|
*
|
|
19
|
-
*
|
|
23
|
+
* console.log(
|
|
24
|
+
* stringify()({ a: "hello" })
|
|
25
|
+
* );
|
|
20
26
|
* // { "a": "hello" }
|
|
21
27
|
* ```
|
|
22
28
|
*
|
package/tabs.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Multi-line version of {@link tabsToSpacesLine}.
|
|
3
3
|
*
|
|
4
4
|
* @example
|
|
5
|
-
* ```ts
|
|
5
|
+
* ```ts tangle:../export/tabs-to-spaces.ts
|
|
6
6
|
* import { tabsToSpaces } from "@thi.ng/strings";
|
|
7
7
|
*
|
|
8
8
|
* console.log(
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
export declare const tabsToSpaces: (src: string, tabSize?: number) => string;
|
|
24
24
|
/**
|
|
25
25
|
* Takes a single line string and converts all tab characters to spaces, using
|
|
26
|
-
* given `tabSize
|
|
26
|
+
* given `tabSize` (default: 4).
|
|
27
27
|
*
|
|
28
28
|
* @param line -
|
|
29
29
|
* @param tabSize -
|
package/tabs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { repeat } from "./repeat.js";
|
|
2
|
-
const
|
|
2
|
+
const __nextTab = (x, tabSize) => Math.floor((x + tabSize) / tabSize) * tabSize;
|
|
3
3
|
const tabsToSpaces = (src, tabSize = 4) => src.split(/\r?\n/g).map((line) => tabsToSpacesLine(line, tabSize)).join("\n");
|
|
4
4
|
const tabsToSpacesLine = (line, tabSize = 4) => {
|
|
5
5
|
let res = "";
|
|
@@ -8,7 +8,7 @@ const tabsToSpacesLine = (line, tabSize = 4) => {
|
|
|
8
8
|
for (let i = 0; i < n; i++) {
|
|
9
9
|
const w = words[i];
|
|
10
10
|
res += w;
|
|
11
|
-
res += repeat(" ",
|
|
11
|
+
res += repeat(" ", __nextTab(res.length, tabSize) - res.length);
|
|
12
12
|
}
|
|
13
13
|
res += words[n];
|
|
14
14
|
return res;
|
|
@@ -25,7 +25,7 @@ const spacesToTabsLine = (line, tabSize = 4) => {
|
|
|
25
25
|
i = m.index;
|
|
26
26
|
const end = m.index + numSpaces;
|
|
27
27
|
while (i < end) {
|
|
28
|
-
const j =
|
|
28
|
+
const j = __nextTab(i, tabSize);
|
|
29
29
|
if (j <= end) {
|
|
30
30
|
res += " ";
|
|
31
31
|
i = j;
|
package/trim.d.ts
CHANGED
|
@@ -4,13 +4,17 @@ import type { Stringer } from "./api.js";
|
|
|
4
4
|
* trimmable characters (default: whitespace only).
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
|
-
* ```ts
|
|
7
|
+
* ```ts tangle:../export/trim.ts
|
|
8
8
|
* import { trim } from "@thi.ng/strings";
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* console.log(
|
|
11
|
+
* trim()(" Hello ")
|
|
12
|
+
* );
|
|
11
13
|
* // "Hello"
|
|
12
14
|
*
|
|
13
|
-
*
|
|
15
|
+
* console.log(
|
|
16
|
+
* trim(" -+")("-+-+- Hello -+-+-")
|
|
17
|
+
* );
|
|
14
18
|
* // "Hello"
|
|
15
19
|
* ```
|
|
16
20
|
*
|
package/utf8.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
/**
|
|
3
2
|
* Returns the number of bytes required to encode the given string as UTF-8.
|
|
4
3
|
*
|
|
@@ -45,10 +44,10 @@ export declare const UTF8Error: {
|
|
|
45
44
|
origMessage: string;
|
|
46
45
|
name: string;
|
|
47
46
|
message: string;
|
|
48
|
-
stack?: string
|
|
47
|
+
stack?: string;
|
|
49
48
|
cause?: unknown;
|
|
50
49
|
};
|
|
51
|
-
captureStackTrace(targetObject: object, constructorOpt?: Function
|
|
50
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
52
51
|
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
53
52
|
stackTraceLimit: number;
|
|
54
53
|
};
|
package/utf8.js
CHANGED
|
@@ -27,8 +27,7 @@ const utf8Decode = (buf, start, num) => {
|
|
|
27
27
|
c = (c & 15) << 12 | (buf[i++] & 63) << 6 | buf[i++] & 63;
|
|
28
28
|
} else if (c >= 240 && c < 248) {
|
|
29
29
|
c = (c & 7) << 18 | (buf[i++] & 63) << 12 | (buf[i++] & 63) << 6 | buf[i++] & 63;
|
|
30
|
-
} else
|
|
31
|
-
utf8Error();
|
|
30
|
+
} else __utf8Error();
|
|
32
31
|
result += fromUtf8CodePoint(c);
|
|
33
32
|
}
|
|
34
33
|
}
|
|
@@ -51,8 +50,7 @@ const utf8Encode = (src, capacity) => {
|
|
|
51
50
|
c = 65536 + ((c & 1023) << 10) + (src.charCodeAt(++i) & 1023);
|
|
52
51
|
buf[pos++] = 240 | c >> 18;
|
|
53
52
|
buf[pos++] = 128 | c >> 12 & 63;
|
|
54
|
-
} else
|
|
55
|
-
buf[pos++] = 224 | c >> 12;
|
|
53
|
+
} else buf[pos++] = 224 | c >> 12;
|
|
56
54
|
buf[pos++] = 128 | c >> 6 & 63;
|
|
57
55
|
}
|
|
58
56
|
buf[pos++] = 128 | c & 63;
|
|
@@ -61,16 +59,15 @@ const utf8Encode = (src, capacity) => {
|
|
|
61
59
|
return buf.subarray(0, pos);
|
|
62
60
|
};
|
|
63
61
|
const fromUtf8CodePoint = (x) => {
|
|
64
|
-
if (x < 65536)
|
|
65
|
-
return String.fromCharCode(x);
|
|
62
|
+
if (x < 65536) return String.fromCharCode(x);
|
|
66
63
|
if (x < 1114112) {
|
|
67
64
|
x -= 65536;
|
|
68
65
|
return String.fromCharCode(55296 | x >>> 10, 56320 | x & 1023);
|
|
69
66
|
}
|
|
70
|
-
return
|
|
67
|
+
return __utf8Error(`invalid codepoint 0x${x.toString(16)}`);
|
|
71
68
|
};
|
|
72
69
|
const UTF8Error = defError(() => "UTF-8 error");
|
|
73
|
-
const
|
|
70
|
+
const __utf8Error = (msg) => {
|
|
74
71
|
throw new UTF8Error(msg);
|
|
75
72
|
};
|
|
76
73
|
export {
|
package/uuid.d.ts
CHANGED
package/word-wrap.js
CHANGED
|
@@ -26,8 +26,7 @@ const SPLIT_ANSI = {
|
|
|
26
26
|
let i = max;
|
|
27
27
|
let match;
|
|
28
28
|
while (match = re.exec(x)) {
|
|
29
|
-
if (match.index >= max)
|
|
30
|
-
break;
|
|
29
|
+
if (match.index >= max) break;
|
|
31
30
|
const n = match[0].length;
|
|
32
31
|
i += n;
|
|
33
32
|
max += n;
|
|
@@ -35,11 +34,11 @@ const SPLIT_ANSI = {
|
|
|
35
34
|
return i;
|
|
36
35
|
}
|
|
37
36
|
};
|
|
38
|
-
const
|
|
37
|
+
const __append = (acc, word, wordLen, width) => {
|
|
39
38
|
const curr = acc[acc.length - 1];
|
|
40
39
|
curr && width - curr.n > wordLen ? curr.add(word, wordLen) : acc.push(new Line(word, wordLen));
|
|
41
40
|
};
|
|
42
|
-
const
|
|
41
|
+
const __wrapWord = (word, { width, min, hard, splitter }, offset = 0, acc = []) => {
|
|
43
42
|
let len = splitter.length(word);
|
|
44
43
|
let free = width - offset;
|
|
45
44
|
if (free < min && free < len) {
|
|
@@ -48,12 +47,12 @@ const wrapWord = (word, { width, min, hard, splitter }, offset = 0, acc = []) =>
|
|
|
48
47
|
while (hard && len > free) {
|
|
49
48
|
const split2 = splitter.split(word, free);
|
|
50
49
|
const chunk = word.substring(0, split2);
|
|
51
|
-
|
|
50
|
+
__append(acc, chunk, free, width);
|
|
52
51
|
word = word.substring(split2);
|
|
53
52
|
free = width;
|
|
54
53
|
len = splitter.length(word);
|
|
55
54
|
}
|
|
56
|
-
|
|
55
|
+
__append(acc, word, len, width);
|
|
57
56
|
return acc;
|
|
58
57
|
};
|
|
59
58
|
const wordWrapLine = (line, opts, acc = []) => {
|
|
@@ -70,7 +69,7 @@ const wordWrapLine = (line, opts, acc = []) => {
|
|
|
70
69
|
};
|
|
71
70
|
for (let word of split(line, opts.delimWord || /\s/g)) {
|
|
72
71
|
const curr = acc[acc.length - 1];
|
|
73
|
-
|
|
72
|
+
__wrapWord(word, $opts, curr && curr.n > 0 ? curr.n + 1 : 0, acc);
|
|
74
73
|
}
|
|
75
74
|
return acc;
|
|
76
75
|
};
|