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 }