From 251fdc07e50036f9d0d5bc0e9f5166e645ab8853 Mon Sep 17 00:00:00 2001 From: Jan-Lukas Else Date: Mon, 27 Dec 2021 21:33:49 +0100 Subject: [PATCH] Enable minification for feeds again and test feed generation --- feeds.go | 16 +++------- feeds_test.go | 70 +++++++++++++++++++++++++++++++++++++++++++ go.mod | 5 ++++ go.sum | 14 +++++++++ pkgs/minify/minify.go | 11 +++++-- templateAssets.go | 7 ++--- 6 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 feeds_test.go diff --git a/feeds.go b/feeds.go index f7a969d..ea7e81a 100644 --- a/feeds.go +++ b/feeds.go @@ -1,7 +1,6 @@ package main import ( - "bytes" "net/http" "strings" "time" @@ -22,13 +21,8 @@ const ( func (a *goBlog) generateFeed(blog string, f feedType, w http.ResponseWriter, r *http.Request, posts []*post, title string, description string) { now := time.Now() - if title == "" { - title = a.cfg.Blogs[blog].Title - } - title = a.renderMdTitle(title) - if description == "" { - description = a.cfg.Blogs[blog].Description - } + title = a.renderMdTitle(defaultIfEmpty(title, a.cfg.Blogs[blog].Title)) + description = defaultIfEmpty(description, a.cfg.Blogs[blog].Description) feed := &feeds.Feed{ Title: title, Description: description, @@ -43,15 +37,13 @@ func (a *goBlog) generateFeed(blog string, f feedType, w http.ResponseWriter, r }, } for _, p := range posts { - var contentBuf bytes.Buffer - // _, _ = a.min.Write(&contentBuf, contenttype.HTML, []byte(a.feedHtml(p))) - contentBuf.WriteString(a.feedHtml(p)) // Don't minify for now, might break some feed readers + content, _ := a.min.MinifyString(contenttype.HTML, a.feedHtml(p)) feed.Add(&feeds.Item{ Title: p.RenderedTitle, Link: &feeds.Link{Href: a.fullPostURL(p)}, Description: a.postSummary(p), Id: p.Path, - Content: contentBuf.String(), + Content: content, Created: timeNoErr(dateparse.ParseLocal(p.Published)), Updated: timeNoErr(dateparse.ParseLocal(p.Updated)), }) diff --git a/feeds_test.go b/feeds_test.go new file mode 100644 index 0000000..07ef36e --- /dev/null +++ b/feeds_test.go @@ -0,0 +1,70 @@ +package main + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/mmcdole/gofeed" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_generateFeeds(t *testing.T) { + app := &goBlog{ + cfg: createDefaultTestConfig(t), + } + + _ = app.initConfig() + _ = app.initDatabase(false) + app.initComponents(false) + + app.createPost(&post{ + Path: "/testpost", + Section: "posts", + Status: "published", + Published: "2020-01-01T00:00:00Z", + Parameters: map[string][]string{"title": {"Test Post"}}, + Content: "Test Content", + }) + posts, err := app.getPosts(&postsRequestConfig{ + status: "published", + }) + require.NoError(t, err) + require.Len(t, posts, 1) + + for _, typ := range []feedType{rssFeed, atomFeed, jsonFeed} { + rec := httptest.NewRecorder() + req := httptest.NewRequest("GET", "/test", nil) + + app.generateFeed("default", typ, rec, req, posts, "Test-Title", "Test-Description") + + res := rec.Result() + + require.Equal(t, http.StatusOK, res.StatusCode) + + fp := gofeed.NewParser() + feed, err := fp.Parse(res.Body) + _ = res.Body.Close() + + require.NoError(t, err) + require.NotNil(t, feed) + + switch typ { + case rssFeed: + assert.Equal(t, "rss", feed.FeedType) + case atomFeed: + assert.Equal(t, "atom", feed.FeedType) + case jsonFeed: + assert.Equal(t, "json", feed.FeedType) + } + + assert.Equal(t, "Test-Title", feed.Title) + assert.Equal(t, "Test-Description", feed.Description) + + if assert.Len(t, feed.Items, 1) { + assert.Equal(t, "Test Post", feed.Items[0].Title) + assert.Equal(t, "Test Content", feed.Items[0].Description) + } + } +} diff --git a/go.mod b/go.mod index 1a7154f..1eff3b7 100644 --- a/go.mod +++ b/go.mod @@ -35,6 +35,7 @@ require ( github.com/lopezator/migrator v0.3.0 github.com/mattn/go-sqlite3 v1.14.9 github.com/microcosm-cc/bluemonday v1.0.16 + github.com/mmcdole/gofeed v1.1.3 github.com/paulmach/go.geojson v1.4.0 github.com/posener/wstest v1.2.0 github.com/pquerna/otp v1.3.0 @@ -92,6 +93,7 @@ require ( github.com/jonboulle/clockwork v0.2.2 // indirect github.com/josharian/native v0.0.0-20200817173448-b6b71def0850 // indirect github.com/jsimonetti/rtnetlink v0.0.0-20210525051524-4cc836578190 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.13.6 // indirect github.com/lestrrat-go/strftime v1.0.5 // indirect github.com/magiconair/properties v1.8.5 // indirect @@ -100,6 +102,9 @@ require ( github.com/mdlayher/socket v0.0.0-20210307095302-262dc9984e00 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/go.sum b/go.sum index 9351bcb..fa3644e 100644 --- a/go.sum +++ b/go.sum @@ -44,6 +44,7 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= github.com/akutz/memconn v0.1.0 h1:NawI0TORU4hcOMsMr11g7vwlCdkYeLKXBcxWu2W/P8A= @@ -53,6 +54,7 @@ github.com/alecthomas/chroma v0.9.4/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqN github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= @@ -79,6 +81,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cretz/bine v0.2.0 h1:8GiDRGlTgz+o8H9DSnsl+5MeBK4HsExxgl6WgzOCuZo= github.com/cretz/bine v0.2.0/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI= @@ -254,7 +257,9 @@ github.com/jsimonetti/rtnetlink v0.0.0-20210212075122-66c871082f2b/go.mod h1:8w9 github.com/jsimonetti/rtnetlink v0.0.0-20210525051524-4cc836578190 h1:iycCSDo8EKVueI9sfVBBJmtNn9DnXV/K1YWwEJO+uOs= github.com/jsimonetti/rtnetlink v0.0.0-20210525051524-4cc836578190/go.mod h1:NmKSdU4VGSiv1bMsdqNALI4RSvvjtz65tTMCnD05qLo= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -329,10 +334,16 @@ github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mmcdole/gofeed v1.1.3 h1:pdrvMb18jMSLidGp8j0pLvc9IGziX4vbmvVqmLH6z8o= +github.com/mmcdole/gofeed v1.1.3/go.mod h1:QQO3maftbOu+hiVOGOZDRLymqGQCos4zxbA4j89gMrE= +github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf h1:sWGE2v+hO0Nd4yFU/S/mDBM5plIU8v/Qhfz41hkDIAI= +github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf/go.mod h1:pasqhqstspkosTneA62Nc+2p9SOBBYAPbnmRRWPQ0V8= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/paulmach/go.geojson v1.4.0 h1:5x5moCkCtDo5x8af62P9IOAYGQcYHtxz2QJ3x1DoCgY= github.com/paulmach/go.geojson v1.4.0/go.mod h1:YaKx1hKpWF+T2oj2lFJPsW/t1Q5e1jQI61eoQSTwpIs= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= @@ -351,9 +362,11 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA= github.com/schollz/sqlite3dump v1.3.1/go.mod h1:mzSTjZpJH4zAb1FN3iNlhWPbbdyeBpOaTW0hukyMHyI= github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snabb/diagio v1.0.0 h1:kovhQ1rDXoEbmpf/T5N2sUp2iOdxEg+TcqzbYVHV2V0= @@ -405,6 +418,7 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/urfave/cli v1.22.3/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vcraescu/go-paginator v1.0.1-0.20201114172518-2cfc59fe05c2 h1:l5j4nE6rosbObXB/uPmzxOQ2z5uXlFOgttlHJ2YL/0w= github.com/vcraescu/go-paginator v1.0.1-0.20201114172518-2cfc59fe05c2/go.mod h1:NEDNuq1asYbAeX+uy6w56MDQSFmBQz9k+N9Hy6m4r2U= github.com/vishvananda/netlink v1.1.1-0.20211101163509-b10eb8fe5cf6 h1:167a2omrzz+nN9Of6lN/0yOB9itzw+IOioRThNZ30jA= diff --git a/pkgs/minify/minify.go b/pkgs/minify/minify.go index 3da3c30..29f66ec 100644 --- a/pkgs/minify/minify.go +++ b/pkgs/minify/minify.go @@ -38,8 +38,15 @@ func (m *Minifier) Get() *minify.M { } func (m *Minifier) Write(w io.Writer, mediatype string, b []byte) (int, error) { - m.init() - mw := m.m.Writer(mediatype, w) + mw := m.Get().Writer(mediatype, w) defer func() { _ = mw.Close() }() return mw.Write(b) } + +func (m *Minifier) MinifyBytes(mediatype string, b []byte) ([]byte, error) { + return m.Get().Bytes(mediatype, b) +} + +func (m *Minifier) MinifyString(mediatype string, s string) (string, error) { + return m.Get().String(mediatype, s) +} diff --git a/templateAssets.go b/templateAssets.go index d1e8c3e..8164fb6 100644 --- a/templateAssets.go +++ b/templateAssets.go @@ -54,20 +54,19 @@ func (a *goBlog) compileAsset(name string) (string, error) { } ext := path.Ext(name) compiledExt := ext - m := a.min.Get() switch ext { case ".js": - content, err = m.Bytes(contenttype.JS, content) + content, err = a.min.MinifyBytes(contenttype.JS, content) if err != nil { return "", err } case ".css": - content, err = m.Bytes(contenttype.CSS, content) + content, err = a.min.MinifyBytes(contenttype.CSS, content) if err != nil { return "", err } case ".xml", ".xsl": - content, err = m.Bytes(contenttype.XML, content) + content, err = a.min.MinifyBytes(contenttype.XML, content) if err != nil { return "", err }