summaryrefslogtreecommitdiff
path: root/handlers.go
diff options
context:
space:
mode:
Diffstat (limited to 'handlers.go')
-rw-r--r--handlers.go52
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))
}