Line to examine and invert a substring of.
Substring to invert.
out-parameter that will be set to true if any inversion was done.
Whether or not to look for matches case-insensitively, yet invert with the casing passed.
Line with the substring in it inverted, if inversion was successful, else (a duplicate of) the line unchanged.
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 }
Terminal-inverts the colours of a piece of text in a string.