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