-
Notifications
You must be signed in to change notification settings - Fork 249
/
wrap-and-indent.mjs
56 lines (45 loc) · 1.27 KB
/
wrap-and-indent.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
const DEFAULT_INDENT = 4;
function indentString(pString, pCount) {
const lRegex = /^(?!\s*$)/gm;
return pString.replace(lRegex, " ".repeat(pCount));
}
/**
* @param {string} pLine
* @param {number} pMaxWidth
*/
function splitLine(pLine, pMaxWidth) {
const lWords = pLine.split(" ");
const lWrappedLines = [];
let lCurrentLine = "";
let lCurrentWidth = 0;
for (const lWord of lWords) {
if (lCurrentWidth + lWord.length > pMaxWidth) {
lWrappedLines.push(lCurrentLine.trimEnd());
lCurrentLine = "";
lCurrentWidth = 0;
}
if (lCurrentLine) {
lCurrentLine += " ";
lCurrentWidth += 1;
}
lCurrentLine += lWord;
lCurrentWidth += lWord.length;
}
lWrappedLines.push(lCurrentLine.trimEnd());
return lWrappedLines.join("\n");
}
/**
* @param {string} pString - the string to wrap
* @param {number} pMaxWidth - the maximum width of the wrapped string
*/
function wrapString(pString, pMaxWidth) {
return pString
.split(/\r?\n/)
.map((pLine) => splitLine(pLine, pMaxWidth))
.join("\n");
}
export default function wrapAndIndent(pString, pIndent = DEFAULT_INDENT) {
const lMaxConsoleWidth = 78;
const lMaxWidth = lMaxConsoleWidth - pIndent;
return indentString(wrapString(pString, lMaxWidth), pIndent);
}