Browse Source

Handle RSS feeds with CDATA in author item element

hykhd 5 years ago
parent
commit
053b1d0f8d
2 changed files with 30 additions and 0 deletions
  1. 28 0
      reader/rss/parser_test.go
  2. 2 0
      reader/rss/rss.go

+ 28 - 0
reader/rss/parser_test.go

@@ -355,6 +355,34 @@ func TestParseEntryWithAuthorAndInnerHTML(t *testing.T) {
 	}
 }
 
+func TestParseEntryWithAuthorAndCDATA(t *testing.T) {
+	data := `<?xml version="1.0" encoding="utf-8"?>
+		<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
+		<channel>
+			<title>Example</title>
+			<link>https://example.org/</link>
+			<atom:link href="https://example.org/rss" type="application/rss+xml" rel="self"></atom:link>
+			<item>
+				<title>Test</title>
+				<link>https://example.org/item</link>
+				<author>
+					by <![CDATA[Foo Bar]]>
+				</author>
+			</item>
+		</channel>
+		</rss>`
+
+	feed, err := Parse("https://example.org/", bytes.NewBufferString(data))
+	if err != nil {
+		t.Fatal(err)
+	}
+	expected := "by Foo Bar"
+	result := feed.Entries[0].Author
+	if result != expected {
+		t.Errorf("Incorrect entry author, got %q instead of %q", result, expected)
+	}
+}
+
 func TestParseEntryWithNonStandardAtomAuthor(t *testing.T) {
 	data := `<?xml version="1.0" encoding="utf-8"?>
 		<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

+ 2 - 0
reader/rss/rss.go

@@ -217,6 +217,8 @@ func (r *rssItem) entryAuthor() string {
 		default:
 			if rssAuthor.Name != "" {
 				author = rssAuthor.Name
+			} else if strings.Contains(rssAuthor.Inner, "<![CDATA[") {
+				author = rssAuthor.Data
 			} else {
 				author = rssAuthor.Inner
 			}