blogssh/post.go
2025-06-01 13:33:47 +01:00

77 lines
1.5 KiB
Go

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
}