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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 | package Torello.Java;
import java.util.stream.IntStream;
// Chat-GPT wrote this whole thing, in a one shot deal.
// I am just entirely too exhausted to write tests scripts for it right now.
// There might be an "edge case" that completely fails.
//
// However, it is clearly indenting all of the stuff in the Browser CDP classes
// without causing any problems at all.
class IndentNonBlankLines
{
/*
static String run(final String text, final int numSpaces)
{
return run(text, numSpaces, false);
}
static String runAndTrimBlankLines(final String text, final int numSpaces)
{
return run(text, numSpaces, true);
}
*/
static String run
(final String text, final int numSpaces, final boolean trimBlankLines)
{
if (text.length() == 0) return text;
if (numSpaces <= 0)
throw new IllegalArgumentException("numSpaces must be > 0");
final char[] cArr = text.toCharArray();
final IntStream.Builder b = IntStream.builder();
int linesToIndent = 0;
int blankLineTrimCount = 0;
int lineStart = 0;
while (lineStart < cArr.length)
{
int i = lineStart;
boolean blank = true;
while ((i < cArr.length) && (cArr[i] != '\n'))
{
if ((cArr[i] != ' ') && (cArr[i] != '\t'))
blank = false;
i++;
}
if (! blank)
{
b.add(lineStart);
linesToIndent++;
}
else if (trimBlankLines)
blankLineTrimCount += (i - lineStart);
if (i == cArr.length) break;
lineStart = i + 1;
}
final int[] indentStarts = b.build().toArray();
final int newLen =
cArr.length + (linesToIndent * numSpaces) - blankLineTrimCount;
final char[] ret = new char[newLen];
int srcPos = 0;
int destPos = 0;
int indentIndex = 0;
lineStart = 0;
while (lineStart < cArr.length)
{
final boolean indentThisLine =
(indentIndex < indentStarts.length) && (indentStarts[indentIndex] == lineStart);
int i = lineStart;
boolean blank = true;
while ((i < cArr.length) && (cArr[i] != '\n'))
{
if ((cArr[i] != ' ') && (cArr[i] != '\t'))
blank = false;
i++;
}
if (indentThisLine)
{
for (int j=0; j < numSpaces; j++) ret[destPos++] = ' ';
indentIndex++;
}
if (blank && trimBlankLines)
{
// Skip all spaces/tabs on blank lines
}
else
{
while (srcPos < i) ret[destPos++] = cArr[srcPos++];
}
if (i < cArr.length)
{
ret[destPos++] = '\n';
srcPos = i + 1;
lineStart = i + 1;
}
else
break;
}
return new String(ret);
}
}
|