diff --git a/reader/rdf/parser_test.go b/reader/rdf/parser_test.go
index 9383fb03..c1bc67cd 100644
--- a/reader/rdf/parser_test.go
+++ b/reader/rdf/parser_test.go
@@ -377,6 +377,31 @@ func TestParseItemWithoutDate(t *testing.T) {
}
}
+func TestParseItemWithEncodedHTMLTitle(t *testing.T) {
+ data := `
+
+
+ Example
+ http://example.org
+
+
+ -
+ AT&T
+ Test
+ http://example.org/test.html
+
+ `
+
+ feed, err := Parse("http://example.org", bytes.NewBufferString(data))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if feed.Entries[0].Title != `AT&T` {
+ t.Errorf("Incorrect entry title, got: %v", feed.Entries[0].Title)
+ }
+}
+
func TestParseInvalidXml(t *testing.T) {
data := `garbage`
_, err := Parse("http://example.org", bytes.NewBufferString(data))
@@ -519,3 +544,36 @@ func TestParseRDFWithContentEncoded(t *testing.T) {
t.Errorf(`Unexpected entry URL, got %q instead of %q`, result, expected)
}
}
+
+func TestParseRDFWithEncodedHTMLDescription(t *testing.T) {
+ data := `
+
+
+ Example Feed
+ http://example.org/
+
+ -
+ Item Title
+ http://example.org/
+ AT&T <img src="https://example.org/img.png"></a>
+
+ `
+
+ feed, err := Parse("http://example.org/", bytes.NewBufferString(data))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if len(feed.Entries) != 1 {
+ t.Fatalf(`Unexpected number of entries, got %d`, len(feed.Entries))
+ }
+
+ expected := `AT&T `
+ result := feed.Entries[0].Content
+ if result != expected {
+ t.Errorf(`Unexpected entry URL, got %v instead of %v`, result, expected)
+ }
+}
diff --git a/reader/rdf/rdf.go b/reader/rdf/rdf.go
index 1710897a..9a86bff7 100644
--- a/reader/rdf/rdf.go
+++ b/reader/rdf/rdf.go
@@ -6,6 +6,7 @@ package rdf // import "miniflux.app/reader/rdf"
import (
"encoding/xml"
+ "html"
"strings"
"time"
@@ -75,7 +76,7 @@ func (r *rdfItem) Transform() *model.Entry {
}
func (r *rdfItem) entryTitle() string {
- return strings.TrimSpace(r.Title)
+ return html.UnescapeString(strings.TrimSpace(r.Title))
}
func (r *rdfItem) entryContent() string {