package main import ( "strings" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour" ) type childMessage struct{} type postModel struct { viewport viewport.Model } func (m postModel) Init() tea.Cmd { return nil } func (m postModel) View() string { return m.viewport.View() } func (m postModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case tea.KeyEsc.String(): return m, func() tea.Msg { return childMessage{} } default: var cmd tea.Cmd m.viewport, cmd = m.viewport.Update(msg) return m, cmd } case tea.WindowSizeMsg: //TODO: something. What should happen on height change. } return m, nil } func processMarkdown(markdown string) (string, error) { postContent, err := getPostWithoutMetaData(markdown) if err != nil { return "", err } postInfo, err := getPostInfo(markdown) if err != nil { return "", err } // This is stupid lines := strings.Split(postContent, "\n") lines = append([]string{"# " + postInfo.Title[1:len(postInfo.Title)-1]}, lines...) return strings.Join(lines, "\n"), nil } func createMarkdownPostModel(markdown string, termRender *glamour.TermRenderer, viewPort viewport.Model) (postModel, error) { m := postModel{ viewport: viewPort, } out, err := termRender.Render(markdown) if err != nil { return postModel{}, err } m.viewport.SetContent(out) return m, nil }