mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-02 16:52:25 -06: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
							 | 
						||
| 
								 | 
							
								}
							 |