charmbracelet / charmbracelet/bubbles

how to replace content in viewport

Open
#804 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
8.9k
Forks
457
Avg merge
1d 18h
Merged PRs (30d)
5

Description

Hi, this is my minimality code, i am doing a article app, when user press **n** key, load next page reply,
```go
package main

import (
"fmt"
"regexp"
"strings"

"github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/dromara/carbon/v2"
"github.com/seth-shi/go-v2ex/internal/model/messages"
"github.com/seth-shi/go-v2ex/internal/model/response"
)

type Model struct {
viewport viewport.Model
replies []response.V2ReplyResult
replyPage int
}

func (m Model) Init() tea.Cmd {
return nil
}

func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var (
cmd tea.Cmd
cmds []tea.Cmd
)

switch msgType := msg.(type) {
case messages.GetReplyResponse:
m.replies = append(m.replies, msgType.Data.Result...)
m.replyPage++
cmds = append(cmds, m.initViewport())
case tea.WindowSizeMsg:
cmds = append(cmds, m.initViewport())
case tea.KeyMsg:
switch {
case msgType.String() == "n":
// load more reply
return m, tea.Sequence(
messages.LoadingRequestReply.PostStart(),
// api request next page reply : m.replyPage
messages.LoadingRequestReply.PostEnd(),
)
case msgType.String() == "i":
// load more reply
return m, m.replaceLinks()
}
}

m.viewport, cmd = m.viewport.Update(msg)
cmds = append(cmds, cmd)
return m, tea.Batch(cmds...)
}

func (m Model) View() string {
return m.viewport.View()
}

func (m *Model) replaceLinks() tea.Cmd {
imgurPattern := regexp.MustCompile(`https://i\.imgur\.com/[a-zA-Z0-9]+(?:\.\w+)?`)
list := imgurPattern.FindAllString(m.viewport.View(), -1)
// imgMap = api.request(list)
// replaceItems = [x1.png, ansiitext, x2.png, ansiitext]
replaceItems := list
// i try this way, but it's wrong, because press n key, image will replace
r := strings.NewReplacer(replaceItems...)
m.viewport.SetContent(r.Replace(m.viewport.View()))
return nil
}

func (m *Model) initViewport() tea.Cmd {

var (
content strings.Builder
)

content.WriteString("\n\n")
if len(m.replies) > 0 {
var replies strings.Builder
for i, r := range m.replies {
floor := fmt.Sprintf(
"#%d · %s @%s",
i+1,
carbon.CreateFromTimestamp(r.Created),
r.Member.Username,
)
replies.WriteString(lipgloss.NewStyle().Bold(true).Render(floor))
replies.WriteString("\n")
replies.WriteString(r.GetContent())
replies.WriteString("\n\n")
}
content.WriteString(replies.String())
}

m.viewport.SetContent(content.String())

return nil
}

```

But I have a new feature, reply content includes image link, likely **https://xxx.com/a.png**, I need to replace with ASCII text (I'm already ok), But I don't know when to make the replacement. (at View() or initViewport() )

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.