44 lines
927 B
Go
44 lines
927 B
Go
|
package gohtml
|
||
|
|
||
|
import (
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// A textElement represents a text element of an HTML document.
|
||
|
type textElement struct {
|
||
|
text string
|
||
|
parent *tagElement
|
||
|
}
|
||
|
|
||
|
func (e *textElement) isInline() bool {
|
||
|
// Text nodes are always considered to be inline
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// write writes a text to the buffer.
|
||
|
func (e *textElement) write(bf *formattedBuffer, isPreviousNodeInline bool) bool {
|
||
|
text := unifyLineFeed(e.text)
|
||
|
if e.parent != nil && e.parent.isRaw {
|
||
|
bf.writeToken(text, formatterTokenType_Text)
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
if !isPreviousNodeInline {
|
||
|
bf.writeLineFeed()
|
||
|
}
|
||
|
|
||
|
// Collapse leading and trailing spaces
|
||
|
text = regexp.MustCompile(`^\s+|\s+$`).ReplaceAllString(text, " ")
|
||
|
lines := strings.Split(text, "\n")
|
||
|
for l, line := range lines {
|
||
|
if l > 0 {
|
||
|
bf.writeLineFeed()
|
||
|
}
|
||
|
for _, word := range strings.Split(line, " ") {
|
||
|
bf.writeToken(word, formatterTokenType_Text)
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
}
|