// Render returns the view as the model reads it: one line "id+n|text" for each
// node inside <chat> tags, with the newlines of the text as spaces.
func (v *View) Render() string {
- return v.RenderWithout(nil)
+ return "<chat>\n" + strings.Join(v.LinesWithout(nil), "") + "</chat>"
}
-// RenderWithout returns the view as Render does, without the leaf lines of the
-// messages in skip. A line that merges such a message with others stays.
-func (v *View) RenderWithout(skip map[int]bool) string {
- var text strings.Builder
- text.WriteString("<chat>\n")
+// LinesWithout returns the lines of the view as the model reads them, each with
+// its newline, without the leaf lines of the messages in skip. A line that
+// merges such a message with others stays.
+func (v *View) LinesWithout(skip map[int]bool) []string {
+ lines := make([]string, 0, len(v.lines))
for _, line := range v.lines {
if line.level == 0 && skip[line.index] {
continue
}
+ var text strings.Builder
v.renderLine(&text, line)
+ lines = append(lines, text.String())
}
- text.WriteString("</chat>")
-
- return text.String()
+ return lines
}
// renderLine writes one view line, "id+n|text", and a newline.