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:
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)
+ })
+ }
+
+}