mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 14:02:25 -05:00 
			
		
		
		
	
		
			
	
	
		
			72 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package split | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"strconv" | ||
|  | 	"strings" | ||
|  | ) | ||
|  | 
 | ||
|  | // singleTermLine: beyond a certain length of string, all of the | ||
|  | // extra checks to handle quoting/not-quoting add a significant | ||
|  | // amount of extra processing time. Quoting in this manner only really | ||
|  | // effects readability on a single line, so a max string length that | ||
|  | // encompasses the maximum number of columns on *most* terminals was | ||
|  | // selected. This was chosen using the metric that 1080p is one of the | ||
|  | // most common display resolutions, and that a relatively small font size | ||
|  | // of 7 requires ~ 223 columns. So 256 should be >= $COLUMNS (fullscreen) | ||
|  | // in 99% of usecases (these figures all pulled out of my ass). | ||
|  | const singleTermLine = 256 | ||
|  | 
 | ||
|  | // appendQuote will append 'str' to 'buf', double quoting and escaping if needed. | ||
|  | func appendQuote(buf []byte, str string) []byte { | ||
|  | 	switch { | ||
|  | 	case len(str) > singleTermLine || !strconv.CanBackquote(str): | ||
|  | 		// Append quoted and escaped string | ||
|  | 		return strconv.AppendQuote(buf, str) | ||
|  | 
 | ||
|  | 	case (strings.IndexByte(str, '"') != -1): | ||
|  | 		// Double quote and escape string | ||
|  | 		buf = append(buf, '"') | ||
|  | 		buf = appendEscape(buf, str) | ||
|  | 		buf = append(buf, '"') | ||
|  | 		return buf | ||
|  | 
 | ||
|  | 	case (strings.IndexByte(str, ',') != -1): | ||
|  | 		// Double quote this string as-is | ||
|  | 		buf = append(buf, '"') | ||
|  | 		buf = append(buf, str...) | ||
|  | 		buf = append(buf, '"') | ||
|  | 		return buf | ||
|  | 
 | ||
|  | 	default: | ||
|  | 		// Append string as-is | ||
|  | 		return append(buf, str...) | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // appendEscape will append 'str' to 'buf' and escape any double quotes. | ||
|  | func appendEscape(buf []byte, str string) []byte { | ||
|  | 	var delim bool | ||
|  | 	for i := range str { | ||
|  | 		switch { | ||
|  | 		case str[i] == '\\' && !delim: | ||
|  | 			// Set delim flag | ||
|  | 			delim = true | ||
|  | 
 | ||
|  | 		case str[i] == '"' && !delim: | ||
|  | 			// Append escaped double quote | ||
|  | 			buf = append(buf, `\"`...) | ||
|  | 
 | ||
|  | 		case delim: | ||
|  | 			// Append skipped slash | ||
|  | 			buf = append(buf, `\`...) | ||
|  | 			delim = false | ||
|  | 			fallthrough | ||
|  | 
 | ||
|  | 		default: | ||
|  | 			// Append char as-is | ||
|  | 			buf = append(buf, str[i]) | ||
|  | 		} | ||
|  | 	} | ||
|  | 	return buf | ||
|  | } |