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  }