github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/edit/buf_to_html.go (about) 1 package edit 2 3 import ( 4 "fmt" 5 "html" 6 "strings" 7 8 "github.com/markusbkk/elvish/pkg/cli/term" 9 ) 10 11 // TODO(xiaq): Move this into the ui package. 12 13 func bufToHTML(b *term.Buffer) string { 14 var sb strings.Builder 15 for _, line := range b.Lines { 16 style := "" 17 openedSpan := false 18 for _, c := range line { 19 if c.Style != style { 20 if openedSpan { 21 sb.WriteString("</span>") 22 } 23 if c.Style == "" { 24 openedSpan = false 25 } else { 26 var classes []string 27 for _, c := range strings.Split(c.Style, ";") { 28 classes = append(classes, "sgr-"+c) 29 } 30 fmt.Fprintf(&sb, 31 `<span class="%s">`, strings.Join(classes, " ")) 32 openedSpan = true 33 } 34 style = c.Style 35 } 36 fmt.Fprintf(&sb, "%s", html.EscapeString(c.Text)) 37 } 38 if openedSpan { 39 sb.WriteString("</span>") 40 } 41 sb.WriteString("\n") 42 } 43 return sb.String() 44 }