dotfiles

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit dac59a165ef6d5327a2131dd4b5e64ec26bf11d6 (tree)
parent 83dafe1d2cdf7de7df2295165c16d12ba5599e7f
Author: Motiejus Jakštys <desired.mta@gmail.com>
Date:   Fri,  5 Jun 2020 13:22:44 +0300

add page conversion

Diffstat:
Asrc/joplin2site/internal/page/page.go | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/joplin2site/internal/page/page_test.go | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 125 insertions(+), 0 deletions(-)

diff --git a/src/joplin2site/internal/page/page.go b/src/joplin2site/internal/page/page.go @@ -0,0 +1,63 @@ +package page + +import ( + "errors" + "fmt" + "strings" + "time" + + "github.com/motiejus/dotfiles/joplin2site/internal/note" + "gopkg.in/yaml.v2" +) + +// Page contains everything that's necessary to render a page. +type Page struct { + ID string + Title string + URL string + BodyHTML string + CreatedAt time.Time + PublishedAt time.Time +} + +type userMeta struct { + URL string `yaml:"url"` + PublishedAt time.Time `yaml:"published_at"` +} + +var ( + ErrMetaStart = errors.New("missing metadata opening tag") + ErrMetaEnd = errors.New("missing metadata closing tag") +) + +const ( + _metaPrefix = "<!--\n" + _metaSuffix = "\n-->\n" +) + +// FromNote converts a Joplin Note to Page +func FromNote(n note.Note) (Page, error) { + if !strings.HasPrefix(n.Body, _metaPrefix) { + return Page{}, ErrMetaStart + } + endIdx := strings.Index(n.Body, _metaSuffix) + if endIdx == -1 { + return Page{}, ErrMetaEnd + } + metaS := n.Body[len(_metaPrefix):endIdx] + body := n.Body[endIdx+len(_metaSuffix):] + + var meta userMeta + if err := yaml.UnmarshalStrict([]byte(metaS), &meta); err != nil { + return Page{}, fmt.Errorf("failed to unmarshal user's metadata: %w", err) + } + + return Page{ + ID: n.ID, + Title: n.Title, + URL: meta.URL, + BodyHTML: body, + CreatedAt: n.CreatedTime, + PublishedAt: meta.PublishedAt, + }, nil +} diff --git a/src/joplin2site/internal/page/page_test.go b/src/joplin2site/internal/page/page_test.go @@ -0,0 +1,62 @@ +package page + +import ( + "testing" + "time" + + "github.com/motiejus/dotfiles/joplin2site/internal/note" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFromNote(t *testing.T) { + tests := []struct { + name string + note note.Note + wantPage Page + wantErr string + }{ + { + name: "ok minimal", + note: note.Note{ + Body: `<!-- +url: /about/ +published_at: 2020-06-05T12:42:00Z +--> +This is body`, + }, + wantPage: Page{ + URL: "/about/", + BodyHTML: "This is body", + PublishedAt: time.Date(2020, 6, 5, 12, 42, 00, 0, time.UTC), + }, + }, + + { + name: "missing metadata opening tag", + note: note.Note{}, + wantErr: `missing metadata opening tag`, + }, + { + name: "missing metadata closing tag", + note: note.Note{ + Body: "<!--\n foo bar noend\n\n", + }, + wantErr: `missing metadata closing tag`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + page, err := FromNote(tt.note) + if tt.wantErr != "" { + assert.EqualError(t, err, tt.wantErr) + return + } + + require.NoError(t, err) + assert.Equal(t, tt.wantPage, page) + }) + } + +}