util.go
func Reticence(str string, length int) string {
	if length > len(str) {
		return str
	}
	var i int
F:
	for i = len(str) - 1; i >= 0; i-- {
		switch str[i] {
		case ' ', ',', '?', ';', ':', '\'', '"', '!':
			if i <= length {
				break F
			}
		case '.':
			if i-2 >= 0 {
				s := str[i-2 : i]
				if s == ".." {
					i = i - 2
					if i <= length {
						break F
					}
				}
			}
			if i <= length {
				break F
			}
		}
	}
	if i-1 > 0 {
		switch str[i-1] {
		case ' ', ',', '?', ';', ':', '\'', '"', '!':
			i--
		case '.':
			if i-2 > 0 && str[i-2:i] == ".." {
				i -= 3
			}
		}
	}
	if i >= 2 {
		if i+3 >= len(str) {
			return str
		}
		return str[:i] + "..."
	}
	if length >= 2 && length < len(str) {
		if length+3 >= len(str) {
			return str
		}
		return str[:length] + "..."
	}
	return str
}
func Reticence(str string, length int) string {
	if length > len(str) {
		return str
	}
	var i int
F:
	for i = len(str) - 1; i >= 0; i-- {
		switch str[i] {
		case ' ', ',', '?', ';', ':', '\'', '"', '!':
			if i <= length {
				break F
			}
		case '.':
			if i-2 >= 0 {
				s := str[i-2 : i]
				if s == ".." {
					i = i - 2
					if i <= length {
						break F
					}
				}
			}
			if i <= length {
				break F
			}
		}
	}
	if i-1 > 0 {
		switch str[i-1] {
		case ' ', ',', '?', ';', ':', '\'', '"', '!':
			i--
		case '.':
			if i-2 > 0 && str[i-2:i] == ".." {
				i -= 3
			}
		}
	}
	if i >= 2 {
		if i+3 >= len(str) {
			return str
		}
		return str[:i] + "..."
	}
	if length >= 2 && length < len(str) {
		if length+3 >= len(str) {
			return str
		}
		return str[:length] + "..."
	}
	return str
}
// Reticence trucate the string in the space or on pontuation mark and put
// reticences in the resulting string.