gopdf/splittext.go

54 lines
1018 B
Go

package gofpdf
import (
"math"
// "strings"
"unicode"
)
// SplitText splits UTF-8 encoded text into several lines using the current
// font. Each line has its length limited to a maximum width given by w. This
// function can be used to determine the total height of wrapped text for
// vertical placement purposes.
func (f *Fpdf) SplitText(txt string, w float64) (lines []string) {
cw := f.currentFont.Cw
wmax := int(math.Ceil((w - 2*f.cMargin) * 1000 / f.fontSize))
s := []rune(txt) // Return slice of UTF-8 runes
nb := len(s)
for nb > 0 && s[nb-1] == '\n' {
nb--
}
s = s[0:nb]
sep := -1
i := 0
j := 0
l := 0
for i < nb {
c := s[i]
l += cw[c]
if unicode.IsSpace(c) || isChinese(c) {
sep = i
}
if c == '\n' || l > wmax {
if sep == -1 {
if i == j {
i++
}
sep = i
} else {
i = sep + 1
}
lines = append(lines, string(s[j:sep]))
sep = -1
j = i
l = 0
} else {
i++
}
}
if i != j {
lines = append(lines, string(s[j:i]))
}
return lines
}