Commit 63b93d9
Eric Bower
·
2026-01-03 23:35:04 -0500 EST
parent bb7b4f2
feat(prose): lists are back bby
8 files changed,
+253,
-58
+114,
-46
| ... | ... | @@ -90,6 +90,7 @@ type PostPageData struct { | |
| 90 | 90 | Diff template.HTML | |
| 91 | 91 | UpdatedAtISO string | |
| 92 | 92 | UpdatedAt string | |
| 93 | + | List *shared.ListParsedText | |
| 93 | 94 | } | |
| 94 | 95 | ||
| 95 | 96 | type HeaderTxt struct { |
| ... | ... | @@ -427,22 +428,43 @@ func postHandler(w http.ResponseWriter, r *http.Request) { | |
| 427 | 428 | post, err := dbpool.FindPostWithSlug(slug, user.ID, cfg.Space) | |
| 428 | 429 | if err == nil { | |
| 429 | 430 | logger.Info("post found", "id", post.ID, "filename", post.FileSize) | |
| 430 | - | parsedText, err := shared.ParseText(post.Text) | |
| 431 | - | if err != nil { | |
| 432 | - | logger.Error("find post with slug", "err", err.Error()) | |
| 433 | - | } | |
| 431 | + | ext := filepath.Ext(post.Filename) | |
| 432 | + | contents := template.HTML("") | |
| 433 | + | tags := []string{} | |
| 434 | + | unlisted := false | |
| 435 | + | var list *shared.ListParsedText | |
| 434 | 436 | ||
| 435 | - | if parsedText.Image != "" { | |
| 436 | - | ogImage = parsedText.Image | |
| 437 | - | } | |
| 437 | + | switch ext { | |
| 438 | + | case ".lxt": | |
| 439 | + | list = shared.ListParseText(post.Text) | |
| 438 | 440 | ||
| 439 | - | if parsedText.ImageCard != "" { | |
| 440 | - | ogImageCard = parsedText.ImageCard | |
| 441 | - | } | |
| 441 | + | tags = list.Tags | |
| 442 | + | if list.Image != "" { | |
| 443 | + | ogImage = list.Image | |
| 444 | + | } | |
| 445 | + | if list.ImageCard != "" { | |
| 446 | + | ogImageCard = list.ImageCard | |
| 447 | + | } | |
| 448 | + | if post.Hidden || post.PublishAt.After(time.Now()) { | |
| 449 | + | unlisted = true | |
| 450 | + | } | |
| 451 | + | case ".md": | |
| 452 | + | parsedText, err := shared.ParseText(post.Text) | |
| 453 | + | if err != nil { | |
| 454 | + | logger.Error("could not parse md text", "err", err.Error()) | |
| 455 | + | } | |
| 442 | 456 | ||
| 443 | - | unlisted := false | |
| 444 | - | if post.Hidden || post.PublishAt.After(time.Now()) { | |
| 445 | - | unlisted = true | |
| 457 | + | tags = parsedText.Tags | |
| 458 | + | if parsedText.Image != "" { | |
| 459 | + | ogImage = parsedText.Image | |
| 460 | + | } | |
| 461 | + | if parsedText.ImageCard != "" { | |
| 462 | + | ogImageCard = parsedText.ImageCard | |
| 463 | + | } | |
| 464 | + | if post.Hidden || post.PublishAt.After(time.Now()) { | |
| 465 | + | unlisted = true | |
| 466 | + | } | |
| 467 | + | contents = template.HTML(parsedText.Html) | |
| 446 | 468 | } | |
| 447 | 469 | ||
| 448 | 470 | data = PostPageData{ |
| ... | ... | @@ -459,10 +481,10 @@ func postHandler(w http.ResponseWriter, r *http.Request) { | |
| 459 | 481 | UpdatedAtISO: post.UpdatedAt.Format(time.RFC3339), | |
| 460 | 482 | Username: username, | |
| 461 | 483 | BlogName: blogName, | |
| 462 | - | Contents: template.HTML(parsedText.Html), | |
| 484 | + | Contents: contents, | |
| 463 | 485 | HasCSS: hasCSS, | |
| 464 | 486 | CssURL: template.URL(cfg.CssURL(username)), | |
| 465 | - | Tags: parsedText.Tags, | |
| 487 | + | Tags: tags, | |
| 466 | 488 | Image: template.URL(ogImage), | |
| 467 | 489 | ImageCard: ogImageCard, | |
| 468 | 490 | Favicon: template.URL(favicon), |
| ... | ... | @@ -470,6 +492,7 @@ func postHandler(w http.ResponseWriter, r *http.Request) { | |
| 470 | 492 | Unlisted: unlisted, | |
| 471 | 493 | Diff: template.HTML(diff), | |
| 472 | 494 | WithStyles: withStyles, | |
| 495 | + | List: list, | |
| 473 | 496 | } | |
| 474 | 497 | } else { | |
| 475 | 498 | logger.Info("post not found") |
| ... | ... | @@ -522,6 +545,7 @@ func postHandler(w http.ResponseWriter, r *http.Request) { | |
| 522 | 545 | } | |
| 523 | 546 | ||
| 524 | 547 | ts, err := shared.RenderTemplate(cfg, []string{ | |
| 548 | + | cfg.StaticPath("html/list.partial.tmpl"), | |
| 525 | 549 | cfg.StaticPath("html/post.page.tmpl"), | |
| 526 | 550 | }) | |
| 527 | 551 |
| ... | ... | @@ -651,7 +675,10 @@ func rssBlogHandler(w http.ResponseWriter, r *http.Request) { | |
| 651 | 675 | return | |
| 652 | 676 | } | |
| 653 | 677 | ||
| 654 | - | ts, err := template.ParseFiles(cfg.StaticPath("html/rss.page.tmpl")) | |
| 678 | + | ts, err := template.New("rss.page.tmpl").Funcs(shared.FuncMap).ParseFiles( | |
| 679 | + | cfg.StaticPath("html/list.partial.tmpl"), | |
| 680 | + | cfg.StaticPath("html/rss.page.tmpl"), | |
| 681 | + | ) | |
| 655 | 682 | if err != nil { | |
| 656 | 683 | logger.Error("template parse file", "err", err.Error()) | |
| 657 | 684 | http.Error(w, err.Error(), http.StatusInternalServerError) |
| ... | ... | @@ -700,27 +727,48 @@ func rssBlogHandler(w http.ResponseWriter, r *http.Request) { | |
| 700 | 727 | if slices.Contains(cfg.HiddenPosts, post.Filename) { | |
| 701 | 728 | continue | |
| 702 | 729 | } | |
| 703 | - | parsed, err := shared.ParseText(post.Text) | |
| 704 | - | if err != nil { | |
| 705 | - | logger.Error("parse post text", "err", err.Error()) | |
| 706 | - | } | |
| 707 | 730 | ||
| 708 | - | footer, err := dbpool.FindPostWithFilename("_footer.md", user.ID, cfg.Space) | |
| 709 | - | var footerHTML string | |
| 710 | - | if err == nil { | |
| 711 | - | footerParsed, err := shared.ParseText(footer.Text) | |
| 731 | + | content := "" | |
| 732 | + | ext := filepath.Ext(post.Filename) | |
| 733 | + | fmt.Println("HERE", post.Filename, ext) | |
| 734 | + | switch ext { | |
| 735 | + | case ".md": | |
| 736 | + | parsed, err := shared.ParseText(post.Text) | |
| 712 | 737 | if err != nil { | |
| 713 | - | logger.Error("parse footer text", "err", err.Error()) | |
| 738 | + | logger.Error("parse post text", "err", err.Error()) | |
| 714 | 739 | } | |
| 715 | - | footerHTML = footerParsed.Html | |
| 716 | - | } | |
| 717 | 740 | ||
| 718 | - | var tpl bytes.Buffer | |
| 719 | - | data := &PostPageData{ | |
| 720 | - | Contents: template.HTML(parsed.Html + footerHTML), | |
| 721 | - | } | |
| 722 | - | if err := ts.Execute(&tpl, data); err != nil { | |
| 723 | - | continue | |
| 741 | + | footer, err := dbpool.FindPostWithFilename("_footer.md", user.ID, cfg.Space) | |
| 742 | + | var footerHTML string | |
| 743 | + | if err == nil { | |
| 744 | + | footerParsed, err := shared.ParseText(footer.Text) | |
| 745 | + | if err != nil { | |
| 746 | + | logger.Error("parse footer text", "err", err.Error()) | |
| 747 | + | } | |
| 748 | + | footerHTML = footerParsed.Html | |
| 749 | + | } | |
| 750 | + | ||
| 751 | + | var tpl bytes.Buffer | |
| 752 | + | data := &PostPageData{ | |
| 753 | + | Contents: template.HTML(parsed.Html + footerHTML), | |
| 754 | + | } | |
| 755 | + | if err := ts.Execute(&tpl, data); err != nil { | |
| 756 | + | logger.Error("md template", "err", err) | |
| 757 | + | continue | |
| 758 | + | } | |
| 759 | + | content = tpl.String() | |
| 760 | + | case ".lxt": | |
| 761 | + | parsed := shared.ListParseText(post.Text) | |
| 762 | + | var tpl bytes.Buffer | |
| 763 | + | data := &PostPageData{ | |
| 764 | + | List: parsed, | |
| 765 | + | } | |
| 766 | + | if err := ts.Execute(&tpl, data); err != nil { | |
| 767 | + | logger.Error("lxt template", "err", err) | |
| 768 | + | continue | |
| 769 | + | } | |
| 770 | + | content = tpl.String() | |
| 771 | + | ||
| 724 | 772 | } | |
| 725 | 773 | ||
| 726 | 774 | realUrl := cfg.FullPostURL(curl, post.Username, post.Slug) |
| ... | ... | @@ -730,7 +778,7 @@ func rssBlogHandler(w http.ResponseWriter, r *http.Request) { | |
| 730 | 778 | Id: feedId, | |
| 731 | 779 | Title: utils.FilenameToTitle(post.Filename, post.Title), | |
| 732 | 780 | Link: &feeds.Link{Href: realUrl}, | |
| 733 | - | Content: tpl.String(), | |
| 781 | + | Content: content, | |
| 734 | 782 | Updated: *post.PublishAt, | |
| 735 | 783 | Created: *post.PublishAt, | |
| 736 | 784 | Description: post.Description, |
| ... | ... | @@ -769,7 +817,10 @@ func rssHandler(w http.ResponseWriter, r *http.Request) { | |
| 769 | 817 | return | |
| 770 | 818 | } | |
| 771 | 819 | ||
| 772 | - | ts, err := template.ParseFiles(cfg.StaticPath("html/rss.page.tmpl")) | |
| 820 | + | ts, err := template.New("rss.page.tmpl").Funcs(shared.FuncMap).ParseFiles( | |
| 821 | + | cfg.StaticPath("html/list.partial.tmpl"), | |
| 822 | + | cfg.StaticPath("html/rss.page.tmpl"), | |
| 823 | + | ) | |
| 773 | 824 | if err != nil { | |
| 774 | 825 | logger.Error("template parse file", "err", err.Error()) | |
| 775 | 826 | http.Error(w, err.Error(), http.StatusInternalServerError) |
| ... | ... | @@ -788,17 +839,34 @@ func rssHandler(w http.ResponseWriter, r *http.Request) { | |
| 788 | 839 | ||
| 789 | 840 | var feedItems []*feeds.Item | |
| 790 | 841 | for _, post := range pager.Data { | |
| 791 | - | parsed, err := shared.ParseText(post.Text) | |
| 792 | - | if err != nil { | |
| 793 | - | logger.Error(err.Error()) | |
| 794 | - | } | |
| 842 | + | content := "" | |
| 843 | + | ext := filepath.Ext(post.Filename) | |
| 844 | + | switch ext { | |
| 845 | + | case ".md": | |
| 846 | + | parsed, err := shared.ParseText(post.Text) | |
| 847 | + | if err != nil { | |
| 848 | + | logger.Error(err.Error()) | |
| 849 | + | } | |
| 850 | + | ||
| 851 | + | var tpl bytes.Buffer | |
| 852 | + | data := &PostPageData{ | |
| 853 | + | Contents: template.HTML(parsed.Html), | |
| 854 | + | } | |
| 855 | + | if err := ts.Execute(&tpl, data); err != nil { | |
| 856 | + | continue | |
| 857 | + | } | |
| 858 | + | content = tpl.String() | |
| 859 | + | case ".lxt": | |
| 860 | + | parsed := shared.ListParseText(post.Text) | |
| 861 | + | var tpl bytes.Buffer | |
| 862 | + | data := &PostPageData{ | |
| 863 | + | List: parsed, | |
| 864 | + | } | |
| 865 | + | if err := ts.Execute(&tpl, data); err != nil { | |
| 866 | + | continue | |
| 867 | + | } | |
| 868 | + | content = tpl.String() | |
| 795 | 869 | ||
| 796 | - | var tpl bytes.Buffer | |
| 797 | - | data := &PostPageData{ | |
| 798 | - | Contents: template.HTML(parsed.Html), | |
| 799 | - | } | |
| 800 | - | if err := ts.Execute(&tpl, data); err != nil { | |
| 801 | - | continue | |
| 802 | 870 | } | |
| 803 | 871 | ||
| 804 | 872 | realUrl := cfg.FullPostURL(curl, post.Username, post.Slug) |
| ... | ... | @@ -810,7 +878,7 @@ func rssHandler(w http.ResponseWriter, r *http.Request) { | |
| 810 | 878 | Id: realUrl, | |
| 811 | 879 | Title: post.Title, | |
| 812 | 880 | Link: &feeds.Link{Href: realUrl}, | |
| 813 | - | Content: tpl.String(), | |
| 881 | + | Content: content, | |
| 814 | 882 | Created: *post.PublishAt, | |
| 815 | 883 | Updated: *post.UpdatedAt, | |
| 816 | 884 | Description: post.Description, |
+1,
-0
| ... | ... | @@ -28,6 +28,7 @@ func NewConfigSite(service string) *shared.ConfigSite { | |
| 28 | 28 | Space: "prose", | |
| 29 | 29 | AllowedExt: []string{ | |
| 30 | 30 | ".md", | |
| 31 | + | ".lxt", | |
| 31 | 32 | ".jpg", | |
| 32 | 33 | ".jpeg", | |
| 33 | 34 | ".png", |
+51,
-0
| ... | ... | @@ -0,0 +1,51 @@ | |
| 1 | + | {{define "list"}} | |
| 2 | + | {{$indent := 0}} | |
| 3 | + | {{$mod := 0}} | |
| 4 | + | <ul style="list-style-type: {{.ListType}};"> | |
| 5 | + | {{range .Items}} | |
| 6 | + | {{if lt $indent .Indent}} | |
| 7 | + | <ul> | |
| 8 | + | {{else if gt $indent .Indent}} | |
| 9 | + | ||
| 10 | + | {{$mod = minus $indent .Indent}} | |
| 11 | + | {{range $y := intRange 1 $mod}} | |
| 12 | + | </li></ul> | |
| 13 | + | {{end}} | |
| 14 | + | ||
| 15 | + | {{else}} | |
| 16 | + | </li> | |
| 17 | + | {{end}} | |
| 18 | + | {{$indent = .Indent}} | |
| 19 | + | ||
| 20 | + | {{if .IsText}} | |
| 21 | + | {{if .Value}} | |
| 22 | + | <li>{{.Value}} | |
| 23 | + | {{end}} | |
| 24 | + | {{end}} | |
| 25 | + | ||
| 26 | + | {{if .IsURL}} | |
| 27 | + | <li><a href="{{.URL}}">{{.Value}}</a> | |
| 28 | + | {{end}} | |
| 29 | + | ||
| 30 | + | {{if .IsImg}} | |
| 31 | + | <li><img src="{{.URL}}" alt="{{.Value}}" /> | |
| 32 | + | {{end}} | |
| 33 | + | ||
| 34 | + | {{if .IsBlock}} | |
| 35 | + | <li><blockquote>{{.Value}}</blockquote> | |
| 36 | + | {{end}} | |
| 37 | + | ||
| 38 | + | {{if .IsHeaderOne}} | |
| 39 | + | </ul><h2 class="text-xl font-bold">{{.Value}}</h2><ul style="list-style-type: {{$.ListType}};"> | |
| 40 | + | {{end}} | |
| 41 | + | ||
| 42 | + | {{if .IsHeaderTwo}} | |
| 43 | + | </ul><h3 class="text-lg font-bold">{{.Value}}</h3><ul style="list-style-type: {{$.ListType}};"> | |
| 44 | + | {{end}} | |
| 45 | + | ||
| 46 | + | {{if .IsPre}} | |
| 47 | + | <li><pre>{{.Value}}</pre> | |
| 48 | + | {{end}} | |
| 49 | + | {{end}} | |
| 50 | + | </ul> | |
| 51 | + | {{end}} |
+5,
-1
| ... | ... | @@ -65,7 +65,11 @@ | |
| 65 | 65 | </header> | |
| 66 | 66 | <main> | |
| 67 | 67 | <article class="md"> | |
| 68 | - | {{.Contents}} | |
| 68 | + | {{if .List}} | |
| 69 | + | {{template "list" .List}} | |
| 70 | + | {{else}} | |
| 71 | + | {{.Contents}} | |
| 72 | + | {{end}} | |
| 69 | 73 | ||
| 70 | 74 | <div class="tags"> | |
| 71 | 75 | {{range .Tags}} |
+5,
-1
| ... | ... | @@ -1 +1,5 @@ | |
| 1 | - | {{.Contents}} | |
| 1 | + | {{if .List}} | |
| 2 | + | {{template "list" .List}} | |
| 3 | + | {{else}} | |
| 4 | + | {{.Contents}} | |
| 5 | + | {{end}} |
+43,
-2
| ... | ... | @@ -2,6 +2,7 @@ package prose | |
| 2 | 2 | ||
| 3 | 3 | import ( | |
| 4 | 4 | "fmt" | |
| 5 | + | "path/filepath" | |
| 5 | 6 | "strings" | |
| 6 | 7 | ||
| 7 | 8 | "slices" |
| ... | ... | @@ -62,7 +63,28 @@ func (p *MarkdownHooks) FileValidate(s *pssh.SSHServerConnSession, data *filehan | |
| 62 | 63 | return true, nil | |
| 63 | 64 | } | |
| 64 | 65 | ||
| 65 | - | func (p *MarkdownHooks) FileMeta(s *pssh.SSHServerConnSession, data *filehandlers.PostMetaData) error { | |
| 66 | + | func (p *MarkdownHooks) metaLxt(data *filehandlers.PostMetaData) error { | |
| 67 | + | parsedText := shared.ListParseText(data.Text) | |
| 68 | + | ||
| 69 | + | if parsedText.Title == "" { | |
| 70 | + | data.Title = utils.ToUpper(data.Slug) | |
| 71 | + | } else { | |
| 72 | + | data.Title = parsedText.Title | |
| 73 | + | } | |
| 74 | + | ||
| 75 | + | data.Aliases = parsedText.Aliases | |
| 76 | + | data.Tags = parsedText.Tags | |
| 77 | + | data.Description = parsedText.Description | |
| 78 | + | ||
| 79 | + | if parsedText.PublishAt != nil && !parsedText.PublishAt.IsZero() { | |
| 80 | + | data.PublishAt = parsedText.PublishAt | |
| 81 | + | } | |
| 82 | + | data.Hidden = parsedText.Hidden | |
| 83 | + | ||
| 84 | + | return nil | |
| 85 | + | } | |
| 86 | + | ||
| 87 | + | func (p *MarkdownHooks) metaMd(data *filehandlers.PostMetaData) error { | |
| 66 | 88 | parsedText, err := shared.ParseText(data.Text) | |
| 67 | 89 | if err != nil { | |
| 68 | 90 | return fmt.Errorf("%s: %w", data.Filename, err) |
| ... | ... | @@ -81,9 +103,28 @@ func (p *MarkdownHooks) FileMeta(s *pssh.SSHServerConnSession, data *filehandler | |
| 81 | 103 | if parsedText.PublishAt != nil && !parsedText.PublishAt.IsZero() { | |
| 82 | 104 | data.PublishAt = parsedText.PublishAt | |
| 83 | 105 | } | |
| 106 | + | data.Hidden = parsedText.Hidden | |
| 107 | + | ||
| 108 | + | return nil | |
| 109 | + | } | |
| 110 | + | ||
| 111 | + | func (p *MarkdownHooks) FileMeta(s *pssh.SSHServerConnSession, data *filehandlers.PostMetaData) error { | |
| 112 | + | ext := filepath.Ext(data.Filename) | |
| 113 | + | switch ext { | |
| 114 | + | case ".lxt": | |
| 115 | + | err := p.metaLxt(data) | |
| 116 | + | if err != nil { | |
| 117 | + | return fmt.Errorf("%s: %w", data.Filename, err) | |
| 118 | + | } | |
| 119 | + | case ".md": | |
| 120 | + | err := p.metaMd(data) | |
| 121 | + | if err != nil { | |
| 122 | + | return fmt.Errorf("%s: %w", data.Filename, err) | |
| 123 | + | } | |
| 124 | + | } | |
| 84 | 125 | ||
| 85 | 126 | isHiddenFilename := slices.Contains(p.Cfg.HiddenPosts, data.Filename) | |
| 86 | - | data.Hidden = parsedText.Hidden || isHiddenFilename | |
| 127 | + | data.Hidden = data.Hidden || isHiddenFilename | |
| 87 | 128 | ||
| 88 | 129 | return nil | |
| 89 | 130 | } |
+1,
-0
| ... | ... | @@ -55,6 +55,7 @@ func StartSshServer() { | |
| 55 | 55 | ".md": filehandlers.NewScpPostHandler(dbh, cfg, hooks), | |
| 56 | 56 | ".txt": filehandlers.NewScpPostHandler(dbh, cfg, hooks), | |
| 57 | 57 | ".css": filehandlers.NewScpPostHandler(dbh, cfg, hooks), | |
| 58 | + | ".lxt": filehandlers.NewScpPostHandler(dbh, cfg, hooks), | |
| 58 | 59 | "fallback": uploadimgs.NewUploadImgHandler(dbh, cfg, st), | |
| 59 | 60 | } | |
| 60 | 61 | handler := filehandlers.NewFileHandlerRouter(cfg, dbh, fileMap) |
| ... | ... | @@ -34,12 +34,19 @@ type ListItem struct { | |
| 34 | 34 | } | |
| 35 | 35 | ||
| 36 | 36 | type ListMetaData struct { | |
| 37 | - | PublishAt *time.Time | |
| 38 | - | Title string | |
| 39 | - | Description string | |
| 40 | - | Layout string | |
| 41 | - | Tags []string | |
| 42 | - | ListType string // https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type | |
| 37 | + | // prose | |
| 38 | + | Aliases []string | |
| 39 | + | Description string | |
| 40 | + | Hidden bool | |
| 41 | + | Image string | |
| 42 | + | ImageCard string | |
| 43 | + | Layout string | |
| 44 | + | ListType string // https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type | |
| 45 | + | PublishAt *time.Time | |
| 46 | + | Tags []string | |
| 47 | + | Title string | |
| 48 | + | ||
| 49 | + | // feeds | |
| 43 | 50 | DigestInterval string | |
| 44 | 51 | Cron string | |
| 45 | 52 | Email string |
| ... | ... | @@ -101,14 +108,30 @@ func TokenToMetaField(meta *ListMetaData, token *SplitToken) error { | |
| 101 | 108 | meta.Title = token.Value | |
| 102 | 109 | case "description": | |
| 103 | 110 | meta.Description = token.Value | |
| 111 | + | case "image": | |
| 112 | + | meta.Image = token.Value | |
| 113 | + | case "image_card": | |
| 114 | + | meta.ImageCard = token.Value | |
| 104 | 115 | case "list_type": | |
| 105 | 116 | meta.ListType = token.Value | |
| 117 | + | case "hidden": | |
| 118 | + | if token.Value == "true" { | |
| 119 | + | meta.Hidden = true | |
| 120 | + | } else { | |
| 121 | + | meta.Hidden = false | |
| 122 | + | } | |
| 106 | 123 | case "tags": | |
| 107 | 124 | tags := strings.Split(token.Value, ",") | |
| 108 | 125 | meta.Tags = make([]string, 0) | |
| 109 | 126 | for _, tag := range tags { | |
| 110 | 127 | meta.Tags = append(meta.Tags, strings.TrimSpace(tag)) | |
| 111 | 128 | } | |
| 129 | + | case "aliases": | |
| 130 | + | aliases := strings.Split(token.Value, ",") | |
| 131 | + | meta.Aliases = make([]string, 0) | |
| 132 | + | for _, alias := range aliases { | |
| 133 | + | meta.Aliases = append(meta.Aliases, strings.TrimSpace(alias)) | |
| 134 | + | } | |
| 112 | 135 | case "layout": | |
| 113 | 136 | meta.Layout = token.Value | |
| 114 | 137 | case "digest_interval": |
| ... | ... | @@ -206,10 +229,12 @@ func ListParseText(text string) *ListParsedText { | |
| 206 | 229 | textItems := SplitByNewline(text) | |
| 207 | 230 | items := []*ListItem{} | |
| 208 | 231 | meta := ListMetaData{ | |
| 232 | + | Aliases: []string{}, | |
| 233 | + | InlineContent: true, | |
| 234 | + | Layout: "default", | |
| 209 | 235 | ListType: "disc", | |
| 236 | + | PublishAt: &time.Time{}, | |
| 210 | 237 | Tags: []string{}, | |
| 211 | - | Layout: "default", | |
| 212 | - | InlineContent: true, | |
| 213 | 238 | } | |
| 214 | 239 | pre := false | |
| 215 | 240 | skip := false |