diff options
Diffstat (limited to 'handlers.go')
| -rw-r--r-- | handlers.go | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/handlers.go b/handlers.go index 599d53b..c87d82b 100644 --- a/handlers.go +++ b/handlers.go @@ -8,6 +8,7 @@ import ( "net/url" "strings" + "github.com/charmbracelet/lipgloss" "tildegit.org/tjp/sliderule" "tildegit.org/tjp/sliderule/gemini" "tildegit.org/tjp/sliderule/gemini/gemtext" @@ -121,7 +122,7 @@ func parseGophermapDoc(body []byte, softWrap int) (string, []Link, error) { Text: item.Display, Target: fmtGopherURL(item.Type, item.Selector, item.Hostname, item.Port), }) - if _, err := b.WriteString(fmt.Sprintf("[%d]%s %s%s%s\n", i, padding(i, width), linkStyle, item.Display, ansiClear)); err != nil { + if _, err := b.WriteString(fmt.Sprintf("[%d]%s %s\n", i, padding(i, width), linkStyle.Render(item.Display))); err != nil { return "", nil, err } i += 1 @@ -131,16 +132,15 @@ func parseGophermapDoc(body []byte, softWrap int) (string, []Link, error) { return b.String(), l, nil } -const ( - ansiClear = "\x1b[0m" - linkStyle = "\x1b[38;5;33m" - promptStyle = "\x1b[38;5;39m" - quoteStyle = "\x1b[38;5;208m\x1b[3m" - rawStyle = "\x1b[38;5;249m" - h1Style = "\x1b[38;5;154m\x1b[1m\x1b[4m" - h2Style = "\x1b[38;5;50m\x1b[4m" - h3Style = "\x1b[38;5;6m\x1b[4m" - listStyle = "\x1b[38;5;3m" +var ( + linkStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("33")) + promptStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("39")) + quoteStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("208")).Italic(true) + rawStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("249")) + h1Style = lipgloss.NewStyle().Foreground(lipgloss.Color("154")).Bold(true).Underline(true) + h2Style = lipgloss.NewStyle().Foreground(lipgloss.Color("50")).Underline(true) + h3Style = lipgloss.NewStyle().Foreground(lipgloss.Color("6")).Underline(true) + listStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("3")) ) func parseGemtextDoc(body []byte, softWrap int) (string, []Link, error) { @@ -183,22 +183,30 @@ func parseGemtextDoc(body []byte, softWrap int) (string, []Link, error) { if len(label) == 0 { label = ll.URL() } - if _, err := b.WriteString(fmt.Sprintf("[%d]%s %s%s%s\n", i, padding(i, width), linkStyle, label, ansiClear)); err != nil { - return "", nil, err + for j, line := range fold(label, softWrap) { + var prefix string + if j == 0 { + prefix = fmt.Sprintf("[%d]%s ", i, padding(i, width)) + } else { + prefix = strings.Repeat(" ", width+3) + } + if _, err := fmt.Fprintf(&b, "%s%s\n", prefix, linkStyle.Render(line)); err != nil { + return "", nil, err + } } i += 1 case gemtext.LineTypeQuote: q := item.(gemtext.QuoteLine) for _, line := range fold(q.Body(), softWrap-1) { line = strings.TrimSpace(line) - if _, err := b.WriteString(textpad + "> " + quoteStyle + line + ansiClear + "\n"); err != nil { + if _, err := b.WriteString(textpad + "> " + quoteStyle.Render(line) + "\n"); err != nil { return "", nil, err } } case gemtext.LineTypePreformatToggle: case gemtext.LineTypePreformattedText: for _, line := range fold(item.String(), softWrap) { - if _, err := b.WriteString(textpad + rawStyle + line + ansiClear + "\n"); err != nil { + if _, err := b.WriteString(textpad + rawStyle.Render(line) + "\n"); err != nil { return "", nil, err } } @@ -210,19 +218,19 @@ func parseGemtextDoc(body []byte, softWrap int) (string, []Link, error) { fallthrough case gemtext.LineTypeHeading1: hLevel += 1 - var color string + var style lipgloss.Style switch hLevel { case 1: - color = h1Style + style = h1Style case 2: - color = h2Style + style = h2Style case 3: - color = h3Style + style = h3Style } for _, line := range fold(item.String(), softWrap) { line = strings.TrimRight(line, "\r\n") - if _, err := b.WriteString(textpad + color + line + ansiClear + "\n"); err != nil { + if _, err := b.WriteString(textpad + style.Render(line) + "\n"); err != nil { return "", nil, err } } @@ -233,7 +241,7 @@ func parseGemtextDoc(body []byte, softWrap int) (string, []Link, error) { if i == 0 { lpad = "* " } - if _, err := b.WriteString(textpad + listStyle + lpad + line + ansiClear + "\n"); err != nil { + if _, err := b.WriteString(textpad + lpad + listStyle.Render(line) + "\n"); err != nil { return "", nil, err } } @@ -307,5 +315,5 @@ func numberWidth(i int) int { } func padding(num int, width int) string { - return string(bytes.Repeat([]byte{' '}, width-numberWidth(num))) + return strings.Repeat(" ", width-numberWidth(num)) } |
