Initial commit
This commit is contained in:
commit
77d3ff4852
20 changed files with 645 additions and 0 deletions
72
providers/sitereader/provider.go
Normal file
72
providers/sitereader/provider.go
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
package sitereader
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"io/fs"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
"lmika.dev/lmika/weiro/models"
|
||||
)
|
||||
|
||||
type Provider struct {
|
||||
fs fs.FS
|
||||
}
|
||||
|
||||
func New(fs fs.FS) *Provider {
|
||||
return &Provider{
|
||||
fs: fs,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Provider) ReadSite() (models.Sites, error) {
|
||||
posts, err := p.ListPosts()
|
||||
if err != nil {
|
||||
return models.Sites{}, err
|
||||
}
|
||||
|
||||
return models.Sites{
|
||||
Posts: posts,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (p *Provider) ListPosts() (posts []*models.Post, err error) {
|
||||
err = fs.WalkDir(p.fs, "posts", func(path string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
} else if d.IsDir() {
|
||||
return nil
|
||||
}
|
||||
|
||||
post, err := p.ReadPost(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
posts = append(posts, post)
|
||||
return nil
|
||||
})
|
||||
return posts, err
|
||||
}
|
||||
|
||||
func (p *Provider) ReadPost(path string) (*models.Post, error) {
|
||||
data, err := fs.ReadFile(p.fs, path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Split front matter and content
|
||||
parts := bytes.SplitN(data, []byte("---"), 3)
|
||||
if len(parts) < 3 {
|
||||
return nil, io.ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
var meta models.Meta
|
||||
if err := yaml.Unmarshal(parts[1], &meta); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &models.Post{
|
||||
Meta: meta,
|
||||
Content: string(bytes.TrimPrefix(parts[2], []byte("\n"))),
|
||||
}, nil
|
||||
}
|
||||
106
providers/sitereader/provider_test.go
Normal file
106
providers/sitereader/provider_test.go
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
package sitereader_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"testing/fstest"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"lmika.dev/lmika/weiro/models"
|
||||
"lmika.dev/lmika/weiro/providers/sitereader"
|
||||
)
|
||||
|
||||
func TestProvider_ReadPost(t *testing.T) {
|
||||
t.Run("with meta", func(t *testing.T) {
|
||||
testFS := fstest.MapFS{
|
||||
"posts/test.md": {Data: []byte(`---
|
||||
date: 2026-02-18T19:59:00Z
|
||||
title: Test Post Here
|
||||
tags: [test, example]
|
||||
---
|
||||
This is just a test post.
|
||||
`)},
|
||||
}
|
||||
|
||||
pr := sitereader.New(testFS)
|
||||
|
||||
post, err := pr.ReadPost("posts/test.md")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "Test Post Here", post.Meta.Title)
|
||||
assert.Equal(t, time.Date(2026, 2, 18, 19, 59, 0, 0, time.UTC), post.Meta.Date)
|
||||
assert.Equal(t, []string{"test", "example"}, post.Meta.Tags)
|
||||
assert.Equal(t, "This is just a test post.\n", post.Content)
|
||||
})
|
||||
|
||||
t.Run("without meta", func(t *testing.T) {
|
||||
testFS := fstest.MapFS{
|
||||
"posts/test.md": {Data: []byte(`---
|
||||
---
|
||||
This is just a test post.
|
||||
`)},
|
||||
}
|
||||
|
||||
pr := sitereader.New(testFS)
|
||||
|
||||
post, err := pr.ReadPost("posts/test.md")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, models.Meta{}, post.Meta)
|
||||
assert.Equal(t, "This is just a test post.\n", post.Content)
|
||||
})
|
||||
}
|
||||
|
||||
func TestProvider_ListPosts(t *testing.T) {
|
||||
testFS := fstest.MapFS{
|
||||
"posts/01-post1.md": {Data: []byte(`---
|
||||
id: 111
|
||||
date: 2026-02-18T19:59:00Z
|
||||
title: Test Post Here
|
||||
tags: [test, example]
|
||||
---
|
||||
This is just a test post.
|
||||
`)},
|
||||
"posts/02-post2.md": {Data: []byte(`---
|
||||
id: 222
|
||||
---
|
||||
This is just a test post.
|
||||
`)},
|
||||
}
|
||||
|
||||
pr := sitereader.New(testFS)
|
||||
|
||||
posts, err := pr.ListPosts()
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 2, len(posts))
|
||||
|
||||
assert.Equal(t, "111", posts[0].Meta.ID)
|
||||
assert.Equal(t, "222", posts[1].Meta.ID)
|
||||
}
|
||||
|
||||
func TestProvider_ReadSite(t *testing.T) {
|
||||
testFS := fstest.MapFS{
|
||||
"posts/01-post1.md": {Data: []byte(`---
|
||||
id: 111
|
||||
date: 2026-02-18T19:59:00Z
|
||||
title: Test Post Here
|
||||
tags: [test, example]
|
||||
---
|
||||
This is just a test post.
|
||||
`)},
|
||||
"posts/02-post2.md": {Data: []byte(`---
|
||||
id: 222
|
||||
---
|
||||
This is just a test post.
|
||||
`)},
|
||||
}
|
||||
|
||||
pr := sitereader.New(testFS)
|
||||
|
||||
sites, err := pr.ReadSite()
|
||||
assert.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 2, len(sites.Posts))
|
||||
|
||||
assert.Equal(t, "111", sites.Posts[0].Meta.ID)
|
||||
assert.Equal(t, "222", sites.Posts[1].Meta.ID)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue