diff options
author | Frédéric Guillot <fred@miniflux.net> | 2018-04-10 18:13:05 -0700 |
---|---|---|
committer | Frédéric Guillot <fred@miniflux.net> | 2018-04-10 18:13:05 -0700 |
commit | dcbb5047b1cb9189ff270ead27a6e619e58f00c2 (patch) | |
tree | 6942644c53553529929c839587d51b4abbce3fa8 /reader/rdf | |
parent | 15202b8675544e12f935f9f8f906ee7f387facad (diff) |
Add support for Dublin Core date in RDF feeds
Diffstat (limited to 'reader/rdf')
-rw-r--r-- | reader/rdf/parser_test.go | 55 | ||||
-rw-r--r-- | reader/rdf/rdf.go | 19 |
2 files changed, 73 insertions, 1 deletions
diff --git a/reader/rdf/parser_test.go b/reader/rdf/parser_test.go index 52c11a5..392b987 100644 --- a/reader/rdf/parser_test.go +++ b/reader/rdf/parser_test.go @@ -322,6 +322,61 @@ func TestParseItemWithoutLink(t *testing.T) { } } +func TestParseItemWithDublicCoreDate(t *testing.T) { + data := `<?xml version="1.0" encoding="utf-8"?> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"> + <channel> + <title>Example</title> + <link>http://example.org</link> + </channel> + + <item> + <title>Title</title> + <description>Test</description> + <link>http://example.org/test.html</link> + <dc:creator>Tester</dc:creator> + <dc:date>2018-04-10T05:00:00+00:00</dc:date> + </item> + </rdf:RDF>` + + feed, err := Parse(bytes.NewBufferString(data)) + if err != nil { + t.Error(err) + } + + expectedDate := time.Date(2018, time.April, 10, 5, 0, 0, 0, time.UTC) + if !feed.Entries[0].Date.Equal(expectedDate) { + t.Errorf("Incorrect entry date, got: %v, want: %v", feed.Entries[0].Date, expectedDate) + } +} + +func TestParseItemWithoutDate(t *testing.T) { + data := `<?xml version="1.0" encoding="utf-8"?> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/"> + <channel> + <title>Example</title> + <link>http://example.org</link> + </channel> + + <item> + <title>Title</title> + <description>Test</description> + <link>http://example.org/test.html</link> + </item> + </rdf:RDF>` + + feed, err := Parse(bytes.NewBufferString(data)) + if err != nil { + t.Error(err) + } + + expectedDate := time.Now().In(time.Local) + diff := expectedDate.Sub(feed.Entries[0].Date) + if diff > time.Second { + t.Errorf("Incorrect entry date, got: %v", diff) + } +} + func TestParseInvalidXml(t *testing.T) { data := `garbage` _, err := Parse(bytes.NewBufferString(data)) diff --git a/reader/rdf/rdf.go b/reader/rdf/rdf.go index d9f3403..44ff0af 100644 --- a/reader/rdf/rdf.go +++ b/reader/rdf/rdf.go @@ -10,7 +10,9 @@ import ( "time" "github.com/miniflux/miniflux/crypto" + "github.com/miniflux/miniflux/logger" "github.com/miniflux/miniflux/model" + "github.com/miniflux/miniflux/reader/date" "github.com/miniflux/miniflux/reader/sanitizer" "github.com/miniflux/miniflux/url" ) @@ -54,6 +56,7 @@ type rdfItem struct { Link string `xml:"link"` Description string `xml:"description"` Creator string `xml:"creator"` + Date string `xml:"date"` } func (r *rdfItem) Transform() *model.Entry { @@ -63,10 +66,24 @@ func (r *rdfItem) Transform() *model.Entry { entry.URL = r.Link entry.Content = r.Description entry.Hash = getHash(r) - entry.Date = time.Now() + entry.Date = getDate(r) return entry } +func getDate(r *rdfItem) time.Time { + if r.Date != "" { + result, err := date.Parse(r.Date) + if err != nil { + logger.Error("rdf: %v", err) + return time.Now() + } + + return result + } + + return time.Now() +} + func getHash(r *rdfItem) string { value := r.Link if value == "" { |