invert

Terminal-inverts the colours of a piece of text in a string.

version(Colours)
pure @safe
string
invert
(
const string line
,
const string toInvert
,
out bool match
,
const bool caseSensitive = true
)

Parameters

line string

Line to examine and invert a substring of.

toInvert string

Substring to invert.

match bool

out-parameter that will be set to true if any inversion was done.

caseSensitive bool

Whether or not to look for matches case-insensitively, yet invert with the casing passed.

Return Value

Type: string

Line with the substring in it inverted, if inversion was successful, else (a duplicate of) the line unchanged.

Examples

immutable line = "This is an example!";
writeln(line.invert("example"));  // "example" substring visually inverted
writeln(line.invert("EXAMPLE", caseInsensitive: true)); // "example" inverted as "EXAMPLE"
1 import kameloso.terminal.colours.defs : TerminalFormat, TerminalReset;
2 import std.format : format;
3 
4 immutable pre = "%c[%dm".format(TerminalToken.format, TerminalFormat.reverse);
5 immutable post = "%c[%dm".format(TerminalToken.format, TerminalReset.invert);
6 bool match;
7 
8 {
9     immutable line = "abc".invert("abc", match);
10     immutable expected = pre ~ "abc" ~ post;
11     assert(match);
12     assert((line == expected), line);
13 }
14 {
15     immutable line = "abc abc".invert("abc", match);
16     immutable inverted = pre ~ "abc" ~ post;
17     immutable expected = inverted ~ ' ' ~ inverted;
18     assert(match);
19     assert((line == expected), line);
20 }
21 {
22     immutable line = "abca abc".invert("abc", match);
23     immutable inverted = pre ~ "abc" ~ post;
24     immutable expected = "abca " ~ inverted;
25     assert(match);
26     assert((line == expected), line);
27 }
28 {
29     immutable line = "abcabc".invert("abc", match);
30     immutable expected = "abcabc";
31     assert(!match);
32     assert((line == expected), line);
33 }
34 {
35     immutable line = "kameloso^^".invert("kameloso", match);
36     immutable expected = "kameloso^^";
37     assert(!match);
38     assert((line == expected), line);
39 }
40 {
41     immutable line = "foo kameloso bar".invert("kameloso", match);
42     immutable expected = "foo " ~ pre ~ "kameloso" ~ post ~ " bar";
43     assert(match);
44     assert((line == expected), line);
45 }
46 {
47     immutable line = "fookameloso bar".invert("kameloso", match);
48     immutable expected = "fookameloso bar";
49     assert(!match);
50     assert((line == expected), line);
51 }
52 {
53     immutable line = "foo kamelosobar".invert("kameloso", match);
54     immutable expected = "foo kamelosobar";
55     assert(!match);
56     assert((line == expected), line);
57 }
58 {
59     immutable line = "foo(kameloso)bar".invert("kameloso", match);
60     immutable expected = "foo(" ~ pre ~ "kameloso" ~ post ~ ")bar";
61     assert(match);
62     assert((line == expected), line);
63 }
64 {
65     immutable line = "kameloso: 8ball".invert("kameloso", match);
66     immutable expected = pre ~ "kameloso" ~ post ~ ": 8ball";
67     assert(match);
68     assert((line == expected), line);
69 }
70 {
71     immutable line = "Welcome to the freenode Internet Relay Chat Network kameloso^"
72         .invert("kameloso^", match);
73     immutable expected = "Welcome to the freenode Internet Relay Chat Network " ~
74         pre ~ "kameloso^" ~ post;
75     assert(match);
76     assert((line == expected), line);
77 }
78 {
79     immutable line = "kameloso^: wfwef".invert("kameloso^", match);
80     immutable expected = pre ~ "kameloso^" ~ post ~ ": wfwef";
81     assert(match);
82     assert((line == expected), line);
83 }
84 {
85     immutable line = "[kameloso^]".invert("kameloso^", match);
86     immutable expected = "[kameloso^]";
87     assert(!match);
88     assert((line == expected), line);
89 }
90 {
91     immutable line = `"kameloso^"`.invert("kameloso^", match);
92     immutable expected = "\"" ~ pre ~ "kameloso^" ~ post ~ "\"";
93     assert(match);
94     assert((line == expected), line);
95 }
96 {
97     immutable line = "kameloso^".invert("kameloso", match);
98     immutable expected = "kameloso^";
99     assert(!match);
100     assert((line == expected), line);
101 }
102 {
103     immutable line = "That guy kameloso? is a bot".invert("kameloso", match);
104     immutable expected = "That guy " ~ pre ~ "kameloso" ~ post  ~ "? is a bot";
105     assert(match);
106     assert((line == expected), line);
107 }
108 {
109     immutable line = "kameloso`".invert("kameloso", match);
110     immutable expected = "kameloso`";
111     assert(!match);
112     assert((line == expected), line);
113 }
114 {
115     immutable line = "kameloso9".invert("kameloso", match);
116     immutable expected = "kameloso9";
117     assert(!match);
118     assert((line == expected), line);
119 }
120 {
121     immutable line = "kameloso-".invert("kameloso", match);
122     immutable expected = "kameloso-";
123     assert(!match);
124     assert((line == expected), line);
125 }
126 {
127     immutable line = "kameloso_".invert("kameloso", match);
128     immutable expected = "kameloso_";
129     assert(!match);
130     assert((line == expected), line);
131 }
132 {
133     immutable line = "kameloso_".invert("kameloso_", match);
134     immutable expected = pre ~ "kameloso_" ~ post;
135     assert(match);
136     assert((line == expected), line);
137 }
138 {
139     immutable line = "kameloso kameloso kameloso kameloso kameloso".invert("kameloso", match);
140     immutable expected = "%1$skameloso%2$s %1$skameloso%2$s %1$skameloso%2$s %1$skameloso%2$s %1$skameloso%2$s"
141         .format(pre, post);
142     assert(match);
143     assert((line == expected), line);
144 }
145 
146 // Case-insensitive tests
147 
148 {
149     immutable line = "KAMELOSO".invert("kameloso", match, caseSensitive: false);
150     immutable expected = pre ~ "kameloso" ~ post;
151     assert(match);
152     assert((line == expected), line);
153 }
154 {
155     immutable line = "KamelosoTV".invert("kameloso", match, caseSensitive: false);
156     immutable expected = "KamelosoTV";
157     assert(!match);
158     assert((line == expected), line);
159 }
160 {
161     immutable line = "Blah blah kAmElOsO Blah blah".invert("kameloso", match, caseSensitive: false);
162     immutable expected = "Blah blah " ~ pre ~ "kameloso" ~ post ~ " Blah blah";
163     assert(match);
164     assert((line == expected), line);
165 }
166 {
167     immutable line = "Blah blah".invert("kameloso", match);
168     immutable expected = "Blah blah";
169     assert(!match);
170     assert((line == expected), line);
171 }
172 {
173     immutable line = "".invert("kameloso", match);
174     immutable expected = "";
175     assert(!match);
176     assert((line == expected), line);
177 }
178 {
179     immutable line = "KAMELOSO".invert("kameloso", match);
180     immutable expected = "KAMELOSO";
181     assert(!match);
182     assert((line == expected), line);
183 }