From 60bff6356c749a76ca8a6326f58d8daf0131c0d3 Mon Sep 17 00:00:00 2001 From: ngn Date: Fri, 23 Aug 2024 14:11:48 +0300 Subject: [PATCH] new: add feeds to news page --- Makefile | 6 ++- go.mod | 1 + go.sum | 12 +++-- main.go | 3 ++ public/download.css | 17 +++++-- public/news.css | 36 +++++++++++++ public/post.css | 14 ++++- routes/news.go | 104 ++++++++++++++++++++++++++++++++++++-- templates/configs.html | 4 +- templates/download.html | 16 ++---- templates/error.html | 6 +-- templates/index.html | 4 +- templates/news.html | 14 +++-- templates/parts/head.html | 3 ++ templates/post.html | 9 ++-- 15 files changed, 204 insertions(+), 45 deletions(-) create mode 100644 templates/parts/head.html diff --git a/Makefile b/Makefile index b088f1a..51bb1b0 100644 --- a/Makefile +++ b/Makefile @@ -6,4 +6,8 @@ website: */*.go *.go format: gofmt -s -w . -.PHONY: format +update: + go get -u + go mod tidy + +.PHONY: format update diff --git a/go.mod b/go.mod index 95ce8a3..601393d 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/bigkevmcd/go-configparser v0.0.0-20240808124832-fc81059ea0bd github.com/gofiber/fiber/v2 v2.52.5 github.com/gofiber/template/html/v2 v2.1.2 + github.com/gorilla/feeds v1.2.0 github.com/russross/blackfriday/v2 v2.1.0 ) diff --git a/go.sum b/go.sum index 882f54b..6d014ef 100644 --- a/go.sum +++ b/go.sum @@ -14,12 +14,14 @@ github.com/gofiber/utils v1.1.0 h1:vdEBpn7AzIUJRhe+CiTOJdUcTg4Q9RK+pEa0KPbLdrM= github.com/gofiber/utils v1.1.0/go.mod h1:poZpsnhBykfnY1Mc0KeEa6mSHrS3dV0+oBWyeQmb2e0= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/feeds v1.2.0 h1:O6pBiXJ5JHhPvqy53NsjKOThq+dNFm8+DFrxBEdzSCc= +github.com/gorilla/feeds v1.2.0/go.mod h1:WMib8uJP3BbY+X8Szd1rA5Pzhdfh+HCCAYT2z7Fza6Y= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -32,6 +34,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/main.go b/main.go index 2bded5c..92a06d6 100644 --- a/main.go +++ b/main.go @@ -43,6 +43,9 @@ func main() { app.Get("/download", routes.GET_Download) app.Get("/news", routes.GET_News) + app.Get("/news/feed.atom", routes.GET_NewsFeed) + app.Get("/news/feed.rss", routes.GET_NewsFeed) + app.Get("/news/feed.json", routes.GET_NewsFeed) app.Get("/news/:id", routes.GET_New) app.Get("/wiki", routes.GET_Wiki) diff --git a/public/download.css b/public/download.css index 7349978..48f2a80 100644 --- a/public/download.css +++ b/public/download.css @@ -18,20 +18,27 @@ .downloads { display: flex; flex-direction: row; - gap: 5px; + gap: 8px; +} + +.downloads a:first-child { + border-right: solid 1px var(--bright-third); + padding-right: 8px; } .entry h1 { color: var(--bright-main); + font-weight: 900; font-size: 20px; } -.entry a, .entry p { - color: var(--bright-main); - font-size: 20px; +.entry a { + color: var(--bright-second); text-decoration: none; + font-weight: 100; + font-size: 20px; } .entry a:hover { - color: var(--bright-second); + text-decoration: underline; } diff --git a/public/news.css b/public/news.css index d5b1c31..b6d51e7 100644 --- a/public/news.css +++ b/public/news.css @@ -11,6 +11,42 @@ main { } } +.feed-menu { + display: flex; + justify-content: center; + flex-direction: row; + align-items: center; + margin-bottom: 6px; + color: white; + gap: 10px; +} + +.feed-menu p { + color: var(--bright-main); + border-right: solid 1px var(--bright-third); + padding-right: 8px; + font-weight: 900; + font-size: 17px; +} + +.feed-menu .feeds { + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; +} + +.feed-menu .feeds a { + font-weight: 100; + font-size: 16px; + color: var(--bright-second); + text-decoration: none; +} + +.feed-menu .feeds a:hover { + text-decoration: underline; +} + .small { display: flex; flex-direction: row; diff --git a/public/post.css b/public/post.css index 6d191f9..1e85843 100644 --- a/public/post.css +++ b/public/post.css @@ -1,5 +1,17 @@ .subtext { + display: flex; + flex-direction: row; + align-items: center; + margin: 12px 0 15px 0; + gap: 8px; +} + +.subtext p { font-size: 18px; color: var(--bright-main); - margin: 5px 0 15px 0; +} + +.subtext p:first-child { + border-right: solid 1px var(--bright-third); + padding-right: 8px; } diff --git a/routes/news.go b/routes/news.go index 889cf54..77de838 100644 --- a/routes/news.go +++ b/routes/news.go @@ -1,18 +1,25 @@ package routes import ( + "fmt" + "path" "sort" + "time" "git.matterlinux.xyz/Matter/website/lib" "git.matterlinux.xyz/Matter/website/log" "github.com/gofiber/fiber/v2" + "github.com/gorilla/feeds" ) -func GET_News(c *fiber.Ctx) error { - contents, err := lib.ListContent("news") - if err != nil { - log.Error("ListContent failed: %s", err.Error()) - return lib.RenderError(c, 500) +func GetContent() ([]lib.Content, error) { + var ( + contents []lib.Content + err error + ) + + if contents, err = lib.ListContent("news"); err != nil { + return nil, err } sort.Slice(contents, func(i, j int) bool { @@ -31,6 +38,17 @@ func GET_News(c *fiber.Ctx) error { return time1.After(time2) }) + return contents, nil +} + +func GET_News(c *fiber.Ctx) error { + contents, err := GetContent() + + if err != nil { + log.Error("GetContent failed: %s", err.Error()) + return lib.RenderError(c, 500) + } + return c.Render("news", fiber.Map{ "news": contents, }) @@ -67,3 +85,79 @@ func GET_New(c *fiber.Ctx) error { return lib.RenderError(c, 404) } + +func GET_NewsFeed(c *fiber.Ctx) error { + var ( + feed_type string + feed *feeds.Feed + contents []lib.Content + res string + err error + ) + + feed_type = path.Base(c.Path()) + + if contents, err = GetContent(); err != nil { + log.Error("GetContent failed: %s", err.Error()) + return lib.RenderError(c, 500) + } + + feed = &feeds.Feed{ + Title: "MatterLinux | News", + Link: &feeds.Link{Href: "https://matterlinux.xyz/news"}, // lets hardcode this for now + Description: "News regarding the MatterLinux project", + Created: time.Now(), + } + + feed.Items = []*feeds.Item{} + + for _, con := range contents { + parsed, err := time.Parse("02/01/06", con.Date) + + if err != nil { + log.Error("Failed to parse post time (%s): %s", con.ID, err.Error()) + return lib.RenderError(c, 500) + } + + feed.Items = append(feed.Items, &feeds.Item{ + Id: con.ID, + Title: con.Title, + Link: &feeds.Link{Href: fmt.Sprintf("https://matterlinux.xyz/news/%s", con.ID)}, + Author: &feeds.Author{Name: con.Author}, + Created: parsed, + Content: con.Md, + }) + } + + switch feed_type { + case "feed.atom": + if res, err = feed.ToAtom(); err != nil { + log.Error("Failed to convert feed to atom: %s", err.Error()) + return lib.RenderError(c, 500) + } + + c.Set("Content-Type", "application/atom+xml") + return c.Send([]byte(res)) + + case "feed.rss": + if res, err = feed.ToRss(); err != nil { + log.Error("Failed to convert feed to RSS: %s", err.Error()) + return lib.RenderError(c, 500) + } + + c.Set("Content-Type", "application/rss+xml") + return c.Send([]byte(res)) + + case "feed.json": + if res, err = feed.ToJSON(); err != nil { + log.Error("Failed to convert feed to JSON: %s", err.Error()) + return lib.RenderError(c, 500) + } + + c.Set("Content-Type", "application/feed+json") + return c.Send([]byte(res)) + } + + log.Error("Cannot handle the feed type: %s", feed_type) + return lib.RenderError(c, 404) +} diff --git a/templates/configs.html b/templates/configs.html index 3206fbd..90edf01 100644 --- a/templates/configs.html +++ b/templates/configs.html @@ -2,9 +2,7 @@ MatterLinux | Configs - - - + {{template "parts/head" .}} diff --git a/templates/download.html b/templates/download.html index 48a3248..6cb5124 100644 --- a/templates/download.html +++ b/templates/download.html @@ -2,9 +2,7 @@ MatterLinux | Download - - - + {{template "parts/head" .}} @@ -12,26 +10,20 @@ {{template "parts/bar" .}}
-

Download MatterLinux

+

Download MatterLinux {{.content.ID}}

-

Version

-

{{.content.ID}}

-
-
-

Release Archive

+

Archive

-

Release ISO

+

ISO

diff --git a/templates/error.html b/templates/error.html index 770c798..23feefb 100644 --- a/templates/error.html +++ b/templates/error.html @@ -2,13 +2,11 @@ MatterLinux | Error - - - + {{template "parts/head" .}} -
+

{{.msg}}

Go Back to Home
diff --git a/templates/index.html b/templates/index.html index 27e3a39..8502a55 100644 --- a/templates/index.html +++ b/templates/index.html @@ -2,9 +2,7 @@ MatterLinux - - - + {{template "parts/head" .}} diff --git a/templates/news.html b/templates/news.html index 106f831..ae9c63f 100644 --- a/templates/news.html +++ b/templates/news.html @@ -2,14 +2,22 @@ MatterLinux | News - - - + {{template "parts/head" .}} + + {{template "parts/bar" .}}
+
+

Feeds

+
+ Atom + RSS + JSON +
+
{{range .news}}

{{.Date}}

diff --git a/templates/parts/head.html b/templates/parts/head.html new file mode 100644 index 0000000..dcf5543 --- /dev/null +++ b/templates/parts/head.html @@ -0,0 +1,3 @@ + + + diff --git a/templates/post.html b/templates/post.html index 2b5e6a0..25a2e5e 100644 --- a/templates/post.html +++ b/templates/post.html @@ -2,9 +2,7 @@ MatterLinux | {{.title}} - - - + {{template "parts/head" .}} @@ -14,7 +12,10 @@

{{.post.Title}}

-

{{.post.Date}} | by {{.post.Author}}

+
+

{{.post.Date}}

+

by {{.post.Author}}

+
{{.post.HTML}}