github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/utils/virtualterm/export.go (about)

     1  package virtualterm
     2  
     3  import (
     4  	"html"
     5  	"strings"
     6  )
     7  
     8  // Export returns a character map of the virtual terminal
     9  func (t *Term) Export() string {
    10  	t.mutex.Lock()
    11  
    12  	gridLen := (t.size.X + 1) * t.size.Y
    13  	r := make([]rune, gridLen, gridLen)
    14  	var i int
    15  	for y := range t.cells {
    16  		for x := range t.cells[y] {
    17  			if t.cells[y][x].char != 0 { // if cell contains no data then lets assume it's a space character
    18  				r[i] = t.cells[y][x].char
    19  			} else {
    20  				r[i] = ' '
    21  			}
    22  			i++
    23  		}
    24  		r[i] = '\n'
    25  		i++
    26  	}
    27  
    28  	t.mutex.Unlock()
    29  
    30  	return string(r)
    31  }
    32  
    33  // ExportHTML returns a HTML reder of the virtual terminal
    34  func (t *Term) ExportHtml() string {
    35  	s := `<span class="">`
    36  
    37  	lastSgr := &sgr{}
    38  	var lastChar rune = 0
    39  
    40  	t.mutex.Lock()
    41  
    42  	for y := range t.cells {
    43  		for x := range t.cells[y] {
    44  			sgr := &t.cells[y][x].sgr
    45  			char := t.cells[y][x].char
    46  
    47  			if t.cells[y][x].differs(lastChar, lastSgr) {
    48  				s += `</span><span class="` + sgrHtmlClassLookup(sgr) + `">`
    49  			}
    50  
    51  			if char != 0 { // if cell contains no data then lets assume it's a space character
    52  				s += html.EscapeString(string(char))
    53  			} else {
    54  				s += " "
    55  			}
    56  
    57  			lastSgr = sgr
    58  			lastChar = char
    59  		}
    60  		s += "\n"
    61  	}
    62  
    63  	t.mutex.Unlock()
    64  
    65  	return s + "</span>"
    66  }
    67  
    68  func sgrHtmlClassLookup(sgr *sgr) string {
    69  	classes := make([]string, 0)
    70  
    71  	for bit, class := range sgrHtmlClassNames {
    72  		if sgr.checkFlag(bit) {
    73  			classes = append(classes, class)
    74  		}
    75  	}
    76  
    77  	if sgr.checkFlag(sgrFgColour4) {
    78  		classes = append(classes, sgrColourHtmlClassNames[sgr.fg.Red])
    79  	}
    80  
    81  	return strings.Join(classes, " ")
    82  }