mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 10:03:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package wordwrap
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"unicode"
 | 
						|
)
 | 
						|
 | 
						|
// WrapString wraps the given string within lim width in characters.
 | 
						|
//
 | 
						|
// Wrapping is currently naive and only happens at white-space. A future
 | 
						|
// version of the library will implement smarter wrapping. This means that
 | 
						|
// pathological cases can dramatically reach past the limit, such as a very
 | 
						|
// long word.
 | 
						|
func WrapString(s string, lim uint) string {
 | 
						|
	// Initialize a buffer with a slightly larger size to account for breaks
 | 
						|
	init := make([]byte, 0, len(s))
 | 
						|
	buf := bytes.NewBuffer(init)
 | 
						|
 | 
						|
	var current uint
 | 
						|
	var wordBuf, spaceBuf bytes.Buffer
 | 
						|
 | 
						|
	for _, char := range s {
 | 
						|
		if char == '\n' {
 | 
						|
			if wordBuf.Len() == 0 {
 | 
						|
				if current+uint(spaceBuf.Len()) > lim {
 | 
						|
					current = 0
 | 
						|
				} else {
 | 
						|
					current += uint(spaceBuf.Len())
 | 
						|
					spaceBuf.WriteTo(buf)
 | 
						|
				}
 | 
						|
				spaceBuf.Reset()
 | 
						|
			} else {
 | 
						|
				current += uint(spaceBuf.Len() + wordBuf.Len())
 | 
						|
				spaceBuf.WriteTo(buf)
 | 
						|
				spaceBuf.Reset()
 | 
						|
				wordBuf.WriteTo(buf)
 | 
						|
				wordBuf.Reset()
 | 
						|
			}
 | 
						|
			buf.WriteRune(char)
 | 
						|
			current = 0
 | 
						|
		} else if unicode.IsSpace(char) {
 | 
						|
			if spaceBuf.Len() == 0 || wordBuf.Len() > 0 {
 | 
						|
				current += uint(spaceBuf.Len() + wordBuf.Len())
 | 
						|
				spaceBuf.WriteTo(buf)
 | 
						|
				spaceBuf.Reset()
 | 
						|
				wordBuf.WriteTo(buf)
 | 
						|
				wordBuf.Reset()
 | 
						|
			}
 | 
						|
 | 
						|
			spaceBuf.WriteRune(char)
 | 
						|
		} else {
 | 
						|
 | 
						|
			wordBuf.WriteRune(char)
 | 
						|
 | 
						|
			if current+uint(spaceBuf.Len()+wordBuf.Len()) > lim && uint(wordBuf.Len()) < lim {
 | 
						|
				buf.WriteRune('\n')
 | 
						|
				current = 0
 | 
						|
				spaceBuf.Reset()
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if wordBuf.Len() == 0 {
 | 
						|
		if current+uint(spaceBuf.Len()) <= lim {
 | 
						|
			spaceBuf.WriteTo(buf)
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		spaceBuf.WriteTo(buf)
 | 
						|
		wordBuf.WriteTo(buf)
 | 
						|
	}
 | 
						|
 | 
						|
	return buf.String()
 | 
						|
}
 |