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);
    }
}