-
Notifications
You must be signed in to change notification settings - Fork 1
/
Toolbox.sc
185 lines (151 loc) · 5.39 KB
/
Toolbox.sc
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*
* SuperCollider3 source file "Toolbox.sc"
* Written by Jens Gulden, jgulden@cs.tu-berlin.de.
* Licensed under the GNU General Public License (GPL),
* this software comes with NO WARRANTY.
*/
// --- class Toolbox ----------------------------------------------------------
//
// <p></p>
// @poseidon-object-id [sm$1eed0fb:10d5552be97:-7ccf]
Toolbox {
// --- trimLeft(s) : String -----------------------------------------------
//
*trimLeft { arg s; // type String
var i = 0;
if ( s.size > 0 , {
if ( s[0].isSpace , {
while ( { (i < (s.size-1)) && (s[i].isSpace) } , { i = i + 1 } );
if ( ((i < (s.size-1)) || (not (s[i].isSpace))) , {
^s.copyToEnd(i);
},{
^"";
});
},{
^s;
});
},{
^"";
});
} // end trimLeft
// --- trimRight(s) : String ----------------------------------------------
//
*trimRight { arg s; // type String
var i = s.size - 1;
if ( i >= 0 , {
if ( s[i].isSpace , {
while ( { ( i > 0 ) && (s[i].isSpace) } , { i = i - 1 } );
if ( ((i > 0) || (not (s[i].isSpace))) , {
^s.copyFromStart(i);
},{
^"";
});
},{
^s;
});
},{
^"";
});
} // end trimRight
// --- trim(s) : String ---------------------------------------------------
//
*trim { arg s; // type String
^Toolbox.trimLeft( Toolbox.trimRight( s ) );
} // end trim
// --- repeat(s, n) : String ----------------------------------------------
//
*repeat { arg s, n; // types String, int
if ( n == 0 , {
^"";
},{
^(s ++ Toolbox.repeat( s, n - 1 )); // recursion
});
} // end repeat
// --- isMultiline(s) : boolean -------------------------------------------
//
*isMultiline { arg s; // type String
^( s.find(Char.nl) != nil ); // type boolean
} // end isMultiline
// --- split(s, delim) : List ---------------------------------------------
//
*split { arg s, delim; // types String, String
var l = List.new;
var f;
var pos;
f = { arg s;
pos = s.find(delim);
if ( pos != nil , {
l.add(s.copyFromStart(pos-1));
f.value(s.copyToEnd(pos+delim.size)); // recursion
},{
l.add(s);
});
};
f.value(s);
^l; // type List
} // end split
// --- splitLines(s) : List -----------------------------------------------
//
*splitLines { arg s; // type String
^Toolbox.split(s, Char.nl);
} // end splitLines
// --- join(l, delim) : String --------------------------------------------
//
*join { arg l, delim; // types List, String
var s = nil;
l.do({ arg e;
if ( s == nil , {
s = e;
},{
s = s ++ delim ++ e;
});
});
^s;
} // end join
// --- joinLines(l) : String ----------------------------------------------
//
*joinLines { arg l; // type List
^Toolbox.join(l, Char.nl); // type String
} // end joinLines
// --- indent(s, shift) : String ------------------------------------------
//
*indent { arg s, shift; // types String, int
var lines;
var ind;
lines = Toolbox.splitLines(s);
ind = Toolbox.repeat(" ", shift);
lines.do({ arg l, index;
lines.put(index, (ind ++ Toolbox.trimLeft(l)));
});
^Toolbox.joinLines(lines);
} // end indent
// --- unindent(s, shift) : String ----------------------------------------
//
*unindent { arg s, shift; // types String, int
// if shift==-1: unindent to maximum possible (at least one line will start without blanks, oters are shifted relatively)
var lines;
var spaces;
lines = Toolbox.splitLines(s);
if ( shift == -1 , { // first find shift value: minimum number of blanks at the beginning of lines
lines.do({ arg line;
spaces = line.size - Toolbox.trimLeft(line).size;
if ( ( (shift == -1) || (spaces < shift) ) , {
shift = spaces;
});
});
});
if ( shift > 0 , {
lines.do({ arg line, index;
line = line.copyToEnd(shift); // cut left part
lines.put(index, line);
});
});
^Toolbox.joinLines(lines); // type String
} // end unindent
// --- indentAbs(s, shift) : String ---------------------------------------
//
*indentAbs { arg s, shift; // types String, int
// indent to absolute shifting, i.e. independently of original indentation
^Toolbox.indent( Toolbox.unindent(s, -1), shift ); // type String
} // end indentAbs
} // end Toolbox