]> git.giacomolli.uk - onechat/blobdiff - terminal.go
Show styled replies only on terminal output
[onechat] / terminal.go
index 4f1c37836a6685c9bb9d704bfa55cf0b4985759e..203cb5e64adb2d6a8054f71e2b0431536e5c1331 100644 (file)
@@ -10,6 +10,8 @@ import (
        "net"
        "path/filepath"
        "strings"
        "net"
        "path/filepath"
        "strings"
+
+       "golang.org/x/sys/unix"
 )
 
 // terminalResultLines is the most lines of a tool result that the client shows.
 )
 
 // terminalResultLines is the most lines of a tool result that the client shows.
@@ -131,7 +133,8 @@ func terminalSendLines(ctx context.Context, conn net.Conn, in io.Reader) error {
 }
 
 // terminalShowEvents writes each event from the daemon to out until the
 }
 
 // terminalShowEvents writes each event from the daemon to out until the
-// connection closes.
+// connection closes. Only replies and work messages use Markdown styles, and
+// only when out is a terminal.
 func terminalShowEvents(conn net.Conn, out io.Writer) error {
        scanner := bufio.NewScanner(conn)
        scanner.Buffer(make([]byte, 64*1024), socketRequestBytes)
 func terminalShowEvents(conn net.Conn, out io.Writer) error {
        scanner := bufio.NewScanner(conn)
        scanner.Buffer(make([]byte, 64*1024), socketRequestBytes)
@@ -149,6 +152,11 @@ func terminalShowEvents(conn net.Conn, out io.Writer) error {
                        continue
                }
 
                        continue
                }
 
+               columns := terminalColumns(out)
+               if columns > 0 && (event.Kind == "reply" || event.Kind == "work") {
+                       text = strings.Join(terminalMarkdown(text, columns), "\n")
+               }
+
                _, err = io.WriteString(out, text+"\n")
                if err != nil {
                        return fmt.Errorf("write terminal event: %w", err)
                _, err = io.WriteString(out, text+"\n")
                if err != nil {
                        return fmt.Errorf("write terminal event: %w", err)
@@ -210,6 +218,26 @@ func terminalEventText(event Event) string {
        }
 }
 
        }
 }
 
+// terminalColumns returns the current terminal width, or zero for other output.
+// A terminal that reports no columns uses 80.
+func terminalColumns(out io.Writer) int {
+       file, ok := out.(interface{ Fd() uintptr })
+       if !ok {
+               return 0
+       }
+
+       size, err := unix.IoctlGetWinsize(int(file.Fd()), unix.TIOCGWINSZ)
+       if err != nil {
+               return 0
+       }
+
+       if size.Col == 0 {
+               return 80
+       }
+
+       return int(size.Col)
+}
+
 // terminalFirstLines returns the first count lines of text, with the number of
 // the lines left out.
 func terminalFirstLines(text string, count int) string {
 // terminalFirstLines returns the first count lines of text, with the number of
 // the lines left out.
 func terminalFirstLines(text string, count int) string {