Improve the terminal filter
All checks were successful
Alpine 3.20 Success

The new filter comes with these enhancements:

 - Processing is rune-wise rather than byte-wise;
   it assumes UTF-8 input and single-cell wide characters,
   but this condition should be /usually/ satisfied.
 - Unprocessed control characters are escaped, `cat -v` style.
 - A lot of escape sequences is at least recognised, if not processed.
 - Rudimentary preparation for efficient dynamic updates
   of task views, through Javascript.

We make terminal resets and screen clearing commands
flush all output and assume that the terminal has a new origin
for any later positioning commands.
This appears to work well enough with GRUB, at least.

The filter is now exposed through a command line option.
This commit is contained in:
2024-12-25 22:18:30 +01:00
parent 14a15e8b59
commit fb291b6def
3 changed files with 456 additions and 64 deletions

44
terminal_test.go Normal file
View File

@@ -0,0 +1,44 @@
package main
import "testing"
// TODO(p): Add a lot more test cases.
var tests = []struct {
push, want string
}{
{
"\x1bc\x1b[?7l\x1b[2J\x1b[0mSeaBIOS\r",
"SeaBIOS\n",
},
}
func TestTerminal(t *testing.T) {
for _, test := range tests {
tw := terminalWriter{}
if _, err := tw.Write([]byte(test.push)); err != nil {
t.Errorf("%#v: %s", test.push, err)
continue
}
have := string(tw.Serialize(0))
if have != test.want {
t.Errorf("%#v: %#v; want %#v", test.push, have, test.want)
}
}
}
func TestTerminalExploded(t *testing.T) {
Loop:
for _, test := range tests {
tw := terminalWriter{}
for _, b := range []byte(test.push) {
if _, err := tw.Write([]byte{b}); err != nil {
t.Errorf("%#v: %s", test.push, err)
continue Loop
}
}
have := string(tw.Serialize(0))
if have != test.want {
t.Errorf("%#v: %#v; want %#v", test.push, have, test.want)
}
}
}