v2 #43
|
@ -10,6 +10,7 @@ import (
|
||||||
"path"
|
"path"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var userPath string
|
var userPath string
|
||||||
|
@ -37,6 +38,68 @@ var importCmd = &cobra.Command{
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// import config
|
||||||
|
bytes, err := os.ReadFile(path.Join(userPath, "meta/config.yml"))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
v1Config := importer.V1UserConfig{}
|
||||||
|
yaml.Unmarshal(bytes, &v1Config)
|
||||||
|
|
||||||
|
mes := []model.MeLinks{}
|
||||||
|
for _, me := range v1Config.Me {
|
||||||
|
mes = append(mes, model.MeLinks{
|
||||||
|
Name: me.Name,
|
||||||
|
Url: me.Url,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
lists := []model.EntryList{}
|
||||||
|
for _, list := range v1Config.Lists {
|
||||||
|
lists = append(lists, model.EntryList{
|
||||||
|
Id: list.Id,
|
||||||
|
Title: list.Title,
|
||||||
|
Include: importer.ConvertTypeList(list.Include, app.Registry),
|
||||||
|
ListType: list.ListType,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
headerMenu := []model.MenuItem{}
|
||||||
|
for _, item := range v1Config.HeaderMenu {
|
||||||
|
headerMenu = append(headerMenu, model.MenuItem{
|
||||||
|
Title: item.Title,
|
||||||
|
List: item.List,
|
||||||
|
Url: item.Url,
|
||||||
|
Post: item.Post,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
footerMenu := []model.MenuItem{}
|
||||||
|
for _, item := range v1Config.FooterMenu {
|
||||||
|
footerMenu = append(footerMenu, model.MenuItem{
|
||||||
|
Title: item.Title,
|
||||||
|
List: item.List,
|
||||||
|
Url: item.Url,
|
||||||
|
Post: item.Post,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
v2Config, _ := app.SiteConfigRepo.Get()
|
||||||
|
v2Config.Title = v1Config.Title
|
||||||
|
v2Config.SubTitle = v1Config.SubTitle
|
||||||
|
v2Config.HeaderColor = v1Config.HeaderColor
|
||||||
|
v2Config.AuthorName = v1Config.AuthorName
|
||||||
|
v2Config.Me = mes
|
||||||
|
v2Config.Lists = lists
|
||||||
|
v2Config.PrimaryListInclude = v1Config.PrimaryListInclude
|
||||||
|
v2Config.HeaderMenu = headerMenu
|
||||||
|
v2Config.FooterMenu = footerMenu
|
||||||
|
|
||||||
|
err = app.SiteConfigRepo.Update(v2Config)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
for _, post := range posts {
|
for _, post := range posts {
|
||||||
existing, _ := app.EntryService.FindById(post.Id)
|
existing, _ := app.EntryService.FindById(post.Id)
|
||||||
if existing != nil {
|
if existing != nil {
|
||||||
|
@ -72,9 +135,23 @@ var importCmd = &cobra.Command{
|
||||||
Content: post.Content,
|
Content: post.Content,
|
||||||
})
|
})
|
||||||
case "bookmark":
|
case "bookmark":
|
||||||
|
entry = &entrytypes.Bookmark{}
|
||||||
|
entry.SetID(post.Id)
|
||||||
|
entry.SetPublishedAt(&post.Meta.Date)
|
||||||
|
entry.SetMetaData(&entrytypes.BookmarkMetaData{
|
||||||
|
Url: post.Meta.Bookmark.Url,
|
||||||
|
Title: post.Meta.Bookmark.Text,
|
||||||
|
Content: post.Content,
|
||||||
|
})
|
||||||
case "reply":
|
case "reply":
|
||||||
|
entry = &entrytypes.Reply{}
|
||||||
|
entry.SetID(post.Id)
|
||||||
|
entry.SetPublishedAt(&post.Meta.Date)
|
||||||
|
entry.SetMetaData(&entrytypes.ReplyMetaData{
|
||||||
|
Url: post.Meta.Reply.Url,
|
||||||
|
Title: post.Meta.Reply.Text,
|
||||||
|
Content: post.Content,
|
||||||
|
})
|
||||||
case "photo":
|
case "photo":
|
||||||
entry = &entrytypes.Image{}
|
entry = &entrytypes.Image{}
|
||||||
entry.SetID(post.Id)
|
entry.SetID(post.Id)
|
||||||
|
|
|
@ -32,6 +32,8 @@ func App(db infra.Database) *web.WebApp {
|
||||||
registry.Register(&entrytypes.Page{})
|
registry.Register(&entrytypes.Page{})
|
||||||
registry.Register(&entrytypes.Recipe{})
|
registry.Register(&entrytypes.Recipe{})
|
||||||
registry.Register(&entrytypes.Note{})
|
registry.Register(&entrytypes.Note{})
|
||||||
|
registry.Register(&entrytypes.Bookmark{})
|
||||||
|
registry.Register(&entrytypes.Reply{})
|
||||||
|
|
||||||
entryRepo := infra.NewEntryRepository(db, registry)
|
entryRepo := infra.NewEntryRepository(db, registry)
|
||||||
binRepo := infra.NewBinaryFileRepo(db)
|
binRepo := infra.NewBinaryFileRepo(db)
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package entrytypes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"owl-blogs/domain/model"
|
||||||
|
"owl-blogs/render"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Bookmark struct {
|
||||||
|
model.EntryBase
|
||||||
|
meta BookmarkMetaData
|
||||||
|
}
|
||||||
|
|
||||||
|
type BookmarkMetaData struct {
|
||||||
|
Title string `owl:"inputType=text"`
|
||||||
|
Url string `owl:"inputType=text"`
|
||||||
|
Content string `owl:"inputType=text widget=textarea"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Bookmark) Title() string {
|
||||||
|
return e.meta.Title
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Bookmark) Content() model.EntryContent {
|
||||||
|
str, err := render.RenderTemplateToString("entry/Bookmark", e)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
return model.EntryContent(str)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Bookmark) MetaData() interface{} {
|
||||||
|
return &e.meta
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Bookmark) SetMetaData(metaData interface{}) {
|
||||||
|
e.meta = *metaData.(*BookmarkMetaData)
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package entrytypes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"owl-blogs/domain/model"
|
||||||
|
"owl-blogs/render"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Reply struct {
|
||||||
|
model.EntryBase
|
||||||
|
meta ReplyMetaData
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReplyMetaData struct {
|
||||||
|
Title string `owl:"inputType=text"`
|
||||||
|
Url string `owl:"inputType=text"`
|
||||||
|
Content string `owl:"inputType=text widget=textarea"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Reply) Title() string {
|
||||||
|
return "Re: " + e.meta.Title
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Reply) Content() model.EntryContent {
|
||||||
|
str, err := render.RenderTemplateToString("entry/Reply", e)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
return model.EntryContent(str)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Reply) MetaData() interface{} {
|
||||||
|
return &e.meta
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Reply) SetMetaData(metaData interface{}) {
|
||||||
|
e.meta = *metaData.(*ReplyMetaData)
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package importer
|
||||||
|
|
||||||
|
type V1UserConfig struct {
|
||||||
|
Title string `yaml:"title"`
|
||||||
|
SubTitle string `yaml:"subtitle"`
|
||||||
|
HeaderColor string `yaml:"header_color"`
|
||||||
|
AuthorName string `yaml:"author_name"`
|
||||||
|
Me []V1UserMe `yaml:"me"`
|
||||||
|
PassworHash string `yaml:"password_hash"`
|
||||||
|
Lists []V1PostList `yaml:"lists"`
|
||||||
|
PrimaryListInclude []string `yaml:"primary_list_include"`
|
||||||
|
HeaderMenu []V1MenuItem `yaml:"header_menu"`
|
||||||
|
FooterMenu []V1MenuItem `yaml:"footer_menu"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type V1UserMe struct {
|
||||||
|
Name string `yaml:"name"`
|
||||||
|
Url string `yaml:"url"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type V1PostList struct {
|
||||||
|
Id string `yaml:"id"`
|
||||||
|
Title string `yaml:"title"`
|
||||||
|
Include []string `yaml:"include"`
|
||||||
|
ListType string `yaml:"list_type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type V1MenuItem struct {
|
||||||
|
Title string `yaml:"title"`
|
||||||
|
List string `yaml:"list"`
|
||||||
|
Url string `yaml:"url"`
|
||||||
|
Post string `yaml:"post"`
|
||||||
|
}
|
|
@ -3,6 +3,8 @@ package importer
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"os"
|
"os"
|
||||||
|
"owl-blogs/app"
|
||||||
|
entrytypes "owl-blogs/entry_types"
|
||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -202,3 +204,35 @@ func fileExists(path string) bool {
|
||||||
_, err := os.Stat(path)
|
_, err := os.Stat(path)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ConvertTypeList(v1 []string, registry *app.EntryTypeRegistry) []string {
|
||||||
|
v2 := make([]string, len(v1))
|
||||||
|
for i, v1Type := range v1 {
|
||||||
|
switch v1Type {
|
||||||
|
case "article":
|
||||||
|
name, _ := registry.TypeName(&entrytypes.Article{})
|
||||||
|
v2[i] = name
|
||||||
|
case "bookmark":
|
||||||
|
name, _ := registry.TypeName(&entrytypes.Bookmark{})
|
||||||
|
v2[i] = name
|
||||||
|
case "reply":
|
||||||
|
name, _ := registry.TypeName(&entrytypes.Reply{})
|
||||||
|
v2[i] = name
|
||||||
|
case "photo":
|
||||||
|
name, _ := registry.TypeName(&entrytypes.Image{})
|
||||||
|
v2[i] = name
|
||||||
|
case "note":
|
||||||
|
name, _ := registry.TypeName(&entrytypes.Note{})
|
||||||
|
v2[i] = name
|
||||||
|
case "recipe":
|
||||||
|
name, _ := registry.TypeName(&entrytypes.Recipe{})
|
||||||
|
v2[i] = name
|
||||||
|
case "page":
|
||||||
|
name, _ := registry.TypeName(&entrytypes.Page{})
|
||||||
|
v2[i] = name
|
||||||
|
default:
|
||||||
|
v2[i] = v1Type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v2
|
||||||
|
}
|
||||||
|
|
|
@ -85,6 +85,15 @@
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<nav>
|
<nav>
|
||||||
<ul>
|
<ul>
|
||||||
|
{{ range $link := .SiteConfig.HeaderMenu }}
|
||||||
|
{{ if $link.List }}
|
||||||
|
<li><a href="/lists/{{ $link.List }}">{{ $link.Title }}</a></li>
|
||||||
|
{{ else if $link.Post }}
|
||||||
|
<li><a href="/posts/{{ $link.Post }}">{{ $link.Title }}</a></li>
|
||||||
|
{{ else }}
|
||||||
|
<li><a href="{{ $link.Url }}">{{ $link.Title }}</a></li>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
@ -93,7 +102,19 @@
|
||||||
{{template "main" .Data}}
|
{{template "main" .Data}}
|
||||||
</main>
|
</main>
|
||||||
<footer class="container">
|
<footer class="container">
|
||||||
Powered by <a href='https://golang.org/'>Go</a>
|
<nav>
|
||||||
|
<ul>
|
||||||
|
{{ range $link := .SiteConfig.FooterMenu }}
|
||||||
|
{{ if $link.List }}
|
||||||
|
<li><a href="/lists/{{ $link.List }}">{{ $link.Title }}</a></li>
|
||||||
|
{{ else if $link.Post }}
|
||||||
|
<li><a href="/posts/{{ $link.Post }}">{{ $link.Title }}</a></li>
|
||||||
|
{{ else }}
|
||||||
|
<li><a href="{{ $link.Url }}">{{ $link.Title }}</a></li>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Bookmark: <a href="{{.MetaData.Url}}">{{.MetaData.Url}}</a>
|
||||||
|
|
||||||
|
{{.MetaData.Content | markdown }}
|
|
@ -0,0 +1,3 @@
|
||||||
|
Reply to: <a href="{{.MetaData.Url}}">{{.MetaData.Url}}</a>
|
||||||
|
|
||||||
|
{{.MetaData.Content | markdown }}
|
Loading…
Reference in New Issue