string: add `strip_margin`
parent
3e05939b65
commit
2d5c7c8e93
|
@ -1267,3 +1267,64 @@ pub fn (s string) repeat(count int) string {
|
||||||
ret[s.len * count] = 0
|
ret[s.len * count] = 0
|
||||||
return string(ret)
|
return string(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Allows multi-line strings to be formatted in a way that removes white-space
|
||||||
|
// before a delimeter. by default `|` is used.
|
||||||
|
// Note: the delimiter has to be a byte at this time. That means surrounding
|
||||||
|
// the value in ``.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// st := 'Hello there,
|
||||||
|
// |this is a string,
|
||||||
|
// | Everything before the first | is removed'.strip_margin()
|
||||||
|
// Returns:
|
||||||
|
// Hello there,
|
||||||
|
// this is a string,
|
||||||
|
// Everything before the first | is removed
|
||||||
|
pub fn (s string) strip_margin(del ...byte) string {
|
||||||
|
mut sep := `|`
|
||||||
|
if del.len >= 1 {
|
||||||
|
// This is a workaround. We can't directly index a var_args array.
|
||||||
|
// Only care about the first one, ignore the rest if more
|
||||||
|
for d in del {
|
||||||
|
// The delimiter is not allowed to be white-space. Will use default
|
||||||
|
if !d.is_space() {
|
||||||
|
sep = d
|
||||||
|
} else {
|
||||||
|
eprintln("Warning: `strip_margin` cannot use white-space as a delimiter")
|
||||||
|
eprintln(" Defaulting to `|`")
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if del.len == 1 {
|
||||||
|
eprintln("Warning: `strip_margin` only uses the first argument given")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// don't know how much space the resulting string will be, but the max it
|
||||||
|
// can be is this big
|
||||||
|
mut ret := malloc(s.len + 1)
|
||||||
|
mut count := 0
|
||||||
|
for i := 0; i < s.len; i++ {
|
||||||
|
if (s[i] in [`\n`, `\r`]) {
|
||||||
|
$if windows {
|
||||||
|
ret[count] = `\r`
|
||||||
|
ret[count+1] = `\n`
|
||||||
|
count += 2
|
||||||
|
} $else {
|
||||||
|
ret[count] = s[i]
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
for s[i] != sep {
|
||||||
|
i++
|
||||||
|
if i >= s.len {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ret[count] = s[i]
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret[count] = 0
|
||||||
|
return string(ret)
|
||||||
|
}
|
||||||
|
|
|
@ -695,3 +695,79 @@ fn test_split_into_lines() {
|
||||||
assert line == line_content
|
assert line == line_content
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_strip_margins() {
|
||||||
|
no_tabs := 'Hello there
|
||||||
|
This is a string
|
||||||
|
With multiple lines'
|
||||||
|
no_tabs_stripped := 'Hello there
|
||||||
|
|This is a string
|
||||||
|
|With multiple lines'.strip_margin()
|
||||||
|
assert no_tabs == no_tabs_stripped
|
||||||
|
|
||||||
|
text_before := 'There is text
|
||||||
|
before the delimiter
|
||||||
|
that should be removed as well'
|
||||||
|
text_before_stripped := 'There is text
|
||||||
|
f lasj asldfj j lksjdf |before the delimiter
|
||||||
|
Which is removed hello |that should be removed as well'.strip_margin()
|
||||||
|
assert text_before_stripped == text_before
|
||||||
|
|
||||||
|
tabs := ' Tab
|
||||||
|
spaces
|
||||||
|
another tab'
|
||||||
|
tabs_stripped := ' Tab
|
||||||
|
| spaces
|
||||||
|
| another tab'.strip_margin()
|
||||||
|
assert tabs == tabs_stripped
|
||||||
|
|
||||||
|
alternate_delimiter := 'This has a different delim,
|
||||||
|
but that is ok
|
||||||
|
because everything works'
|
||||||
|
alternate_delimiter_stripped := 'This has a different delim,
|
||||||
|
#but that is ok
|
||||||
|
# because everything works'.strip_margin(`#`)
|
||||||
|
assert alternate_delimiter_stripped == alternate_delimiter
|
||||||
|
|
||||||
|
delim_after_first_instance := 'The delimiter used
|
||||||
|
only matters the |||| First time it is seen
|
||||||
|
not any | other | times'
|
||||||
|
delim_after_first_instance_stripped := 'The delimiter used
|
||||||
|
|only matters the |||| First time it is seen
|
||||||
|
|not any | other | times'.strip_margin()
|
||||||
|
assert delim_after_first_instance_stripped == delim_after_first_instance
|
||||||
|
|
||||||
|
uneven_delims := 'It doesn\'t matter if the delims are uneven,
|
||||||
|
The text will still be delimited correctly.
|
||||||
|
Maybe not everything needs 3 lines?
|
||||||
|
Let us go for 4 then'
|
||||||
|
uneven_delims_stripped := 'It doesn\'t matter if the delims are uneven,
|
||||||
|
|The text will still be delimited correctly.
|
||||||
|
|Maybe not everything needs 3 lines?
|
||||||
|
|Let us go for 4 then'.strip_margin()
|
||||||
|
assert uneven_delims_stripped == uneven_delims
|
||||||
|
|
||||||
|
multi_blank_lines := 'Multiple blank lines will be removed.
|
||||||
|
I actually consider this a feature.'
|
||||||
|
multi_blank_lines_stripped := 'Multiple blank lines will be removed.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| I actually consider this a feature.'.strip_margin()
|
||||||
|
assert multi_blank_lines == multi_blank_lines_stripped
|
||||||
|
|
||||||
|
end_with_newline := 'This line will end with a newline
|
||||||
|
Something cool or something.
|
||||||
|
'
|
||||||
|
end_with_newline_stripped := 'This line will end with a newline
|
||||||
|
|Something cool or something.
|
||||||
|
|
||||||
|
'.strip_margin()
|
||||||
|
assert end_with_newline_stripped == end_with_newline
|
||||||
|
|
||||||
|
space_delimiter := 'Using a white-space char will
|
||||||
|
revert back to default behavior.'
|
||||||
|
space_delimiter_stripped := 'Using a white-space char will
|
||||||
|
|revert back to default behavior.'.strip_margin(`\n`)
|
||||||
|
assert space_delimiter == space_delimiter_stripped
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue