This repository has been archived on 2024-07-28. You can view files and clone it, but cannot push or open issues or pull requests.
cairde/render.go

113 lines
2.4 KiB
Go
Raw Normal View History

2023-07-23 12:35:49 +00:00
package main
import (
"encoding/json"
2023-07-23 12:35:49 +00:00
"fmt"
2023-07-25 08:31:18 +00:00
"strings"
2023-07-23 12:35:49 +00:00
"time"
"github.com/charmbracelet/bubbles/key"
"github.com/charmbracelet/bubbles/viewport"
2023-07-25 08:31:18 +00:00
"github.com/charmbracelet/lipgloss"
"github.com/muesli/reflow/wordwrap"
2023-07-23 12:35:49 +00:00
)
const timePrefixFormat = "15:04:05"
2023-07-25 08:31:18 +00:00
func renderLines(width int, lines ...string) []string {
var wrappedLines []string
now := time.Now().Format(timePrefixFormat)
leftMargin := lipgloss.Width(fmt.Sprintf(
"%s %s ",
timeStyle.Render(now),
lineSeparatorStyle.Render("|"),
))
2023-07-23 12:35:49 +00:00
for _, line := range lines {
2023-07-25 08:31:18 +00:00
wrapped := wordwrap.String(line, width-leftMargin)
for _, wrappedLine := range strings.Split(wrapped, "\n") {
wrappedLines = append(wrappedLines, wrappedLine)
}
}
var rendered []string
for _, wrappedLine := range wrappedLines {
2023-07-23 12:35:49 +00:00
now := time.Now().Format(timePrefixFormat)
2023-07-25 08:31:18 +00:00
rendered = append(rendered, fmt.Sprintf(
2023-07-24 10:19:51 +00:00
"%s %s %s",
2023-07-24 13:07:11 +00:00
timeStyle.Render(now),
lineSeparatorStyle.Render("|"),
2023-07-25 08:31:18 +00:00
lineStyle.Render(wrappedLine),
),
2023-07-24 10:19:51 +00:00
)
2023-07-23 12:35:49 +00:00
}
2023-07-25 08:31:18 +00:00
2023-07-23 12:35:49 +00:00
return rendered
}
func newViewport(width, height int) viewport.Model {
viewp := viewport.New(width, height)
viewp.KeyMap = viewport.KeyMap{
PageDown: key.NewBinding(key.WithKeys("pgdown")),
PageUp: key.NewBinding(key.WithKeys("pgup")),
HalfPageUp: key.NewBinding(key.WithKeys("ctrl+k")),
HalfPageDown: key.NewBinding(key.WithKeys("ctrl+j")),
}
return viewp
}
func renderCmdHelp(m model) []string {
var (
renderedCmdHelp []string
cmdHelp []string
)
if m.width >= 90 {
cmdHelp = []string{
"CTRL+N/P", "TOGGLE PROFILE",
"CTRL+J/K", "SCROLL UP/DOWN",
"CTRL+L", "CLEAR",
"CTRL+C", "EXIT",
}
} else {
// NOTE(d1): respect small screens
cmdHelp = []string{
"CTRL+N/P",
"CTRL+J/K",
"CTRL+L",
"CTRL+C",
}
}
for idx, cmd := range cmdHelp {
if idx%2 == 0 {
renderedCmdHelp = append(renderedCmdHelp, cmdKeyStyle.Render(cmd))
} else {
renderedCmdHelp = append(renderedCmdHelp, cmdDescriptionStyle.Render(cmd))
}
}
return renderedCmdHelp
}
// https://git.openprivacy.ca/sarah/cwtchbot/src/branch/main/bot.go
type MessageWrapper struct {
Overlay int `json:"o"`
Data string `json:"d"`
}
func packMessage(overlay int, message string) []byte {
mw := new(MessageWrapper)
mw.Overlay = overlay
mw.Data = message
data, _ := json.Marshal(mw)
return data
}
func unpackMessage(message string) MessageWrapper {
mw := new(MessageWrapper)
json.Unmarshal([]byte(message), mw)
return *mw
}