pax_global_header00006660000000000000000000000064140374600370014516gustar00rootroot0000000000000052 comment=5d81d4b54b22ccc4b0f038a0130d342bc6b88312 gofeed-1.1.3/000077500000000000000000000000001403746003700127515ustar00rootroot00000000000000gofeed-1.1.3/.github/000077500000000000000000000000001403746003700143115ustar00rootroot00000000000000gofeed-1.1.3/.github/ISSUE_TEMPLATE.md000066400000000000000000000002361403746003700170170ustar00rootroot00000000000000### Expected behavior ### Actual behavior ### Steps to reproduce the behavior Note: Please include any links to problem feeds, or the feed content itself! gofeed-1.1.3/.gitignore000066400000000000000000000005051403746003700147410ustar00rootroot00000000000000# Compiled Object files, Static and Dynamic libs (Shared Objects) *.o *.a *.so # Folders _obj _test # Architecture specific extensions/prefixes *.[568vq] [568vq].out *.cgo1.go *.cgo2.c _cgo_defun.c _cgo_gotypes.go _cgo_export.* _testmain.go *.exe *.test *.prof .DS_STORE cmd/ftest/ftest # Goland specific files .idea gofeed-1.1.3/.travis.yml000066400000000000000000000004661403746003700150700ustar00rootroot00000000000000language: go env: global: - GO111MODULE="on" go: - 1.11.x - 1.12.x - 1.13.x - tip matrix: allow_failures: - go: tip fast_finish: true before_install: - go get github.com/mattn/goveralls script: - go install ./... - go test -v ./... - $GOPATH/bin/goveralls -service=travis-ci gofeed-1.1.3/LICENSE000066400000000000000000000020621403746003700137560ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 mmcdole Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. gofeed-1.1.3/README.md000066400000000000000000000506051403746003700142360ustar00rootroot00000000000000# gofeed [![Build Status](https://travis-ci.org/mmcdole/gofeed.svg?branch=master)](https://travis-ci.org/mmcdole/gofeed) [![Coverage Status](https://coveralls.io/repos/github/mmcdole/gofeed/badge.svg?branch=master)](https://coveralls.io/github/mmcdole/gofeed?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/mmcdole/gofeed)](https://goreportcard.com/report/github.com/mmcdole/gofeed) [![](https://godoc.org/github.com/mmcdole/gofeed?status.svg)](http://godoc.org/github.com/mmcdole/gofeed) [![License](http://img.shields.io/:license-mit-blue.svg)](http://doge.mit-license.org) The `gofeed` library is a robust feed parser that supports parsing both [RSS](https://en.wikipedia.org/wiki/RSS), [Atom]() and [JSON](https://jsonfeed.org/version/1) feeds. The library provides a universal `gofeed.Parser` that will parse and convert all feed types into a hybrid `gofeed.Feed` model. You also have the option of utilizing the feed specific `atom.Parser` or `rss.Parser` or `json.Parser` parsers which generate `atom.Feed`, `rss.Feed` and `json.Feed` respectively. ## Table of Contents - [Features](#features) - [Overview](#overview) - [Basic Usage](#basic-usage) - [Advanced Usage](#advanced-usage) - [Extensions](#extensions) - [Invalid Feeds](#invalid-feeds) - [Default Mappings](#default-mappings) - [Dependencies](#dependencies) - [License](#license) - [Credits](#credits) ## Features #### Supported feed types: - RSS 0.90 - Netscape RSS 0.91 - Userland RSS 0.91 - RSS 0.92 - RSS 0.93 - RSS 0.94 - RSS 1.0 - RSS 2.0 - Atom 0.3 - Atom 1.0 - JSON 1.0 - JSON 1.1 #### Extension Support The `gofeed` library provides support for parsing several popular predefined extensions into ready-made structs, including [Dublin Core](http://dublincore.org/documents/dces/) and [Apple’s iTunes](https://help.apple.com/itc/podcasts_connect/#/itcb54353390). It parses all other feed extensions in a generic way (see the [Extensions](#extensions) section for more details). #### Invalid Feeds A best-effort attempt is made at parsing broken and invalid XML feeds. Currently, `gofeed` can succesfully parse feeds with the following issues: - Unescaped/Naked Markup in feed elements - Undeclared namespace prefixes - Missing closing tags on certain elements - Illegal tags within feed elements without namespace prefixes - Missing "required" elements as specified by the respective feed specs. - Incorrect date formats ## Overview The `gofeed` library is comprised of a universal feed parser and several feed specific parsers. Which one you choose depends entirely on your usecase. If you will be handling rss, atom and json feeds then it makes sense to use the `gofeed.Parser`. If you know ahead of time that you will only be parsing one feed type then it would make sense to use `rss.Parser` or `atom.Parser` or `json.Parser`. #### Universal Feed Parser The universal `gofeed.Parser` works in 3 stages: detection, parsing and translation. It first detects the feed type that it is currently parsing. Then it uses a feed specific parser to parse the feed into its true representation which will be either a `rss.Feed` or `atom.Feed` or `json.Feed`. These models cover every field possible for their respective feed types. Finally, they are _translated_ into a `gofeed.Feed` model that is a hybrid of all feed types. Performing the universal feed parsing in these 3 stages allows for more flexibility and keeps the code base more maintainable by separating RSS, Atom and Json parsing into seperate packages. ![Diagram](docs/sequence.png) The translation step is done by anything which adheres to the `gofeed.Translator` interface. The `DefaultRSSTranslator`, `DefaultAtomTranslator`, `DefaultJSONTranslator` are used behind the scenes when you use the `gofeed.Parser` with its default settings. You can see how they translate fields from `atom.Feed` or `rss.Feed` `json.Feed` to the universal `gofeed.Feed` struct in the [Default Mappings](#default-mappings) section. However, should you disagree with the way certain fields are translated you can easily supply your own `gofeed.Translator` and override this behavior. See the [Advanced Usage](#advanced-usage) section for an example how to do this. #### Feed Specific Parsers The `gofeed` library provides two feed specific parsers: `atom.Parser`, `rss.Parser` and `json.Parser`. If the hybrid `gofeed.Feed` model that the universal `gofeed.Parser` produces does not contain a field from the `atom.Feed` or `rss.Feed` or `json.Feed` model that you require, it might be beneficial to use the feed specific parsers. When using the `atom.Parser` or `rss.Parser` or `json.Parser` directly, you can access all of fields found in the `atom.Feed`, `rss.Feed` and `json.Feed` models. It is also marginally faster because you are able to skip the translation step. ## Basic Usage #### Universal Feed Parser The most common usage scenario will be to use `gofeed.Parser` to parse an arbitrary RSS or Atom or JSON feed into the hybrid `gofeed.Feed` model. This hybrid model allows you to treat RSS, Atom and JSON feeds the same. ##### Parse a feed from an URL: ```go fp := gofeed.NewParser() feed, _ := fp.ParseURL("http://feeds.twit.tv/twit.xml") fmt.Println(feed.Title) ``` ##### Parse a feed from a string: ```go feedData := ` Sample Feed ` fp := gofeed.NewParser() feed, _ := fp.ParseString(feedData) fmt.Println(feed.Title) ``` ##### Parse a feed from an io.Reader: ```go file, _ := os.Open("/path/to/a/file.xml") defer file.Close() fp := gofeed.NewParser() feed, _ := fp.Parse(file) fmt.Println(feed.Title) ``` ##### Parse a feed from an URL with a 60s timeout: ```go ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() fp := gofeed.NewParser() feed, _ := fp.ParseURLWithContext("http://feeds.twit.tv/twit.xml", ctx) fmt.Println(feed.Title) ``` ##### Parse a feed from an URL with a custom User-Agent: ```go fp := gofeed.NewParser() fp.UserAgent = "MyCustomAgent 1.0" feed, _ := fp.ParseURL("http://feeds.twit.tv/twit.xml") fmt.Println(feed.Title) ``` #### Feed Specific Parsers You can easily use the `rss.Parser`, `atom.Parser` or `json.Parser` directly if you have a usage scenario that requires it: ##### Parse a RSS feed into a `rss.Feed` ```go feedData := ` example@site.com (Example Name) ` fp := rss.Parser{} rssFeed, _ := fp.Parse(strings.NewReader(feedData)) fmt.Println(rssFeed.WebMaster) ``` ##### Parse an Atom feed into a `atom.Feed` ```go feedData := ` Example Atom ` fp := atom.Parser{} atomFeed, _ := fp.Parse(strings.NewReader(feedData)) fmt.Println(atomFeed.Subtitle) ``` ##### Parse a JSON feed into a `json.Feed` ```go feedData := `{"version":"1.0", "home_page_url": "https://daringfireball.net"}` fp := json.Parser{} jsonFeed, _ := fp.Parse(strings.NewReader(feedData)) fmt.Println(jsonFeed.HomePageURL) ``` ## Advanced Usage ##### Parse a feed while using a custom translator The mappings and precedence order that are outlined in the [Default Mappings](#default-mappings) section are provided by the following two structs: `DefaultRSSTranslator`, `DefaultAtomTranslator` and `DefaultJSONTranslator`. If you have fields that you think should have a different precedence, or if you want to make a translator that is aware of an unsupported extension you can do this by specifying your own RSS or Atom or JSON translator when using the `gofeed.Parser`. Here is a simple example of creating a custom `Translator` that makes the `/rss/channel/itunes:author` field have a higher precedence than the `/rss/channel/managingEditor` field in RSS feeds. We will wrap the existing `DefaultRSSTranslator` since we only want to change the behavior for a single field. First we must define a custom translator: ```go import ( "fmt" "github.com/mmcdole/gofeed" "github.com/mmcdole/gofeed/rss" ) type MyCustomTranslator struct { defaultTranslator *gofeed.DefaultRSSTranslator } func NewMyCustomTranslator() *MyCustomTranslator { t := &MyCustomTranslator{} // We create a DefaultRSSTranslator internally so we can wrap its Translate // call since we only want to modify the precedence for a single field. t.defaultTranslator = &gofeed.DefaultRSSTranslator{} return t } func (ct* MyCustomTranslator) Translate(feed interface{}) (*gofeed.Feed, error) { rss, found := feed.(*rss.Feed) if !found { return nil, fmt.Errorf("Feed did not match expected type of *rss.Feed") } f, err := ct.defaultTranslator.Translate(rss) if err != nil { return nil, err } if rss.ITunesExt != nil && rss.ITunesExt.Author != "" { f.Author = rss.ITunesExt.Author } else { f.Author = rss.ManagingEditor } return f } ``` Next you must configure your `gofeed.Parser` to utilize the new `gofeed.Translator`: ```go feedData := ` Ender Wiggin Valentine Wiggin ` fp := gofeed.NewParser() fp.RSSTranslator = NewMyCustomTranslator() feed, _ := fp.ParseString(feedData) fmt.Println(feed.Author) // Valentine Wiggin ``` ## Extensions Every element which does not belong to the feed's default namespace is considered an extension by `gofeed`. These are parsed and stored in a tree-like structure located at `Feed.Extensions` and `Item.Extensions`. These fields should allow you to access and read any custom extension elements. In addition to the generic handling of extensions, `gofeed` also has built in support for parsing certain popular extensions into their own structs for convenience. It currently supports the [Dublin Core](http://dublincore.org/documents/dces/) and [Apple iTunes](https://help.apple.com/itc/podcasts_connect/#/itcb54353390) extensions which you can access at `Feed.ItunesExt`, `feed.DublinCoreExt` and `Item.ITunesExt` and `Item.DublinCoreExt` ## Default Mappings The `DefaultRSSTranslator`, the `DefaultAtomTranslator` and the `DefaultJSONTranslator` map the following `rss.Feed`, `atom.Feed` and `json.Feed` fields to their respective `gofeed.Feed` fields. They are listed in order of precedence (highest to lowest): | `gofeed.Feed` | RSS | Atom | JSON | | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ------------------------ | | Title | /rss/channel/title
/rdf:RDF/channel/title
/rss/channel/dc:title
/rdf:RDF/channel/dc:title | /feed/title | /title | | Description | /rss/channel/description
/rdf:RDF/channel/description
/rss/channel/itunes:subtitle | /feed/subtitle
/feed/tagline | /description | | Link | /rss/channel/link
/rdf:RDF/channel/link | /feed/link[@rel=”alternate”]/@href
/feed/link[not(@rel)]/@href | /home_page_url | | FeedLink | /rss/channel/atom:link[@rel="self"]/@href
/rdf:RDF/channel/atom:link[@rel="self"]/@href | /feed/link[@rel="self"]/@href | /feed_url | | Updated | /rss/channel/lastBuildDate
/rss/channel/dc:date
/rdf:RDF/channel/dc:date | /feed/updated
/feed/modified | /items[0]/date_modified | | Published | /rss/channel/pubDate | | /items[0]/date_published | | Author | /rss/channel/managingEditor
/rss/channel/webMaster
/rss/channel/dc:author
/rdf:RDF/channel/dc:author
/rss/channel/dc:creator
/rdf:RDF/channel/dc:creator
/rss/channel/itunes:author | /feed/authors[0] | /author | | Authors | /rss/channel/managingEditor
/rss/channel/webMaster
/rss/channel/dc:author
/rdf:RDF/channel/dc:author
/rss/channel/dc:creator
/rdf:RDF/channel/dc:creator
/rss/channel/itunes:author | /feed/authors | /authors
/author | | Language | /rss/channel/language
/rss/channel/dc:language
/rdf:RDF/channel/dc:language | /feed/@xml:lang | /language | | Image | /rss/channel/image
/rdf:RDF/image
/rss/channel/itunes:image | /feed/logo | /icon | | Copyright | /rss/channel/copyright
/rss/channel/dc:rights
/rdf:RDF/channel/dc:rights | /feed/rights
/feed/copyright | | Generator | /rss/channel/generator | /feed/generator | | Categories | /rss/channel/category
/rss/channel/itunes:category
/rss/channel/itunes:keywords
/rss/channel/dc:subject
/rdf:RDF/channel/dc:subject | /feed/category | | `gofeed.Item` | RSS | Atom | JSON | | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------- | | Title | /rss/channel/item/title
/rdf:RDF/item/title
/rdf:RDF/item/dc:title
/rss/channel/item/dc:title | /feed/entry/title | /items/title | | Description | /rss/channel/item/description
/rdf:RDF/item/description
/rss/channel/item/dc:description
/rdf:RDF/item/dc:description | /feed/entry/summary | /items/summary | | Content | /rss/channel/item/content:encoded | /feed/entry/content | /items/content_html | | Link | /rss/channel/item/link
/rdf:RDF/item/link | /feed/entry/link[@rel=”alternate”]/@href
/feed/entry/link[not(@rel)]/@href | /items/url | | Updated | /rss/channel/item/dc:date
/rdf:RDF/rdf:item/dc:date | /feed/entry/modified
/feed/entry/updated | /items/date_modified | | Published | /rss/channel/item/pubDate
/rss/channel/item/dc:date | /feed/entry/published
/feed/entry/issued | /items/date_published | | Author | /rss/channel/item/author
/rss/channel/item/dc:author
/rdf:RDF/item/dc:author
/rss/channel/item/dc:creator
/rdf:RDF/item/dc:creator
/rss/channel/item/itunes:author | /feed/entry/author | /items/author/name | | Authors | /rss/channel/item/author
/rss/channel/item/dc:author
/rdf:RDF/item/dc:author
/rss/channel/item/dc:creator
/rdf:RDF/item/dc:creator
/rss/channel/item/itunes:author | /feed/entry/authors[0] | /items/authors
/items/author/name | | GUID | /rss/channel/item/guid | /feed/entry/id | /items/id | | Image | /rss/channel/item/itunes:image
/rss/channel/item/media:image | | /items/image
/items/banner_image | | Categories | /rss/channel/item/category
/rss/channel/item/dc:subject
/rss/channel/item/itunes:keywords
/rdf:RDF/channel/item/dc:subject | /feed/entry/category | /items/tags | | Enclosures | /rss/channel/item/enclosure | /feed/entry/link[@rel=”enclosure”] | /items/attachments | ## Dependencies - [goxpp](https://github.com/mmcdole/goxpp) - XML Pull Parser - [goquery](https://github.com/PuerkitoBio/goquery) - Go jQuery-like interface - [testify](https://github.com/stretchr/testify) - Unit test enhancements - [jsoniter](https://github.com/json-iterator/go) - Faster JSON Parsing ## License This project is licensed under the [MIT License](https://raw.githubusercontent.com/mmcdole/gofeed/master/LICENSE) ## Credits - [cristoper](https://github.com/cristoper) for his work on implementing xml:base relative URI handling. - [Mark Pilgrim](https://en.wikipedia.org/wiki/Mark_Pilgrim) and [Kurt McKee](http://kurtmckee.org) for their work on the excellent [Universal Feed Parser](https://github.com/kurtmckee/feedparser) Python library. This library was the inspiration for the `gofeed` library. - [Dan MacTough](http://blog.mact.me) for his work on [node-feedparser](https://github.com/danmactough/node-feedparser). It provided inspiration for the set of fields that should be covered in the hybrid `gofeed.Feed` model. - [Matt Jibson](https://mattjibson.com/) for his date parsing function in the [goread](https://github.com/mjibson/goread) project. - [Jim Teeuwen](https://github.com/jteeuwen) for his method of representing arbitrary feed extensions in the [go-pkg-rss](https://github.com/jteeuwen/go-pkg-rss) library. - [Sudhanshu Raheja](https://revolt.ist) for supporting JSON Feed parser gofeed-1.1.3/atom/000077500000000000000000000000001403746003700137115ustar00rootroot00000000000000gofeed-1.1.3/atom/feed.go000066400000000000000000000103341403746003700151440ustar00rootroot00000000000000package atom import ( "encoding/json" "time" "github.com/mmcdole/gofeed/extensions" ) // Feed is an Atom Feed type Feed struct { Title string `json:"title,omitempty"` ID string `json:"id,omitempty"` Updated string `json:"updated,omitempty"` UpdatedParsed *time.Time `json:"updatedParsed,omitempty"` Subtitle string `json:"subtitle,omitempty"` Links []*Link `json:"links,omitempty"` Language string `json:"language,omitempty"` Generator *Generator `json:"generator,omitempty"` Icon string `json:"icon,omitempty"` Logo string `json:"logo,omitempty"` Rights string `json:"rights,omitempty"` Contributors []*Person `json:"contributors,omitempty"` Authors []*Person `json:"authors,omitempty"` Categories []*Category `json:"categories,omitempty"` Entries []*Entry `json:"entries"` Extensions ext.Extensions `json:"extensions,omitempty"` Version string `json:"version"` } func (f Feed) String() string { json, _ := json.MarshalIndent(f, "", " ") return string(json) } // Entry is an Atom Entry type Entry struct { Title string `json:"title,omitempty"` ID string `json:"id,omitempty"` Updated string `json:"updated,omitempty"` UpdatedParsed *time.Time `json:"updatedParsed,omitempty"` Summary string `json:"summary,omitempty"` Authors []*Person `json:"authors,omitempty"` Contributors []*Person `json:"contributors,omitempty"` Categories []*Category `json:"categories,omitempty"` Links []*Link `json:"links,omitempty"` Rights string `json:"rights,omitempty"` Published string `json:"published,omitempty"` PublishedParsed *time.Time `json:"publishedParsed,omitempty"` Source *Source `json:"source,omitempty"` Content *Content `json:"content,omitempty"` Extensions ext.Extensions `json:"extensions,omitempty"` } // Category is category metadata for Feeds and Entries type Category struct { Term string `json:"term,omitempty"` Scheme string `json:"scheme,omitempty"` Label string `json:"label,omitempty"` } // Person represents a person in an Atom feed // for things like Authors, Contributors, etc type Person struct { Name string `json:"name,omitempty"` Email string `json:"email,omitempty"` URI string `json:"uri,omitempty"` } // Link is an Atom link that defines a reference // from an entry or feed to a Web resource type Link struct { Href string `json:"href,omitempty"` Hreflang string `json:"hreflang,omitempty"` Rel string `json:"rel,omitempty"` Type string `json:"type,omitempty"` Title string `json:"title,omitempty"` Length string `json:"length,omitempty"` } // Content either contains or links to the content of // the entry type Content struct { Src string `json:"src,omitempty"` Type string `json:"type,omitempty"` Value string `json:"value,omitempty"` } // Generator identifies the agent used to generate a // feed, for debugging and other purposes. type Generator struct { Value string `json:"value,omitempty"` URI string `json:"uri,omitempty"` Version string `json:"version,omitempty"` } // Source contains the feed information for another // feed if a given entry came from that feed. type Source struct { Title string `json:"title,omitempty"` ID string `json:"id,omitempty"` Updated string `json:"updated,omitempty"` UpdatedParsed *time.Time `json:"updatedParsed,omitempty"` Subtitle string `json:"subtitle,omitempty"` Links []*Link `json:"links,omitempty"` Generator *Generator `json:"generator,omitempty"` Icon string `json:"icon,omitempty"` Logo string `json:"logo,omitempty"` Rights string `json:"rights,omitempty"` Contributors []*Person `json:"contributors,omitempty"` Authors []*Person `json:"authors,omitempty"` Categories []*Category `json:"categories,omitempty"` Extensions ext.Extensions `json:"extensions,omitempty"` } gofeed-1.1.3/atom/parser.go000066400000000000000000000370331403746003700155420ustar00rootroot00000000000000package atom import ( "encoding/base64" "io" "strings" "github.com/PuerkitoBio/goquery" ext "github.com/mmcdole/gofeed/extensions" "github.com/mmcdole/gofeed/internal/shared" xpp "github.com/mmcdole/goxpp" ) var ( // Atom elements which contain URIs // https://tools.ietf.org/html/rfc4287 uriElements = map[string]bool{ "icon": true, "id": true, "logo": true, "uri": true, "url": true, // atom 0.3 } // Atom attributes which contain URIs // https://tools.ietf.org/html/rfc4287 atomURIAttrs = map[string]bool{ "href": true, "scheme": true, "src": true, "uri": true, } ) // Parser is an Atom Parser type Parser struct { base *shared.XMLBase } // Parse parses an xml feed into an atom.Feed func (ap *Parser) Parse(feed io.Reader) (*Feed, error) { p := xpp.NewXMLPullParser(feed, false, shared.NewReaderLabel) ap.base = &shared.XMLBase{URIAttrs: atomURIAttrs} _, err := ap.base.FindRoot(p) if err != nil { return nil, err } return ap.parseRoot(p) } func (ap *Parser) parseRoot(p *xpp.XMLPullParser) (*Feed, error) { if err := p.Expect(xpp.StartTag, "feed"); err != nil { return nil, err } atom := &Feed{} atom.Entries = []*Entry{} atom.Version = ap.parseVersion(p) atom.Language = ap.parseLanguage(p) contributors := []*Person{} authors := []*Person{} categories := []*Category{} links := []*Link{} extensions := ext.Extensions{} for { tok, err := ap.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if shared.IsExtension(p) { e, err := shared.ParseExtension(extensions, p) if err != nil { return nil, err } extensions = e } else if name == "title" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } atom.Title = result } else if name == "id" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } atom.ID = result } else if name == "updated" || name == "modified" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } atom.Updated = result date, err := shared.ParseDate(result) if err == nil { utcDate := date.UTC() atom.UpdatedParsed = &utcDate } } else if name == "subtitle" || name == "tagline" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } atom.Subtitle = result } else if name == "link" { result, err := ap.parseLink(p) if err != nil { return nil, err } links = append(links, result) } else if name == "generator" { result, err := ap.parseGenerator(p) if err != nil { return nil, err } atom.Generator = result } else if name == "icon" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } atom.Icon = result } else if name == "logo" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } atom.Logo = result } else if name == "rights" || name == "copyright" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } atom.Rights = result } else if name == "contributor" { result, err := ap.parsePerson("contributor", p) if err != nil { return nil, err } contributors = append(contributors, result) } else if name == "author" { result, err := ap.parsePerson("author", p) if err != nil { return nil, err } authors = append(authors, result) } else if name == "category" { result, err := ap.parseCategory(p) if err != nil { return nil, err } categories = append(categories, result) } else if name == "entry" { result, err := ap.parseEntry(p) if err != nil { return nil, err } atom.Entries = append(atom.Entries, result) } else { err := p.Skip() if err != nil { return nil, err } } } } if len(categories) > 0 { atom.Categories = categories } if len(authors) > 0 { atom.Authors = authors } if len(contributors) > 0 { atom.Contributors = contributors } if len(links) > 0 { atom.Links = links } if len(extensions) > 0 { atom.Extensions = extensions } if err := p.Expect(xpp.EndTag, "feed"); err != nil { return nil, err } return atom, nil } func (ap *Parser) parseEntry(p *xpp.XMLPullParser) (*Entry, error) { if err := p.Expect(xpp.StartTag, "entry"); err != nil { return nil, err } entry := &Entry{} contributors := []*Person{} authors := []*Person{} categories := []*Category{} links := []*Link{} extensions := ext.Extensions{} for { tok, err := ap.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if shared.IsExtension(p) { e, err := shared.ParseExtension(extensions, p) if err != nil { return nil, err } extensions = e } else if name == "title" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } entry.Title = result } else if name == "id" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } entry.ID = result } else if name == "rights" || name == "copyright" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } entry.Rights = result } else if name == "summary" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } entry.Summary = result } else if name == "source" { result, err := ap.parseSource(p) if err != nil { return nil, err } entry.Source = result } else if name == "updated" || name == "modified" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } entry.Updated = result date, err := shared.ParseDate(result) if err == nil { utcDate := date.UTC() entry.UpdatedParsed = &utcDate } } else if name == "contributor" { result, err := ap.parsePerson("contributor", p) if err != nil { return nil, err } contributors = append(contributors, result) } else if name == "author" { result, err := ap.parsePerson("author", p) if err != nil { return nil, err } authors = append(authors, result) } else if name == "category" { result, err := ap.parseCategory(p) if err != nil { return nil, err } categories = append(categories, result) } else if name == "link" { result, err := ap.parseLink(p) if err != nil { return nil, err } links = append(links, result) } else if name == "published" || name == "issued" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } entry.Published = result date, err := shared.ParseDate(result) if err == nil { utcDate := date.UTC() entry.PublishedParsed = &utcDate } } else if name == "content" { result, err := ap.parseContent(p) if err != nil { return nil, err } entry.Content = result } else { err := p.Skip() if err != nil { return nil, err } } } } if len(categories) > 0 { entry.Categories = categories } if len(authors) > 0 { entry.Authors = authors } if len(links) > 0 { entry.Links = links } if len(contributors) > 0 { entry.Contributors = contributors } if len(extensions) > 0 { entry.Extensions = extensions } if err := p.Expect(xpp.EndTag, "entry"); err != nil { return nil, err } return entry, nil } func (ap *Parser) parseSource(p *xpp.XMLPullParser) (*Source, error) { if err := p.Expect(xpp.StartTag, "source"); err != nil { return nil, err } source := &Source{} contributors := []*Person{} authors := []*Person{} categories := []*Category{} links := []*Link{} extensions := ext.Extensions{} for { tok, err := ap.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if shared.IsExtension(p) { e, err := shared.ParseExtension(extensions, p) if err != nil { return nil, err } extensions = e } else if name == "title" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } source.Title = result } else if name == "id" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } source.ID = result } else if name == "updated" || name == "modified" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } source.Updated = result date, err := shared.ParseDate(result) if err == nil { utcDate := date.UTC() source.UpdatedParsed = &utcDate } } else if name == "subtitle" || name == "tagline" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } source.Subtitle = result } else if name == "link" { result, err := ap.parseLink(p) if err != nil { return nil, err } links = append(links, result) } else if name == "generator" { result, err := ap.parseGenerator(p) if err != nil { return nil, err } source.Generator = result } else if name == "icon" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } source.Icon = result } else if name == "logo" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } source.Logo = result } else if name == "rights" || name == "copyright" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } source.Rights = result } else if name == "contributor" { result, err := ap.parsePerson("contributor", p) if err != nil { return nil, err } contributors = append(contributors, result) } else if name == "author" { result, err := ap.parsePerson("author", p) if err != nil { return nil, err } authors = append(authors, result) } else if name == "category" { result, err := ap.parseCategory(p) if err != nil { return nil, err } categories = append(categories, result) } else { err := p.Skip() if err != nil { return nil, err } } } } if len(categories) > 0 { source.Categories = categories } if len(authors) > 0 { source.Authors = authors } if len(contributors) > 0 { source.Contributors = contributors } if len(links) > 0 { source.Links = links } if len(extensions) > 0 { source.Extensions = extensions } if err := p.Expect(xpp.EndTag, "source"); err != nil { return nil, err } return source, nil } func (ap *Parser) parseContent(p *xpp.XMLPullParser) (*Content, error) { c := &Content{} c.Type = p.Attribute("type") c.Src = p.Attribute("src") text, err := ap.parseAtomText(p) if err != nil { return nil, err } c.Value = text return c, nil } func (ap *Parser) parsePerson(name string, p *xpp.XMLPullParser) (*Person, error) { if err := p.Expect(xpp.StartTag, name); err != nil { return nil, err } person := &Person{} for { tok, err := ap.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if name == "name" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } person.Name = result } else if name == "email" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } person.Email = result } else if name == "uri" || name == "url" || name == "homepage" { result, err := ap.parseAtomText(p) if err != nil { return nil, err } person.URI = result } else { err := p.Skip() if err != nil { return nil, err } } } } if err := p.Expect(xpp.EndTag, name); err != nil { return nil, err } return person, nil } func (ap *Parser) parseLink(p *xpp.XMLPullParser) (*Link, error) { if err := p.Expect(xpp.StartTag, "link"); err != nil { return nil, err } l := &Link{} l.Href = p.Attribute("href") l.Hreflang = p.Attribute("hreflang") l.Type = p.Attribute("type") l.Length = p.Attribute("length") l.Title = p.Attribute("title") l.Rel = p.Attribute("rel") if l.Rel == "" { l.Rel = "alternate" } if err := p.Skip(); err != nil { return nil, err } if err := p.Expect(xpp.EndTag, "link"); err != nil { return nil, err } return l, nil } func (ap *Parser) parseCategory(p *xpp.XMLPullParser) (*Category, error) { if err := p.Expect(xpp.StartTag, "category"); err != nil { return nil, err } c := &Category{} c.Term = p.Attribute("term") c.Scheme = p.Attribute("scheme") c.Label = p.Attribute("label") if err := p.Skip(); err != nil { return nil, err } if err := p.Expect(xpp.EndTag, "category"); err != nil { return nil, err } return c, nil } func (ap *Parser) parseGenerator(p *xpp.XMLPullParser) (*Generator, error) { if err := p.Expect(xpp.StartTag, "generator"); err != nil { return nil, err } g := &Generator{} uri := p.Attribute("uri") // Atom 1.0 url := p.Attribute("url") // Atom 0.3 if uri != "" { g.URI = uri } else if url != "" { g.URI = url } g.Version = p.Attribute("version") result, err := ap.parseAtomText(p) if err != nil { return nil, err } g.Value = result if err := p.Expect(xpp.EndTag, "generator"); err != nil { return nil, err } return g, nil } func (ap *Parser) parseAtomText(p *xpp.XMLPullParser) (string, error) { var text struct { Type string `xml:"type,attr"` Mode string `xml:"mode,attr"` InnerXML string `xml:",innerxml"` } err := p.DecodeElement(&text) if err != nil { return "", err } result := text.InnerXML result = strings.TrimSpace(result) lowerType := strings.ToLower(text.Type) lowerMode := strings.ToLower(text.Mode) if strings.Contains(result, " Sample Feed ` feedType := gofeed.DetectFeedType(strings.NewReader(feedData)) if feedType == gofeed.FeedTypeRSS { fmt.Println("Wow! This is an RSS feed!") } } gofeed-1.1.3/docs/000077500000000000000000000000001403746003700137015ustar00rootroot00000000000000gofeed-1.1.3/docs/sequence.png000066400000000000000000001302761403746003700162300ustar00rootroot00000000000000PNG  IHDRhtsRGBYiTXtXML:com.adobe.xmp 1 L'Y@IDATx `U}j)7r EAAD  @(0yRS.^u~o/溢7?4@MB@$ @.`I]v$M`Y{no( gY)@r7(2j|Q1 XR}&o׭B;DU[1m^ó8Z-[]O۾䘽?G@ ւ &&̓)YDQivU 赉+v<^ZdK{}ۑ3W/wVoYGw LQ!dVUZ8v-.O)7q6!)ׯөzM[˲nʸsŅըu[SPZrw.#oY-C:ѯ{OЎg\ Vk@-oj@(.lnMakZ3E&JlNw\ܕ^?iwtE[d~1ڒ&HNCo.6g;DѡAt?!~܉5Q'N\MJI@# ) . L2q&4ـӃxa Ғhm?ᄪn6ݲy_ֻW2MwSmF]B :{B ;ÄmK;lPA/@wFF|;tm.q4H{|0c瞤j@ pM w ȯAzcs-Pd!k-s%[)&,ޛ>̧זjMVx!{6WjB8LݟGt{} f/r,i+9GA]] ,ɶ2 {֡Z6ek6sG]O:>tv?-?nRbwyР'ie_تwjzFFTUE\݇ڣ]qpqdunM$nօs%[{/NwPi;8_+?;?X] x @ pp đ@pn]Q'wjm o#+M>XN+un.I>Ϸdk$ZIF9 US/' ^٦Ŝ~2& n4[+ݳ5IKZNڗ_hˮ<~մs8 lRd2i[lN=ֻOa!i=smw[dimtyzUEO~q:upL[sK`ijSr3Ŵ);a6V"x @ pp đ@$i_fOK8SX[9䖝RHk>i`b3-S-u:Xx)wԋ:w ;\J~hٯ `:'` h=[nue#zs\E @lW xP@BEp|iF޹yeЛc{kw/dD*#^Me|)գu =wM?JAiZs<+Y4M|{:)[yqqMMO=X-[6DHBBB-L_~EW_V{h?$:: y=ֈG71O1oߡxO^ps; 2sIrmAAAErmϜt.d,i0kX˹ ;r8%5͹-g!oRU2T$S2s17;pfjM.9T׵Qk~k@{A< X.0 @@  @ jC2mSGVZVv0Nj&MooMFEGQrKOomc̓Sn:ݬY3SO<}wޥ|՚_"]ynݺǩ^;ϼtQ]v><. W/ˤQ8r$\Y͓nos~>zU̵vp YߙjZJ?ݠL@~)ޟ 4|QHIfsetmr|Rw087n#} ё=1sep(ש2UVcǎQ.6y| WP8qO-Z`F|199 [1{'uluص3lv ;+8.Y>o#տF zu[qg?ٗmUU]v6ieŒ+\*V?|Z;"4]n!@Kh5ZBzjix'2%`qf.H~NԮ]lQ͋+@֣"b.>?*wf)=||؈ɅG1OΝ:k߾_~+nǎg9ԼY ']KQ9VkQUy9'vl?(/79e;?#`yE{v-VCiq` ogN[Ru6?Pf(zԌ?04pJ$Atɥ;ZkĬYׯVwޕd7 ׇO:)qm!uzٯs^zmyu-4y^d}v_,;vY)S4hH!Ȩٳ'?ٳgŲe֖#]*B^/YeSr5k!tG-zizdfg 8T j??@aq$@I^ݢtÒ1ȨS^m"_Uڦ2mԥ>pW_D=4SmFW_yu=Ϳ^$Nٖ>w36;ok΍\F ?9qJrb݆ lKBCT^?DmQspٳg];w5/=&ȉ9 ;*><'6kUع[R}Ngn=B@8[B |*s`v% `!]Xy©rNG\ '}`Pz)W㏴شqCy&˯t%Ef]y|%ϳ|K/U"i+v縪_snO2>޵kglVphy>+ 7nv<7":h_<`EY,f]^n'V^^lS_qq~}QVJS9ǁ&׿jG@'筰& @)5Uu6lrwQJS?%偂E+jq0c^817c0<ȩ'xy׮]L3f<މ9t111ouWZO_~QAAAj==mګU ,޼ӰaCKT%eLHH0*Ūǜ_=.66]|6?匃2lUe!@2/[͡y>|x UΧh~9UiCCfU䔒}|p?uP\R_(s2MNv^qCe@h| P@@ Y9wj?2}Uח!.}]9^5@.P H-NS BCU2 iz7(dNM|s/D%9QV !Shg% 49aؤIV $MZ說úp&ʟvY{7-MU!q5J5 ;v @/pfC!@ƄqSa|%f-{]ֳ gU&x ^f9m ^%wmIAqaAt0)O/29Q29*CӾ(,\9}ԬO}m[Z9{u]^n{Ŏp]@MF&8P@|l=fO@Ѓn546ՆQ4ݕL*N]֋XO}?66auЎި{=y|lEܱ Aa^fNk3UMөYn(ҫEty^Y]׵lѧ$׵!(}\׼. _@[u 0!>q{"O4( /A&ll>Ht9l:q)~?}|p}S~IuV3D ,iwvűa<:8e5N)]D)sԥ݋tV.K0C`aRq~ػP59&;q]F!W'z4@@@>Ws 9Z2YL֞-JsIrt8rO(LPn"֭ei\|4]kxMa/{71jǪ}g&`u]תm׵q]*GN[H @V:N2=R&too?JIF hPq4㲞ڑɶbh\ls M'daJpğ ~a 3n^G Z.P\q]< +_ā Té4|Fkqgw$\^{(B77e9qӽm}'ioz^7v!>slS%M%!1S~Ӟ'Y{7Ql׵OkrMp]bC`W|H]}1P@ Ԑf[tַWGCOwǷQ׺z6ӭ):pMEC6on6)YsgkΖWzv]>9d_|cz85vQB ,ۤ|:5im޹9ݟ1ޢJV̝;5/wT ss  6iE)JDu  dpjM @$bIC/TVսx`ЂM<E5@@O Ś@ Шzs܌.&6@ sYVvSlڐm3 @&S( z L(Q͊b(]${ϠTր Nr7 NoB:,:R* 1/ wC&`QQ)mܐ%,STev"!@|P@`$K $nRd.N`]FFSꋋM jB8q\ .SS?p w#.Y)3'N"ruX4'2!@h| P@[@UM'ڻ "dnaD! ~"fk kaK@T3rlkq8.n@C `JJ# @O'k3DlRH(t a@ &,Sn|: 4`6:$@ 8kˡ lM @(? @~+Lvp:$@ o8[ lM @$? @~+P``tI @_pB=!@TU.EY\ @)7/@@TEk @^0xmO @ {nj,_T  @ NJ# @ @#PU@ @ 8C+ @ @pBU!@ @? :B @ ?@ɏ U @ @ ?@ @H'?j,T @ NJ# @ @#PU@ @ 8C+ @ @pBU!@ @? :B @ ?@ɏ U @ @ ?@ @H'?j,T @ NJ# g*8@@ &#Sij( @ @Nq^ @ @@@45 @ xG'8c/ @ @ d @ @#w@ @ dpj2M @ @0xg7  @i \q E[~g񀪪YtiMg)?U"^~^3Lxiøq.xNOoG)WY  @*N2 J:HR{G=^G߭3Uya @ 6 *@*$ [j:ȯ;]y::^͔=<8r̃ @/ 䋭:A@ pk ӻr~>*Pro5JRqcd4'e&/{)`=jYX @:w<@hr[z4ɵ$I nvFCP ;ṣ\@ SC- 4iKJ(9*xXjI˝Le‚9' @  @[wy7Rɾ2N%9y˳e:x@ o eF`WFp}ܫ(-""*&<,kA|2/;d sf[@ w `H$Q 5)8L 'ɝ˓ |R%%|7$ԩzn @!S`c@Ŕ !nq@TLڇ=* xb&Eʯ9mJqsO41(&44$/2wK~ 9_  s^?:vx[Q:6 |pm(iZ}"I]]/UQ%6r(<_.%a0Ϝ5P>EIבoXD8I$d]Xh8qqot)?^ <Sn^rc7G%K /Lu1c_PlhbXWWhDGoHy0y&385ճG[ՃDKŅsL Gnn~o6|Τ{rj@ )AT\R=29bQMY>Mq iɓ>=-e?YwbunșxGt4t4>?:+EcorgT>ri3q0OzBpO*ʭRe!T/Bm}{E=_@<|n$ܖہloI?%w_˱ʐAx@p%MҹI|w.6iȁ8شߨ187GzWLt Utc7uw=ݢ(S[@%Y c.Ҷi" j%Kf%XtRu<HWXd]Dx ýRGqͨ Q C<Ґm6m)kܻiSj_JpDSУ(?DJϰ ~;^ 8!qW峠1wUқӸ+EDtLjC5}ĚLIQ,Az9%B!ti*CEE}K6siK0r8!x^@F1H6b𬵌r8v,/Rۋ( 6􆔈&͓g|~,*9ݑɣ'$h]5תL(xԠNգMu~k&R/\4m^¦xK_QfD8j _SjɔC M @Y#qW'@c&v_H%)|[yޯAqoY-hBiUs?!$]1uzRSi 2u!q3ҭ o2,F1xeC1Ed&5e 20sgctJ5wss>fww9wcS5Uе[SaAƮӦ=&SH6Fmz$\M7xI`SUblљ'/{ka @vnxw׾66D`ϿU'(S:M 9KVNL<[;U5pωxϱA( 6N-kMI"Ƚqw9.'~퍆gdLjP[Awd'ڤ#~ Tm%k=Sv'me {rllD!z7˸yaQ"+[z&#TŲ8"<<=xDnp%Dz6FlBBC͒Ou$@$ [t 5L{['j c$O^\> JlQj $im<ڞs磎+펩!uVQ(LLQ/@+`"Gاo~T`S[KK?:-\t<Q.Օf'~k4{n]wn;w'rnYFdI;`3tܺus/ESr7t~Ɛ`y;uJIK+ O^Bl.oՃzG7eT,wɔnrItw=pG3[DHVnGBo6_ʓ7JĴ1Q0 @vwׯө|?-]slN ^&$$NpѾ}.(hhٮnoX;&;\WwһɖÕs\J eQoHmq,IP'J;X8`fNHlS5l=w&jXMܻj0-R)D7aG3־WZ $ ܐCv,"zJ& :~A8>ΩuZut(MTkIxkrױJŝ///wXZhM$o5MKbQ+Dj#wўңsSf O3eŴaA4mߊPŎ˟+>'&yI2$ýRP& vjo SC@]ZZ>pG7C&uZd2([1{ g>Ν{SJ_pU~f%ܻD!p eGC;<s_»'<ظEKIUUIܵ>E|Ṽ)j1ߝ}歷EUX,ʉu%Q\\\^N$JRNd=@IDAT]hԚ! &Iwmn{[jZ|X\U!Wx"=ryHϵ߹s{,ɗ>ā(..Hvj`uaiwpҩ9? bslȢw -_eޓtK*jJ3ǝO=Z[%^n{ELH7qO`?젤tEulFbgTWپz2Mؑ :AxqkL4`0$;KX?N;i:Y:XG?Mr6i#%IgJF[vf}us9C3?ZKPwLݪ=^ڣ󮤔uh=ƵE/TgJ?~NVMOIʹ"Ŷ"_@ҳTi܃;l#i(5 X8dw02)0f}_ChT0NO8Qgqgo+W~l֬p>/\\-[6DƎĄ S+lò/Enne%ރ;u)ٱc[oj?a”c &c6kڴ|}׆ɾW9йsׂy8;6&֣w޲y_\ ߡ79Ιs O@~-*,rw PJ,_AXF)Òa!JLhh}=8@WZ)e%u֣ǞѢ>x˾0\&7 Ax?z0_7s]}.ʼ/LqEcd14H@F^tdLk?ԂLgWWJCfO@ЌO6sJ`N:熺O{3{ZPgPfY×"gMߍn)ݳ5]Ś ~?xndɬRN.Yn[>%_-(FBW;+r oޙ􂒞pG ({<ݼ} =vIMyQ-Ѣ܎9x$sT5d+Qq0g%}:䣚bR O_jEH'n|T8tTDtRx {XILLT{( =2"JM1O٥TCfdi;? ФGeyР''|uoI]W??3_7}G7o]_xQ~RR璵kWE,Xfiݦi͚_"^}7LC~h*,7^2fƌJ萨E>WJ?ye!s^Puկ?E9r]un艱v@Cu2wNh(w+=:Kǣ^鋸Q3tmsI.]y.7]`'l8>0y|mN/(?X<~ϳ=pGϞ=B/[:neYhy/x !_On5kVKK$c.괼mӮD=y[fw+qiqF֧}qϿ]ۯ@Mm?r~Iғ4( /ߡ**5tI7+٤ )eAzIZյwq?]\w『ZUjk]paqQHpmuwt2ϓyMClUi\CX h kxX8$˫n:\|8ב8s=!Vp/BN:]ڼ0kU{?yp𒠖+h7:Q䬒 9u }}wZupx-OVddc Imp7;2 h{7'dhXʟu <2pǾfK?e_/7wQh߭Wzn~;tH,:p`_jw6mۚA ydoP5ߣ{]ι e-Oe_2e0!# btRnm6/((&44(Uj ՓHf+[NH gmH.w׈eKAN{Ԫul~ll8w5+Y۱ȑrO}ʷuݡG'j5{RN܃ɢ;t@(Aq\y{W\O޷Dhվn'e-)^.J,|}er^ZŽlC\->SX -ng?q:IRpfݮ dU *!4@}߻'O`:+_4 WO:7X&=cGoCwwzӹg ?ׁIr>\.Ye<Ӣ:9 u6~x5B-rN###Ba᡼sK=xr**:r*˵<5{Zj%j~rjWΫoA:}O' ş곭3JipB.gi=^Cwyf|pA)-HxDžNɅCuV߾}o0,G/>̿r,W7kiڹs[}K%fY]zk{m^VK UWϫZ?vlѾTȚU&:>.a ҥkIUJZև p[z7RۋG<ďO?n{Py-9>{ o+廆oc."gWU/W̌m˦۸vj=Gg$6\ݱJ|ҟy*_jN\K$j&^{X/{:]+8E~wALwJG";˯9/>^vܥ{8*Owh+ٳvڗLvNQ:ulJVGC ?sECϞ-w\=9: o| s`H#I /UNgNr*p2iyVQ2t}'оSZ^KwO]tX&5yW;&-{E6}?2k4="-o玉?wSxX /sS f]@;μw+*nEq9Wy k~Iɨjժt„ɧF#ck5M\e 6B{٭|;~/ U2{M:wޓoz;$ku~ ۶ᄑŽ+**o/Cl;^疷G+-Mސc)?_37/tk8st6q $V4i3ꌠ`λF 5$ڞ܌袢}=w|wP}KOBCB׶K9l;eU;Z_q7pKLruOgʬrͫ'^ks8kя~P& @}vGmj3W|n㕡e&6E?eÇr%yPŒi#]9ޘcDDdrCtz8!3g;w#A&2-/F'5y٧lAn%es^B:5?t;Bo`Dlq_T}4d/4ݗtRF+ۃN`II- Œ{AŸ J{ݹP5ؤ(8mLyU$$&?׶5dclm+ՎOk׋WF8bKw9ə*w>FI-A%[w̫)d+u~[g;*  T}REq"XvcS.6j^ٿFDh5s#UbshkfYtB({HL- EGwK.)-IS3>)ywydn_&sfR$u Հw>C=NKFTWI'|rב+ey %R,j5AwIK2``Wota^L&_l |g}eݠX@ai=g|3rPr\O_ķe I$1?k@\iN|qɮzǒq t뢭aYY{>=(}#'c^2Ln"9rh/ֶ_6cF'&`vݓ ' ?2?TQǒe+ $$:ֻnLt=%+4%DFն/-9}nra>ҭ Migڗ%ɭ"}m/H_5'| )1Ȑ:z)p3:2JdMǯi#ӝ}%)W6[6k7v8Zjߍ)O5{7bWG%Ky{7o^d.wOgBUU6K'-i3W,_,4 R|2p'%õXF21ڪ2Cڃ\'wңVLõ!w|@UL|wNkK,RWVՏN&OxxZ@z9I2odټj+K׫;'Ny/~Ȳ7Ef?&eK-qt]W-5z ߂/x7l\0 1/"da'7[]3۽)XŵO7yR%[~Wrɞ\vn797{;mq([pqf>GS3xt@S(4il^8 {EE  ex`QdτAcf6⳩L/VgJ~Xe[±ҟW^e*?_2IƑeph;wiI%_H$pҏMx2ROTW<'e}@\V|GWjC씠 nVR_*f{% RSydUTMkR8iгl CE N΂ν^:, 5! 7nVRR?2ݿz7ف|dдjM}ҚÇڤs~W<_avOI 78TqRL.W+?ZK(M,(&m8Vl@UE+jq|0c^[~UMz՞( ԐVr0.GoHY9rG쏮zy1٥GsӓKC8!ܛAO=L54%m8 OmRUk':y7s>m^},eOrD^] JL4;T]+9 6$.Hxh߆qoֱĄ$m(Ci7Omy5O~R'/ѣw]ѺS-[= ZLx!ʫ5_zzFƤ)m8xSp[n,(9k}+r JkXpavO_dVzii)v2?xz) HOݛc=P^m5!Q4EWj=cd.4Cj1Ӽ5ލV^qI܉N>,s)G?ڸ0%  vF$eF0pBo~Ư,ׯ_ݜ~w |EIӻCr((( EWUpz.U뱻*zQPŻr(rAnmJ(iI7~B|&}23osw_~_ɱ1Ω(cE%eK+٦ϙ4n+3:J{7yϧ;$7\ҹl2\Yʹp^}Xܺ۝NL9:f#S\\Zk+\ȼSQK&'y|Q s897eiÍcoƖ`W뱼X-/2 ӹsmiwFFw飋-[Zc%?#UGnѥK'餆RMNs|ٹ[1o͟%CMemdǪeme҆;cwʳ"'Q;%_/7e^?GG7~uIU6UQ4z>9R #>0` gN&|xq܇~K3w#ˮ˘\ SXbK/5kr,]羏qj6Z5Qf_Z_7Ir;Mr|aCp_rW}huC aELeZav:ܭKbk]foI̅!u ]Ҳu sAW~窗ٕϗqUEכK6⚙EUBiIz2|~ M,P;PMC$Eƻb&IM_# u##,i<o CZfQQQjRb,k ooj _O YwTr m)920%0r;9׮;dbVsϦb-JAu>XY(2D"S//izAn"ON:n8 !&6L:5j5l)yі_?-M㪏,7'0W_]x9TbDQbH,oPw-*,}]pZdԞ[k:?RxS4#@޾*Ѽ|0s+ߘ3nZ%ƚyEf\#L=ʼ2LǪ>}L' xb^k\$/uvWTTRṢt{f@V1O٘훦 uȑfm+"s'0a|QN;g{嗛g+WJ9AWNJ75Br]E8_& 50LO緶[ӄ]4giOY- 8 <:3ͱ'73|1վY .kG6cns`(_(yzIo'7R&4??ozIL5x^{Ήhr{kn7}28޺L`S D]b`Ҕ=N1?k:'$jVrk~qGaKoYy[&h+41fok]p*6?ﯘv]N0< sBc_s4=j;Nz9-numY?WSYY&Os|_'/ @}/{hM Y`nhRTXqn1Szwk ߋ3fL>~_xaotNx ?H喼ۮv}[n93(ֿ =z(kvgfL+e2wfuSfux˩6nMe2^C::q(Nm+9G*KvxbJSڔY ,YvmLzX$б/*xd)gm6nم]8\*}u`s-[-[n ~nΑ +̭ >麝һe;V/ԣ-Aҳ/~1$OI,dN* Ȥ3d"Ҳ\S(S3jŦQfK0Ud*oϒI<};sŤ GKp(ٺ/+6w,m}.Δ+hB2RrM:U]u|ڣfyɱꓬh$.碿}OY t(j&Qf{hz|^p~vmߖo%~?:>_(^x㍤K.._tys23?-xwABϞ=F1D%Jyi;K' r kl)9¤wՖzeO+).t hKG9O=LUS߉SK9e"(ӫWh Ij1-oeO->@Ze&#?(/i&}>&mOx%{{eRR8tT}mg5KrzwpO^:tl5_Umz/ݩl[JIZii͛R73;!#d(*p^GZ7/4X1q/h]\]SZv:"VAF}]|NP>ގ)S.)z$"58ܒN;$-b UzhIê&CHx޶-;zs凍/CMIFߥL 堃th` ӞOgwޮ5qxp5L6I&nyOB 0{Mdr^nn)*.ٻٚCMDhѝ8k--e9Bkһ+鮖y4}g(:kNmwI1ByeEFyjoQE c[t:G|}&ke( #4\V7-\U6Yw/ y9l*C>@m`0Aw~_е6ѫQݻ|eVkU+c>X]>IE߳ǵ_4v)CK?|Q7Kc6n(z?>'Nd2g͹3}M)A|]M 0[UtIwd._<7t@jl4=ƀ㻔J5Pɗ^_hulSU=OŋJګsQ:ي[]˪O,n}> ~#bil/7Tt5R>l𞨩jnɾ-l}~v9cK[Tjfe^|k:ڼ6Ě/G{zk: Yrxf70?C٥0h}w$Sa;B:L G}jM\hlV7}cmӹt^k$]̗7XCެ l/f^xYg5?fhOdw[Kp,:κ3r: :in}|ssQ}U#u!I?{tRp-nզ}:ƚ|@G[kJ=ioֺ)u'icuzd 'Ltl{p^W]umnݺ_~yZn޽; ㉏~:SN)ݵk~e߼wq7k0[G[T)S?)JXPl 6 mg]xYUI͚%VEd, ^[ꔞl yVQ͚}ь UAwtƷ{05Z&Tp)~p-?6JIk?lpǘ羨Z/rw%M5?ThYVf&qq&>>KISzzk_cZ'7,2r?,ݷ<'tr9I?w4$lW>wk_m@y @-Kc~KNJ+ގa.4gU+b+z7]<2"%Բ$$3&6bbb¢&02gSiIɪ87wd6hH#p` 6YNA':{i$q١lh`Ynv6ys:5aO)..avcS@ OԶuH=T@W.Pl2 vGZNJ>c 5dlgտIJL۠_SЩzM*7W&rh+PU`˗Jd-=4PrW̪(fL ׺b[mpmkrȑ Q(ݱr`N:ktJeVr,㍧e:6A2CۂvU>^kƹigW :Iv]0EN(JSbccd'-|zM2܍#6(अ]%Β2qc(kRzNx,,fdn*KHȣR+|͞O4,*z柀 qb[BpZ٥L\\\vɾq\[9ǯV֤2|XM{=~=!<]6ɭ'C3oomMh7d]IɄv{ί#]#5$2Czufz*!2*x~'jp~N)wr?;W'a{t_~޺yNҍ 4Ԯ!,Y,7HodIN!x57:W|'w؛xb% 'niliF}O[ӻ~ȕGeo}T\V>ֳJ+um% ,LZ"ƛNۼ8{*I'-=$_T&mj.Uvyin88U$_+079 C@z;F.|scbbnv>̮Mꥁ&Nws|Y Q1i]t^PXXbV,ϲˍc$C=O~녢A'&) ]eEIcmit@0)yuc%d4"@@2ϼQ['։wi8'kN ?H)]_si wVʛ ;;o.**IR"!NVvec.ύ5qժ;{#M3%JtU_-EJ*(,5kҎۑrigp T2e]Ғ)5DNЧLT˫!E/ @ Tn%k&3JF /m̞4"A'W}%QsSNUsENMr+O-7 {5 ׍27/4+OOE{H}w0iq0(΄r*w[& z  .}z73 "wi‰Y=6;7ؑ]< _7d& dS;Cn+JωO0q!c ,..2NȐs>:V~E 3I@}c(8Fh~?P^!Y@!! @]2nIavfSWU|^ZVjj߮۴[>Af@tL1KqqJ"cji@jtbm`['.(7:^&[~~#Ce(]z[l ֳE@@ ~!H@'avQ{ OԻd\nnVG  1 C1OκyTyL*~i~~$c7iKzMrC4YV# D="p@ Hϡ2.lzn^51wCˬ:|NP?C>WIA@=%I9 )7\@FQQѮvOc$ҧL>V11@@QS4l@@{Oϼmed]Dঠ _emZfx_[r"  X֗@"L ave%:NTXThlʧҡ}>!  z85D}@ P9nw(,avMO.IDAT)۩JJ^Mch&&*@@  '* @nvw0iq0(ouRpIW&ʤGSV! oxåմ@F!oȄKJJbCtW!{^LF@@HNMa@"Kqnv Ow a;4QfjI7LT"b@@ '!nLݿ,=oTrʐ9 9C_ݦy4oм5  a-@>4@ *''u?;UZZkҹLy󧿻my0֟:!  P؎ @2ߺL)_wuL&H m&!   3G@F@&Q+C_Mh  @ pSO@@@@p +"   +@)bO= G@@@#@)0   D=4@@@R*    "p@@@@ 0J    @ pSO@@@@p +"   +@)bO= G@@@#@)0   D=4@@@R*    "p@@@@ 0J    @ pSO@@@@p +"   +@)bO= G@@@#@)0   D=4@@@R*    "p@@@@ 0J    @ pSO@@@@p +"   +- &ۂ:T@@ éA|    P]Su@@@@$@A|    P]Su@@@@$@A|    P]Su@@@@$@A|    P] @@aG>,&&f܂ n^رc/ۻoc@@pS8Eڀ Tl"zp賧tMqq1dX  | H#@ItNǫQQQƌ3zl6[XF@@ RNg 4YguTb \='AdyVLu^(l7z{キ^^N(>N2>g#ۮ|d}<ΓUeDY>UeKoH9i~  M-@>@ $0Fd|%벲ZMgyi! Mu5k^M@ֿ*U.s%/y~Y.$@@BSP*  hMpi$_%G%Ypᷲpg￿Bet>e<8q]I  4C p|@p", >UKDy{sՊj/d1_jYF֍t_z-Jd[k(66V5TZ3  M%@9. @ HHӍG'q}dy:2  CBlQW@эdXA 7 FYII111=eu7}ٽurΧ23yB@@ 8颲 * zOk'C^R/tnL,'CNC%H{<@BANp#    BBdQU@@@@ 8Y    @ p EU@@@@P  g:"   !$@)NUE@@@BAS(% |e>¾4@@ "#4@ gfemA^U  @p     pE    u p     pE    u p     pE    u p     pE    u p     pE    u p     pE    u p     pE    u p     pE    u Dי   `yfUР;g:k4K|Oـ  @)HN@s3-tgjC`@@CSc(s @9̴"؜&e?  !@19 @ ,E3ÙVo*#  '@9 @ ;D)94@=NwΨ1 @ t"g# +@)r=-Gh"N qX@@ pj # P:N.  "@)X@8N"@@@p ng !A'M!u,  ghϫY @ ̕6:5QAw̨%Gor:ͪOm ^xތ&*j^#CT2{#W uZSP* [&kP?NcrrwG(<~h|StNu)TWMq:C\BQ_@ S> 5 $TcP0EMlI/_j3i}׺uRI=>Qԛdv/ @ 0S؞Z ڃICNɕgɵpkq7ڲ2dL2(@RC@ V?&L0:"ARPC]IXrC{-Yf͝90GT@UN@CiҹL.TV6oَܰͭ" (]@@ Jq  L|qL '}GdkWTnrYs.,Gt@E/ZE@kuod޽Y[v%6MRd'@'Nd@0|0U}ɽEXP4K79 )@:Ȁ x'`w8ZjV@&ꓫľm+JO S`})@ ! di nAFդչ3#M+ѯםMZ0?%tfϚs0oqFyjkc^\uicr tY?G@ \r޶YQ JͼU[ӟZה/2C'+~a&)6m_e&Rp⥯=6Iq:)ӕ=U41SOmtr9OGs_6`+<Ra=ʅUsE&[n*?餞mT.!u+7/z]G̈Mע{0Cz}0s޸-^7cJf[lؑu"׍}yGPdخڮzyu5,#-@)/CR`Lʭ\Euxw,ٮ+M% 6V2A&ݺڤhHip] h]˜()OtΦO$blzIvxwHvzCGˇO6k+* 2iI6=vX4Η1N[M2例Wvԯ_ 9Oe^VE3gӽ۫r5=jVցԀS.io*yҫI߲'ߪLA{1뱆u]5 @x p K@agare[Tz^:ғ{zw0u@+^Z.\yQɃ(3Zoސ`K9MtoWK{(UOd!|#{u8hBw?&5 R[+^pr/L?WeO\Y:%IȈ-sН/zt`˗^j2#eln mZaw+s'on*zj-ǍկE'tm-=);A)m뜋"mkn6IUW_s .2 :@7┡}0/2d 8ɳk?L{رS5Nճ{esSo-[6Ƕiݶ '1<}_}d;?֬6u,WݿkR4щrjl0BR iH*A+@=5T @pYqЫ59Jt~9)ʗF1&O{fOܱ᎗^U~Ƕ.))勿2gj;u {_kINVJo2>j^]v=l᧌(x9YNO=S=uw= *--z~2k{5qruEEnvĸqΞv^:y"oo1~܄\ɣ<ѽ{wN΂wj1_stޣoN*|G^˳4Qg?mhν} io#]XkCG5͖c.u~'ېN.z c/[瘾SֱCGꈑĉu[ୖw5}GvYyOX Diފ2]Vֶ'өSCO)7n|U\e]\QQֹ?9wܪe8ͮsYZր.+Q12!>{ jK=aۿ+lǎ=` |~}w~WA6|yoo^VVfζ';yk}z2ߓә] &&׵ӳO.7PYo~ p=`@ }/-JVz싊Kl˖ntlsfOqm gPH߭\0x :څL NߢmTꅴ!f_~y5l>d_O+xbbp@n1E$eΜ 82i{]&خWuu_jqm k<#S T)@wp.}DH$ T Ę4 6i& 8:~UUn2f^(:d{'#,@9 '';:ݱ1uy`n׌>l̊-{̓1s*zF\?h:1lW`vUNj ȼB2+x8mi:~ b5D5)sr *kj{iZ-k~0@ ,8i ('WπG& 457\:3&mHxcl_ӫ}Ks᳋$Th2q2&3y_̛+N-?ެ-q7jKhc_0K|)mО5N>ig$SgNg+s'oi \{(*p]+'!a-@)O/Ch*6\~JHssR}xGk4üYf ]K_o0gHϦ;6YɼVoq:eů6XTk6'HM;UDXqW/2KaܜB\Rnu-R4D#@? A75ycAt{ۊ)jfLa[E2p% >I3w?u97cR0N]eQʬdf`&g\ׂP+@ X8뙡^ !/P8tR}V{CSw3}[v߹!Y-Jn2W%$E6eXs8? p]3(!a,/ua|ri @ ,ZN?굔m ``)*-7&*5m.ͣ*ќuY\ӷy^P_!5j Qs7'dMv&3g͹P~DjݹEꙧ @p݇ ]YKr'Warz':M-Lн6%±S=ֶ763dz6OO[5MYi/7Un2t?Oq(u9 "t E5@jtLg|5gh-Q*z:7/m79dcKNJ+ޮܛvw9WįZ[ѻ⑾z{[Hy>oH@z8E^@hOc bw81ӡC=Mn ݷ&h-#H? 4uG*B [@3#MңL ٞZM ڧ>^kƹigmE KS @R^7Kn8q`WJG)'z|Yw3QbNB@p ng  @&N؊tF.ٜ d;}hMu[@P gz# _blӴ]tnpEa%f,.ٜ8E" @p @@@iM"kat`N oڌә]j3r E@& 䧀  @S Tn%kSFtFٸ3] IAabц69'8 M/@5@@p:M.QGE&ڙ@hBP5!>FL<];?QJC|4߹IoFmsDf&Wk_Z                                              @ ?25? IENDB`gofeed-1.1.3/extensions/000077500000000000000000000000001403746003700151505ustar00rootroot00000000000000gofeed-1.1.3/extensions/dublincore.go000066400000000000000000000041541403746003700176310ustar00rootroot00000000000000package ext // DublinCoreExtension represents a feed extension // for the Dublin Core specification. type DublinCoreExtension struct { Title []string `json:"title,omitempty"` Creator []string `json:"creator,omitempty"` Author []string `json:"author,omitempty"` Subject []string `json:"subject,omitempty"` Description []string `json:"description,omitempty"` Publisher []string `json:"publisher,omitempty"` Contributor []string `json:"contributor,omitempty"` Date []string `json:"date,omitempty"` Type []string `json:"type,omitempty"` Format []string `json:"format,omitempty"` Identifier []string `json:"identifier,omitempty"` Source []string `json:"source,omitempty"` Language []string `json:"language,omitempty"` Relation []string `json:"relation,omitempty"` Coverage []string `json:"coverage,omitempty"` Rights []string `json:"rights,omitempty"` } // NewDublinCoreExtension creates a new DublinCoreExtension // given the generic extension map for the "dc" prefix. func NewDublinCoreExtension(extensions map[string][]Extension) *DublinCoreExtension { dc := &DublinCoreExtension{} dc.Title = parseTextArrayExtension("title", extensions) dc.Creator = parseTextArrayExtension("creator", extensions) dc.Author = parseTextArrayExtension("author", extensions) dc.Subject = parseTextArrayExtension("subject", extensions) dc.Description = parseTextArrayExtension("description", extensions) dc.Publisher = parseTextArrayExtension("publisher", extensions) dc.Contributor = parseTextArrayExtension("contributor", extensions) dc.Date = parseTextArrayExtension("date", extensions) dc.Type = parseTextArrayExtension("type", extensions) dc.Format = parseTextArrayExtension("format", extensions) dc.Identifier = parseTextArrayExtension("identifier", extensions) dc.Source = parseTextArrayExtension("source", extensions) dc.Language = parseTextArrayExtension("language", extensions) dc.Relation = parseTextArrayExtension("relation", extensions) dc.Coverage = parseTextArrayExtension("coverage", extensions) dc.Rights = parseTextArrayExtension("rights", extensions) return dc } gofeed-1.1.3/extensions/extensions.go000066400000000000000000000021651403746003700177020ustar00rootroot00000000000000package ext // Extensions is the generic extension map for Feeds and Items. // The first map is for the element namespace prefix (e.g., itunes). // The second map is for the element name (e.g., author). type Extensions map[string]map[string][]Extension // Extension represents a single XML element that was in a non // default namespace in a Feed or Item/Entry. type Extension struct { Name string `json:"name"` Value string `json:"value"` Attrs map[string]string `json:"attrs"` Children map[string][]Extension `json:"children"` } func parseTextExtension(name string, extensions map[string][]Extension) (value string) { if extensions == nil { return } matches, ok := extensions[name] if !ok || len(matches) == 0 { return } match := matches[0] return match.Value } func parseTextArrayExtension(name string, extensions map[string][]Extension) (values []string) { if extensions == nil { return } matches, ok := extensions[name] if !ok || len(matches) == 0 { return } values = []string{} for _, m := range matches { values = append(values, m.Value) } return } gofeed-1.1.3/extensions/itunes.go000066400000000000000000000117251403746003700170140ustar00rootroot00000000000000package ext // ITunesFeedExtension is a set of extension // fields for RSS feeds. type ITunesFeedExtension struct { Author string `json:"author,omitempty"` Block string `json:"block,omitempty"` Categories []*ITunesCategory `json:"categories,omitempty"` Explicit string `json:"explicit,omitempty"` Keywords string `json:"keywords,omitempty"` Owner *ITunesOwner `json:"owner,omitempty"` Subtitle string `json:"subtitle,omitempty"` Summary string `json:"summary,omitempty"` Image string `json:"image,omitempty"` Complete string `json:"complete,omitempty"` NewFeedURL string `json:"newFeedUrl,omitempty"` Type string `json:"type,omitempty"` } // ITunesItemExtension is a set of extension // fields for RSS items. type ITunesItemExtension struct { Author string `json:"author,omitempty"` Block string `json:"block,omitempty"` Duration string `json:"duration,omitempty"` Explicit string `json:"explicit,omitempty"` Keywords string `json:"keywords,omitempty"` Subtitle string `json:"subtitle,omitempty"` Summary string `json:"summary,omitempty"` Image string `json:"image,omitempty"` IsClosedCaptioned string `json:"isClosedCaptioned,omitempty"` Episode string `json:"episode,omitempty"` Season string `json:"season,omitempty"` Order string `json:"order,omitempty"` EpisodeType string `json:"episodeType,omitempty"` } // ITunesCategory is a category element for itunes feeds. type ITunesCategory struct { Text string `json:"text,omitempty"` Subcategory *ITunesCategory `json:"subcategory,omitempty"` } // ITunesOwner is the owner of a particular itunes feed. type ITunesOwner struct { Email string `json:"email,omitempty"` Name string `json:"name,omitempty"` } // NewITunesFeedExtension creates an ITunesFeedExtension given an // extension map for the "itunes" key. func NewITunesFeedExtension(extensions map[string][]Extension) *ITunesFeedExtension { feed := &ITunesFeedExtension{} feed.Author = parseTextExtension("author", extensions) feed.Block = parseTextExtension("block", extensions) feed.Explicit = parseTextExtension("explicit", extensions) feed.Keywords = parseTextExtension("keywords", extensions) feed.Subtitle = parseTextExtension("subtitle", extensions) feed.Summary = parseTextExtension("summary", extensions) feed.Image = parseImage(extensions) feed.Complete = parseTextExtension("complete", extensions) feed.NewFeedURL = parseTextExtension("new-feed-url", extensions) feed.Categories = parseCategories(extensions) feed.Owner = parseOwner(extensions) feed.Type = parseTextExtension("type", extensions) return feed } // NewITunesItemExtension creates an ITunesItemExtension given an // extension map for the "itunes" key. func NewITunesItemExtension(extensions map[string][]Extension) *ITunesItemExtension { entry := &ITunesItemExtension{} entry.Author = parseTextExtension("author", extensions) entry.Block = parseTextExtension("block", extensions) entry.Duration = parseTextExtension("duration", extensions) entry.Explicit = parseTextExtension("explicit", extensions) entry.Subtitle = parseTextExtension("subtitle", extensions) entry.Summary = parseTextExtension("summary", extensions) entry.Keywords = parseTextExtension("keywords", extensions) entry.Image = parseImage(extensions) entry.IsClosedCaptioned = parseTextExtension("isClosedCaptioned", extensions) entry.Episode = parseTextExtension("episode", extensions) entry.Season = parseTextExtension("season", extensions) entry.Order = parseTextExtension("order", extensions) entry.EpisodeType = parseTextExtension("episodeType", extensions) return entry } func parseImage(extensions map[string][]Extension) (image string) { if extensions == nil { return } matches, ok := extensions["image"] if !ok || len(matches) == 0 { return } image = matches[0].Attrs["href"] return } func parseOwner(extensions map[string][]Extension) (owner *ITunesOwner) { if extensions == nil { return } matches, ok := extensions["owner"] if !ok || len(matches) == 0 { return } owner = &ITunesOwner{} if name, ok := matches[0].Children["name"]; ok { owner.Name = name[0].Value } if email, ok := matches[0].Children["email"]; ok { owner.Email = email[0].Value } return } func parseCategories(extensions map[string][]Extension) (categories []*ITunesCategory) { if extensions == nil { return } matches, ok := extensions["category"] if !ok || len(matches) == 0 { return } categories = []*ITunesCategory{} for _, cat := range matches { c := &ITunesCategory{} if text, ok := cat.Attrs["text"]; ok { c.Text = text } if subs, ok := cat.Children["category"]; ok { s := &ITunesCategory{} if text, ok := subs[0].Attrs["text"]; ok { s.Text = text } c.Subcategory = s } categories = append(categories, c) } return } gofeed-1.1.3/extensions/itunes_test.go000066400000000000000000000020561403746003700200500ustar00rootroot00000000000000package ext_test import ( "bytes" "encoding/json" "fmt" "io/ioutil" "path/filepath" "strings" "testing" "github.com/mmcdole/gofeed" "github.com/stretchr/testify/assert" ) func TestITunes_Extensions(t *testing.T) { files, _ := filepath.Glob("../testdata/extensions/itunes/*.xml") for _, f := range files { base := filepath.Base(f) name := strings.TrimSuffix(base, filepath.Ext(base)) fmt.Printf("Testing %s... ", name) // Get actual source feed ff := fmt.Sprintf("../testdata/extensions/itunes/%s.xml", name) f, _ := ioutil.ReadFile(ff) // Parse actual feed fp := gofeed.NewParser() actual, _ := fp.Parse(bytes.NewReader(f)) // Get json encoded expected feed result ef := fmt.Sprintf("../testdata/extensions/itunes/%s.json", name) e, _ := ioutil.ReadFile(ef) // Unmarshal expected feed expected := &gofeed.Feed{} json.Unmarshal(e, &expected) if assert.Equal(t, expected, actual, "Feed file %s.xml did not match expected output %s.json", name, name) { fmt.Printf("OK\n") } else { fmt.Printf("Failed\n") } } } gofeed-1.1.3/feed.go000066400000000000000000000106651403746003700142130ustar00rootroot00000000000000package gofeed import ( "encoding/json" "time" ext "github.com/mmcdole/gofeed/extensions" ) // Feed is the universal Feed type that atom.Feed // and rss.Feed gets translated to. It represents // a web feed. // Sorting with sort.Sort will order the Items by // oldest to newest publish time. type Feed struct { Title string `json:"title,omitempty"` Description string `json:"description,omitempty"` Link string `json:"link,omitempty"` FeedLink string `json:"feedLink,omitempty"` Links []string `json:"links,omitempty"` Updated string `json:"updated,omitempty"` UpdatedParsed *time.Time `json:"updatedParsed,omitempty"` Published string `json:"published,omitempty"` PublishedParsed *time.Time `json:"publishedParsed,omitempty"` Author *Person `json:"author,omitempty"` // Deprecated: Use feed.Authors instead Authors []*Person `json:"authors,omitempty"` Language string `json:"language,omitempty"` Image *Image `json:"image,omitempty"` Copyright string `json:"copyright,omitempty"` Generator string `json:"generator,omitempty"` Categories []string `json:"categories,omitempty"` DublinCoreExt *ext.DublinCoreExtension `json:"dcExt,omitempty"` ITunesExt *ext.ITunesFeedExtension `json:"itunesExt,omitempty"` Extensions ext.Extensions `json:"extensions,omitempty"` Custom map[string]string `json:"custom,omitempty"` Items []*Item `json:"items"` FeedType string `json:"feedType"` FeedVersion string `json:"feedVersion"` } func (f Feed) String() string { json, _ := json.MarshalIndent(f, "", " ") return string(json) } // Item is the universal Item type that atom.Entry // and rss.Item gets translated to. It represents // a single entry in a given feed. type Item struct { Title string `json:"title,omitempty"` Description string `json:"description,omitempty"` Content string `json:"content,omitempty"` Link string `json:"link,omitempty"` Links []string `json:"links,omitempty"` Updated string `json:"updated,omitempty"` UpdatedParsed *time.Time `json:"updatedParsed,omitempty"` Published string `json:"published,omitempty"` PublishedParsed *time.Time `json:"publishedParsed,omitempty"` Author *Person `json:"author,omitempty"` // Deprecated: Use item.Authors instead Authors []*Person `json:"authors,omitempty"` GUID string `json:"guid,omitempty"` Image *Image `json:"image,omitempty"` Categories []string `json:"categories,omitempty"` Enclosures []*Enclosure `json:"enclosures,omitempty"` DublinCoreExt *ext.DublinCoreExtension `json:"dcExt,omitempty"` ITunesExt *ext.ITunesItemExtension `json:"itunesExt,omitempty"` Extensions ext.Extensions `json:"extensions,omitempty"` Custom map[string]string `json:"custom,omitempty"` } // Person is an individual specified in a feed // (e.g. an author) type Person struct { Name string `json:"name,omitempty"` Email string `json:"email,omitempty"` } // Image is an image that is the artwork for a given // feed or item. type Image struct { URL string `json:"url,omitempty"` Title string `json:"title,omitempty"` } // Enclosure is a file associated with a given Item. type Enclosure struct { URL string `json:"url,omitempty"` Length string `json:"length,omitempty"` Type string `json:"type,omitempty"` } // Len returns the length of Items. func (f Feed) Len() int { return len(f.Items) } // Less compares PublishedParsed of Items[i], Items[k] // and returns true if Items[i] is less than Items[k]. func (f Feed) Less(i, k int) bool { return f.Items[i].PublishedParsed.Before( *f.Items[k].PublishedParsed, ) } // Swap swaps Items[i] and Items[k]. func (f Feed) Swap(i, k int) { f.Items[i], f.Items[k] = f.Items[k], f.Items[i] } gofeed-1.1.3/feed_test.go000066400000000000000000000015341403746003700152450ustar00rootroot00000000000000package gofeed_test import ( "sort" "testing" "time" "github.com/mmcdole/gofeed" ) func TestFeedSort(t *testing.T) { oldestItem := &gofeed.Item{ PublishedParsed: &[]time.Time{time.Unix(0, 0)}[0], } inbetweenItem := &gofeed.Item{ PublishedParsed: &[]time.Time{time.Unix(1, 0)}[0], } newestItem := &gofeed.Item{ PublishedParsed: &[]time.Time{time.Unix(2, 0)}[0], } feed := gofeed.Feed{ Items: []*gofeed.Item{ newestItem, oldestItem, inbetweenItem, }, } expected := gofeed.Feed{ Items: []*gofeed.Item{ oldestItem, inbetweenItem, newestItem, }, } sort.Sort(feed) for i, item := range feed.Items { if !item.PublishedParsed.Equal( *expected.Items[i].PublishedParsed, ) { t.Errorf( "Item PublishedParsed = %s; want %s", item.PublishedParsed, expected.Items[i].PublishedParsed, ) } } } gofeed-1.1.3/go.mod000066400000000000000000000005221403746003700140560ustar00rootroot00000000000000module github.com/mmcdole/gofeed go 1.14 require ( github.com/PuerkitoBio/goquery v1.5.1 github.com/json-iterator/go v1.1.10 github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf github.com/stretchr/testify v1.3.0 github.com/urfave/cli v1.22.3 golang.org/x/net v0.0.0-20200301022130-244492dfa37a golang.org/x/text v0.3.2 ) gofeed-1.1.3/go.sum000066400000000000000000000077321403746003700141150ustar00rootroot00000000000000github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/urfave/cli v1.22.3 h1:FpNT6zq26xNpHZy08emi755QwzLPs6Pukqjlc7RfOMU= github.com/urfave/cli v1.22.3/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gofeed-1.1.3/internal/000077500000000000000000000000001403746003700145655ustar00rootroot00000000000000gofeed-1.1.3/internal/shared/000077500000000000000000000000001403746003700160335ustar00rootroot00000000000000gofeed-1.1.3/internal/shared/charsetconv.go000066400000000000000000000005341403746003700207030ustar00rootroot00000000000000package shared import ( "io" "golang.org/x/net/html/charset" ) func NewReaderLabel(label string, input io.Reader) (io.Reader, error) { conv, err := charset.NewReaderLabel(label, input) if err != nil { return nil, err } // Wrap the charset decoder reader with a XML sanitizer //clean := NewXMLSanitizerReader(conv) return conv, nil } gofeed-1.1.3/internal/shared/dateparser.go000066400000000000000000000134561403746003700205250ustar00rootroot00000000000000package shared import ( "fmt" "strings" "time" ) // DateFormats taken from github.com/mjibson/goread var dateFormats = []string{ time.RFC822, // RSS time.RFC822Z, // RSS time.RFC3339, // Atom time.UnixDate, time.RubyDate, time.RFC850, time.RFC1123Z, time.RFC1123, time.ANSIC, "Mon, January 2 2006 15:04:05 -0700", "Mon, Jan 2 2006 15:04:05 -700", "Mon, Jan 2 2006 15:04:05 -0700", "Mon Jan 2 15:04 2006", "Mon Jan 02, 2006 3:04 pm", "Mon Jan 02 2006 15:04:05 -0700", "Mon Jan 02 2006 15:04:05 GMT-0700 (MST)", "Monday, January 2, 2006 03:04 PM", "Monday, January 2, 2006", "Monday, January 02, 2006", "Monday, 2 January 2006 15:04:05 -0700", "Monday, 2 Jan 2006 15:04:05 -0700", "Monday, 02 January 2006 15:04:05 -0700", "Monday, 02 January 2006 15:04:05", "Mon, 2 January 2006, 15:04 -0700", "Mon, 2 January 2006 15:04:05 -0700", "Mon, 2 January 2006", "Mon, 2 Jan 2006 3:04:05 PM -0700", "Mon, 2 Jan 2006 15:4:5 -0700 GMT", "Mon, 2, Jan 2006 15:4", "Mon, 2 Jan 2006, 15:04 -0700", "Mon, 2 Jan 2006 15:04 -0700", "Mon, 2 Jan 2006 15:04:05 UT", "Mon, 2 Jan 2006 15:04:05 -0700 MST", "Mon, 2 Jan 2006 15:04:05-0700", "Mon, 2 Jan 2006 15:04:05 -0700", "Mon, 2 Jan 2006 15:04:05", "Mon, 2 Jan 2006 15:04", "Mon,2 Jan 2006", "Mon, 2 Jan 2006", "Mon, 2 Jan 06 15:04:05 -0700", "Mon, 2006-01-02 15:04", "Mon, 02 January 2006", "Mon, 02 Jan 2006 15 -0700", "Mon, 02 Jan 2006 15:04 -0700", "Mon, 02 Jan 2006 15:04:05 Z", "Mon, 02 Jan 2006 15:04:05 UT", "Mon, 02 Jan 2006 15:04:05 MST-07:00", "Mon, 02 Jan 2006 15:04:05 MST -0700", "Mon, 02 Jan 2006 15:04:05 GMT-0700", "Mon,02 Jan 2006 15:04:05 -0700", "Mon, 02 Jan 2006 15:04:05 -0700", "Mon, 02 Jan 2006 15:04:05 -07:00", "Mon, 02 Jan 2006 15:04:05 --0700", "Mon 02 Jan 2006 15:04:05 -0700", "Mon, 02 Jan 2006 15:04:05 -07", "Mon, 02 Jan 2006 15:04:05 00", "Mon, 02 Jan 2006 15:04:05", "Mon, 02 Jan 2006 15:4:5 Z", "Mon, 02 Jan 2006", "January 2, 2006 3:04 PM", "January 2, 2006, 3:04 p.m.", "January 2, 2006 15:04:05", "January 2, 2006 03:04 PM", "January 2, 2006", "January 02, 2006 15:04", "January 02, 2006 03:04 PM", "January 02, 2006", "Jan 2, 2006 3:04:05 PM", "Jan 2, 2006", "Jan 02 2006 03:04:05PM", "Jan 02, 2006", "6/1/2 15:04", "6-1-2 15:04", "2 January 2006 15:04:05 -0700", "2 January 2006", "2 Jan 2006 15:04:05 Z", "2 Jan 2006 15:04:05 -0700", "2 Jan 2006", "2.1.2006 15:04:05", "2/1/2006", "2-1-2006", "2006 January 02", "2006-1-2T15:04:05Z", "2006-1-2 15:04:05", "2006-1-2", "2006-1-02T15:04:05Z", "2006-01-02T15:04Z", "2006-01-02T15:04-07:00", "2006-01-02T15:04:05Z", "2006-01-02T15:04:05-07:00:00", "2006-01-02T15:04:05:-0700", "2006-01-02T15:04:05-0700", "2006-01-02T15:04:05-07:00", "2006-01-02T15:04:05 -0700", "2006-01-02T15:04:05:00", "2006-01-02T15:04:05", "2006-01-02 at 15:04:05", "2006-01-02 15:04:05Z", "2006-01-02 15:04:05-0700", "2006-01-02 15:04:05-07:00", "2006-01-02 15:04:05 -0700", "2006-01-02 15:04", "2006-01-02 00:00:00.0 15:04:05.0 -0700", "2006/01/02", "2006-01-02", "15:04 02.01.2006 -0700", "1/2/2006 3:04:05 PM", "1/2/2006", "06/1/2 15:04", "06-1-2 15:04", "02 Monday, Jan 2006 15:04", "02 Jan 2006 15:04:05 UT", "02 Jan 2006 15:04:05 -0700", "02 Jan 2006 15:04:05", "02 Jan 2006", "02.01.2006 15:04:05", "02/01/2006 15:04:05", "02.01.2006 15:04", "02/01/2006 - 15:04", "02.01.2006 -0700", "02/01/2006", "02-01-2006", "01/02/2006 3:04 PM", "01/02/2006 - 15:04", "01/02/2006", "01-02-2006", } // Named zone cannot be consistently loaded, so handle separately var dateFormatsWithNamedZone = []string{ "Mon, January 02, 2006, 15:04:05 MST", "Mon, January 02, 2006 15:04:05 MST", "Mon, Jan 2, 2006 15:04 MST", "Mon, Jan 2 2006 15:04 MST", "Mon, Jan 2, 2006 15:04:05 MST", "Mon Jan 2 15:04:05 2006 MST", "Mon, Jan 02,2006 15:04:05 MST", "Monday, January 2, 2006 15:04:05 MST", "Monday, 2 January 2006 15:04:05 MST", "Monday, 2 Jan 2006 15:04:05 MST", "Monday, 02 January 2006 15:04:05 MST", "Mon, 2 January 2006 15:04 MST", "Mon, 2 January 2006, 15:04:05 MST", "Mon, 2 January 2006 15:04:05 MST", "Mon, 2 Jan 2006 15:4:5 MST", "Mon, 2 Jan 2006 15:04 MST", "Mon, 2 Jan 2006 15:04:05MST", "Mon, 2 Jan 2006 15:04:05 MST", "Mon 2 Jan 2006 15:04:05 MST", "mon,2 Jan 2006 15:04:05 MST", "Mon, 2 Jan 15:04:05 MST", "Mon, 2 Jan 06 15:04:05 MST", "Mon,02 January 2006 14:04:05 MST", "Mon, 02 Jan 2006 3:04:05 PM MST", "Mon,02 Jan 2006 15:04 MST", "Mon, 02 Jan 2006 15:04 MST", "Mon, 02 Jan 2006, 15:04:05 MST", "Mon, 02 Jan 2006 15:04:05MST", "Mon, 02 Jan 2006 15:04:05 MST", "Mon , 02 Jan 2006 15:04:05 MST", "Mon, 02 Jan 06 15:04:05 MST", "January 2, 2006 15:04:05 MST", "January 02, 2006 15:04:05 MST", "Jan 2, 2006 3:04:05 PM MST", "Jan 2, 2006 15:04:05 MST", "2 January 2006 15:04:05 MST", "2 Jan 2006 15:04:05 MST", "2006-01-02 15:04:05 MST", "1/2/2006 3:04:05 PM MST", "1/2/2006 15:04:05 MST", "02 Jan 2006 15:04 MST", "02 Jan 2006 15:04:05 MST", "02/01/2006 15:04 MST", "02-01-2006 15:04:05 MST", "01/02/2006 15:04:05 MST", } // ParseDate parses a given date string using a large // list of commonly found feed date formats. func ParseDate(ds string) (t time.Time, err error) { d := strings.TrimSpace(ds) if d == "" { return t, fmt.Errorf("Date string is empty") } for _, f := range dateFormats { if t, err = time.Parse(f, d); err == nil { return } } for _, f := range dateFormatsWithNamedZone { t, err = time.Parse(f, d) if err != nil { continue } // This is a format match! Now try to load the timezone name loc, err := time.LoadLocation(t.Location().String()) if err != nil { // We couldn't load the TZ name. Just use UTC instead... return t, nil } if t, err = time.ParseInLocation(f, ds, loc); err == nil { return t, nil } // This should not be reachable } err = fmt.Errorf("Failed to parse date: %s", ds) return } gofeed-1.1.3/internal/shared/extparser.go000066400000000000000000000156441403746003700204110ustar00rootroot00000000000000package shared import ( "strings" "github.com/mmcdole/gofeed/extensions" "github.com/mmcdole/goxpp" ) // IsExtension returns whether or not the current // XML element is an extension element (if it has a // non empty prefix) func IsExtension(p *xpp.XMLPullParser) bool { space := strings.TrimSpace(p.Space) if prefix, ok := p.Spaces[space]; ok { return !(prefix == "" || prefix == "rss" || prefix == "rdf" || prefix == "content") } return p.Space != "" } // ParseExtension parses the current element of the // XMLPullParser as an extension element and updates // the extension map func ParseExtension(fe ext.Extensions, p *xpp.XMLPullParser) (ext.Extensions, error) { prefix := prefixForNamespace(p.Space, p) result, err := parseExtensionElement(p) if err != nil { return nil, err } // Ensure the extension prefix map exists if _, ok := fe[prefix]; !ok { fe[prefix] = map[string][]ext.Extension{} } // Ensure the extension element slice exists if _, ok := fe[prefix][p.Name]; !ok { fe[prefix][p.Name] = []ext.Extension{} } fe[prefix][p.Name] = append(fe[prefix][p.Name], result) return fe, nil } func parseExtensionElement(p *xpp.XMLPullParser) (e ext.Extension, err error) { if err = p.Expect(xpp.StartTag, "*"); err != nil { return e, err } e.Name = p.Name e.Children = map[string][]ext.Extension{} e.Attrs = map[string]string{} for _, attr := range p.Attrs { // TODO: Alright that we are stripping // namespace information from attributes ? e.Attrs[attr.Name.Local] = attr.Value } for { tok, err := p.Next() if err != nil { return e, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { child, err := parseExtensionElement(p) if err != nil { return e, err } if _, ok := e.Children[child.Name]; !ok { e.Children[child.Name] = []ext.Extension{} } e.Children[child.Name] = append(e.Children[child.Name], child) } else if tok == xpp.Text { e.Value += p.Text } } e.Value = strings.TrimSpace(e.Value) if err = p.Expect(xpp.EndTag, e.Name); err != nil { return e, err } return e, nil } func prefixForNamespace(space string, p *xpp.XMLPullParser) string { // First we check if the global namespace map // contains an entry for this namespace/prefix. // This way we can use the canonical prefix for this // ns instead of the one defined in the feed. if prefix, ok := canonicalNamespaces[space]; ok { return prefix } // Next we check if the feed itself defined this // this namespace and return it if we have a result. if prefix, ok := p.Spaces[space]; ok { return prefix } // Lastly, any namespace which is not defined in the // the feed will be the prefix itself when using Go's // xml.Decoder.Token() method. return space } // Namespaces taken from github.com/kurtmckee/feedparser // These are used for determining canonical name space prefixes // for many of the popular RSS/Atom extensions. // // These canonical prefixes override any prefixes used in the feed itself. var canonicalNamespaces = map[string]string{ "http://webns.net/mvcb/": "admin", "http://purl.org/rss/1.0/modules/aggregation/": "ag", "http://purl.org/rss/1.0/modules/annotate/": "annotate", "http://media.tangent.org/rss/1.0/": "audio", "http://backend.userland.com/blogChannelModule": "blogChannel", "http://creativecommons.org/ns#license": "cc", "http://web.resource.org/cc/": "cc", "http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html": "creativeCommons", "http://backend.userland.com/creativeCommonsRssModule": "creativeCommons", "http://purl.org/rss/1.0/modules/company": "co", "http://purl.org/rss/1.0/modules/content/": "content", "http://my.theinfo.org/changed/1.0/rss/": "cp", "http://purl.org/dc/elements/1.1/": "dc", "http://purl.org/dc/terms/": "dcterms", "http://purl.org/rss/1.0/modules/email/": "email", "http://purl.org/rss/1.0/modules/event/": "ev", "http://rssnamespace.org/feedburner/ext/1.0": "feedburner", "http://freshmeat.net/rss/fm/": "fm", "http://xmlns.com/foaf/0.1/": "foaf", "http://www.w3.org/2003/01/geo/wgs84_pos#": "geo", "http://www.georss.org/georss": "georss", "http://www.opengis.net/gml": "gml", "http://postneo.com/icbm/": "icbm", "http://purl.org/rss/1.0/modules/image/": "image", "http://www.itunes.com/DTDs/PodCast-1.0.dtd": "itunes", "http://example.com/DTDs/PodCast-1.0.dtd": "itunes", "http://purl.org/rss/1.0/modules/link/": "l", "http://search.yahoo.com/mrss": "media", "http://search.yahoo.com/mrss/": "media", "http://madskills.com/public/xml/rss/module/pingback/": "pingback", "http://prismstandard.org/namespaces/1.2/basic/": "prism", "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf", "http://www.w3.org/2000/01/rdf-schema#": "rdfs", "http://purl.org/rss/1.0/modules/reference/": "ref", "http://purl.org/rss/1.0/modules/richequiv/": "reqv", "http://purl.org/rss/1.0/modules/search/": "search", "http://purl.org/rss/1.0/modules/slash/": "slash", "http://schemas.xmlsoap.org/soap/envelope/": "soap", "http://purl.org/rss/1.0/modules/servicestatus/": "ss", "http://hacks.benhammersley.com/rss/streaming/": "str", "http://purl.org/rss/1.0/modules/subscription/": "sub", "http://purl.org/rss/1.0/modules/syndication/": "sy", "http://schemas.pocketsoap.com/rss/myDescModule/": "szf", "http://purl.org/rss/1.0/modules/taxonomy/": "taxo", "http://purl.org/rss/1.0/modules/threading/": "thr", "http://purl.org/rss/1.0/modules/textinput/": "ti", "http://madskills.com/public/xml/rss/module/trackback/": "trackback", "http://wellformedweb.org/commentAPI/": "wfw", "http://purl.org/rss/1.0/modules/wiki/": "wiki", "http://www.w3.org/1999/xhtml": "xhtml", "http://www.w3.org/1999/xlink": "xlink", "http://www.w3.org/XML/1998/namespace": "xml", "http://podlove.org/simple-chapters": "psc", } gofeed-1.1.3/internal/shared/parseutils.go000066400000000000000000000074451403746003700205670ustar00rootroot00000000000000package shared import ( "bytes" "errors" "html" "regexp" "strings" xpp "github.com/mmcdole/goxpp" ) var ( emailNameRgx = regexp.MustCompile(`^([^@]+@[^\s]+)\s+\(([^@]+)\)$`) nameEmailRgx = regexp.MustCompile(`^([^@]+)\s+\(([^@]+@[^)]+)\)$`) nameOnlyRgx = regexp.MustCompile(`^([^@()]+)$`) emailOnlyRgx = regexp.MustCompile(`^([^@()]+@[^@()]+)$`) TruncatedEntity = errors.New("truncated entity") InvalidNumericReference = errors.New("invalid numeric reference") ) const CDATA_START = "" // ParseText is a helper function for parsing the text // from the current element of the XMLPullParser. // This function can handle parsing naked XML text from // an element. func ParseText(p *xpp.XMLPullParser) (string, error) { var text struct { Type string `xml:"type,attr"` InnerXML string `xml:",innerxml"` } err := p.DecodeElement(&text) if err != nil { return "", err } result := text.InnerXML result = strings.TrimSpace(result) if strings.Contains(result, CDATA_START) { return StripCDATA(result), nil } return DecodeEntities(result) } // StripCDATA removes CDATA tags from the string // content outside of CDATA tags is passed via DecodeEntities func StripCDATA(str string) string { buf := bytes.NewBuffer([]byte{}) curr := 0 for curr < len(str) { start := indexAt(str, CDATA_START, curr) if start == -1 { dec, _ := DecodeEntities(str[curr:]) buf.Write([]byte(dec)) return buf.String() } end := indexAt(str, CDATA_END, start) if end == -1 { dec, _ := DecodeEntities(str[curr:]) buf.Write([]byte(dec)) return buf.String() } buf.Write([]byte(str[start+len(CDATA_START) : end])) curr = curr + end + len(CDATA_END) } return buf.String() } // DecodeEntities decodes escaped XML entities // in a string and returns the unescaped string func DecodeEntities(str string) (string, error) { data := []byte(str) buf := bytes.NewBuffer([]byte{}) for len(data) > 0 { // Find the next entity idx := bytes.IndexByte(data, '&') if idx == -1 { buf.Write(data) break } buf.Write(data[:idx]) data = data[idx:] // If there is only the '&' left here if len(data) == 1 { buf.Write(data) return buf.String(), nil } // Find the end of the entity end := bytes.IndexByte(data, ';') if end == -1 { // it's not an entitiy. just a plain old '&' possibly with extra bytes buf.Write(data) return buf.String(), nil } // Check if there is a space somewhere within the 'entitiy'. // If there is then skip the whole thing since it's not a real entity. if strings.Contains(string(data[1:end]), " ") { buf.Write(data) return buf.String(), nil } else { buf.WriteString(html.UnescapeString(string(data[0 : end+1]))) } // Skip the entity data = data[end+1:] } return buf.String(), nil } // ParseNameAddress parses name/email strings commonly // found in RSS feeds of the format "Example Name (example@site.com)" // and other variations of this format. func ParseNameAddress(nameAddressText string) (name string, address string) { if nameAddressText == "" { return } if emailNameRgx.MatchString(nameAddressText) { result := emailNameRgx.FindStringSubmatch(nameAddressText) address = result[1] name = result[2] } else if nameEmailRgx.MatchString(nameAddressText) { result := nameEmailRgx.FindStringSubmatch(nameAddressText) name = result[1] address = result[2] } else if nameOnlyRgx.MatchString(nameAddressText) { result := nameOnlyRgx.FindStringSubmatch(nameAddressText) name = result[1] } else if emailOnlyRgx.MatchString(nameAddressText) { result := emailOnlyRgx.FindStringSubmatch(nameAddressText) address = result[1] } return } func indexAt(str, substr string, start int) int { idx := strings.Index(str[start:], substr) if idx > -1 { idx += start } return idx } gofeed-1.1.3/internal/shared/parseutils_test.go000066400000000000000000000065111403746003700216170ustar00rootroot00000000000000package shared import ( "testing" "github.com/stretchr/testify/assert" ) func TestDecodeEntities(t *testing.T) { tests := []struct { str string res string }{ {"", ""}, {"foo", "foo"}, {"skip & normal & amps", "skip & normal & amps"}, {"not & entity;hello &ne xt;one", "not & entity;hello &ne xt;one"}, {"<foo>", ""}, {"a "b" 'c'", "a \"b\" 'c'"}, {"foo && bar", "foo && bar"}, {""foo"", "\"foo\""}, {"abc", "abc"}, {"résumé", "résumé"}, {"résumé", "résumé"}, {"&", "&"}, {"&foo", "&foo"}, {"<", "<"}, {"&#", "&#"}, } for _, test := range tests { res, err := DecodeEntities(test.str) assert.Nil(t, err, "cannot decode %q", test.str) assert.Equal(t, res, test.res, "%q was decoded to %q instead of %q", test.str, res, test.res) } } func TestStripCDATA(t *testing.T) { tests := []struct { str string res string }{ {"test", " test test"}, {" <", "test & <"}, {"", ""}, {"test", "test"}, {"]]>", "]]>"}, {" < " and & or write things like but my document is still well formed! ]]>`, ` Since this is a CDATA section I can use all sorts of reserved characters like > < " and & or write things like but my document is still well formed! `}, {``, ` Within this Character Data block I can use double dashes as much as I want (along with <, &, ', and ") *and* %MyParamEntity; will be expanded to the text "Has been expanded" ... however, I can't use the CEND sequence. If I need to use CEND I must escape one of the brackets or the greater-than sign using concatenated CDATA sections. `}, // {``, ` test `, // }, {``, ` test `}, // TODO: probably wrong {`An example of escaped CENDs`, `An example of escaped CENDs`}, {`]]>`, `This text contains a CEND ]]>`}, {`]]>`, `This text contains a CEND ]]>`}, } for _, test := range tests { res := StripCDATA(test.str) assert.Equal(t, test.res, res) } } gofeed-1.1.3/internal/shared/xmlbase.go000066400000000000000000000131761403746003700200250ustar00rootroot00000000000000package shared import ( "bytes" "fmt" "golang.org/x/net/html" "net/url" "strings" "github.com/mmcdole/goxpp" ) var ( // HTML attributes which contain URIs // https://pythonhosted.org/feedparser/resolving-relative-links.html // To catch every possible URI attribute is non-trivial: // https://stackoverflow.com/questions/2725156/complete-list-of-html-tag-attributes-which-have-a-url-value htmlURIAttrs = map[string]bool{ "action": true, "background": true, "cite": true, "codebase": true, "data": true, "href": true, "poster": true, "profile": true, "scheme": true, "src": true, "uri": true, "usemap": true, } ) type urlStack []*url.URL func (s *urlStack) push(u *url.URL) { *s = append([]*url.URL{u}, *s...) } func (s *urlStack) pop() *url.URL { if s == nil || len(*s) == 0 { return nil } var top *url.URL top, *s = (*s)[0], (*s)[1:] return top } func (s *urlStack) top() *url.URL { if s == nil || len(*s) == 0 { return nil } return (*s)[0] } type XMLBase struct { stack urlStack URIAttrs map[string]bool } // FindRoot iterates through the tokens of an xml document until // it encounters its first StartTag event. It returns an error // if it reaches EndDocument before finding a tag. func (b *XMLBase) FindRoot(p *xpp.XMLPullParser) (event xpp.XMLEventType, err error) { for { event, err = b.NextTag(p) if err != nil { return event, err } if event == xpp.StartTag { break } if event == xpp.EndDocument { return event, fmt.Errorf("Failed to find root node before document end.") } } return } // XMLBase.NextTag iterates through the tokens until it reaches a StartTag or // EndTag It maintains the urlStack upon encountering StartTag and EndTags, so // that the top of the stack (accessible through the CurrentBase() and // CurrentBaseURL() methods) is the absolute base URI by which relative URIs // should be resolved. // // NextTag is similar to goxpp's NextTag method except it wont throw an error // if the next immediate token isnt a Start/EndTag. Instead, it will continue // to consume tokens until it hits a Start/EndTag or EndDocument. func (b *XMLBase) NextTag(p *xpp.XMLPullParser) (event xpp.XMLEventType, err error) { for { if p.Event == xpp.EndTag { // Pop xml:base after each end tag b.pop() } event, err = p.Next() if err != nil { return event, err } if event == xpp.EndTag { break } if event == xpp.StartTag { base := parseBase(p) err = b.push(base) if err != nil { return } err = b.resolveAttrs(p) if err != nil { return } break } if event == xpp.EndDocument { return event, fmt.Errorf("Failed to find NextTag before reaching the end of the document.") } } return } func parseBase(p *xpp.XMLPullParser) string { xmlURI := "http://www.w3.org/XML/1998/namespace" for _, attr := range p.Attrs { if attr.Name.Local == "base" && attr.Name.Space == xmlURI { return attr.Value } } return "" } func (b *XMLBase) push(base string) error { newURL, err := url.Parse(base) if err != nil { return err } topURL := b.CurrentBaseURL() if topURL != nil { newURL = topURL.ResolveReference(newURL) } b.stack.push(newURL) return nil } // returns the popped base URL func (b *XMLBase) pop() string { url := b.stack.pop() if url != nil { return url.String() } return "" } func (b *XMLBase) CurrentBaseURL() *url.URL { return b.stack.top() } func (b *XMLBase) CurrentBase() string { if url := b.CurrentBaseURL(); url != nil { return url.String() } return "" } // resolve the given string as a URL relative to current base func (b *XMLBase) ResolveURL(u string) (string, error) { if b.CurrentBase() == "" { return u, nil } relURL, err := url.Parse(u) if err != nil { return u, err } curr := b.CurrentBaseURL() if curr.Path != "" && u != "" && curr.Path[len(curr.Path)-1] != '/' { // There's no reason someone would use a path in xml:base if they // didn't mean for it to be a directory curr.Path = curr.Path + "/" } absURL := b.CurrentBaseURL().ResolveReference(relURL) return absURL.String(), nil } // resolve relative URI attributes according to xml:base func (b *XMLBase) resolveAttrs(p *xpp.XMLPullParser) error { for i, attr := range p.Attrs { lowerName := strings.ToLower(attr.Name.Local) if b.URIAttrs[lowerName] { absURL, err := b.ResolveURL(attr.Value) if err != nil { return err } p.Attrs[i].Value = absURL } } return nil } // Transforms html by resolving any relative URIs in attributes // if an error occurs during parsing or serialization, then the original string // is returned along with the error. func (b *XMLBase) ResolveHTML(relHTML string) (string, error) { if b.CurrentBase() == "" { return relHTML, nil } htmlReader := strings.NewReader(relHTML) doc, err := html.Parse(htmlReader) if err != nil { return relHTML, err } var visit func(*html.Node) // recursively traverse HTML resolving any relative URIs in attributes visit = func(n *html.Node) { if n.Type == html.ElementNode { for i, a := range n.Attr { if htmlURIAttrs[a.Key] { absVal, err := b.ResolveURL(a.Val) if err == nil { n.Attr[i].Val = absVal } break } } } for c := n.FirstChild; c != nil; c = c.NextSibling { visit(c) } } visit(doc) var w bytes.Buffer err = html.Render(&w, doc) if err != nil { return relHTML, err } // html.Render() always writes a complete html5 document, so strip the html // and body tags absHTML := w.String() absHTML = strings.TrimPrefix(absHTML, "") absHTML = strings.TrimSuffix(absHTML, "") return absHTML, err } gofeed-1.1.3/internal/shared/xmlsanitizer.go000066400000000000000000000010341403746003700211110ustar00rootroot00000000000000package shared import ( "io" "golang.org/x/text/transform" ) // NewXMLSanitizerReader creates an io.Reader that // wraps another io.Reader and removes illegal xml // characters from the io stream. func NewXMLSanitizerReader(xml io.Reader) io.Reader { isIllegal := func(r rune) bool { return !(r == 0x09 || r == 0x0A || r == 0x0D || r >= 0x20 && r <= 0xDF77 || r >= 0xE000 && r <= 0xFFFD || r >= 0x10000 && r <= 0x10FFFF) } t := transform.Chain(transform.RemoveFunc(isIllegal)) return transform.NewReader(xml, t) } gofeed-1.1.3/json/000077500000000000000000000000001403746003700137225ustar00rootroot00000000000000gofeed-1.1.3/json/feed.go000066400000000000000000000165321403746003700151630ustar00rootroot00000000000000package json import "encoding/json" // Feed describes the structure for JSON Feed v1.0 // https://www.jsonfeed.org/version/1/ type Feed struct { Version string `json:"version"` // version (required, string) is the URL of the version of the format the feed uses Title string `json:"title,omitempty"` // title (required, string) is the name of the feed HomePageURL string `json:"home_page_url,omitempty"` // home_page_url (optional but strongly recommended, string) is the URL of the resource that the feed describes. This resource should be an HTML page FeedURL string `json:"feed_url,omitempty"` // feed_url (optional but strongly recommended, string) is the URL of the feed, and serves as the unique identifier for the feed Description string `json:"description,omitempty"` // description (optional, string) UserComment string `json:"user_comment,omitempty"` // user_comment (optional, string) is a description of the purpose of the feed. This is for the use of people looking at the raw JSON, and should be ignored by feed readers. NextURL string `json:"next_url,omitempty"` // next_url (optional, string) is the URL of a feed that provides the next n items. This allows for pagination Icon string `json:"icon,omitempty"` // icon (optional, string) is the URL of an image for the feed suitable to be used in a timeline. It should be square and relatively large — such as 512 x 512 Favicon string `json:"favicon,omitempty"` // favicon (optional, string) is the URL of an image for the feed suitable to be used in a source list. It should be square and relatively small, but not smaller than 64 x 64 Author *Author `json:"author,omitempty"` // author (optional, object) specifies the feed author. The author object has several members. These are all optional — but if you provide an author object, then at least one is required: Expired bool `json:"expired,omitempty"` // expired (optional, boolean) says whether or not the feed is finished — that is, whether or not it will ever update again. Items []*Item `json:"items"` // items is an array, and is required // TODO Hubs // hubs (very optional, array of objects) describes endpoints that can be used to subscribe to real-time notifications from the publisher of this feed. Each object has a type and url, both of which are required. See the section “Subscribing to Real-time Notifications” below for details. // TODO Extensions // Version 1.1 Authors []*Author `json:"authors,omitempty"` Language string `json:"language,omitempty"` } func (f Feed) String() string { json, _ := json.MarshalIndent(f, "", " ") return string(json) } // Item defines an item in the feed type Item struct { ID string `json:"id,omitempty"` // id (required, string) is unique for that item for that feed over time. If an id is presented as a number or other type, a JSON Feed reader must coerce it to a string. Ideally, the id is the full URL of the resource described by the item, since URLs make great unique identifiers. URL string `json:"url,omitempty"` // url (optional, string) is the URL of the resource described by the item. It’s the permalink ExternalURL string `json:"external_url,omitempty"` // external_url (very optional, string) is the URL of a page elsewhere. This is especially useful for linkblogs Title string `json:"title,omitempty"` // title (optional, string) is plain text. Microblog items in particular may omit titles. ContentHTML string `json:"content_html,omitempty"` // content_html and content_text are each optional strings — but one or both must be present. This is the HTML or plain text of the item. Important: the only place HTML is allowed in this format is in content_html. A Twitter-like service might use content_text, while a blog might use content_html. Use whichever makes sense for your resource. (It doesn’t even have to be the same for each item in a feed.) ContentText string `json:"content_text,omitempty"` // Same as above Summary string `json:"summary,omitempty"` // summary (optional, string) is a plain text sentence or two describing the item. Image string `json:"image,omitempty"` // image (optional, string) is the URL of the main image for the item. This image may also appear in the content_html BannerImage string `json:"banner_image,omitempty"` // banner_image (optional, string) is the URL of an image to use as a banner. DatePublished string `json:"date_published,omitempty"` // date_published (optional, string) specifies the date in RFC 3339 format. (Example: 2010-02-07T14:04:00-05:00.) DateModified string `json:"date_modified,omitempty"` // date_modified (optional, string) specifies the modification date in RFC 3339 format. Author *Author `json:"author,omitempty"` // author (optional, object) has the same structure as the top-level author. If not specified in an item, then the top-level author, if present, is the author of the item. Tags []string `json:"tags,omitempty"` // tags (optional, array of strings) can have any plain text values you want. Tags tend to be just one word, but they may be anything. Attachments *[]Attachments `json:"attachments,omitempty"` // attachments (optional, array) lists related resources. Podcasts, for instance, would include an attachment that’s an audio or video file. An individual item may have one or more attachments. // TODO Extensions // Version 1.1 Authors []*Author `json:"authors,omitempty"` Language string `json:"language,omitempty"` } // Author defines the feed author structure. The author object has several members. These are all optional — but if you provide an author object, then at least one is required: type Author struct { Name string `json:"name,omitempty"` // name (optional, string) is the author’s name. URL string `json:"url,omitempty"` // url (optional, string) is the URL of a site owned by the author Avatar string `json:"avatar,omitempty"` // avatar (optional, string) is the URL for an image for the author. It should be square and relatively large — such as 512 x 512 } // Attachments defines the structure for related sources. Podcasts, for instance, would include an attachment that’s an audio or video file type Attachments struct { URL string `json:"url,omitempty"` // url (required, string) specifies the location of the attachment. MimeType string `json:"mime_type,omitempty"` // mime_type (required, string) specifies the type of the attachment, such as “audio/mpeg.” Title string `json:"title,omitempty"` // title (optional, string) is a name for the attachment. Important: if there are multiple attachments, and two or more have the exact same title (when title is present), then they are considered as alternate representations of the same thing. In this way a podcaster, for instance, might provide an audio recording in different formats. SizeInBytes int64 `json:"size_in_bytes,omitempty"` // size_in_bytes (optional, number) specifies how large the file is. DurationInSeconds int64 `json:"duration_in_seconds,omitempty"` // duration_in_seconds (optional, number) specifies how long it takes to listen to or watch, when played at normal speed. } gofeed-1.1.3/json/parser.go000066400000000000000000000007431403746003700155510ustar00rootroot00000000000000package json import ( "bytes" "io" jsoniter "github.com/json-iterator/go" ) var ( j = jsoniter.ConfigCompatibleWithStandardLibrary ) // Parser is an JSON Feed Parser type Parser struct{} // Parse parses an json feed into an json.Feed func (ap *Parser) Parse(feed io.Reader) (*Feed, error) { jsonFeed := &Feed{} buffer := new(bytes.Buffer) buffer.ReadFrom(feed) err := j.Unmarshal(buffer.Bytes(), jsonFeed) if err != nil { return nil, err } return jsonFeed, err } gofeed-1.1.3/json/parser_test.go000066400000000000000000000102411403746003700166020ustar00rootroot00000000000000package json_test import ( "bytes" "encoding/json" "fmt" "io/ioutil" "path/filepath" "strings" "testing" jsonParser "github.com/mmcdole/gofeed/json" "github.com/stretchr/testify/assert" ) // Tests // TODO: add tests for invalid func TestParser_Parse(t *testing.T) { files, _ := filepath.Glob("../testdata/parser/json/*.json") for _, f := range files { base := filepath.Base(f) name := strings.TrimSuffix(base, filepath.Ext(base)) if strings.HasSuffix(name, "expected") { continue } fmt.Printf("Testing %s... ", name) // Get actual source feed ff := fmt.Sprintf("../testdata/parser/json/%s.json", name) f, _ := ioutil.ReadFile(ff) // Parse actual feed fp := &jsonParser.Parser{} actual, _ := fp.Parse(bytes.NewReader(f)) // Get json encoded expected feed result ef := fmt.Sprintf("../testdata/parser/json/%s_expected.json", name) e, _ := ioutil.ReadFile(ef) // Unmarshal expected feed expected := &jsonParser.Feed{} json.Unmarshal(e, &expected) if assert.Equal(t, expected, actual, "Feed file %s.json did not match expected output %s.json", name, name) { fmt.Printf("OK\n") } else { fmt.Printf("Failed\n") } } } // TODO: Remove redundant tests func TestParser_ParseInvalidAndStruct(t *testing.T) { name := "invalid" fmt.Printf("Testing %s... ", name) // Get actual source feed ff := fmt.Sprintf("../testdata/parser/json/invalid/%s.json", name) fmt.Println(ff) f, _ := ioutil.ReadFile(ff) // Parse actual feed fp := &jsonParser.Parser{} _, err := fp.Parse(bytes.NewReader(f)) assert.Contains(t, err.Error(), "expect }") name = "version_json_10" fmt.Printf("Testing %s... ", name) // Get actual source feed ff = fmt.Sprintf("../testdata/parser/json/%s.json", name) fmt.Println(ff) f, _ = ioutil.ReadFile(ff) // Parse actual feed actual, _ := fp.Parse(bytes.NewReader(f)) assert.Equal(t, "1.0", actual.Version) assert.Equal(t, "title", actual.Title) assert.Equal(t, "https://sample-json-feed.com", actual.HomePageURL) assert.Equal(t, "https://sample-json-feed.com/feed.json", actual.FeedURL) assert.Equal(t, "description", actual.Description) assert.Equal(t, "user_comment", actual.UserComment) assert.Equal(t, "https://sample-json-feed.com/feed.json?next=500", actual.NextURL) assert.Equal(t, "https://sample-json-feed.com/icon.png", actual.Icon) assert.Equal(t, "https://sample-json-feed.com/favicon.png", actual.Favicon) assert.Equal(t, "author_name", actual.Author.Name) assert.Equal(t, "https://sample-feed-author.com", actual.Author.URL) assert.Equal(t, "https://sample-feed-author.com/me.png", actual.Author.Avatar) assert.Equal(t, false, actual.Expired) assert.Equal(t, "id", actual.Items[0].ID) assert.Equal(t, "https://sample-json-feed.com/id", actual.Items[0].URL) assert.Equal(t, "https://sample-json-feed.com/external", actual.Items[0].ExternalURL) assert.Equal(t, "title", actual.Items[0].Title) assert.Contains(t, actual.Items[0].ContentHTML, "content_html") assert.Equal(t, "content_text", actual.Items[0].ContentText) assert.Equal(t, "summary", actual.Items[0].Summary) assert.Equal(t, "https://sample-json-feed.com/image.png", actual.Items[0].Image) assert.Equal(t, "https://sample-json-feed.com/banner_image.png", actual.Items[0].BannerImage) assert.Equal(t, "2019-10-12T07:20:50.52Z", actual.Items[0].DatePublished) assert.Equal(t, "2019-10-12T07:20:50.52Z", actual.Items[0].DateModified) assert.Equal(t, "author_name", actual.Items[0].Author.Name) assert.Equal(t, "https://sample-feed-author.com", actual.Items[0].Author.URL) assert.Equal(t, "https://sample-feed-author.com/me.png", actual.Items[0].Author.Avatar) assert.Equal(t, "tag1", actual.Items[0].Tags[0]) assert.Equal(t, "tag2", actual.Items[0].Tags[1]) assert.Equal(t, "https://sample-json-feed.com/attachment", (*actual.Items[0].Attachments)[0].URL) assert.Equal(t, "audio/mpeg", (*actual.Items[0].Attachments)[0].MimeType) assert.Equal(t, "title", (*actual.Items[0].Attachments)[0].Title) assert.Equal(t, int64(100), (*actual.Items[0].Attachments)[0].SizeInBytes) assert.Equal(t, int64(100), (*actual.Items[0].Attachments)[0].DurationInSeconds) assert.Contains(t, actual.String(), "https://sample-json-feed.com/attachment") } // TODO: Examples gofeed-1.1.3/parser.go000066400000000000000000000104731403746003700146010ustar00rootroot00000000000000package gofeed import ( "bytes" "context" "errors" "fmt" "io" "net/http" "strings" "github.com/mmcdole/gofeed/atom" "github.com/mmcdole/gofeed/json" "github.com/mmcdole/gofeed/rss" ) // ErrFeedTypeNotDetected is returned when the detection system can not figure // out the Feed format var ErrFeedTypeNotDetected = errors.New("Failed to detect feed type") // HTTPError represents an HTTP error returned by a server. type HTTPError struct { StatusCode int Status string } func (err HTTPError) Error() string { return fmt.Sprintf("http error: %s", err.Status) } // Parser is a universal feed parser that detects // a given feed type, parsers it, and translates it // to the universal feed type. type Parser struct { AtomTranslator Translator RSSTranslator Translator JSONTranslator Translator UserAgent string Client *http.Client rp *rss.Parser ap *atom.Parser jp *json.Parser } // NewParser creates a universal feed parser. func NewParser() *Parser { fp := Parser{ rp: &rss.Parser{}, ap: &atom.Parser{}, jp: &json.Parser{}, UserAgent: "Gofeed/1.0", } return &fp } // Parse parses a RSS or Atom or JSON feed into // the universal gofeed.Feed. It takes an // io.Reader which should return the xml/json content. func (f *Parser) Parse(feed io.Reader) (*Feed, error) { // Wrap the feed io.Reader in a io.TeeReader // so we can capture all the bytes read by the // DetectFeedType function and construct a new // reader with those bytes intact for when we // attempt to parse the feeds. var buf bytes.Buffer tee := io.TeeReader(feed, &buf) feedType := DetectFeedType(tee) // Glue the read bytes from the detect function // back into a new reader r := io.MultiReader(&buf, feed) switch feedType { case FeedTypeAtom: return f.parseAtomFeed(r) case FeedTypeRSS: return f.parseRSSFeed(r) case FeedTypeJSON: return f.parseJSONFeed(r) } return nil, ErrFeedTypeNotDetected } // ParseURL fetches the contents of a given url and // attempts to parse the response into the universal feed type. func (f *Parser) ParseURL(feedURL string) (feed *Feed, err error) { return f.ParseURLWithContext(feedURL, context.Background()) } // ParseURLWithContext fetches contents of a given url and // attempts to parse the response into the universal feed type. // Request could be canceled or timeout via given context func (f *Parser) ParseURLWithContext(feedURL string, ctx context.Context) (feed *Feed, err error) { client := f.httpClient() req, err := http.NewRequest("GET", feedURL, nil) if err != nil { return nil, err } req = req.WithContext(ctx) req.Header.Set("User-Agent", f.UserAgent) resp, err := client.Do(req) if err != nil { return nil, err } if resp != nil { defer func() { ce := resp.Body.Close() if ce != nil { err = ce } }() } if resp.StatusCode < 200 || resp.StatusCode >= 300 { return nil, HTTPError{ StatusCode: resp.StatusCode, Status: resp.Status, } } return f.Parse(resp.Body) } // ParseString parses a feed XML string and into the // universal feed type. func (f *Parser) ParseString(feed string) (*Feed, error) { return f.Parse(strings.NewReader(feed)) } func (f *Parser) parseAtomFeed(feed io.Reader) (*Feed, error) { af, err := f.ap.Parse(feed) if err != nil { return nil, err } return f.atomTrans().Translate(af) } func (f *Parser) parseRSSFeed(feed io.Reader) (*Feed, error) { rf, err := f.rp.Parse(feed) if err != nil { return nil, err } return f.rssTrans().Translate(rf) } func (f *Parser) parseJSONFeed(feed io.Reader) (*Feed, error) { jf, err := f.jp.Parse(feed) if err != nil { return nil, err } return f.jsonTrans().Translate(jf) } func (f *Parser) atomTrans() Translator { if f.AtomTranslator != nil { return f.AtomTranslator } f.AtomTranslator = &DefaultAtomTranslator{} return f.AtomTranslator } func (f *Parser) rssTrans() Translator { if f.RSSTranslator != nil { return f.RSSTranslator } f.RSSTranslator = &DefaultRSSTranslator{} return f.RSSTranslator } func (f *Parser) jsonTrans() Translator { if f.JSONTranslator != nil { return f.JSONTranslator } f.JSONTranslator = &DefaultJSONTranslator{} return f.JSONTranslator } func (f *Parser) httpClient() *http.Client { if f.Client != nil { return f.Client } f.Client = &http.Client{} return f.Client } gofeed-1.1.3/parser_test.go000066400000000000000000000131261403746003700156360ustar00rootroot00000000000000package gofeed_test import ( "bytes" "context" "fmt" "io" "io/ioutil" "net/http" "net/http/httptest" "net/url" "strings" "testing" "time" "github.com/mmcdole/gofeed" "github.com/stretchr/testify/assert" ) func TestParser_Parse(t *testing.T) { var feedTests = []struct { file string feedType string feedTitle string hasError bool }{ {"atom03_feed.xml", "atom", "Feed Title", false}, {"atom10_feed.xml", "atom", "Feed Title", false}, {"rss_feed.xml", "rss", "Feed Title", false}, {"rss_feed_bom.xml", "rss", "Feed Title", false}, {"rss_feed_leading_spaces.xml", "rss", "Feed Title", false}, {"rdf_feed.xml", "rss", "Feed Title", false}, {"sample.json", "json", "title", false}, {"json10_feed.json", "json", "title", false}, {"json11_feed.json", "json", "title", false}, {"unknown_feed.xml", "", "", true}, {"empty_feed.xml", "", "", true}, {"invalid.json", "", "", true}, } for _, test := range feedTests { fmt.Printf("Testing %s... ", test.file) // Get feed content path := fmt.Sprintf("testdata/parser/universal/%s", test.file) f, _ := ioutil.ReadFile(path) // Get actual value fp := gofeed.NewParser() feed, err := fp.Parse(bytes.NewReader(f)) if test.hasError { assert.NotNil(t, err) assert.Nil(t, feed) } else { assert.NotNil(t, feed) assert.Nil(t, err) assert.Equal(t, feed.FeedType, test.feedType) assert.Equal(t, feed.Title, test.feedTitle) } } } func TestParser_ParseString(t *testing.T) { var feedTests = []struct { file string feedType string feedTitle string hasError bool }{ {"atom03_feed.xml", "atom", "Feed Title", false}, {"atom10_feed.xml", "atom", "Feed Title", false}, {"rss_feed.xml", "rss", "Feed Title", false}, {"rss_feed_bom.xml", "rss", "Feed Title", false}, {"rss_feed_leading_spaces.xml", "rss", "Feed Title", false}, {"rdf_feed.xml", "rss", "Feed Title", false}, {"sample.json", "json", "title", false}, {"unknown_feed.xml", "", "", true}, {"empty_feed.xml", "", "", true}, {"invalid.json", "", "", true}, } for _, test := range feedTests { fmt.Printf("Testing %s... ", test.file) // Get feed content path := fmt.Sprintf("testdata/parser/universal/%s", test.file) f, _ := ioutil.ReadFile(path) // Get actual value fp := gofeed.NewParser() feed, err := fp.ParseString(string(f)) if test.hasError { assert.NotNil(t, err) assert.Nil(t, feed) } else { assert.NotNil(t, feed) assert.Nil(t, err) assert.Equal(t, feed.FeedType, test.feedType) assert.Equal(t, feed.Title, test.feedTitle) } } } func TestParser_ParseURL_Success(t *testing.T) { var feedTests = []struct { file string feedType string feedTitle string hasError bool }{ {"atom03_feed.xml", "atom", "Feed Title", false}, {"atom10_feed.xml", "atom", "Feed Title", false}, {"rss_feed.xml", "rss", "Feed Title", false}, {"rss_feed_bom.xml", "rss", "Feed Title", false}, {"rss_feed_leading_spaces.xml", "rss", "Feed Title", false}, {"rdf_feed.xml", "rss", "Feed Title", false}, {"json10_feed.json", "json", "title", false}, {"json11_feed.json", "json", "title", false}, {"unknown_feed.xml", "", "", true}, {"invalid.json", "", "", true}, } for _, test := range feedTests { fmt.Printf("Testing %s... ", test.file) // Get feed content path := fmt.Sprintf("testdata/parser/universal/%s", test.file) f, _ := ioutil.ReadFile(path) // Get actual value server, client := mockServerResponse(200, string(f), 0) fp := gofeed.NewParser() fp.Client = client feed, err := fp.ParseURL(server.URL) if test.hasError { assert.NotNil(t, err) assert.Nil(t, feed) } else { assert.NotNil(t, feed) assert.Nil(t, err) assert.Equal(t, feed.FeedType, test.feedType) assert.Equal(t, feed.Title, test.feedTitle) } } } func TestParser_ParseURLWithContext(t *testing.T) { server, client := mockServerResponse(404, "", 1*time.Minute) ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() fp := gofeed.NewParser() fp.Client = client _, err := fp.ParseURLWithContext(server.URL, ctx) assert.True(t, strings.Contains(err.Error(), ctx.Err().Error())) } func TestParser_ParseURL_Failure(t *testing.T) { server, client := mockServerResponse(404, "", 0) fp := gofeed.NewParser() fp.Client = client feed, err := fp.ParseURL(server.URL) assert.NotNil(t, err) assert.IsType(t, gofeed.HTTPError{}, err) assert.Nil(t, feed) } // Test Helpers func mockServerResponse(code int, body string, delay time.Duration) (*httptest.Server, *http.Client) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { time.Sleep(delay) w.WriteHeader(code) w.Header().Set("Content-Type", "application/xml") io.WriteString(w, body) })) transport := &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse(server.URL) }, } client := &http.Client{Transport: transport} return server, client } // Examples func ExampleParser_Parse() { feedData := ` Sample Feed ` fp := gofeed.NewParser() feed, err := fp.Parse(strings.NewReader(feedData)) if err != nil { panic(err) } fmt.Println(feed.Title) } func ExampleParser_ParseURL() { fp := gofeed.NewParser() feed, err := fp.ParseURL("http://feeds.twit.tv/twit.xml") if err != nil { panic(err) } fmt.Println(feed.Title) } func ExampleParser_ParseString() { feedData := ` Sample Feed ` fp := gofeed.NewParser() feed, err := fp.ParseString(feedData) if err != nil { panic(err) } fmt.Println(feed.Title) } gofeed-1.1.3/rss/000077500000000000000000000000001403746003700135605ustar00rootroot00000000000000gofeed-1.1.3/rss/feed.go000066400000000000000000000117531403746003700150210ustar00rootroot00000000000000package rss import ( "encoding/json" "time" ext "github.com/mmcdole/gofeed/extensions" ) // Feed is an RSS Feed type Feed struct { Title string `json:"title,omitempty"` Link string `json:"link,omitempty"` Description string `json:"description,omitempty"` Language string `json:"language,omitempty"` Copyright string `json:"copyright,omitempty"` ManagingEditor string `json:"managingEditor,omitempty"` WebMaster string `json:"webMaster,omitempty"` PubDate string `json:"pubDate,omitempty"` PubDateParsed *time.Time `json:"pubDateParsed,omitempty"` LastBuildDate string `json:"lastBuildDate,omitempty"` LastBuildDateParsed *time.Time `json:"lastBuildDateParsed,omitempty"` Categories []*Category `json:"categories,omitempty"` Generator string `json:"generator,omitempty"` Docs string `json:"docs,omitempty"` TTL string `json:"ttl,omitempty"` Image *Image `json:"image,omitempty"` Rating string `json:"rating,omitempty"` SkipHours []string `json:"skipHours,omitempty"` SkipDays []string `json:"skipDays,omitempty"` Cloud *Cloud `json:"cloud,omitempty"` TextInput *TextInput `json:"textInput,omitempty"` DublinCoreExt *ext.DublinCoreExtension `json:"dcExt,omitempty"` ITunesExt *ext.ITunesFeedExtension `json:"itunesExt,omitempty"` Extensions ext.Extensions `json:"extensions,omitempty"` Items []*Item `json:"items"` Version string `json:"version"` } func (f Feed) String() string { json, _ := json.MarshalIndent(f, "", " ") return string(json) } // Item is an RSS Item type Item struct { Title string `json:"title,omitempty"` Link string `json:"link,omitempty"` Description string `json:"description,omitempty"` Content string `json:"content,omitempty"` Author string `json:"author,omitempty"` Categories []*Category `json:"categories,omitempty"` Comments string `json:"comments,omitempty"` Enclosure *Enclosure `json:"enclosure,omitempty"` GUID *GUID `json:"guid,omitempty"` PubDate string `json:"pubDate,omitempty"` PubDateParsed *time.Time `json:"pubDateParsed,omitempty"` Source *Source `json:"source,omitempty"` DublinCoreExt *ext.DublinCoreExtension `json:"dcExt,omitempty"` ITunesExt *ext.ITunesItemExtension `json:"itunesExt,omitempty"` Extensions ext.Extensions `json:"extensions,omitempty"` Custom map[string]string `json:"custom,omitempty"` } // Image is an image that represents the feed type Image struct { URL string `json:"url,omitempty"` Link string `json:"link,omitempty"` Title string `json:"title,omitempty"` Width string `json:"width,omitempty"` Height string `json:"height,omitempty"` Description string `json:"description,omitempty"` } // Enclosure is a media object that is attached to // the item type Enclosure struct { URL string `json:"url,omitempty"` Length string `json:"length,omitempty"` Type string `json:"type,omitempty"` } // GUID is a unique identifier for an item type GUID struct { Value string `json:"value,omitempty"` IsPermalink string `json:"isPermalink,omitempty"` } // Source contains feed information for another // feed if a given item came from that feed type Source struct { Title string `json:"title,omitempty"` URL string `json:"url,omitempty"` } // Category is category metadata for Feeds and Entries type Category struct { Domain string `json:"domain,omitempty"` Value string `json:"value,omitempty"` } // TextInput specifies a text input box that // can be displayed with the channel type TextInput struct { Title string `json:"title,omitempty"` Description string `json:"description,omitempty"` Name string `json:"name,omitempty"` Link string `json:"link,omitempty"` } // Cloud allows processes to register with a // cloud to be notified of updates to the channel, // implementing a lightweight publish-subscribe protocol // for RSS feeds type Cloud struct { Domain string `json:"domain,omitempty"` Port string `json:"port,omitempty"` Path string `json:"path,omitempty"` RegisterProcedure string `json:"registerProcedure,omitempty"` Protocol string `json:"protocol,omitempty"` } gofeed-1.1.3/rss/parser.go000066400000000000000000000372061403746003700154130ustar00rootroot00000000000000package rss import ( "fmt" "io" "strings" ext "github.com/mmcdole/gofeed/extensions" "github.com/mmcdole/gofeed/internal/shared" xpp "github.com/mmcdole/goxpp" ) // Parser is a RSS Parser type Parser struct { base *shared.XMLBase } // Parse parses an xml feed into an rss.Feed func (rp *Parser) Parse(feed io.Reader) (*Feed, error) { p := xpp.NewXMLPullParser(feed, false, shared.NewReaderLabel) rp.base = &shared.XMLBase{} _, err := rp.base.FindRoot(p) if err != nil { return nil, err } return rp.parseRoot(p) } func (rp *Parser) parseRoot(p *xpp.XMLPullParser) (*Feed, error) { rssErr := p.Expect(xpp.StartTag, "rss") rdfErr := p.Expect(xpp.StartTag, "rdf") if rssErr != nil && rdfErr != nil { return nil, fmt.Errorf("%s or %s", rssErr.Error(), rdfErr.Error()) } // Items found in feed root var channel *Feed var textinput *TextInput var image *Image items := []*Item{} ver := rp.parseVersion(p) for { tok, err := rp.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { // Skip any extensions found in the feed root. if shared.IsExtension(p) { p.Skip() continue } name := strings.ToLower(p.Name) if name == "channel" { channel, err = rp.parseChannel(p) if err != nil { return nil, err } } else if name == "item" { item, err := rp.parseItem(p) if err != nil { return nil, err } items = append(items, item) } else if name == "textinput" { textinput, err = rp.parseTextInput(p) if err != nil { return nil, err } } else if name == "image" { image, err = rp.parseImage(p) if err != nil { return nil, err } } else { p.Skip() } } } rssErr = p.Expect(xpp.EndTag, "rss") rdfErr = p.Expect(xpp.EndTag, "rdf") if rssErr != nil && rdfErr != nil { return nil, fmt.Errorf("%s or %s", rssErr.Error(), rdfErr.Error()) } if channel == nil { channel = &Feed{} channel.Items = []*Item{} } if len(items) > 0 { channel.Items = append(channel.Items, items...) } if textinput != nil { channel.TextInput = textinput } if image != nil { channel.Image = image } channel.Version = ver return channel, nil } func (rp *Parser) parseChannel(p *xpp.XMLPullParser) (rss *Feed, err error) { if err = p.Expect(xpp.StartTag, "channel"); err != nil { return nil, err } rss = &Feed{} rss.Items = []*Item{} extensions := ext.Extensions{} categories := []*Category{} for { tok, err := rp.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if shared.IsExtension(p) { ext, err := shared.ParseExtension(extensions, p) if err != nil { return nil, err } extensions = ext } else if name == "title" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.Title = result } else if name == "description" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.Description = result } else if name == "link" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.Link = result } else if name == "language" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.Language = result } else if name == "copyright" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.Copyright = result } else if name == "managingeditor" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.ManagingEditor = result } else if name == "webmaster" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.WebMaster = result } else if name == "pubdate" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.PubDate = result date, err := shared.ParseDate(result) if err == nil { utcDate := date.UTC() rss.PubDateParsed = &utcDate } } else if name == "lastbuilddate" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.LastBuildDate = result date, err := shared.ParseDate(result) if err == nil { utcDate := date.UTC() rss.LastBuildDateParsed = &utcDate } } else if name == "generator" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.Generator = result } else if name == "docs" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.Docs = result } else if name == "ttl" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.TTL = result } else if name == "rating" { result, err := shared.ParseText(p) if err != nil { return nil, err } rss.Rating = result } else if name == "skiphours" { result, err := rp.parseSkipHours(p) if err != nil { return nil, err } rss.SkipHours = result } else if name == "skipdays" { result, err := rp.parseSkipDays(p) if err != nil { return nil, err } rss.SkipDays = result } else if name == "item" { result, err := rp.parseItem(p) if err != nil { return nil, err } rss.Items = append(rss.Items, result) } else if name == "cloud" { result, err := rp.parseCloud(p) if err != nil { return nil, err } rss.Cloud = result } else if name == "category" { result, err := rp.parseCategory(p) if err != nil { return nil, err } categories = append(categories, result) } else if name == "image" { result, err := rp.parseImage(p) if err != nil { return nil, err } rss.Image = result } else if name == "textinput" { result, err := rp.parseTextInput(p) if err != nil { return nil, err } rss.TextInput = result } else { // Skip element as it isn't an extension and not // part of the spec p.Skip() } } } if err = p.Expect(xpp.EndTag, "channel"); err != nil { return nil, err } if len(categories) > 0 { rss.Categories = categories } if len(extensions) > 0 { rss.Extensions = extensions if itunes, ok := rss.Extensions["itunes"]; ok { rss.ITunesExt = ext.NewITunesFeedExtension(itunes) } if dc, ok := rss.Extensions["dc"]; ok { rss.DublinCoreExt = ext.NewDublinCoreExtension(dc) } } return rss, nil } func (rp *Parser) parseItem(p *xpp.XMLPullParser) (item *Item, err error) { if err = p.Expect(xpp.StartTag, "item"); err != nil { return nil, err } item = &Item{} extensions := ext.Extensions{} categories := []*Category{} for { tok, err := rp.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if shared.IsExtension(p) { ext, err := shared.ParseExtension(extensions, p) if err != nil { return nil, err } item.Extensions = ext } else if name == "title" { result, err := shared.ParseText(p) if err != nil { return nil, err } item.Title = result } else if name == "description" { result, err := shared.ParseText(p) if err != nil { return nil, err } item.Description = result } else if name == "encoded" { space := strings.TrimSpace(p.Space) if prefix, ok := p.Spaces[space]; ok && prefix == "content" { result, err := shared.ParseText(p) if err != nil { return nil, err } item.Content = result } } else if name == "link" { result, err := shared.ParseText(p) if err != nil { return nil, err } item.Link = result } else if name == "author" { result, err := shared.ParseText(p) if err != nil { return nil, err } item.Author = result } else if name == "comments" { result, err := shared.ParseText(p) if err != nil { return nil, err } item.Comments = result } else if name == "pubdate" { result, err := shared.ParseText(p) if err != nil { return nil, err } item.PubDate = result date, err := shared.ParseDate(result) if err == nil { utcDate := date.UTC() item.PubDateParsed = &utcDate } } else if name == "source" { result, err := rp.parseSource(p) if err != nil { return nil, err } item.Source = result } else if name == "enclosure" { result, err := rp.parseEnclosure(p) if err != nil { return nil, err } item.Enclosure = result } else if name == "guid" { result, err := rp.parseGUID(p) if err != nil { return nil, err } item.GUID = result } else if name == "category" { result, err := rp.parseCategory(p) if err != nil { return nil, err } categories = append(categories, result) } else { result, err := shared.ParseText(p) if err != nil { continue } if item.Custom == nil { item.Custom = make(map[string]string, 0) } item.Custom[name] = result } } } if len(categories) > 0 { item.Categories = categories } if len(extensions) > 0 { item.Extensions = extensions if itunes, ok := item.Extensions["itunes"]; ok { item.ITunesExt = ext.NewITunesItemExtension(itunes) } if dc, ok := item.Extensions["dc"]; ok { item.DublinCoreExt = ext.NewDublinCoreExtension(dc) } } if err = p.Expect(xpp.EndTag, "item"); err != nil { return nil, err } return item, nil } func (rp *Parser) parseSource(p *xpp.XMLPullParser) (source *Source, err error) { if err = p.Expect(xpp.StartTag, "source"); err != nil { return nil, err } source = &Source{} source.URL = p.Attribute("url") result, err := shared.ParseText(p) if err != nil { return source, err } source.Title = result if err = p.Expect(xpp.EndTag, "source"); err != nil { return nil, err } return source, nil } func (rp *Parser) parseEnclosure(p *xpp.XMLPullParser) (enclosure *Enclosure, err error) { if err = p.Expect(xpp.StartTag, "enclosure"); err != nil { return nil, err } enclosure = &Enclosure{} enclosure.URL = p.Attribute("url") enclosure.Length = p.Attribute("length") enclosure.Type = p.Attribute("type") // Ignore any enclosure text _, err = p.NextText() if err != nil { return enclosure, err } if err = p.Expect(xpp.EndTag, "enclosure"); err != nil { return nil, err } return enclosure, nil } func (rp *Parser) parseImage(p *xpp.XMLPullParser) (image *Image, err error) { if err = p.Expect(xpp.StartTag, "image"); err != nil { return nil, err } image = &Image{} for { tok, err := rp.base.NextTag(p) if err != nil { return image, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if name == "url" { result, err := shared.ParseText(p) if err != nil { return nil, err } image.URL = result } else if name == "title" { result, err := shared.ParseText(p) if err != nil { return nil, err } image.Title = result } else if name == "link" { result, err := shared.ParseText(p) if err != nil { return nil, err } image.Link = result } else if name == "width" { result, err := shared.ParseText(p) if err != nil { return nil, err } image.Width = result } else if name == "height" { result, err := shared.ParseText(p) if err != nil { return nil, err } image.Height = result } else if name == "description" { result, err := shared.ParseText(p) if err != nil { return nil, err } image.Description = result } else { p.Skip() } } } if err = p.Expect(xpp.EndTag, "image"); err != nil { return nil, err } return image, nil } func (rp *Parser) parseGUID(p *xpp.XMLPullParser) (guid *GUID, err error) { if err = p.Expect(xpp.StartTag, "guid"); err != nil { return nil, err } guid = &GUID{} guid.IsPermalink = p.Attribute("isPermalink") result, err := shared.ParseText(p) if err != nil { return } guid.Value = result if err = p.Expect(xpp.EndTag, "guid"); err != nil { return nil, err } return guid, nil } func (rp *Parser) parseCategory(p *xpp.XMLPullParser) (cat *Category, err error) { if err = p.Expect(xpp.StartTag, "category"); err != nil { return nil, err } cat = &Category{} cat.Domain = p.Attribute("domain") result, err := shared.ParseText(p) if err != nil { return nil, err } cat.Value = result if err = p.Expect(xpp.EndTag, "category"); err != nil { return nil, err } return cat, nil } func (rp *Parser) parseTextInput(p *xpp.XMLPullParser) (*TextInput, error) { if err := p.Expect(xpp.StartTag, "textinput"); err != nil { return nil, err } ti := &TextInput{} for { tok, err := rp.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if name == "title" { result, err := shared.ParseText(p) if err != nil { return nil, err } ti.Title = result } else if name == "description" { result, err := shared.ParseText(p) if err != nil { return nil, err } ti.Description = result } else if name == "name" { result, err := shared.ParseText(p) if err != nil { return nil, err } ti.Name = result } else if name == "link" { result, err := shared.ParseText(p) if err != nil { return nil, err } ti.Link = result } else { p.Skip() } } } if err := p.Expect(xpp.EndTag, "textinput"); err != nil { return nil, err } return ti, nil } func (rp *Parser) parseSkipHours(p *xpp.XMLPullParser) ([]string, error) { if err := p.Expect(xpp.StartTag, "skiphours"); err != nil { return nil, err } hours := []string{} for { tok, err := rp.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if name == "hour" { result, err := shared.ParseText(p) if err != nil { return nil, err } hours = append(hours, result) } else { p.Skip() } } } if err := p.Expect(xpp.EndTag, "skiphours"); err != nil { return nil, err } return hours, nil } func (rp *Parser) parseSkipDays(p *xpp.XMLPullParser) ([]string, error) { if err := p.Expect(xpp.StartTag, "skipdays"); err != nil { return nil, err } days := []string{} for { tok, err := rp.base.NextTag(p) if err != nil { return nil, err } if tok == xpp.EndTag { break } if tok == xpp.StartTag { name := strings.ToLower(p.Name) if name == "day" { result, err := shared.ParseText(p) if err != nil { return nil, err } days = append(days, result) } else { p.Skip() } } } if err := p.Expect(xpp.EndTag, "skipdays"); err != nil { return nil, err } return days, nil } func (rp *Parser) parseCloud(p *xpp.XMLPullParser) (*Cloud, error) { if err := p.Expect(xpp.StartTag, "cloud"); err != nil { return nil, err } cloud := &Cloud{} cloud.Domain = p.Attribute("domain") cloud.Port = p.Attribute("port") cloud.Path = p.Attribute("path") cloud.RegisterProcedure = p.Attribute("registerProcedure") cloud.Protocol = p.Attribute("protocol") rp.base.NextTag(p) if err := p.Expect(xpp.EndTag, "cloud"); err != nil { return nil, err } return cloud, nil } func (rp *Parser) parseVersion(p *xpp.XMLPullParser) (ver string) { name := strings.ToLower(p.Name) if name == "rss" { ver = p.Attribute("version") } else if name == "rdf" { ns := p.Attribute("xmlns") if ns == "http://channel.netscape.com/rdf/simple/0.9/" || ns == "http://my.netscape.com/rdf/simple/0.9/" { ver = "0.9" } else if ns == "http://purl.org/rss/1.0/" { ver = "1.0" } } return } gofeed-1.1.3/rss/parser_test.go000066400000000000000000000020431403746003700164410ustar00rootroot00000000000000package rss_test import ( "bytes" "encoding/json" "fmt" "io/ioutil" "path/filepath" "strings" "testing" "github.com/mmcdole/gofeed/rss" "github.com/stretchr/testify/assert" ) func TestParser_Parse(t *testing.T) { files, _ := filepath.Glob("../testdata/parser/rss/*.xml") for _, f := range files { base := filepath.Base(f) name := strings.TrimSuffix(base, filepath.Ext(base)) fmt.Printf("Testing %s... ", name) // Get actual source feed ff := fmt.Sprintf("../testdata/parser/rss/%s.xml", name) f, _ := ioutil.ReadFile(ff) // Parse actual feed fp := &rss.Parser{} actual, _ := fp.Parse(bytes.NewReader(f)) // Get json encoded expected feed result ef := fmt.Sprintf("../testdata/parser/rss/%s.json", name) e, _ := ioutil.ReadFile(ef) // Unmarshal expected feed expected := &rss.Feed{} json.Unmarshal(e, &expected) if assert.Equal(t, expected, actual, "Feed file %s.xml did not match expected output %s.json", name, name) { fmt.Printf("OK\n") } else { fmt.Printf("Failed\n") } } } // TODO: Examples gofeed-1.1.3/testdata/000077500000000000000000000000001403746003700145625ustar00rootroot00000000000000gofeed-1.1.3/testdata/extensions/000077500000000000000000000000001403746003700167615ustar00rootroot00000000000000gofeed-1.1.3/testdata/extensions/itunes/000077500000000000000000000000001403746003700202705ustar00rootroot00000000000000gofeed-1.1.3/testdata/extensions/itunes/itunes_item_summary_cdata_multi.json000066400000000000000000000011611403746003700276320ustar00rootroot00000000000000{ "items": [ { "itunesExt": { "summary": "Line 1\n Line 2\n Line 3" }, "extensions": { "itunes": { "summary": [ { "name": "summary", "value": "Line 1\n Line 2\n Line 3", "attrs": {}, "children": {} } ] } } } ], "feedType": "rss", "feedVersion": "2.0" } gofeed-1.1.3/testdata/extensions/itunes/itunes_item_summary_cdata_multi.xml000066400000000000000000000004301403746003700274570ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/000077500000000000000000000000001403746003700160565ustar00rootroot00000000000000gofeed-1.1.3/testdata/parser/atom/000077500000000000000000000000001403746003700170165ustar00rootroot00000000000000gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_email.json000066400000000000000000000002011403746003700245210ustar00rootroot00000000000000{ "authors": [ { "email": "email@example.org" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_email.xml000066400000000000000000000002431403746003700243560ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_homepage.json000066400000000000000000000002001403746003700252160ustar00rootroot00000000000000{ "authors": [ { "uri": "http://example.org" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_homepage.xml000066400000000000000000000002541403746003700250560ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_mixed_content.json000066400000000000000000000001721403746003700263010ustar00rootroot00000000000000{ "authors": [ { "name": "Author Name" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_mixed_content.xml000066400000000000000000000002661403746003700261340ustar00rootroot00000000000000 Author Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_name.json000066400000000000000000000001721403746003700243610ustar00rootroot00000000000000{ "authors": [ { "name": "Author Name" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_name.xml000066400000000000000000000002311403746003700242040ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_uri.json000066400000000000000000000002001403746003700242300ustar00rootroot00000000000000{ "authors": [ { "uri": "http://example.org" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_uri.xml000066400000000000000000000002351403746003700240670ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_url.json000066400000000000000000000002001403746003700242330ustar00rootroot00000000000000{ "authors": [ { "uri": "http://example.org" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_author_url.xml000066400000000000000000000002351403746003700240720ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_email.json000066400000000000000000000002061403746003700255760ustar00rootroot00000000000000{ "contributors": [ { "email": "email@example.org" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_email.xml000066400000000000000000000002611403746003700254260ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_homepage.json000066400000000000000000000002051403746003700262730ustar00rootroot00000000000000{ "contributors": [ { "uri": "http://example.org" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_homepage.xml000066400000000000000000000002731403746003700261270ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_mixed_content.json000066400000000000000000000002041403746003700273450ustar00rootroot00000000000000{ "contributors": [ { "name": "Contributor Name" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_mixed_content.xml000066400000000000000000000003121403746003700271740ustar00rootroot00000000000000 Contributor Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_multiple.json000066400000000000000000000005571403746003700263530ustar00rootroot00000000000000{ "contributors": [ { "name": "Contributor Name 1", "email": "email@example.org", "uri": "http://example.org/1" }, { "name": "Contributor Name 2", "email": "email2@example.org", "uri": "http://example.org/2" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_multiple.xml000066400000000000000000000006031403746003700261720ustar00rootroot00000000000000 Contributor Name 1 email@example.org http://example.org/1 Contributor Name 2 email2@example.org http://example.org/2 gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_name.json000066400000000000000000000002041403746003700254250ustar00rootroot00000000000000{ "contributors": [ { "name": "Contributor Name" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_name.xml000066400000000000000000000002551403746003700252620ustar00rootroot00000000000000 Contributor Name gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_uri.json000066400000000000000000000002051403746003700253050ustar00rootroot00000000000000{ "contributors": [ { "uri": "http://example.org" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_uri.xml000066400000000000000000000002541403746003700251400ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_url.json000066400000000000000000000002051403746003700253100ustar00rootroot00000000000000{ "contributors": [ { "uri": "http://example.org" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_contributor_url.xml000066400000000000000000000002541403746003700251430ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright.json000066400000000000000000000001141403746003700240630ustar00rootroot00000000000000{ "rights": "Feed Copyright", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright.xml000066400000000000000000000002131403746003700237120ustar00rootroot00000000000000 Feed Copyright gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_base64.json000066400000000000000000000001141403746003700252270ustar00rootroot00000000000000{ "rights": "Feed Copyright", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_base64.xml000066400000000000000000000002511403746003700250600ustar00rootroot00000000000000 RmVlZCBDb3B5cmlnaHQ= gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_base64_escaped_markup.json000066400000000000000000000001371403746003700302770ustar00rootroot00000000000000{ "rights": "<p>Feed Copyright</p>", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_base64_escaped_markup.xml000066400000000000000000000003201403746003700301200ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RmVlZCBDb3B5cmlnaHQmbHQ7L3AmZ3Q7 gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_html_escaped_markup.json000066400000000000000000000001231403746003700301520ustar00rootroot00000000000000{ "rights": "

Feed Copyright

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_html_escaped_markup.xml000066400000000000000000000003251403746003700300050ustar00rootroot00000000000000 <p>Feed Copyright</p> gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_naked_markup.json000066400000000000000000000001231403746003700266040ustar00rootroot00000000000000{ "rights": "

Feed Copyright

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_naked_markup.xml000066400000000000000000000002421403746003700264350ustar00rootroot00000000000000

Feed Copyright

gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_text.json000066400000000000000000000001141403746003700251270ustar00rootroot00000000000000{ "rights": "Feed Copyright", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_text.xml000066400000000000000000000002451403746003700247630ustar00rootroot00000000000000 Feed Copyright gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_xhtml_escaped_markup.json000066400000000000000000000001371403746003700303470ustar00rootroot00000000000000{ "rights": "<p>Feed Copyright</p>", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_xhtml_escaped_markup.xml000066400000000000000000000004141403746003700301740ustar00rootroot00000000000000
<p>Feed Copyright</p>
gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_xhtml_inline_markup.json000066400000000000000000000001231403746003700302140ustar00rootroot00000000000000{ "rights": "

Feed Copyright

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_copyright_xhtml_inline_markup.xml000066400000000000000000000003761403746003700300550ustar00rootroot00000000000000

Feed Copyright

gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_email.json000066400000000000000000000003011403746003700257430ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "email": "email@example.org" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_email.xml000066400000000000000000000003031403746003700255740ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_homepage.json000066400000000000000000000003001403746003700264400ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "uri": "http://example.org" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_homepage.xml000066400000000000000000000003151403746003700262750ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_mixed_content.json000066400000000000000000000002721403746003700275230ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "name": "Author Name" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_mixed_content.xml000066400000000000000000000003241403746003700273500ustar00rootroot00000000000000 Author Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_name.json000066400000000000000000000002721403746003700256030ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "name": "Author Name" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_name.xml000066400000000000000000000002721403746003700254320ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_uri.json000066400000000000000000000003001403746003700254520ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "uri": "http://example.org" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_uri.xml000066400000000000000000000002761403746003700253150ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_url.json000066400000000000000000000003001403746003700254550ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "uri": "http://example.org" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_author_url.xml000066400000000000000000000002761403746003700253200ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_content.json000066400000000000000000000002251403746003700247510ustar00rootroot00000000000000{ "entries": [ { "content": { "value": "Entry Content" } } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_content.xml000066400000000000000000000002411403746003700245760ustar00rootroot00000000000000 Entry Content gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_email.json000066400000000000000000000003061403746003700270200ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "email": "email@example.org" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_email.xml000066400000000000000000000003221403746003700266450ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_homepage.json000066400000000000000000000003051403746003700275150ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "uri": "http://example.org" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_homepage.xml000066400000000000000000000003341403746003700273460ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_mixed_content.json000066400000000000000000000003041403746003700305670ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "name": "Contributor Name" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_mixed_content.xml000066400000000000000000000003551403746003700304240ustar00rootroot00000000000000 Contributor Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_multiple.json000066400000000000000000000007471403746003700275750ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "name": "Contributor Name 1", "email": "email@example.org", "uri": "http://example.org/1" }, { "name": "Contributor Name 2", "email": "email2@example.org", "uri": "http://example.org/2" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_multiple.xml000066400000000000000000000006741403746003700274230ustar00rootroot00000000000000 Contributor Name 1 email@example.org http://example.org/1 Contributor Name 2 email2@example.org http://example.org/2 gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_name.json000066400000000000000000000003041403746003700266470ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "name": "Contributor Name" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_name.xml000066400000000000000000000003161403746003700265010ustar00rootroot00000000000000 Contributor Name gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_uri.json000066400000000000000000000003051403746003700265270ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "uri": "http://example.org" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_uri.xml000066400000000000000000000003151403746003700263570ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_url.json000066400000000000000000000003051403746003700265320ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "uri": "http://example.org" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_contributor_url.xml000066400000000000000000000003151403746003700263620ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_id.json000066400000000000000000000001541403746003700236740ustar00rootroot00000000000000{ "entries": [ { "id": "http://example.org" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_id.xml000066400000000000000000000002271403746003700235240ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_issued.json000066400000000000000000000002651403746003700245770ustar00rootroot00000000000000{ "entries": [ { "published": "Sun, 06 Jul 2014 12:56:00 GMT", "publishedParsed": "2014-07-06T12:56:00Z" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_issued.xml000066400000000000000000000002561403746003700244260ustar00rootroot00000000000000 Sun, 06 Jul 2014 12:56:00 GMT gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link.json000066400000000000000000000003361403746003700242370ustar00rootroot00000000000000{ "entries": [ { "links": [ { "rel": "alternate", "type": "text/html" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link.xml000066400000000000000000000002461403746003700240660ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link_href.json000066400000000000000000000003531403746003700252420ustar00rootroot00000000000000{ "entries": [ { "links": [ { "href": "http://www.example.org", "rel": "alternate" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link_href.xml000066400000000000000000000002621403746003700250700ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link_multiple.json000066400000000000000000000007361403746003700261560ustar00rootroot00000000000000{ "entries": [ { "links": [ { "href": "http://www.example.org", "rel": "alternate", "type": "application/xhtml+xml" }, { "href": "http://www.example.org/post", "rel": "service.post", "type": "application/atom+xml" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link_multiple.xml000066400000000000000000000004721403746003700260020ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link_rel.json000066400000000000000000000002651403746003700251020ustar00rootroot00000000000000{ "entries": [ { "links": [ { "rel": "alternate" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link_rel.xml000066400000000000000000000002441403746003700247260ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link_title.json000066400000000000000000000003401403746003700254330ustar00rootroot00000000000000{ "entries": [ { "links": [ { "rel": "alternate", "title": "Link Title" } ] } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_link_title.xml000066400000000000000000000002511403746003700252630ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_modified.json000066400000000000000000000002611403746003700250570ustar00rootroot00000000000000{ "entries": [ { "updated": "Sun, 06 Jul 2014 12:56:00 GMT", "updatedParsed": "2014-07-06T12:56:00Z" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_modified.xml000066400000000000000000000002711403746003700247070ustar00rootroot00000000000000 Sun, 06 Jul 2014 12:56:00 GMT gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary.json000066400000000000000000000001541403746003700247750ustar00rootroot00000000000000{ "entries": [ { "summary": "Entry Summary" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary.xml000066400000000000000000000002411403746003700246210ustar00rootroot00000000000000 Entry Summary gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_base64.json000066400000000000000000000001541403746003700261410ustar00rootroot00000000000000{ "entries": [ { "summary": "Entry Summary" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_base64.xml000066400000000000000000000002771403746003700257760ustar00rootroot00000000000000 RW50cnkgU3VtbWFyeQ== gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_base64_escaped_markup.json000066400000000000000000000001771403746003700312110ustar00rootroot00000000000000{ "entries": [ { "summary": "<p>Entry Summary</p>" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_base64_escaped_markup.xml000066400000000000000000000003511403746003700310320ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RW50cnkgU3VtbWFyeSZsdDsvcCZndDs= gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_html_escaped_markup.json000066400000000000000000000001631403746003700310640ustar00rootroot00000000000000{ "entries": [ { "summary": "

Entry Summary

" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_html_escaped_markup.xml000066400000000000000000000003551403746003700307160ustar00rootroot00000000000000 <p>Entry Summary</p> gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_naked_markup.json000066400000000000000000000001631403746003700275160ustar00rootroot00000000000000{ "entries": [ { "summary": "

Entry Summary

" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_naked_markup.xml000066400000000000000000000002671403746003700273520ustar00rootroot00000000000000

Entry Summary

gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_text.json000066400000000000000000000001541403746003700260410ustar00rootroot00000000000000{ "entries": [ { "summary": "Entry Summary" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_text.xml000066400000000000000000000003001403746003700256610ustar00rootroot00000000000000 Entry Summary gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_xhtml_escaped_markup.json000066400000000000000000000001771403746003700312610ustar00rootroot00000000000000{ "entries": [ { "summary": "<p>Entry Summary</p>" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_xhtml_escaped_markup.xml000066400000000000000000000004331403746003700311030ustar00rootroot00000000000000
<p>Entry Summary</p>
gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_xhtml_inline_markup.json000066400000000000000000000001631403746003700311260ustar00rootroot00000000000000{ "entries": [ { "summary": "

Entry Summary

" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_summary_xhtml_inline_markup.xml000066400000000000000000000004161403746003700307560ustar00rootroot00000000000000

Entry Summary

gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title.json000066400000000000000000000001501403746003700244150ustar00rootroot00000000000000{ "entries": [ { "title": "Entry Title" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title.xml000066400000000000000000000002311403746003700242440ustar00rootroot00000000000000 Entry Title gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_base64.json000066400000000000000000000001501403746003700255610ustar00rootroot00000000000000{ "entries": [ { "title": "Entry Title" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_base64.xml000066400000000000000000000002651403746003700254170ustar00rootroot00000000000000 RW50cnkgVGl0bGU= gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_base64_escaped_markup.json000066400000000000000000000001731403746003700306310ustar00rootroot00000000000000{ "entries": [ { "title": "<p>Entry Title</p>" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_base64_escaped_markup.xml000066400000000000000000000003371403746003700304620ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RW50cnkgVGl0bGUmbHQ7L3AmZ3Q7 gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_html_escaped_markup.json000066400000000000000000000001571403746003700305130ustar00rootroot00000000000000{ "entries": [ { "title": "

Entry Title

" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_html_escaped_markup.xml000066400000000000000000000003351403746003700303400ustar00rootroot00000000000000 <p>Entry Title</p> gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_naked_markup.json000066400000000000000000000001571403746003700271450ustar00rootroot00000000000000{ "entries": [ { "title": "

Entry Title

" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_naked_markup.xml000066400000000000000000000002571403746003700267750ustar00rootroot00000000000000 <p>Entry Title</p> gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_text.json000066400000000000000000000001501403746003700254610ustar00rootroot00000000000000{ "entries": [ { "title": "Entry Title" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_text.xml000066400000000000000000000002701403746003700253130ustar00rootroot00000000000000 Entry Title gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_xhtml_escaped_markup.json000066400000000000000000000001731403746003700307010ustar00rootroot00000000000000{ "entries": [ { "title": "<p>Entry Title</p>" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_xhtml_escaped_markup.xml000066400000000000000000000004231403746003700305260ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml"><p>Entry Title</p></div> gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_xhtml_inline_markup.json000066400000000000000000000001571403746003700305550ustar00rootroot00000000000000{ "entries": [ { "title": "

Entry Title

" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_title_xhtml_inline_markup.xml000066400000000000000000000004061403746003700304010ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml"><p>Entry Title</p></div> gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_updated.json000066400000000000000000000002611403746003700247250ustar00rootroot00000000000000{ "entries": [ { "updated": "Sun, 06 Jul 2014 12:56:00 GMT", "updatedParsed": "2014-07-06T12:56:00Z" } ], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_entry_updated.xml000066400000000000000000000002611403746003700245540ustar00rootroot00000000000000 Sun, 06 Jul 2014 12:56:00 GMT gofeed-1.1.3/testdata/parser/atom/atom03_feed_generator_name.json000066400000000000000000000001501403746003700250410ustar00rootroot00000000000000{ "generator": { "value": "Feed Generator" }, "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_generator_name.xml000066400000000000000000000002201403746003700246660ustar00rootroot00000000000000 Feed Generator gofeed-1.1.3/testdata/parser/atom/atom03_feed_generator_url.json000066400000000000000000000001521403746003700247250ustar00rootroot00000000000000{ "generator": { "uri": "http://example.org" }, "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_generator_url.xml000066400000000000000000000002201403746003700245500ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_generator_version.json000066400000000000000000000001371403746003700256130ustar00rootroot00000000000000{ "generator": { "version": "1.0" }, "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_generator_version.xml000066400000000000000000000002111403746003700254330ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_id.json000066400000000000000000000001141403746003700224470ustar00rootroot00000000000000{ "id": "http://example.org", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_id.xml000066400000000000000000000001721403746003700223020ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom03_feed_link.json000066400000000000000000000002261403746003700230140ustar00rootroot00000000000000{ "links": [ { "rel": "alternate", "type": "text/html" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_link.xml000066400000000000000000000001771403746003700226500ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_link_href.json000066400000000000000000000002371403746003700240220ustar00rootroot00000000000000{ "links": [ { "href": "http://example.org", "rel": "alternate" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_link_href.xml000066400000000000000000000002101403746003700236400ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_link_multiple.json000066400000000000000000000005461403746003700247340ustar00rootroot00000000000000{ "links": [ { "href": "http://www.example.org", "rel": "alternate", "type": "application/xhtml+xml" }, { "href": "http://www.example.org/post", "rel": "service.post", "type": "application/atom+xml" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_link_multiple.xml000066400000000000000000000004341403746003700245570ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_link_rel.json000066400000000000000000000001601403746003700236530ustar00rootroot00000000000000{ "links": [ { "rel": "self" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_link_rel.xml000066400000000000000000000001701403746003700235030ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_link_title.json000066400000000000000000000002301403746003700242100ustar00rootroot00000000000000{ "links": [ { "rel": "alternate", "title": "Link Title" } ], "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_link_title.xml000066400000000000000000000002021403746003700240360ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom03_feed_modified.json000066400000000000000000000002111403746003700236310ustar00rootroot00000000000000{ "updated": "Sun, 06 Jul 2014 12:56:00 GMT", "updatedParsed": "2014-07-06T12:56:00Z", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_modified.xml000066400000000000000000000002341403746003700234650ustar00rootroot00000000000000 Sun, 06 Jul 2014 12:56:00 GMT gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline.json000066400000000000000000000001141403746003700234760ustar00rootroot00000000000000{ "subtitle": "Feed Tagline", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline.xml000066400000000000000000000002031403746003700233240ustar00rootroot00000000000000 Feed Tagline gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_base64.json000066400000000000000000000001141403746003700246420ustar00rootroot00000000000000{ "subtitle": "Feed Tagline", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_base64.xml000066400000000000000000000002361403746003700244760ustar00rootroot00000000000000 RmVlZCBUYWdsaW5l gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_base64_escaped_markup.json000066400000000000000000000001371403746003700277120ustar00rootroot00000000000000{ "subtitle": "<p>Feed Tagline</p>", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_base64_escaped_markup.xml000066400000000000000000000003141403746003700275360ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RmVlZCBUYWdsaW5lJmx0Oy9wJmd0Ow== gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_html_escaped_markup.json000066400000000000000000000001231403746003700275650ustar00rootroot00000000000000{ "subtitle": "

Feed Tagline

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_html_escaped_markup.xml000066400000000000000000000003071403746003700274200ustar00rootroot00000000000000 <p>Feed Tagline</p> gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_naked_markup.json000066400000000000000000000001231403746003700262170ustar00rootroot00000000000000{ "subtitle": "

Feed Tagline

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_naked_markup.xml000066400000000000000000000002311403746003700260460ustar00rootroot00000000000000

Feed Tagline

gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_text.json000066400000000000000000000001141403746003700245420ustar00rootroot00000000000000{ "subtitle": "Feed Tagline", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_text.xml000066400000000000000000000002421403746003700243730ustar00rootroot00000000000000 Feed Tagline gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_xhtml_escaped_markup.json000066400000000000000000000001371403746003700277620ustar00rootroot00000000000000{ "subtitle": "<p>Feed Tagline</p>", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_xhtml_escaped_markup.xml000066400000000000000000000003751403746003700276150ustar00rootroot00000000000000
<p>Feed Tagline</p>
gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_xhtml_inline_markup.json000066400000000000000000000001231403746003700276270ustar00rootroot00000000000000{ "subtitle": "

Feed Tagline

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_tagline_xhtml_inline_markup.xml000066400000000000000000000003601403746003700274610ustar00rootroot00000000000000

Feed Tagline

gofeed-1.1.3/testdata/parser/atom/atom03_feed_title.json000066400000000000000000000001071403746003700231760ustar00rootroot00000000000000{ "title": "Feed Title", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_title.xml000066400000000000000000000001731403746003700230300ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_base64.json000066400000000000000000000001071403746003700243420ustar00rootroot00000000000000{ "title": "Feed Title", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_base64.xml000066400000000000000000000002301403746003700241660ustar00rootroot00000000000000 RmVlZCBUaXRsZQ== gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_base64_escaped_markup.json000066400000000000000000000001321403746003700274030ustar00rootroot00000000000000{ "title": "<p>Feed Title</p>", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_base64_escaped_markup.xml000066400000000000000000000003021403746003700272310ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RmVlZCBUaXRsZSZsdDsvcCZndDs= gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_html_escaped_markup.json000066400000000000000000000001161403746003700272650ustar00rootroot00000000000000{ "title": "

Feed Title

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_html_escaped_markup.xml000066400000000000000000000002771403746003700271240ustar00rootroot00000000000000 <p>Feed Title</p> gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_naked_markup.json000066400000000000000000000001161403746003700257170ustar00rootroot00000000000000{ "title": "

Feed Title

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_naked_markup.xml000066400000000000000000000002211403746003700255430ustar00rootroot00000000000000 <p>Feed Title</p> gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_text.json000066400000000000000000000001071403746003700242420ustar00rootroot00000000000000{ "title": "Feed Title", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_text.xml000066400000000000000000000002321403746003700240700ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_xhtml_escaped_markup.json000066400000000000000000000001321403746003700274530ustar00rootroot00000000000000{ "title": "<p>Feed Title</p>", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_xhtml_escaped_markup.xml000066400000000000000000000003651403746003700273120ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml"><p>Feed Title</p></div> gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_xhtml_inline_markup.json000066400000000000000000000001161403746003700273270ustar00rootroot00000000000000{ "title": "

Feed Title

", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_title_xhtml_inline_markup.xml000066400000000000000000000003501403746003700271560ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml"><p>Feed Title</p></div> gofeed-1.1.3/testdata/parser/atom/atom03_feed_xml_lang.json000066400000000000000000000001021403746003700236510ustar00rootroot00000000000000{ "language": "en", "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/atom03_feed_xml_lang.xml000066400000000000000000000001561403746003700235110ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_email.json000066400000000000000000000002011403746003700245170ustar00rootroot00000000000000{ "authors": [ { "email": "email@example.org" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_email.xml000066400000000000000000000002241403746003700243530ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_mixed_content.json000066400000000000000000000001721403746003700262770ustar00rootroot00000000000000{ "authors": [ { "name": "Author Name" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_mixed_content.xml000066400000000000000000000002541403746003700261270ustar00rootroot00000000000000 Author Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_multiple.json000066400000000000000000000005401403746003700252710ustar00rootroot00000000000000{ "authors": [ { "name": "Author Name 1", "email": "email@example.org", "uri": "http://example.org/1" }, { "name": "Author Name 2", "email": "email2@example.org", "uri": "http://example.org/2" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_multiple.xml000066400000000000000000000005161403746003700251230ustar00rootroot00000000000000 Author Name 1 http://example.org/1 email@example.org Author Name 2 http://example.org/2 email2@example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_name.json000066400000000000000000000001721403746003700243570ustar00rootroot00000000000000{ "authors": [ { "name": "Author Name" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_name.xml000066400000000000000000000002121403746003700242010ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_uri.json000066400000000000000000000002001403746003700242260ustar00rootroot00000000000000{ "authors": [ { "uri": "http://example.org" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_uri.xml000066400000000000000000000002161403746003700240640ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_url.json000066400000000000000000000002001403746003700242310ustar00rootroot00000000000000{ "authors": [ { "uri": "http://example.org" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_author_url.xml000066400000000000000000000002161403746003700240670ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_email.json000066400000000000000000000002061403746003700255740ustar00rootroot00000000000000{ "contributors": [ { "email": "email@example.org" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_email.xml000066400000000000000000000002421403746003700254230ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_mixed_content.json000066400000000000000000000002041403746003700273430ustar00rootroot00000000000000{ "contributors": [ { "name": "Contributor Name" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_mixed_content.xml000066400000000000000000000003001403746003700271670ustar00rootroot00000000000000 Contributor Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_multiple.json000066400000000000000000000005571403746003700263510ustar00rootroot00000000000000{ "contributors": [ { "name": "Contributor Name 1", "email": "email@example.org", "uri": "http://example.org/1" }, { "name": "Contributor Name 2", "email": "email2@example.org", "uri": "http://example.org/2" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_multiple.xml000066400000000000000000000006031403746003700261700ustar00rootroot00000000000000 Contributor Name 1 email@example.org http://example.org/1 Contributor Name 2 email2@example.org http://example.org/2 gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_name.json000066400000000000000000000002041403746003700254230ustar00rootroot00000000000000{ "contributors": [ { "name": "Contributor Name" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_name.xml000066400000000000000000000002361403746003700252570ustar00rootroot00000000000000 Contributor Name gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_uri.json000066400000000000000000000002051403746003700253030ustar00rootroot00000000000000{ "contributors": [ { "uri": "http://example.org" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_uri.xml000066400000000000000000000002351403746003700251350ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_url.json000066400000000000000000000002051403746003700253060ustar00rootroot00000000000000{ "contributors": [ { "uri": "http://example.org" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_contributor_url.xml000066400000000000000000000002351403746003700251400ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_email.json000066400000000000000000000003011403746003700257410ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "email": "email@example.org" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_email.xml000066400000000000000000000002521403746003700255750ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_mixed_content.json000066400000000000000000000002721403746003700275210ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "name": "Author Name" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_mixed_content.xml000066400000000000000000000003111403746003700273420ustar00rootroot00000000000000 Author Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_multiple.json000066400000000000000000000007301403746003700265130ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "name": "Author Name 1", "email": "email@example.org", "uri": "http://example.org/1" }, { "name": "Author Name 2", "email": "email2@example.org", "uri": "http://example.org/2" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_multiple.xml000066400000000000000000000005551403746003700263470ustar00rootroot00000000000000 Author Name 1 email@example.org http://example.org/1 Author Name 2 email2@example.org http://example.org/2 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_name.json000066400000000000000000000002721403746003700256010ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "name": "Author Name" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_name.xml000066400000000000000000000002511403746003700254250ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_uri.json000066400000000000000000000003001403746003700254500ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "uri": "http://example.org" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_uri.xml000066400000000000000000000002551403746003700253100ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_url.json000066400000000000000000000003001403746003700254530ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "uri": "http://example.org" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_author_url.xml000066400000000000000000000002561403746003700253140ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_category_label.json000066400000000000000000000003011403746003700262440ustar00rootroot00000000000000{ "entries": [ { "categories": [ { "label": "Category Label" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_category_label.xml000066400000000000000000000002271403746003700261020ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_category_scheme.json000066400000000000000000000003151403746003700264360ustar00rootroot00000000000000{ "entries": [ { "categories": [ { "scheme": "http://example.org/scheme" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_category_scheme.xml000066400000000000000000000002441403746003700262660ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_category_term.json000066400000000000000000000002771403746003700261500ustar00rootroot00000000000000{ "entries": [ { "categories": [ { "term": "Category Term" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_category_term.xml000066400000000000000000000002241403746003700257670ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content.json000066400000000000000000000002251403746003700247470ustar00rootroot00000000000000{ "entries": [ { "content": { "value": "Entry Content" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content.xml000066400000000000000000000002241403746003700245750ustar00rootroot00000000000000 Entry Content gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_base64.json000066400000000000000000000003111403746003700261070ustar00rootroot00000000000000{ "entries": [ { "content": { "type": "application/octet-stream", "value": "Entry Content" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_base64.xml000066400000000000000000000002751403746003700257470ustar00rootroot00000000000000 RW50cnkgQ29udGVudA== gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_base64_escaped_markup.json000066400000000000000000000003361403746003700311610ustar00rootroot00000000000000 { "entries": [ { "content": { "type": "application/octet-stream", "value": "<p>Entry Content</p>" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_base64_escaped_markup.xml000066400000000000000000000003471403746003700310120ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RW50cnkgQ29udGVudCZsdDsvcCZndDs= gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_html_div_escaped_markup.json000066400000000000000000000002741403746003700317040ustar00rootroot00000000000000{ "entries": [ { "content": { "type": "html", "value": "

Entry Content

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_html_div_escaped_markup.xml000066400000000000000000000003701403746003700315300ustar00rootroot00000000000000
<p>Entry Content</p>
gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_html_escaped_markup.json000066400000000000000000000002741403746003700310420ustar00rootroot00000000000000{ "entries": [ { "content": { "type": "html", "value": "

Entry Content

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_html_escaped_markup.xml000066400000000000000000000003051403746003700306640ustar00rootroot00000000000000 <p>Entry Content</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_src.json000066400000000000000000000002421403746003700256150ustar00rootroot00000000000000{ "entries": [ { "content": { "src": "http://example.org/video.mp4" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_src.xml000066400000000000000000000002631403746003700254470ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_text.json000066400000000000000000000002651403746003700260170ustar00rootroot00000000000000{ "entries": [ { "content": { "type": "text", "value": "Entry Content" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_text.xml000066400000000000000000000002401403746003700256370ustar00rootroot00000000000000 Entry Content gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_xhtml_escaped_markup.json000066400000000000000000000003111403746003700312220ustar00rootroot00000000000000{ "entries": [ { "content": { "type": "xhtml", "value": "<p>Entry Content</p>" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_xhtml_escaped_markup.xml000066400000000000000000000003671403746003700310640ustar00rootroot00000000000000
<p>Entry Content</p>
gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_xhtml_inline_markup.json000066400000000000000000000002751403746003700311050ustar00rootroot00000000000000{ "entries": [ { "content": { "type": "xhtml", "value": "

Entry Content

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_content_xhtml_inline_markup.xml000066400000000000000000000003511403746003700307270ustar00rootroot00000000000000

Entry Content

gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_email.json000066400000000000000000000003061403746003700270160ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "email": "email@example.org" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_email.xml000066400000000000000000000003131403746003700266430ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_mixed_content.json000066400000000000000000000003041403746003700305650ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "name": "Contributor Name" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_mixed_content.xml000066400000000000000000000003351403746003700304200ustar00rootroot00000000000000 Contributor Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_multiple.json000066400000000000000000000007471403746003700275730ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "name": "Contributor Name 1", "email": "email@example.org", "uri": "http://example.org/1" }, { "name": "Contributor Name 2", "email": "email2@example.org", "uri": "http://example.org/2" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_multiple.xml000066400000000000000000000006201403746003700274100ustar00rootroot00000000000000 Contributor Name 1 email@example.org http://example.org/1 Contributor Name 2 email2@example.org http://example.org/2 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_name.json000066400000000000000000000003041403746003700266450ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "name": "Contributor Name" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_name.xml000066400000000000000000000002651403746003700265020ustar00rootroot00000000000000 Contributor Name gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_uri.json000066400000000000000000000003051403746003700265250ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "uri": "http://example.org" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_uri.xml000066400000000000000000000002641403746003700263600ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_url.json000066400000000000000000000003051403746003700265300ustar00rootroot00000000000000{ "entries": [ { "contributors": [ { "uri": "http://example.org" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_contributor_url.xml000066400000000000000000000002641403746003700263630ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_id.json000066400000000000000000000001541403746003700236720ustar00rootroot00000000000000{ "entries": [ { "id": "http://example.org" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_id.xml000066400000000000000000000002031403746003700235140ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_href.json000066400000000000000000000003471403746003700252430ustar00rootroot00000000000000{ "entries": [ { "links": [ { "rel": "alternate", "href": "http://example.org" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_href.xml000066400000000000000000000002301403746003700250610ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_hreflang.json000066400000000000000000000003331403746003700261000ustar00rootroot00000000000000{ "entries": [ { "links": [ { "hreflang": "en", "rel": "alternate" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_hreflang.xml000066400000000000000000000002201403746003700257220ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_length.json000066400000000000000000000003331403746003700255730ustar00rootroot00000000000000{ "entries": [ { "links": [ { "rel": "alternate", "length": "1024" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_length.xml000066400000000000000000000002161403746003700254220ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_multiple.json000066400000000000000000000007251403746003700261520ustar00rootroot00000000000000{ "entries": [ { "links": [ { "href": "http://example.org/1", "rel": "alternate", "type": "application/xhtml+xml" }, { "href": "http://example.org/2", "rel": "service.post", "type": "application/atom+xml" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_multiple.xml000066400000000000000000000004461403746003700260010ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_no_rel.json000066400000000000000000000004201403746003700255650ustar00rootroot00000000000000{ "entries": [ { "links": [ { "href": "http://example.org", "rel": "alternate", "type": "text/html" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_no_rel.xml000066400000000000000000000002531403746003700254200ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_rel.json000066400000000000000000000002601403746003700250730ustar00rootroot00000000000000{ "entries": [ { "links": [ { "rel": "self" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_rel.xml000066400000000000000000000002101403746003700247150ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_title.json000066400000000000000000000003401403746003700254310ustar00rootroot00000000000000{ "entries": [ { "links": [ { "rel": "alternate", "title": "Link Title" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_title.xml000066400000000000000000000002221403746003700252570ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_type.json000066400000000000000000000003361403746003700252760ustar00rootroot00000000000000{ "entries": [ { "links": [ { "rel": "alternate", "type": "text/html" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_link_type.xml000066400000000000000000000002171403746003700251230ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights.json000066400000000000000000000001521403746003700245740ustar00rootroot00000000000000{ "entries": [ { "rights": "Entry Rights" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights.xml000066400000000000000000000002111403746003700244170ustar00rootroot00000000000000 Entry Rights gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights_html_escaped_markup.json000066400000000000000000000001611403746003700306630ustar00rootroot00000000000000{ "entries": [ { "rights": "

Entry Rights

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights_html_escaped_markup.xml000066400000000000000000000003011403746003700305060ustar00rootroot00000000000000 <p>Entry Rights</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights_text.json000066400000000000000000000001521403746003700256400ustar00rootroot00000000000000{ "entries": [ { "rights": "Entry Rights" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights_text.xml000066400000000000000000000002501403746003700254660ustar00rootroot00000000000000 Entry Rights gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights_xhtml_escaped_markup.json000066400000000000000000000001761403746003700310610ustar00rootroot00000000000000{ "entries": [ { "rights": "<p>Entry Rights</p>" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights_xhtml_escaped_markup.xml000066400000000000000000000003711403746003700307050ustar00rootroot00000000000000
<p>Entry Rights</p>
gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights_xhtml_inline_markup.json000066400000000000000000000001611403746003700307250ustar00rootroot00000000000000{ "entries": [ { "rights": "

Entry Rights

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_rights_xhtml_inline_markup.xml000066400000000000000000000003541403746003700305600ustar00rootroot00000000000000

Entry Rights

gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_email.json000066400000000000000000000003731403746003700273320ustar00rootroot00000000000000{ "entries": [ { "source": { "authors": [ { "email": "email@example.org" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_email.xml000066400000000000000000000003461403746003700271610ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_mixed_content.json000066400000000000000000000003641403746003700311030ustar00rootroot00000000000000{ "entries": [ { "source": { "authors": [ { "name": "Author Name" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_mixed_content.xml000066400000000000000000000003641403746003700307320ustar00rootroot00000000000000 Author Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_name.json000066400000000000000000000003641403746003700271630ustar00rootroot00000000000000{ "entries": [ { "source": { "authors": [ { "name": "Author Name" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_name.xml000066400000000000000000000003241403746003700270060ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_uri.json000066400000000000000000000003721403746003700270410ustar00rootroot00000000000000{ "entries": [ { "source": { "authors": [ { "uri": "http://example.org" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_uri.xml000066400000000000000000000003301403746003700266620ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_url.json000066400000000000000000000003721403746003700270440ustar00rootroot00000000000000{ "entries": [ { "source": { "authors": [ { "uri": "http://example.org" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_author_url.xml000066400000000000000000000003301403746003700266650ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_authors_multiple.json000066400000000000000000000010521403746003700302540ustar00rootroot00000000000000{ "entries": [ { "source": { "authors": [ { "name":"Author Name 1", "uri":"http://example.org/1", "email": "email@example.org" }, { "name":"Author Name 2", "uri":"http://example.org/2", "email": "email2@example.org" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_authors_multiple.xml000066400000000000000000000006741403746003700301140ustar00rootroot00000000000000 Author Name 1 email@example.org http://example.org/1 Author Name 2 email2@example.org http://example.org/2 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_category_label.json000066400000000000000000000003731403746003700276350ustar00rootroot00000000000000{ "entries": [ { "source": { "categories": [ { "label": "Category Label" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_category_label.xml000066400000000000000000000002721403746003700274620ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_category_scheme.json000066400000000000000000000004131403746003700300150ustar00rootroot00000000000000{ "entries": [ { "source": { "categories": [ { "scheme": "http://example.org/categories" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_category_scheme.xml000066400000000000000000000003141403746003700276440ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_category_term.json000066400000000000000000000003711403746003700275230ustar00rootroot00000000000000{ "entries": [ { "source": { "categories": [ { "term": "Category Term" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_category_term.xml000066400000000000000000000003061403746003700273500ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_email.json000066400000000000000000000004001403746003700303710ustar00rootroot00000000000000{ "entries": [ { "source": { "contributors": [ { "email": "email@example.org" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_email.xml000066400000000000000000000003711403746003700302270ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_mixed_content.json000066400000000000000000000003761403746003700321560ustar00rootroot00000000000000{ "entries": [ { "source": { "contributors": [ { "name": "Contributor Name" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_mixed_content.xml000066400000000000000000000004071403746003700320000ustar00rootroot00000000000000 Contributor Name Mixed content gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_multiple.json000066400000000000000000000010751403746003700311460ustar00rootroot00000000000000{ "entries": [ { "source": { "contributors": [ { "name": "Contributor Name 1", "email": "email@example.org", "uri": "http://example.org/1" }, { "name": "Contributor Name 2", "email": "email2@example.org", "uri": "http://example.org/2" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_multiple.xml000066400000000000000000000007421403746003700307750ustar00rootroot00000000000000 Contributor Name 1 http://example.org/1 email@example.org Contributor Name 2 http://example.org/2 email2@example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_name.json000066400000000000000000000003761403746003700302360ustar00rootroot00000000000000{ "entries": [ { "source": { "contributors": [ { "name": "Contributor Name" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_name.xml000066400000000000000000000003511403746003700300560ustar00rootroot00000000000000 Contributor Name gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_uri.json000066400000000000000000000003771403746003700301160ustar00rootroot00000000000000{ "entries": [ { "source": { "contributors": [ { "uri": "http://example.org" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_uri.xml000066400000000000000000000003471403746003700277420ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_url.json000066400000000000000000000003771403746003700301210ustar00rootroot00000000000000{ "entries": [ { "source": { "contributors": [ { "uri": "http://example.org" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_contributor_url.xml000066400000000000000000000003461403746003700277440ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_generator.json000066400000000000000000000003141403746003700266420ustar00rootroot00000000000000{ "entries": [ { "source": { "generator": { "value": "Source Generator" } } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_generator.xml000066400000000000000000000002751403746003700264770ustar00rootroot00000000000000 Source Generator gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_generator_uri.json000066400000000000000000000003751403746003700275300ustar00rootroot00000000000000{ "entries": [ { "source": { "generator": { "value": "Source Generator", "uri": "http://example.org" } } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_generator_uri.xml000066400000000000000000000003341403746003700273520ustar00rootroot00000000000000 Source Generator gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_generator_version.json000066400000000000000000000003631403746003700304130ustar00rootroot00000000000000{ "entries": [ { "source": { "generator": { "value": "Source Generator", "version": "2.56" } } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_generator_version.xml000066400000000000000000000003251403746003700302400ustar00rootroot00000000000000 Source Generator gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_icon.json000066400000000000000000000002411403746003700256030ustar00rootroot00000000000000{ "entries": [ { "source": { "icon": "http://example.org/icon.png" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_icon.xml000066400000000000000000000002631403746003700254360ustar00rootroot00000000000000 http://example.org/icon.png gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_id.json000066400000000000000000000002261403746003700252520ustar00rootroot00000000000000{ "entries": [ { "source": { "id": "http://example.org" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_id.xml000066400000000000000000000002331403746003700250770ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_href.json000066400000000000000000000004451403746003700266220ustar00rootroot00000000000000{ "entries": [ { "source": { "links": [ { "href": "http://example.org", "rel": "alternate" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_href.xml000066400000000000000000000003001403746003700264370ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_hreflang.json000066400000000000000000000004311403746003700274570ustar00rootroot00000000000000{ "entries": [ { "source": { "links": [ { "hreflang": "en", "rel": "alternate" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_hreflang.xml000066400000000000000000000002711403746003700273100ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_length.json000066400000000000000000000004311403746003700271520ustar00rootroot00000000000000{ "entries": [ { "source": { "links": [ { "rel": "alternate", "length": "1024" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_length.xml000066400000000000000000000002671403746003700270100ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_multiple.json000066400000000000000000000010531403746003700275250ustar00rootroot00000000000000{ "entries": [ { "source": { "links": [ { "href": "http://example.org/1", "rel": "alternate", "type": "application/xhtml+xml" }, { "href": "http://example.org/2", "rel": "service.post", "type": "application/atom+xml" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_multiple.xml000066400000000000000000000005231403746003700273550ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_rel.json000066400000000000000000000003521403746003700264550ustar00rootroot00000000000000{ "entries": [ { "source": { "links": [ { "rel": "self" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_rel.xml000066400000000000000000000002601403746003700263020ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_title.json000066400000000000000000000004361403746003700270170ustar00rootroot00000000000000{ "entries": [ { "source": { "links": [ { "rel": "alternate", "title": "Link Title" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_title.xml000066400000000000000000000002721403746003700266440ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_type.json000066400000000000000000000004341403746003700266550ustar00rootroot00000000000000{ "entries": [ { "source": { "links": [ { "rel": "alternate", "type": "text/html" } ] } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_link_type.xml000066400000000000000000000002661403746003700265070ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_logo.json000066400000000000000000000002411403746003700256130ustar00rootroot00000000000000{ "entries": [ { "source": { "logo": "http://example.org/logo.jpg" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_logo.xml000066400000000000000000000002711403746003700254450ustar00rootroot00000000000000 http://example.org/logo.jpg gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_mixed_content.json000066400000000000000000000002411403746003700275130ustar00rootroot00000000000000{ "entries": [ { "source": { "logo": "http://example.org/logo.jpg" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_mixed_content.xml000066400000000000000000000003311403746003700273420ustar00rootroot00000000000000 http://example.org/logo.jpg Mixed content gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights.json000066400000000000000000000002251403746003700261550ustar00rootroot00000000000000{ "entries": [ { "source": { "rights": "Source Rights" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights.xml000066400000000000000000000002621403746003700260050ustar00rootroot00000000000000 Source Rights gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_base64.json000066400000000000000000000002341403746003700273210ustar00rootroot00000000000000{ "entries": [ { "source": { "rights": "

Source Rights

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_base64.xml000066400000000000000000000003521403746003700271510ustar00rootroot00000000000000 PHA+U291cmNlIFJpZ2h0czwvcD4= gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_base64_escaped_markup.json000066400000000000000000000002501403746003700323620ustar00rootroot00000000000000{ "entries": [ { "source": { "rights": "<p>Source Rights</p>" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_base64_escaped_markup.xml000066400000000000000000000004131403746003700322120ustar00rootroot00000000000000 Jmx0O3AmZ3Q7U291cmNlIFJpZ2h0cyZsdDsvcCZndDs= gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_html_escaped_markup.json000066400000000000000000000002341403746003700322440ustar00rootroot00000000000000{ "entries": [ { "source": { "rights": "

Source Rights

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_html_escaped_markup.xml000066400000000000000000000003521403746003700320740ustar00rootroot00000000000000 <p>Source Rights</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_text.json000066400000000000000000000002251403746003700272210ustar00rootroot00000000000000{ "entries": [ { "source": { "rights": "Source Rights" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_text.xml000066400000000000000000000003041403746003700270460ustar00rootroot00000000000000 Source Rights gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_xhtml_escaped_markup.json000066400000000000000000000002501403746003700324320ustar00rootroot00000000000000{ "entries": [ { "source": { "rights": "<p>Source Rights</p>" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_xhtml_escaped_markup.xml000066400000000000000000000004351403746003700322660ustar00rootroot00000000000000
<p>Source Rights</p>
gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_xhtml_inline_markup.json000066400000000000000000000002341403746003700323060ustar00rootroot00000000000000{ "entries": [ { "source": { "rights": "

Source Rights

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_rights_xhtml_inline_markup.xml000066400000000000000000000004201403746003700321320ustar00rootroot00000000000000

Source Rights

gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle.json000066400000000000000000000002311403746003700265050ustar00rootroot00000000000000{ "entries": [ { "source": { "subtitle": "Source Subtitle" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle.xml000066400000000000000000000002711403746003700263400ustar00rootroot00000000000000 Source Subtitle gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_base64.json000066400000000000000000000002401403746003700276510ustar00rootroot00000000000000{ "entries": [ { "source": { "subtitle": "

Source Subtitle

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_base64.xml000066400000000000000000000003631403746003700275060ustar00rootroot00000000000000 PHA+U291cmNlIFN1YnRpdGxlPC9wPg== gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_base64_escaped_markup.json000066400000000000000000000002541403746003700327210ustar00rootroot00000000000000{ "entries": [ { "source": { "subtitle": "<p>Source Subtitle</p>" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_base64_escaped_markup.xml000066400000000000000000000004261403746003700325510ustar00rootroot00000000000000 Jmx0O3AmZ3Q7U291cmNlIFN1YnRpdGxlJmx0Oy9wJmd0Ow== gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_html_escaped_markup.json000066400000000000000000000002401403746003700325740ustar00rootroot00000000000000{ "entries": [ { "source": { "subtitle": "

Source Subtitle

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_html_escaped_markup.xml000066400000000000000000000003611403746003700324270ustar00rootroot00000000000000 <p>Source Subtitle</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_text.json000066400000000000000000000002311403746003700275510ustar00rootroot00000000000000{ "entries": [ { "source": { "subtitle": "Source Subtitle" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_text.xml000066400000000000000000000003141403746003700274020ustar00rootroot00000000000000 Source Subtitle gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_xhtml_escaped_markup.json000066400000000000000000000002541403746003700327710ustar00rootroot00000000000000{ "entries": [ { "source": { "subtitle": "<p>Source Subtitle</p>" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_xhtml_escaped_markup.xml000066400000000000000000000004431403746003700326200ustar00rootroot00000000000000
<p>Source Subtitle</p>
gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_xhtml_inline_markup.json000066400000000000000000000002401403746003700326360ustar00rootroot00000000000000{ "entries": [ { "source": { "subtitle": "

Source Subtitle

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_subtitle_xhtml_inline_markup.xml000066400000000000000000000004261403746003700324730ustar00rootroot00000000000000

Source Subtitle

gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title.json000066400000000000000000000002231403746003700257740ustar00rootroot00000000000000{ "entries": [ { "source": { "title": "Source Title" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title.xml000066400000000000000000000002551403746003700256300ustar00rootroot00000000000000 Source Title gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_base64.json000066400000000000000000000002321403746003700271400ustar00rootroot00000000000000{ "entries": [ { "source": { "title": "

Source Title

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_base64.xml000066400000000000000000000003461403746003700267750ustar00rootroot00000000000000 PHA+U291cmNlIFRpdGxlPC9wPg== gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_base64_escaped_markup.json000066400000000000000000000002461403746003700322100ustar00rootroot00000000000000{ "entries": [ { "source": { "title": "<p>Source Title</p>" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_base64_escaped_markup.xml000066400000000000000000000004101403746003700320300ustar00rootroot00000000000000 Jmx0O3AmZ3Q7U291cmNlIFRpdGxlJmx0Oy9wJmd0Ow== gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_html_escaped_markup.json000066400000000000000000000002321403746003700320630ustar00rootroot00000000000000{ "entries": [ { "source": { "title": "

Source Title

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_html_escaped_markup.xml000066400000000000000000000003501403746003700317130ustar00rootroot00000000000000 <p>Source Title</p></subtitle> </source> </entry> </feed>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_text.json��������������������������0000664�0000000�0000000�00000000223�14037460037�0027040�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "source": { "title": "Source Title" } } ], "version": "1.0" } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_text.xml���������������������������0000664�0000000�0000000�00000000303�14037460037�0026666�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry source title - text --> <feed xmlns="http://www.w3.org/2005/Atom"> <entry> <source> <title type="text">Source Title</subtitle> </source> </entry> </feed>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_xhtml_escaped_markup.json����������0000664�0000000�0000000�00000000246�14037460037�0032260�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "source": { "title": "<p>Source Title</p>" } } ], "version": "1.0" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_xhtml_escaped_markup.xml�����������0000664�0000000�0000000�00000000427�14037460037�0032110�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry source title - xhtml w/ escaped markup --> <feed xmlns="http://www.w3.org/2005/Atom"> <entry> <source> <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Source Title</p></div> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_xhtml_inline_markup.json000066400000000000000000000002321403746003700321250ustar00rootroot00000000000000{ "entries": [ { "source": { "title": "

Source Title

" } } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_source_title_xhtml_inline_markup.xml000066400000000000000000000004121403746003700317540ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml"><p>Source Title</p></div> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary.json000066400000000000000000000001541403746003700247730ustar00rootroot00000000000000{ "entries": [ { "summary": "Entry Summary" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary.xml000066400000000000000000000002201403746003700246140ustar00rootroot00000000000000 Entry Summary gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_base64.json000066400000000000000000000001631403746003700261370ustar00rootroot00000000000000{ "entries": [ { "summary": "

Entry Summary

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_base64.xml000066400000000000000000000003101403746003700257600ustar00rootroot00000000000000 PHA+RW50cnkgU3VtbWFyeTwvcD4= gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_base64_escaped_markup.json000066400000000000000000000001771403746003700312070ustar00rootroot00000000000000{ "entries": [ { "summary": "<p>Entry Summary</p>" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_base64_escaped_markup.xml000066400000000000000000000003521403746003700310310ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RW50cnkgU3VtbWFyeSZsdDsvcCZndDs= gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_html_escaped_markup.json000066400000000000000000000001631403746003700310620ustar00rootroot00000000000000{ "entries": [ { "summary": "

Entry Summary

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_html_escaped_markup.xml000066400000000000000000000003071403746003700307110ustar00rootroot00000000000000 <p>Entry Summary</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_text.json000066400000000000000000000001541403746003700260370ustar00rootroot00000000000000{ "entries": [ { "summary": "Entry Summary" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_text.xml000066400000000000000000000002421403746003700256640ustar00rootroot00000000000000 Entry Summary gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_xhtml_escaped_markup.json000066400000000000000000000001771403746003700312570ustar00rootroot00000000000000{ "entries": [ { "summary": "<p>Entry Summary</p>" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_xhtml_escaped_markup.xml000066400000000000000000000003721403746003700311030ustar00rootroot00000000000000
<p>Entry Summary</p>
gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_xhtml_inline_markup.json000066400000000000000000000001631403746003700311240ustar00rootroot00000000000000{ "entries": [ { "summary": "

Entry Summary

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_summary_xhtml_inline_markup.xml000066400000000000000000000003551403746003700307560ustar00rootroot00000000000000

Entry Summary

gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title.json000066400000000000000000000001501403746003700244130ustar00rootroot00000000000000{ "entries": [ { "title": "Entry Title" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title.xml000066400000000000000000000002111403746003700242400ustar00rootroot00000000000000 Entry Title gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_base64.json000066400000000000000000000001571403746003700255660ustar00rootroot00000000000000{ "entries": [ { "title": "

Entry Title

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_base64.xml000066400000000000000000000002761403746003700254170ustar00rootroot00000000000000 PHA+RW50cnkgVGl0bGU8L3A+ gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_base64_escaped_markup.json000066400000000000000000000001731403746003700306270ustar00rootroot00000000000000{ "entries": [ { "title": "<p>Entry Title</p>" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_base64_escaped_markup.xml000066400000000000000000000003401403746003700304520ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RW50cnkgVGl0bGUmbHQ7L3AmZ3Q7 gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_html_escaped_markup.json000066400000000000000000000001571403746003700305110ustar00rootroot00000000000000{ "entries": [ { "title": "

Entry Title

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_html_escaped_markup.xml000066400000000000000000000002771403746003700303430ustar00rootroot00000000000000 <p>Entry Title</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_text.json000066400000000000000000000001501403746003700254570ustar00rootroot00000000000000{ "entries": [ { "title": "Entry Title" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_text.xml000066400000000000000000000002301403746003700253050ustar00rootroot00000000000000 Entry Title gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_xhtml_escaped_markup.json000066400000000000000000000001731403746003700306770ustar00rootroot00000000000000{ "entries": [ { "title": "<p>Entry Title</p>" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_xhtml_escaped_markup.xml000066400000000000000000000003571403746003700305320ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml"><p>Entry Title</p></div> gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_xhtml_inline_markup.json000066400000000000000000000001571403746003700305530ustar00rootroot00000000000000{ "entries": [ { "title": "

Entry Title

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_entry_title_xhtml_inline_markup.xml000066400000000000000000000003421403746003700303760ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml"><p>Entry Title</p></div> gofeed-1.1.3/testdata/parser/atom/atom10_feed_generator_name.json000066400000000000000000000001501403746003700250370ustar00rootroot00000000000000{ "generator": { "value": "Feed Generator" }, "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_generator_name.xml000066400000000000000000000001771403746003700246770ustar00rootroot00000000000000 Feed Generator gofeed-1.1.3/testdata/parser/atom/atom10_feed_generator_uri.json000066400000000000000000000001521403746003700247200ustar00rootroot00000000000000{ "generator": { "uri": "http://example.org" }, "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_generator_uri.xml000066400000000000000000000002161403746003700245500ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_generator_url.json000066400000000000000000000001521403746003700247230ustar00rootroot00000000000000{ "generator": { "uri": "http://example.org" }, "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_generator_url.xml000066400000000000000000000002161403746003700245530ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_generator_version.json000066400000000000000000000001401403746003700256030ustar00rootroot00000000000000{ "generator": { "version": "2.56" }, "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_generator_version.xml000066400000000000000000000002101403746003700254300ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_icon.json000066400000000000000000000001271403746003700230050ustar00rootroot00000000000000{ "icon": "http://example.org/icon.png", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_icon.xml000066400000000000000000000001751403746003700226370ustar00rootroot00000000000000 http://example.org/icon.png gofeed-1.1.3/testdata/parser/atom/atom10_feed_id.json000066400000000000000000000001141403746003700224450ustar00rootroot00000000000000{ "id": "http://example.org", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_id.xml000066400000000000000000000001561403746003700223020ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_href.json000066400000000000000000000002371403746003700240200ustar00rootroot00000000000000{ "links": [ { "href": "http://example.org", "rel": "alternate" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_href.xml000066400000000000000000000002011403746003700236360ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_hreflang.json000066400000000000000000000002231403746003700246550ustar00rootroot00000000000000{ "links": [ { "hreflang": "en", "rel": "alternate" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_hreflang.xml000066400000000000000000000001701403746003700245050ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_length.json000066400000000000000000000002231403746003700243500ustar00rootroot00000000000000{ "links": [ { "rel": "alternate", "length": "1024" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_length.xml000066400000000000000000000001671403746003700242060ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_multiple.json000066400000000000000000000005401403746003700247240ustar00rootroot00000000000000{ "links": [ { "href": "http://www.example.org/1", "rel": "self", "type": "application/xhtml+xml" }, { "href": "http://www.example.org/2", "rel": "service.post", "type": "application/atom+xml" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_multiple.xml000066400000000000000000000004231403746003700245530ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_rel.json000066400000000000000000000001601403746003700236510ustar00rootroot00000000000000{ "links": [ { "rel": "self" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_rel.xml000066400000000000000000000001611403746003700235010ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_title.json000066400000000000000000000002301403746003700242060ustar00rootroot00000000000000{ "links": [ { "rel": "alternate", "title": "Link Title" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_title.xml000066400000000000000000000001731403746003700240430ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_type.json000066400000000000000000000002261403746003700240530ustar00rootroot00000000000000{ "links": [ { "rel": "alternate", "type": "text/html" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_link_type.xml000066400000000000000000000001701403746003700237000ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/atom10_feed_logo.json000066400000000000000000000001271403746003700230150ustar00rootroot00000000000000{ "logo": "http://example.org/logo.jpg", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_logo.xml000066400000000000000000000001751403746003700226470ustar00rootroot00000000000000 http://example.org/logo.jpg gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights.json000066400000000000000000000001111403746003700233460ustar00rootroot00000000000000{ "rights": "Feed Rights", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights.xml000066400000000000000000000001631403746003700232040ustar00rootroot00000000000000 Feed Rights gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_base64.json000066400000000000000000000001201403746003700245120ustar00rootroot00000000000000{ "rights": "

Feed Rights

", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_base64.xml000066400000000000000000000002501403746003700243450ustar00rootroot00000000000000 PHA+RmVlZCBSaWdodHM8L3A+ gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_base64_escaped_markup.json000066400000000000000000000001341403746003700275620ustar00rootroot00000000000000{ "rights": "<p>Feed Rights</p>", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_base64_escaped_markup.xml000066400000000000000000000003121403746003700274070ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RmVlZCBSaWdodHMmbHQ7L3AmZ3Q7 gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_html_escaped_markup.json000066400000000000000000000001201403746003700274350ustar00rootroot00000000000000{ "rights": "

Feed Rights

", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_html_escaped_markup.xml000066400000000000000000000002531403746003700272730ustar00rootroot00000000000000 <p>Feed Rights</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_text.json000066400000000000000000000001111403746003700244120ustar00rootroot00000000000000{ "rights": "Feed Rights", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_text.xml000066400000000000000000000002061403746003700242460ustar00rootroot00000000000000 Feed Rights gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_xhtml_escaped_markup.json000066400000000000000000000001341403746003700276320ustar00rootroot00000000000000{ "rights": "<p>Feed Rights</p>", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_xhtml_escaped_markup.xml000066400000000000000000000003351403746003700274640ustar00rootroot00000000000000
<p>Feed Rights</p>
gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_xhtml_inline_markup.json000066400000000000000000000001201403746003700274770ustar00rootroot00000000000000{ "rights": "

Feed Rights

", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_rights_xhtml_inline_markup.xml000066400000000000000000000003201403746003700273300ustar00rootroot00000000000000

Feed Rights

gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle.json000066400000000000000000000001151403746003700237050ustar00rootroot00000000000000{ "subtitle": "Feed Subtitle", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle.xml000066400000000000000000000001731403746003700235400ustar00rootroot00000000000000 Feed Subtitle gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_base64.json000066400000000000000000000001241403746003700250510ustar00rootroot00000000000000{ "subtitle": "

Feed Subtitle

", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_base64.xml000066400000000000000000000002631403746003700247040ustar00rootroot00000000000000 PHA+RmVlZCBTdWJ0aXRsZTwvcD4= gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_base64_escaped_markup.json000066400000000000000000000001401403746003700301120ustar00rootroot00000000000000{ "subtitle": "<p>Feed Subtitle</p>", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_base64_escaped_markup.xml000066400000000000000000000003251403746003700277460ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RmVlZCBTdWJ0aXRsZSZsdDsvcCZndDs= gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_html_escaped_markup.json000066400000000000000000000001241403746003700277740ustar00rootroot00000000000000{ "subtitle": "

Feed Subtitle

", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_html_escaped_markup.xml000066400000000000000000000002631403746003700276270ustar00rootroot00000000000000 <p>Feed Subtitle</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_text.json000066400000000000000000000001151403746003700247510ustar00rootroot00000000000000{ "subtitle": "Feed Subtitle", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_text.xml000066400000000000000000000002161403746003700246020ustar00rootroot00000000000000 Feed Subtitle gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_xhtml_escaped_markup.json000066400000000000000000000001401403746003700301620ustar00rootroot00000000000000{ "subtitle": "<p>Feed Subtitle</p>", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_xhtml_escaped_markup.xml000066400000000000000000000003451403746003700300200ustar00rootroot00000000000000
<p>Feed Subtitle</p>
gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_xhtml_inline_markup.json000066400000000000000000000001241403746003700300360ustar00rootroot00000000000000{ "subtitle": "

Feed Subtitle

", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_subtitle_xhtml_inline_markup.xml000066400000000000000000000003301403746003700276640ustar00rootroot00000000000000

Feed Subtitle

gofeed-1.1.3/testdata/parser/atom/atom10_feed_title.json000066400000000000000000000001071403746003700231740ustar00rootroot00000000000000{ "title": "Feed Title", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_title.xml000066400000000000000000000001571403746003700230300ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_base64.json000066400000000000000000000001161403746003700243400ustar00rootroot00000000000000{ "title": "

Feed Title

", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_base64.xml000066400000000000000000000002461403746003700241730ustar00rootroot00000000000000 PHA+RmVlZCBUaXRsZTwvcD4= gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_base64_escaped_markup.json000066400000000000000000000001321403746003700274010ustar00rootroot00000000000000{ "title": "<p>Feed Title</p>", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_base64_escaped_markup.xml000066400000000000000000000003101403746003700272260ustar00rootroot00000000000000 Jmx0O3AmZ3Q7RmVlZCBUaXRsZSZsdDsvcCZndDs= gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_html_escaped_markup.json000066400000000000000000000001161403746003700272630ustar00rootroot00000000000000{ "title": "

Feed Title

", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_html_escaped_markup.xml000066400000000000000000000002471403746003700271170ustar00rootroot00000000000000 <p>Feed Title</p> gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_text.json000066400000000000000000000001071403746003700242400ustar00rootroot00000000000000{ "title": "Feed Title", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_text.xml000066400000000000000000000002021403746003700240630ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_xhtml_escaped_markup.json000066400000000000000000000001321403746003700274510ustar00rootroot00000000000000{ "title": "<p>Feed Title</p>", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_xhtml_escaped_markup.xml000066400000000000000000000003341403746003700273040ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml"><p>Feed Title</p></div></subtitle> </feed> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_xhtml_inline_markup.json������������������������0000664�0000000�0000000�00000000116�14037460037�0027325�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "title": "<p>Feed Title</p>", "entries": [], "version": "1.0" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/atom10_feed_title_xhtml_inline_markup.xml�������������������������0000664�0000000�0000000�00000000317�14037460037�0027157�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: feed title - xhtml w/ inline markup --> <feed xmlns="http://www.w3.org/2005/Atom"> <title type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Feed Title</p></div></subtitle> </feed> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/atom10_feed_xml_lang.json�����������������������������������������0000664�0000000�0000000�00000000074�14037460037�0023657�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "language": "en", "entries": [], "version": "1.0" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/atom10_feed_xml_lang.xml������������������������������������������0000664�0000000�0000000�00000000146�14037460037�0023506�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: feed language --> <feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"> </feed> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base.json���������������������������������������0000664�0000000�0000000�00000000372�14037460037�0024460�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "content": { "type": "html", "value": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } } ], "version": "1.0" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base.xml����������������������������������������0000664�0000000�0000000�00000000333�14037460037�0024304�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry content xml:base --> <feed xmlns="http://www.w3.org/2005/Atom"> <entry> <content type="html" xml:base="http://example.com/test/">Example <a href="test.html">test</a></content> </entry> </feed> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base_inherit.json�������������������������������0000664�0000000�0000000�00000000372�14037460037�0026202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "content": { "type": "html", "value": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } } ], "version": "1.0" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base_inherit.xml��������������������������������0000664�0000000�0000000�00000000371�14037460037�0026030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry content xml:base inherited from parent element --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/test/"> <entry> <content type="html">Example <a href="test.html">test</a></content> </entry> </feed> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base_inherit_2.json�����������������������������0000664�0000000�0000000�00000000372�14037460037�0026423�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "content": { "type": "html", "value": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } } ], "version": "1.0" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base_inherit_2.xml������������������������������0000664�0000000�0000000�00000000432�14037460037�0026247�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry content xml:base overrides parent element --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/parent/"> <entry> <content type="html" xml:base="http://example.com/test/">Example <a href="test.html">test</a></content> </entry> </feed> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base_inherit_3.json�����������������������������0000664�0000000�0000000�00000000372�14037460037�0026424�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "content": { "type": "html", "value": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } } ], "version": "1.0" } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base_inherit_3.xml������������������������������0000664�0000000�0000000�00000000440�14037460037�0026247�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry content xml:base resets properly on new element --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/parent/"> <entry> <content type="html" xml:base="http://example.com/test/">Example <a href="test.html">test</a></content> </entry> </feed> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base_inherit_4.json�����������������������������0000664�0000000�0000000�00000000445�14037460037�0026426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "summary": "blah blah blah", "content": { "type": "html", "value": "Example \u003ca href=\"http://example.com/parent/test.html\"\u003etest\u003c/a\u003e" } } ], "version": "1.0" } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_content_xml_base_inherit_4.xml������������������������������0000664�0000000�0000000�00000000522�14037460037�0026251�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry content xml:base inherits properly on new element --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/parent/"> <entry> <summary type="html" xml:base="http://example.com/info/">blah blah blah</summary> <content type="html">Example <a href="test.html">test</a></content> </entry> </feed> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_contributor_uri_base.json�����������������������������������0000664�0000000�0000000�00000000323�14037460037�0025353�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "contributors": [ { "uri": "http://example.com/relative/link" } ] } ], "version": "1.0" } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_contributor_uri_base.xml������������������������������������0000664�0000000�0000000�00000000411�14037460037�0025200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry contributor url relative to feed xml:base --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/test/"> <entry> <contributor> <uri>/relative/link</uri> </contributor> </entry> </feed> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_id_xml_base.json��������������������������������������������0000664�0000000�0000000�00000000177�14037460037�0023405�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "id": "http://example.com/test/relative/link" } ], "version": "1.0" } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_id_xml_base.xml���������������������������������������������0000664�0000000�0000000�00000000265�14037460037�0023232�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry id relative to xml:base --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/test/"> <entry> <id>relative/link</id> </entry> </feed> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_summary_xml_base.json���������������������������������������0000664�0000000�0000000�00000000261�14037460037�0024500�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "summary": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } ], "version": "1.0" } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_summary_xml_base.xml����������������������������������������0000664�0000000�0000000�00000000343�14037460037�0024330�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry summary content xml:base --> <feed xmlns="http://www.w3.org/2005/Atom"> <entry> <summary type="html" xml:base="http://example.com/test/">Example <a href="test.html">test</a></summary> </entry> </feed> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_summary_xml_base_inherit.json�������������������������������0000664�0000000�0000000�00000000261�14037460037�0026222�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "summary": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } ], "version": "1.0" } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_summary_xml_base_inherit.xml��������������������������������0000664�0000000�0000000�00000000401�14037460037�0026045�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry summary content xml:base inherited from parent element --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/test/"> <entry> <summary type="html">Example <a href="test.html">test</a></summary> </entry> </feed> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_summary_xml_base_inherit_2.json�����������������������������0000664�0000000�0000000�00000000261�14037460037�0026443�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "summary": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } ], "version": "1.0" } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_summary_xml_base_inherit_2.xml������������������������������0000664�0000000�0000000�00000000442�14037460037�0026273�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry summary content xml:base overrides parent element --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/parent/"> <entry> <summary type="html" xml:base="http://example.com/test/">Example <a href="test.html">test</a></summary> </entry> </feed> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_summary_xml_base_inherit_3.json�����������������������������0000664�0000000�0000000�00000000330�14037460037�0026441�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "entries": [ { "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "summary": "blah blah blah" } ], "version": "1.0" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������gofeed-1.1.3/testdata/parser/atom/entry_summary_xml_base_inherit_3.xml������������������������������0000664�0000000�0000000�00000000573�14037460037�0026301�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Description: entry summary content xml:base resets properly on new element --> <feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://example.com/parent/"> <entry> <title type="html" xml:base="http://example.com/test/">Example <a href="test.html">test</a> blah blah blah gofeed-1.1.3/testdata/parser/atom/entry_title_xml_base.json000066400000000000000000000002571403746003700241310ustar00rootroot00000000000000{ "entries": [ { "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/entry_title_xml_base.xml000066400000000000000000000003351403746003700237550ustar00rootroot00000000000000 Example <a href="test.html">test</a> gofeed-1.1.3/testdata/parser/atom/entry_title_xml_base_inherit.json000066400000000000000000000002571403746003700256530ustar00rootroot00000000000000{ "entries": [ { "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/entry_title_xml_base_inherit.xml000066400000000000000000000004541403746003700255010ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div> gofeed-1.1.3/testdata/parser/atom/feed_author_uri_base.json000066400000000000000000000002461403746003700240510ustar00rootroot00000000000000{ "authors": [ { "name": "John Doe", "uri": "http://example.org/about" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_author_uri_base.xml000066400000000000000000000002431403746003700236750ustar00rootroot00000000000000 John Doe about gofeed-1.1.3/testdata/parser/atom/feed_author_uri_inherit.json000066400000000000000000000002441403746003700245770ustar00rootroot00000000000000{ "authors": [ { "name": "John Doe", "uri": "http://github.com/john" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_author_uri_inherit.xml000066400000000000000000000002771403746003700244340ustar00rootroot00000000000000 John Doe john gofeed-1.1.3/testdata/parser/atom/feed_copyright_xml_base.json000066400000000000000000000002201403746003700245500ustar00rootroot00000000000000{ "entries": [], "rights": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/feed_copyright_xml_base.xml000066400000000000000000000004431403746003700244060ustar00rootroot00000000000000
Example test
gofeed-1.1.3/testdata/parser/atom/feed_entry_author_uri_base.json000066400000000000000000000003621403746003700252710ustar00rootroot00000000000000{ "entries": [ { "authors": [ { "name": "Name", "uri": "http://example.com/relative/link" } ] } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_entry_author_uri_base.xml000066400000000000000000000005661403746003700251260ustar00rootroot00000000000000 Name /relative/link gofeed-1.1.3/testdata/parser/atom/feed_link_xml_base.json000066400000000000000000000016711403746003700235100ustar00rootroot00000000000000{ "links": [ { "href": "http://www.example.com/feed", "rel": "self", "type": "application/atom+xml" } ], "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_link_xml_base.xml000066400000000000000000000002741403746003700233350ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/feed_logo_uri_base.json000066400000000000000000000002061403746003700235030ustar00rootroot00000000000000{ "icon": "http://example.org/img/icon.png", "logo": "http://example.org/logo.png", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_logo_uri_base.xml000066400000000000000000000002241403746003700233320ustar00rootroot00000000000000 logo.png icon.png gofeed-1.1.3/testdata/parser/atom/feed_rights_xml_base_inherit.json000066400000000000000000000002201403746003700255620ustar00rootroot00000000000000{ "entries": [], "rights": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_rights_xml_base_inherit.xml000066400000000000000000000003571403746003700254240ustar00rootroot00000000000000 Example test gofeed-1.1.3/testdata/parser/atom/feed_title_xml_base.json000066400000000000000000000002171403746003700236670ustar00rootroot00000000000000{ "entries": [], "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_title_xml_base.xml000066400000000000000000000003131403746003700235130ustar00rootroot00000000000000 Example <a href="test.html">test</a> gofeed-1.1.3/testdata/parser/atom/feed_title_xml_base_cdata.json000066400000000000000000000002171403746003700250230ustar00rootroot00000000000000{ "entries": [], "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_title_xml_base_cdata.xml000066400000000000000000000003311403746003700246470ustar00rootroot00000000000000 <![CDATA[Example <a href="test.html">test</a>]]> gofeed-1.1.3/testdata/parser/atom/feed_title_xml_base_inherit.json000066400000000000000000000002171403746003700254110ustar00rootroot00000000000000{ "entries": [], "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_title_xml_base_inherit.xml000066400000000000000000000003511403746003700252370ustar00rootroot00000000000000 Example <a href="test.html">test</a> gofeed-1.1.3/testdata/parser/atom/feed_title_xml_base_inherit_2.json000066400000000000000000000002171403746003700256320ustar00rootroot00000000000000{ "entries": [], "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/feed_title_xml_base_inherit_2.xml000066400000000000000000000004121403746003700254560ustar00rootroot00000000000000 Example <a href="test.html">test</a> gofeed-1.1.3/testdata/parser/atom/relative_uri.json000066400000000000000000000002171403746003700224030ustar00rootroot00000000000000{ "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/relative_uri.xml000066400000000000000000000004371403746003700222360ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div> gofeed-1.1.3/testdata/parser/atom/relative_uri_inherit.json000066400000000000000000000002171403746003700241250ustar00rootroot00000000000000{ "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/relative_uri_inherit.xml000066400000000000000000000004751403746003700237620ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div> gofeed-1.1.3/testdata/parser/atom/relative_uri_inherit_2.json000066400000000000000000000002171403746003700243460ustar00rootroot00000000000000{ "title": "Example \u003ca href=\"http://example.com/test/test.html\"\u003etest\u003c/a\u003e", "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/relative_uri_inherit_2.xml000066400000000000000000000005401403746003700241740ustar00rootroot00000000000000 <div xmlns="http://www.w3.org/1999/xhtml">Example <a href="test.html">test</a></div> gofeed-1.1.3/testdata/parser/atom/version_atom03.json000066400000000000000000000000541403746003700225600ustar00rootroot00000000000000{ "entries": [], "version": "0.3" } gofeed-1.1.3/testdata/parser/atom/version_atom03.xml000066400000000000000000000001411403746003700224040ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/atom/version_atom10.json000066400000000000000000000000541403746003700225560ustar00rootroot00000000000000{ "entries": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/atom/version_atom10.xml000066400000000000000000000001121403746003700224000ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/json/000077500000000000000000000000001403746003700170275ustar00rootroot00000000000000gofeed-1.1.3/testdata/parser/json/invalid/000077500000000000000000000000001403746003700204555ustar00rootroot00000000000000gofeed-1.1.3/testdata/parser/json/invalid/invalid.json000066400000000000000000000000241403746003700227720ustar00rootroot00000000000000{ "verion": "1.0" gofeed-1.1.3/testdata/parser/json/version_json_10.json000066400000000000000000000027571403746003700227530ustar00rootroot00000000000000{ "version": "1.0", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/json/version_json_10_expected.json000066400000000000000000000027571403746003700246340ustar00rootroot00000000000000{ "version": "1.0", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/json/version_json_11.json000066400000000000000000000026061403746003700227450ustar00rootroot00000000000000{ "version": "1.1", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "authors": [ { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" } ], "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/json/version_json_11_deprecated_author.json000066400000000000000000000025721403746003700265110ustar00rootroot00000000000000{ "version": "1.1", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/json/version_json_11_deprecated_author_expected.json000066400000000000000000000025721403746003700303720ustar00rootroot00000000000000{ "version": "1.1", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/json/version_json_11_expected.json000066400000000000000000000026061403746003700246260ustar00rootroot00000000000000{ "version": "1.1", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "authors": [ { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" } ], "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/rss/000077500000000000000000000000001403746003700166655ustar00rootroot00000000000000gofeed-1.1.3/testdata/parser/rss/issue_36_enclosure_text.json000066400000000000000000000003561403746003700243470ustar00rootroot00000000000000{ "items": [ { "enclosure": { "url": "http://example.org/podcast.mp3", "length": "123456", "type": "audio/mpeg" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/issue_36_enclosure_text.xml000066400000000000000000000003311403746003700241670ustar00rootroot00000000000000 Bad Text gofeed-1.1.3/testdata/parser/rss/rdf_channel_description.json000066400000000000000000000001211403746003700244200ustar00rootroot00000000000000{ "description": "Feed Description", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_description.xml000066400000000000000000000004161403746003700242560ustar00rootroot00000000000000 Feed Description gofeed-1.1.3/testdata/parser/rss/rdf_channel_description_cdata_escaped_markup.json000066400000000000000000000001441403746003700306240ustar00rootroot00000000000000{ "description": "<p>Feed Description</p>", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_description_cdata_escaped_markup.xml000066400000000000000000000005041403746003700304530ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rdf_channel_description_cdata_naked_markup.json000066400000000000000000000001301403746003700302750ustar00rootroot00000000000000{ "description": "

Feed Description

", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_description_cdata_naked_markup.xml000066400000000000000000000004661403746003700301400ustar00rootroot00000000000000 Feed Description

]]>
gofeed-1.1.3/testdata/parser/rss/rdf_channel_description_escaped_markup.json000066400000000000000000000001301403746003700274630ustar00rootroot00000000000000{ "description": "

Feed Description

", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_description_escaped_markup.xml000066400000000000000000000004621403746003700273220ustar00rootroot00000000000000 <p>Feed Description</p> gofeed-1.1.3/testdata/parser/rss/rdf_channel_description_naked_markup.json000066400000000000000000000001301403746003700271410ustar00rootroot00000000000000{ "description": "

Feed Description

", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_description_naked_markup.xml000066400000000000000000000004441403746003700270000ustar00rootroot00000000000000

Feed Description

gofeed-1.1.3/testdata/parser/rss/rdf_channel_link.json000066400000000000000000000001141403746003700230340ustar00rootroot00000000000000{ "link": "http://example.org", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_link.xml000066400000000000000000000003731403746003700226720ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/rss/rdf_channel_mixed_content.json000066400000000000000000000001051403746003700247370ustar00rootroot00000000000000{ "title": "Feed Title", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_mixed_content.xml000066400000000000000000000004101403746003700245650ustar00rootroot00000000000000 Feed Title Mixed content gofeed-1.1.3/testdata/parser/rss/rdf_channel_title.json000066400000000000000000000001051403746003700232200ustar00rootroot00000000000000{ "title": "Feed Title", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_title.xml000066400000000000000000000003661403746003700230600ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/rss/rdf_channel_title_cdata_escaped_markup.json000066400000000000000000000001301403746003700274150ustar00rootroot00000000000000{ "title": "<p>Feed Title</p>", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_title_cdata_escaped_markup.xml000066400000000000000000000004541403746003700272550ustar00rootroot00000000000000 <![CDATA[<p>Feed Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rdf_channel_title_cdata_naked_markup.json000066400000000000000000000001141403746003700270750ustar00rootroot00000000000000{ "title": "

Feed Title

", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_title_cdata_naked_markup.xml000066400000000000000000000004361403746003700267330ustar00rootroot00000000000000 <![CDATA[<p>Feed Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rdf_channel_title_escaped_markup.json000066400000000000000000000001141403746003700262630ustar00rootroot00000000000000{ "title": "

Feed Title

", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_title_escaped_markup.xml000066400000000000000000000004321403746003700261150ustar00rootroot00000000000000 <p>Feed Title</p> gofeed-1.1.3/testdata/parser/rss/rdf_channel_title_naked_markup.json000066400000000000000000000001141403746003700257410ustar00rootroot00000000000000{ "title": "

Feed Title

", "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_channel_title_naked_markup.xml000066400000000000000000000004141403746003700255730ustar00rootroot00000000000000 <p>Feed Title</p> gofeed-1.1.3/testdata/parser/rss/rdf_image_link.json000066400000000000000000000001511403746003700225070ustar00rootroot00000000000000{ "image": { "link": "http://www.example.org" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_image_link.xml000066400000000000000000000005651403746003700223470ustar00rootroot00000000000000 http://www.example.org gofeed-1.1.3/testdata/parser/rss/rdf_image_mixed_content.json000066400000000000000000000002701403746003700244140ustar00rootroot00000000000000{ "image": { "url": "http://example.org/image.gif", "link": "http://www.example.org", "title": "Image Title" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_image_mixed_content.xml000066400000000000000000000007151403746003700242470ustar00rootroot00000000000000 Image Title http://www.example.org http://example.org/image.gif Mixed Content gofeed-1.1.3/testdata/parser/rss/rdf_image_title.json000066400000000000000000000001371403746003700226770ustar00rootroot00000000000000{ "image": { "title": "Image Title" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_image_title.xml000066400000000000000000000005551403746003700225320ustar00rootroot00000000000000 Image Title gofeed-1.1.3/testdata/parser/rss/rdf_image_title_cdata_escaped_markup.json000066400000000000000000000001621403746003700270740ustar00rootroot00000000000000{ "image": { "title": "<p>Image Title</p>" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_image_title_cdata_escaped_markup.xml000066400000000000000000000006431403746003700267270ustar00rootroot00000000000000 <![CDATA[<p>Image Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rdf_image_title_cdata_naked_markup.json000066400000000000000000000001461403746003700265540ustar00rootroot00000000000000{ "image": { "title": "

Image Title

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_image_title_cdata_naked_markup.xml000066400000000000000000000006251403746003700264050ustar00rootroot00000000000000 <![CDATA[<p>Image Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rdf_image_title_escaped_markup.json000066400000000000000000000001461403746003700257420ustar00rootroot00000000000000{ "image": { "title": "

Image Title

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_image_title_escaped_markup.xml000066400000000000000000000006211403746003700255670ustar00rootroot00000000000000 <p>Image Title</p> gofeed-1.1.3/testdata/parser/rss/rdf_image_title_naked_markup.json000066400000000000000000000001461403746003700254200ustar00rootroot00000000000000{ "image": { "title": "

Image Title

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_image_title_naked_markup.xml000066400000000000000000000006031403746003700252450ustar00rootroot00000000000000 <p>Image Title</p> gofeed-1.1.3/testdata/parser/rss/rdf_image_url.json000066400000000000000000000001561403746003700223610ustar00rootroot00000000000000{ "image": { "url": "http://example.org/image.gif" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_image_url.xml000066400000000000000000000005701403746003700222100ustar00rootroot00000000000000 http://example.org/image.gif gofeed-1.1.3/testdata/parser/rss/rdf_item_description.json000066400000000000000000000001611403746003700237520ustar00rootroot00000000000000{ "items": [ { "description": "Item Description" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_description.xml000066400000000000000000000006701403746003700236060ustar00rootroot00000000000000 Item Description gofeed-1.1.3/testdata/parser/rss/rdf_item_description_cdata_escaped_markup.json000066400000000000000000000002041403746003700301470ustar00rootroot00000000000000{ "items": [ { "description": "<p>Item Description</p>" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_description_cdata_escaped_markup.xml000066400000000000000000000007551403746003700300110ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rdf_item_description_cdata_naked_markup.json000066400000000000000000000001701403746003700276270ustar00rootroot00000000000000{ "items": [ { "description": "

Item Description

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_description_cdata_naked_markup.xml000066400000000000000000000007371403746003700274670ustar00rootroot00000000000000 Item Description

]]>
gofeed-1.1.3/testdata/parser/rss/rdf_item_description_escaped_markup.json000066400000000000000000000001701403746003700270150ustar00rootroot00000000000000{ "items": [ { "description": "

Item Description

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_description_escaped_markup.xml000066400000000000000000000007331403746003700266510ustar00rootroot00000000000000 <p>Item Description</p> gofeed-1.1.3/testdata/parser/rss/rdf_item_description_naked_markup.json000066400000000000000000000001701403746003700264730ustar00rootroot00000000000000{ "items": [ { "description": "

Item Description

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_description_naked_markup.xml000066400000000000000000000007151403746003700263270ustar00rootroot00000000000000

Item Description

gofeed-1.1.3/testdata/parser/rss/rdf_item_link.json000066400000000000000000000001541403746003700223660ustar00rootroot00000000000000{ "items": [ { "link": "http://example.org" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_link.xml000066400000000000000000000006451403746003700222220ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/rss/rdf_item_title.json000066400000000000000000000001451403746003700225520ustar00rootroot00000000000000{ "items": [ { "title": "Item Title" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_title.xml000066400000000000000000000006371403746003700224070ustar00rootroot00000000000000 Item Title gofeed-1.1.3/testdata/parser/rss/rdf_item_title_cdata_escaped_markup.json000066400000000000000000000001701403746003700267470ustar00rootroot00000000000000{ "items": [ { "title": "<p>Item Title</p>" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_title_cdata_escaped_markup.xml000066400000000000000000000007251403746003700266040ustar00rootroot00000000000000 <![CDATA[<p>Item Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rdf_item_title_cdata_naked_markup.json000066400000000000000000000002001403746003700264170ustar00rootroot00000000000000{ "items": [ { "title": "\u003cp\u003eItem Title\u003c/p\u003e" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_title_cdata_naked_markup.xml000066400000000000000000000007071403746003700262620ustar00rootroot00000000000000 <![CDATA[<p>Item Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rdf_item_title_escaped_markup.json000066400000000000000000000001541403746003700256150ustar00rootroot00000000000000{ "items": [ { "title": "

Item Title

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_title_escaped_markup.xml000066400000000000000000000007031403746003700254440ustar00rootroot00000000000000 <p>Item Title</p> gofeed-1.1.3/testdata/parser/rss/rdf_item_title_naked_markup.json000066400000000000000000000001541403746003700252730ustar00rootroot00000000000000{ "items": [ { "title": "

Item Title

" } ], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_item_title_naked_markup.xml000066400000000000000000000006651403746003700251310ustar00rootroot00000000000000 <p>Item Title</p> gofeed-1.1.3/testdata/parser/rss/rdf_mixed_content.json000066400000000000000000000000521403746003700232500ustar00rootroot00000000000000{ "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_mixed_content.xml000066400000000000000000000003621403746003700231030ustar00rootroot00000000000000 Mixed content gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description.json000066400000000000000000000001631403746003700250620ustar00rootroot00000000000000{ "textInput": { "description": "TextInput Description" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description.xml000066400000000000000000000006241403746003700247130ustar00rootroot00000000000000 TextInput Description gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description_cdata_escaped_markup.json000066400000000000000000000002061403746003700312570ustar00rootroot00000000000000{ "textInput": { "description": "<p>TextInput Description</p>" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description_cdata_escaped_markup.xml000066400000000000000000000007121403746003700311100ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description_cdata_naked_markup.json000066400000000000000000000001721403746003700307370ustar00rootroot00000000000000{ "textInput": { "description": "

TextInput Description

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description_cdata_naked_markup.xml000066400000000000000000000006741403746003700305750ustar00rootroot00000000000000 TextInput Description

]]>
gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description_escaped_markup.json000066400000000000000000000001721403746003700301250ustar00rootroot00000000000000{ "textInput": { "description": "

TextInput Description

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description_escaped_markup.xml000066400000000000000000000006701403746003700277570ustar00rootroot00000000000000 <p>TextInput Description</p> gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description_naked_markup.json000066400000000000000000000001721403746003700276030ustar00rootroot00000000000000{ "textInput": { "description": "

TextInput Description

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_description_naked_markup.xml000066400000000000000000000006521403746003700274350ustar00rootroot00000000000000

TextInput Description

gofeed-1.1.3/testdata/parser/rss/rdf_textinput_link.json000066400000000000000000000001601403746003700234710ustar00rootroot00000000000000{ "textInput": { "link": "http://example.org/search" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_link.xml000066400000000000000000000006031403746003700233220ustar00rootroot00000000000000 http://example.org/search gofeed-1.1.3/testdata/parser/rss/rdf_textinput_mixed_content.json000066400000000000000000000003461403746003700254020ustar00rootroot00000000000000{ "textInput": { "title": "TextInput Title", "description": "TextInput Description", "name": "TextInput Name", "link": "http://example.org/search" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_mixed_content.xml000066400000000000000000000010271403746003700252260ustar00rootroot00000000000000 TextInput Title TextInput Description TextInput Name http://example.org/search Mixed content gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name.json000066400000000000000000000001451403746003700234570ustar00rootroot00000000000000{ "textInput": { "name": "TextInput Name" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name.xml000066400000000000000000000005701403746003700233100ustar00rootroot00000000000000 TextInput Name gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name_cdata_escaped_markup.json000066400000000000000000000001701403746003700276540ustar00rootroot00000000000000{ "textInput": { "name": "<p>TextInput Name</p>" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name_cdata_escaped_markup.xml000066400000000000000000000006561403746003700275140ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name_cdata_naked_markup.json000066400000000000000000000001541403746003700273340ustar00rootroot00000000000000{ "textInput": { "name": "

TextInput Name

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name_cdata_naked_markup.xml000066400000000000000000000006401403746003700271630ustar00rootroot00000000000000 TextInput Name

]]>
gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name_escaped_markup.json000066400000000000000000000001541403746003700265220ustar00rootroot00000000000000{ "textInput": { "name": "

TextInput Name

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name_escaped_markup.xml000066400000000000000000000006341403746003700263540ustar00rootroot00000000000000 <p>TextInput Name</p> gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name_naked_markup.json000066400000000000000000000001541403746003700262000ustar00rootroot00000000000000{ "textInput": { "name": "

TextInput Name

" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_name_naked_markup.xml000066400000000000000000000006161403746003700260320ustar00rootroot00000000000000

TextInput Name

gofeed-1.1.3/testdata/parser/rss/rdf_textinput_title.json000066400000000000000000000001471403746003700236620ustar00rootroot00000000000000{ "textInput": { "title": "TextInput Title" }, "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/rdf_textinput_title.xml000066400000000000000000000005741403746003700235150ustar00rootroot00000000000000 TextInput Title gofeed-1.1.3/testdata/parser/rss/rss_channel_category.json000066400000000000000000000004501403746003700237530ustar00rootroot00000000000000{ "categories": [ { "domain": "http://www.example.org/cat/1", "value": "Feed Category 1" }, { "domain": "http://www.example.org/cat/2", "value": "Feed Category 2" } ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_category.xml000066400000000000000000000003771403746003700236120ustar00rootroot00000000000000 Feed Category 1 Feed Category 2 gofeed-1.1.3/testdata/parser/rss/rss_channel_category_cdata_escaped_markup.json000066400000000000000000000005161403746003700301550ustar00rootroot00000000000000{ "categories": [ { "domain": "http://www.example.org/cat/1", "value": "<p>Feed Category 1</p>" }, { "domain": "http://www.example.org/cat/2", "value": "<p>Feed Category 2</p>" } ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_category_cdata_escaped_markup.xml000066400000000000000000000005241403746003700300030ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_category_cdata_naked_markup.json000066400000000000000000000004661403746003700276370ustar00rootroot00000000000000{ "categories": [ { "domain": "http://www.example.org/cat/1", "value": "

Feed Category 1

" }, { "domain": "http://www.example.org/cat/2", "value": "

Feed Category 2

" } ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_category_cdata_naked_markup.xml000066400000000000000000000004721403746003700274630ustar00rootroot00000000000000 Feed Category 1

]]>
Feed Category 2

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_category_escaped_markup.json000066400000000000000000000004661403746003700270250ustar00rootroot00000000000000{ "categories": [ { "domain": "http://www.example.org/cat/1", "value": "

Feed Category 1

" }, { "domain": "http://www.example.org/cat/2", "value": "

Feed Category 2

" } ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_category_escaped_markup.xml000066400000000000000000000004341403746003700266470ustar00rootroot00000000000000

Feed Category 1

Feed Category 2

gofeed-1.1.3/testdata/parser/rss/rss_channel_category_naked_markup.json000066400000000000000000000004661403746003700265030ustar00rootroot00000000000000{ "categories": [ { "domain": "http://www.example.org/cat/1", "value": "

Feed Category 1

" }, { "domain": "http://www.example.org/cat/2", "value": "

Feed Category 2

" } ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_category_naked_markup.xml000066400000000000000000000004661403746003700263320ustar00rootroot00000000000000 <p>Feed Category 1</p> <p>Feed Category 2</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_cloud.json000066400000000000000000000003461403746003700232500ustar00rootroot00000000000000{ "cloud": { "domain": "rpc.sys.com", "port": "80", "path": "/RPC2", "registerProcedure": "myCloud.rssPleaseNotify", "protocol": "xml-rpc" }, "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_cloud.xml000066400000000000000000000003261403746003700230750ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright.json000066400000000000000000000001151403746003700241440ustar00rootroot00000000000000{ "copyright": "Feed Copyright", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright.xml000066400000000000000000000002131403746003700237720ustar00rootroot00000000000000 Feed Copyright gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright_cdata_escaped_markup.json000066400000000000000000000001401403746003700303410ustar00rootroot00000000000000{ "copyright": "<p>Feed Copyright</p>", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright_cdata_escaped_markup.xml000066400000000000000000000003001403746003700301660ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright_cdata_naked_markup.json000066400000000000000000000001241403746003700300210ustar00rootroot00000000000000{ "copyright": "

Feed Copyright

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright_cdata_naked_markup.xml000066400000000000000000000002621403746003700276530ustar00rootroot00000000000000 Feed Copyright

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright_escaped_markup.json000066400000000000000000000001241403746003700272070ustar00rootroot00000000000000{ "copyright": "

Feed Copyright

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright_escaped_markup.xml000066400000000000000000000002561403746003700270440ustar00rootroot00000000000000 <p>Feed Copyright</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright_naked_markup.json000066400000000000000000000001241403746003700266650ustar00rootroot00000000000000{ "copyright": "

Feed Copyright

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_copyright_naked_markup.xml000066400000000000000000000002561403746003700265220ustar00rootroot00000000000000 <p>Feed Copyright</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_description.json000066400000000000000000000001211403746003700244540ustar00rootroot00000000000000{ "description": "Feed Description", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_description.xml000066400000000000000000000002231403746003700243060ustar00rootroot00000000000000 Feed Description gofeed-1.1.3/testdata/parser/rss/rss_channel_description_cdata_escaped_markup.json000066400000000000000000000001441403746003700306600ustar00rootroot00000000000000{ "description": "<p>Feed Description</p>", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_description_cdata_escaped_markup.xml000066400000000000000000000003101403746003700305020ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_description_cdata_naked_markup.json000066400000000000000000000001301403746003700303310ustar00rootroot00000000000000{ "description": "

Feed Description

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_description_cdata_naked_markup.xml000066400000000000000000000002721403746003700301670ustar00rootroot00000000000000 Feed Description

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_description_escaped_markup.json000066400000000000000000000001301403746003700275170ustar00rootroot00000000000000{ "description": "

Feed Description

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_description_escaped_markup.xml000066400000000000000000000002661403746003700273600ustar00rootroot00000000000000 <p>Feed Description</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_description_naked_markup.json000066400000000000000000000001301403746003700271750ustar00rootroot00000000000000{ "description": "

Feed Description

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_description_naked_markup.xml000066400000000000000000000002501403746003700270270ustar00rootroot00000000000000

Feed Description

gofeed-1.1.3/testdata/parser/rss/rss_channel_docs.json000066400000000000000000000001201403746003700230600ustar00rootroot00000000000000{ "docs": "http://www.example.org", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_docs.xml000066400000000000000000000002031403746003700227110ustar00rootroot00000000000000 http://www.example.org gofeed-1.1.3/testdata/parser/rss/rss_channel_generator.json000066400000000000000000000001151403746003700241220ustar00rootroot00000000000000{ "generator": "Feed Generator", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_generator.xml000066400000000000000000000002121403746003700237470ustar00rootroot00000000000000 Feed Generator gofeed-1.1.3/testdata/parser/rss/rss_channel_generator_cdata_escaped_markup.json000066400000000000000000000001401403746003700303170ustar00rootroot00000000000000{ "generator": "<p>Feed Generator</p>", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_generator_cdata_escaped_markup.xml000066400000000000000000000003001403746003700301440ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_generator_cdata_naked_markup.json000066400000000000000000000001241403746003700277770ustar00rootroot00000000000000{ "generator": "

Feed Generator

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_generator_cdata_naked_markup.xml000066400000000000000000000002621403746003700276310ustar00rootroot00000000000000 Feed Generator

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_generator_escaped_markup.json000066400000000000000000000001241403746003700271650ustar00rootroot00000000000000{ "generator": "

Feed Generator

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_generator_escaped_markup.xml000066400000000000000000000002561403746003700270220ustar00rootroot00000000000000 <p>Feed Generator</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_generator_naked_markup.json000066400000000000000000000001241403746003700266430ustar00rootroot00000000000000{ "generator": "

Feed Generator

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_generator_naked_markup.xml000066400000000000000000000002401403746003700264710ustar00rootroot00000000000000

Feed Generator

gofeed-1.1.3/testdata/parser/rss/rss_channel_image.json000066400000000000000000000004211403746003700232160ustar00rootroot00000000000000{ "image": { "url": "http://example.org/url", "link": "http://example.org/link", "title": "Image Title", "width": "256", "height": "512", "description": "Image Description" }, "items": [], "version": "0.91" } gofeed-1.1.3/testdata/parser/rss/rss_channel_image.xml000066400000000000000000000005651403746003700230560ustar00rootroot00000000000000 Image Title http://example.org/url http://example.org/link 256 512 Image Description Mixed content gofeed-1.1.3/testdata/parser/rss/rss_channel_image_mixed_content.json000066400000000000000000000004211403746003700261360ustar00rootroot00000000000000{ "image": { "url": "http://example.org/url", "link": "http://example.org/link", "title": "Image Title", "width": "256", "height": "512", "description": "Image Description" }, "items": [], "version": "0.91" } gofeed-1.1.3/testdata/parser/rss/rss_channel_image_mixed_content.xml000066400000000000000000000005651403746003700257760ustar00rootroot00000000000000 Image Title http://example.org/url http://example.org/link 256 512 Image Description Mixed content gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author.json000066400000000000000000000001471403746003700244610ustar00rootroot00000000000000{ "items": [ { "author": "Item Author" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author.xml000066400000000000000000000002251403746003700243050ustar00rootroot00000000000000 Item Author gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author_cdata_escaped_markup.json000066400000000000000000000001721403746003700306560ustar00rootroot00000000000000{ "items": [ { "author": "<p>Item Author</p>" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author_cdata_escaped_markup.xml000066400000000000000000000003121403746003700305010ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author_cdata_naked_markup.json000066400000000000000000000001561403746003700303360ustar00rootroot00000000000000{ "items": [ { "author": "

Item Author

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author_cdata_naked_markup.xml000066400000000000000000000002741403746003700301660ustar00rootroot00000000000000 Item Author

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author_escaped_markup.json000066400000000000000000000001561403746003700275240ustar00rootroot00000000000000{ "items": [ { "author": "

Item Author

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author_escaped_markup.xml000066400000000000000000000002701403746003700273500ustar00rootroot00000000000000 <p>Item Author</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author_naked_markup.json000066400000000000000000000001561403746003700272020ustar00rootroot00000000000000{ "items": [ { "author": "

Item Author

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_author_naked_markup.xml000066400000000000000000000002521403746003700270260ustar00rootroot00000000000000

Item Author

gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category.json000066400000000000000000000006201403746003700247700ustar00rootroot00000000000000{ "items": [ { "categories": [ { "domain": "http://www.example.org/cat/1", "value": "Item Category 1" }, { "domain": "http://www.example.org/cat/2", "value": "Item Category 2" } ] } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category.xml000066400000000000000000000004301403746003700246160ustar00rootroot00000000000000 Item Category 1 Item Category 2 gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category_cdata_escaped_markup.json000066400000000000000000000006661403746003700312010ustar00rootroot00000000000000{ "items": [ { "categories": [ { "domain": "http://www.example.org/cat/1", "value": "<p>Item Category 1</p>" }, { "domain": "http://www.example.org/cat/2", "value": "<p>Item Category 2</p>" } ] } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category_cdata_escaped_markup.xml000066400000000000000000000005541403746003700310240ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category_cdata_naked_markup.json000066400000000000000000000006361403746003700306540ustar00rootroot00000000000000{ "items": [ { "categories": [ { "domain": "http://www.example.org/cat/1", "value": "

Item Category 1

" }, { "domain": "http://www.example.org/cat/2", "value": "

Item Category 2

" } ] } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category_cdata_naked_markup.xml000066400000000000000000000005221403746003700304750ustar00rootroot00000000000000 Item Category 1

]]>
Item Category 2

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category_escaped_markup.json000066400000000000000000000006361403746003700300420ustar00rootroot00000000000000{ "items": [ { "categories": [ { "domain": "http://www.example.org/cat/1", "value": "

Item Category 1

" }, { "domain": "http://www.example.org/cat/2", "value": "

Item Category 2

" } ] } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category_escaped_markup.xml000066400000000000000000000005161403746003700276660ustar00rootroot00000000000000 <p>Item Category 1</p> <p>Item Category 2</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category_naked_markup.json000066400000000000000000000006361403746003700275200ustar00rootroot00000000000000{ "items": [ { "categories": [ { "domain": "http://www.example.org/cat/1", "value": "

Item Category 1

" }, { "domain": "http://www.example.org/cat/2", "value": "

Item Category 2

" } ] } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_category_naked_markup.xml000066400000000000000000000004641403746003700273460ustar00rootroot00000000000000

Item Category 1

Item Category 2

gofeed-1.1.3/testdata/parser/rss/rss_channel_item_comments.json000066400000000000000000000001601403746003700247770ustar00rootroot00000000000000{ "items": [ { "comments": "http://example.org" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_comments.xml000066400000000000000000000002421403746003700246270ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/rss/rss_channel_item_custom.json000066400000000000000000000002011403746003700244600ustar00rootroot00000000000000{ "items": [ { "custom": { "apcategory": "s", "test": "test" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_custom.xml000066400000000000000000000002571403746003700243220ustar00rootroot00000000000000 s test gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description.json000066400000000000000000000001611403746003700254760ustar00rootroot00000000000000{ "items": [ { "description": "Item Description" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description.xml000066400000000000000000000002511403746003700253250ustar00rootroot00000000000000 Item Description gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description_cdata_escaped_markup.json000066400000000000000000000002041403746003700316730ustar00rootroot00000000000000{ "items": [ { "description": "<p>Item Description</p>" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description_cdata_escaped_markup.xml000066400000000000000000000003371403746003700315310ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description_cdata_naked_markup.json000066400000000000000000000001701403746003700313530ustar00rootroot00000000000000{ "items": [ { "description": "

Item Description

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description_cdata_naked_markup.xml000066400000000000000000000003211403746003700312000ustar00rootroot00000000000000 Item Description

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description_escaped_markup.json000066400000000000000000000001701403746003700305410ustar00rootroot00000000000000{ "items": [ { "description": "

Item Description

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description_escaped_markup.xml000066400000000000000000000003151403746003700303710ustar00rootroot00000000000000 <p>Item Description</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description_naked_markup.json000066400000000000000000000001701403746003700302170ustar00rootroot00000000000000{ "items": [ { "description": "

Item Description

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_description_naked_markup.xml000066400000000000000000000002771403746003700300560ustar00rootroot00000000000000

Item Description

gofeed-1.1.3/testdata/parser/rss/rss_channel_item_enclosure.json000066400000000000000000000003561403746003700251600ustar00rootroot00000000000000{ "items": [ { "enclosure": { "url": "http://example.org/podcast.mp3", "length": "123456", "type": "audio/mpeg" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_enclosure.xml000066400000000000000000000003201403746003700247760ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid.json000066400000000000000000000002111403746003700240770ustar00rootroot00000000000000{ "items": [ { "guid": { "value": "abc123" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid.xml000066400000000000000000000002351403746003700237340ustar00rootroot00000000000000 abc123 gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid_cdata_escaped_markup.json000066400000000000000000000002341403746003700303030ustar00rootroot00000000000000{ "items": [ { "guid": { "value": "<p>abc123</p>" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid_cdata_escaped_markup.xml000066400000000000000000000003231403746003700301310ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid_cdata_naked_markup.json000066400000000000000000000002201403746003700277540ustar00rootroot00000000000000{ "items": [ { "guid": { "value": "

abc123

" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid_cdata_naked_markup.xml000066400000000000000000000003051403746003700276070ustar00rootroot00000000000000 abc123

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid_escaped_markup.json000066400000000000000000000002201403746003700271420ustar00rootroot00000000000000{ "items": [ { "guid": { "value": "

abc123

" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid_escaped_markup.xml000066400000000000000000000003011403746003700267710ustar00rootroot00000000000000 <p>abc123</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid_naked_markup.json000066400000000000000000000002201403746003700266200ustar00rootroot00000000000000{ "items": [ { "guid": { "value": "

abc123

" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_guid_naked_markup.xml000066400000000000000000000002631403746003700264560ustar00rootroot00000000000000

abc123

gofeed-1.1.3/testdata/parser/rss/rss_channel_item_link.json000066400000000000000000000002661403746003700241160ustar00rootroot00000000000000{ "items": [ { "link": "http://example.org", "links": [ "http://example.org" ] } ], "version": "2.0" }gofeed-1.1.3/testdata/parser/rss/rss_channel_item_link.xml000066400000000000000000000002261403746003700237410ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/rss/rss_channel_item_pubDate.json000066400000000000000000000002531403746003700245410ustar00rootroot00000000000000{ "items": [ { "pubDate": "Sun, 06 Jul 2014 12:56:00 GMT", "pubDateParsed": "2014-07-06T12:56:00Z" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_pubDate.xml000066400000000000000000000002521403746003700243670ustar00rootroot00000000000000 Sun, 06 Jul 2014 12:56:00 GMT gofeed-1.1.3/testdata/parser/rss/rss_channel_item_source.json000066400000000000000000000002761403746003700244620ustar00rootroot00000000000000{ "items": [ { "source": { "title": "Source Title", "url": "http://example.org" } } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_source.xml000066400000000000000000000002571403746003700243100ustar00rootroot00000000000000 Source Title gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title.json000066400000000000000000000001451403746003700242760ustar00rootroot00000000000000{ "items": [ { "title": "Item Title" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title.xml000066400000000000000000000002211403746003700241200ustar00rootroot00000000000000 Item Title gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title_cdata_escaped_markup.json000066400000000000000000000001701403746003700304730ustar00rootroot00000000000000{ "items": [ { "title": "<p>Item Title</p>" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title_cdata_escaped_markup.xml000066400000000000000000000003061403746003700303230ustar00rootroot00000000000000 <![CDATA[<p>Item Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title_cdata_naked_markup.json000066400000000000000000000001541403746003700301530ustar00rootroot00000000000000{ "items": [ { "title": "

Item Title

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title_cdata_naked_markup.xml000066400000000000000000000002701403746003700300010ustar00rootroot00000000000000 <![CDATA[<p>Item Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title_escaped_markup.json000066400000000000000000000001541403746003700273410ustar00rootroot00000000000000{ "items": [ { "title": "

Item Title

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title_escaped_markup.xml000066400000000000000000000002641403746003700271720ustar00rootroot00000000000000 <p>Item Title</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title_naked_markup.json000066400000000000000000000001541403746003700270170ustar00rootroot00000000000000{ "items": [ { "title": "

Item Title

" } ], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_item_title_naked_markup.xml000066400000000000000000000002501403746003700266430ustar00rootroot00000000000000 <p>Item Title</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_language.json000066400000000000000000000000731403746003700237220ustar00rootroot00000000000000{ "language":"en-us", "items": [], "version":"2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_language.xml000066400000000000000000000001771403746003700235560ustar00rootroot00000000000000 en-us gofeed-1.1.3/testdata/parser/rss/rss_channel_lastBuildDate.json000066400000000000000000000002231403746003700246550ustar00rootroot00000000000000{ "lastBuildDate": "Sun, 06 Jul 2014 12:56:00 GMT", "lastBuildDateParsed": "2014-07-06T12:56:00Z", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_lastBuildDate.xml000066400000000000000000000002461403746003700245110ustar00rootroot00000000000000 Sun, 06 Jul 2014 12:56:00 GMT gofeed-1.1.3/testdata/parser/rss/rss_channel_link.json000066400000000000000000000001141403746003700230700ustar00rootroot00000000000000{ "link": "http://example.org", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_link.xml000066400000000000000000000002001403746003700227130ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor.json000066400000000000000000000001171403746003700250660ustar00rootroot00000000000000{ "managingEditor": "Feed Editor", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor.xml000066400000000000000000000002171403746003700247160ustar00rootroot00000000000000 Feed Editor gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor_cdata_escaped_markup.json000066400000000000000000000001421403746003700312630ustar00rootroot00000000000000{ "managingEditor": "<p>Feed Editor</p>", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor_cdata_escaped_markup.xml000066400000000000000000000003041403746003700311120ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor_cdata_naked_markup.json000066400000000000000000000001261403746003700307430ustar00rootroot00000000000000{ "managingEditor": "

Feed Editor

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor_cdata_naked_markup.xml000066400000000000000000000002721403746003700305740ustar00rootroot00000000000000 Feed Editor

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor_escaped_markup.json000066400000000000000000000001261403746003700301310ustar00rootroot00000000000000{ "managingEditor": "

Feed Editor

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor_escaped_markup.xml000066400000000000000000000002621403746003700277610ustar00rootroot00000000000000 <p>Feed Editor</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor_naked_markup.json000066400000000000000000000001261403746003700276070ustar00rootroot00000000000000{ "managingEditor": "

Feed Editor

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_managingEditor_naked_markup.xml000066400000000000000000000002441403746003700274370ustar00rootroot00000000000000

Feed Editor

gofeed-1.1.3/testdata/parser/rss/rss_channel_mixed_content.json000066400000000000000000000001051403746003700247730ustar00rootroot00000000000000{ "title": "Feed Title", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_mixed_content.xml000066400000000000000000000002341403746003700246250ustar00rootroot00000000000000 Feed Title Mixed content gofeed-1.1.3/testdata/parser/rss/rss_channel_pubDate.json000066400000000000000000000001771403746003700235300ustar00rootroot00000000000000{ "pubDate": "Sun, 06 Jul 2014 12:56:00 GMT", "pubDateParsed": "2014-07-06T12:56:00Z", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_pubDate.xml000066400000000000000000000002241403746003700233500ustar00rootroot00000000000000 Sun, 06 Jul 2014 12:56:00 GMT gofeed-1.1.3/testdata/parser/rss/rss_channel_rating.json000066400000000000000000000003551403746003700234260ustar00rootroot00000000000000{ "rating": "(PICS-1.1 \"http://www.rsac.org/ratingsv01.html\" l gen true comment \"RSACi North America Server\" for \"http://www.rsac.org\" on \"1996.04.16T08:15-0500\" r (n 0 s 0 v 0 l 0))", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_rating.xml000066400000000000000000000004251403746003700232530ustar00rootroot00000000000000 (PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0)) gofeed-1.1.3/testdata/parser/rss/rss_channel_rating_cdata_escaped_markup.json000066400000000000000000000004001403746003700276140ustar00rootroot00000000000000{ "rating": "<p>(PICS-1.1 \"http://www.rsac.org/ratingsv01.html\" l gen true comment \"RSACi North America Server\" for \"http://www.rsac.org\" on \"1996.04.16T08:15-0500\" r (n 0 s 0 v 0 l 0))</p>", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_rating_cdata_escaped_markup.xml000066400000000000000000000005161403746003700274530ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_rating_cdata_naked_markup.json000066400000000000000000000003641403746003700273030ustar00rootroot00000000000000{ "rating": "

(PICS-1.1 \"http://www.rsac.org/ratingsv01.html\" l gen true comment \"RSACi North America Server\" for \"http://www.rsac.org\" on \"1996.04.16T08:15-0500\" r (n 0 s 0 v 0 l 0))

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_rating_cdata_naked_markup.xml000066400000000000000000000005001403746003700271220ustar00rootroot00000000000000 (PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_rating_escaped_markup.json000066400000000000000000000003641403746003700264710ustar00rootroot00000000000000{ "rating": "

(PICS-1.1 \"http://www.rsac.org/ratingsv01.html\" l gen true comment \"RSACi North America Server\" for \"http://www.rsac.org\" on \"1996.04.16T08:15-0500\" r (n 0 s 0 v 0 l 0))

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_rating_escaped_markup.xml000066400000000000000000000004701403746003700263160ustar00rootroot00000000000000 <p>(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_rating_naked_markup.json000066400000000000000000000003641403746003700261470ustar00rootroot00000000000000{ "rating": "

(PICS-1.1 \"http://www.rsac.org/ratingsv01.html\" l gen true comment \"RSACi North America Server\" for \"http://www.rsac.org\" on \"1996.04.16T08:15-0500\" r (n 0 s 0 v 0 l 0))

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_rating_naked_markup.xml000066400000000000000000000004521403746003700257740ustar00rootroot00000000000000

(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))

gofeed-1.1.3/testdata/parser/rss/rss_channel_skipDays.json000066400000000000000000000001501403746003700237220ustar00rootroot00000000000000{ "skipDays": [ "Thursday", "Friday" ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_skipDays.xml000066400000000000000000000002611403746003700235540ustar00rootroot00000000000000 Thursday Friday gofeed-1.1.3/testdata/parser/rss/rss_channel_skipDays_mixed_content.json000066400000000000000000000001501403746003700266420ustar00rootroot00000000000000{ "skipDays": [ "Thursday", "Friday" ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_skipDays_mixed_content.xml000066400000000000000000000003241403746003700264740ustar00rootroot00000000000000 Thursday Friday Mixed content gofeed-1.1.3/testdata/parser/rss/rss_channel_skipHours.json000066400000000000000000000001521403746003700241240ustar00rootroot00000000000000{ "skipHours": [ "4", "5", "6" ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_skipHours.xml000066400000000000000000000003011403746003700237470ustar00rootroot00000000000000 4 5 6 gofeed-1.1.3/testdata/parser/rss/rss_channel_skipHours_mixed_content.json000066400000000000000000000001521403746003700270440ustar00rootroot00000000000000{ "skipHours": [ "4", "5", "6" ], "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_skipHours_mixed_content.xml000066400000000000000000000003441403746003700266760ustar00rootroot00000000000000 4 5 6 Mixed content gofeed-1.1.3/testdata/parser/rss/rss_channel_textInput.json000066400000000000000000000003371403746003700241460ustar00rootroot00000000000000{ "textInput": { "title": "textInput title", "description": "textInput description", "name": "textInput name", "link": "http://example.org" }, "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_textInput.xml000066400000000000000000000004461403746003700237760ustar00rootroot00000000000000 textInput title textInput name http://example.org textInput description gofeed-1.1.3/testdata/parser/rss/rss_channel_textInput_mixed_content.json000066400000000000000000000003371403746003700270660ustar00rootroot00000000000000{ "textInput": { "title": "textInput title", "description": "textInput description", "name": "textInput name", "link": "http://example.org" }, "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_textInput_mixed_content.xml000066400000000000000000000005111403746003700267070ustar00rootroot00000000000000 textInput title textInput name http://example.org textInput description Mixed content gofeed-1.1.3/testdata/parser/rss/rss_channel_title.json000066400000000000000000000001051403746003700232540ustar00rootroot00000000000000{ "title": "Feed Title", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_title.xml000066400000000000000000000001731403746003700231100ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/rss/rss_channel_title_cdata_escaped_markup.json000066400000000000000000000001301403746003700274510ustar00rootroot00000000000000{ "title": "<p>Feed Title</p>", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_title_cdata_escaped_markup.xml000066400000000000000000000002601403746003700273040ustar00rootroot00000000000000 <![CDATA[<p>Feed Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rss_channel_title_cdata_naked_markup.json000066400000000000000000000001141403746003700271310ustar00rootroot00000000000000{ "title": "

Feed Title

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_title_cdata_naked_markup.xml000066400000000000000000000002421403746003700267620ustar00rootroot00000000000000 <![CDATA[<p>Feed Title</p>]]> gofeed-1.1.3/testdata/parser/rss/rss_channel_title_escaped_markup.json000066400000000000000000000001141403746003700263170ustar00rootroot00000000000000{ "title": "

Feed Title

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_title_escaped_markup.xml000066400000000000000000000002261403746003700261520ustar00rootroot00000000000000 <p>Feed Title</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_title_naked_markup.json000066400000000000000000000001141403746003700257750ustar00rootroot00000000000000{ "title": "

Feed Title

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_title_naked_markup.xml000066400000000000000000000002201403746003700256220ustar00rootroot00000000000000 <p>Feed Title</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_ttl.json000066400000000000000000000000731403746003700227420ustar00rootroot00000000000000{ "ttl": "60", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_ttl.xml000066400000000000000000000001551403746003700225720ustar00rootroot00000000000000 60 gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster.json000066400000000000000000000001151403746003700240650ustar00rootroot00000000000000{ "webMaster": "Feed WebMaster", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster.xml000066400000000000000000000002031403746003700237120ustar00rootroot00000000000000 Feed WebMaster gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster_cdata_escaped_markup.json000066400000000000000000000001401403746003700302620ustar00rootroot00000000000000{ "webMaster": "<p>Feed WebMaster</p>", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster_cdata_escaped_markup.xml000066400000000000000000000003001403746003700301070ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster_cdata_naked_markup.json000066400000000000000000000001241403746003700277420ustar00rootroot00000000000000{ "webMaster": "

Feed WebMaster

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster_cdata_naked_markup.xml000066400000000000000000000002621403746003700275740ustar00rootroot00000000000000 Feed WebMaster

]]>
gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster_escaped_markup.json000066400000000000000000000001241403746003700271300ustar00rootroot00000000000000{ "webMaster": "

Feed WebMaster

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster_escaped_markup.xml000066400000000000000000000002461403746003700267640ustar00rootroot00000000000000 <p>Feed WebMaster</p> gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster_naked_markup.json000066400000000000000000000001241403746003700266060ustar00rootroot00000000000000{ "webMaster": "

Feed WebMaster

", "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_channel_webMaster_naked_markup.xml000066400000000000000000000002301403746003700264330ustar00rootroot00000000000000

Feed WebMaster

gofeed-1.1.3/testdata/parser/rss/rss_mixed_content.json000066400000000000000000000000521403746003700233040ustar00rootroot00000000000000{ "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/rss_mixed_content.xml000066400000000000000000000001661403746003700231410ustar00rootroot00000000000000 Mixed content gofeed-1.1.3/testdata/parser/rss/version_rdf_090.json000066400000000000000000000000521403746003700224650ustar00rootroot00000000000000{ "items": [], "version": "0.9" } gofeed-1.1.3/testdata/parser/rss/version_rdf_090.xml000066400000000000000000000002331403746003700223150ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rdf_10.json000066400000000000000000000000521403746003700223750ustar00rootroot00000000000000{ "items": [], "version": "1.0" } gofeed-1.1.3/testdata/parser/rss/version_rdf_10.xml000066400000000000000000000002111403746003700222210ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_091_netscape.json000066400000000000000000000000531403746003700244050ustar00rootroot00000000000000{ "items": [], "version": "0.91" } gofeed-1.1.3/testdata/parser/rss/version_rss_091_netscape.xml000066400000000000000000000001761403746003700242420ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_091_userland.json000066400000000000000000000000531403746003700244200ustar00rootroot00000000000000{ "items": [], "version": "0.91" } gofeed-1.1.3/testdata/parser/rss/version_rss_091_userland.xml000066400000000000000000000000341403746003700242460ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_092.json000066400000000000000000000000531403746003700225240ustar00rootroot00000000000000{ "items": [], "version": "0.92" } gofeed-1.1.3/testdata/parser/rss/version_rss_092.xml000066400000000000000000000000621403746003700223530ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_093.json000066400000000000000000000000531403746003700225250ustar00rootroot00000000000000{ "items": [], "version": "0.93" } gofeed-1.1.3/testdata/parser/rss/version_rss_093.xml000066400000000000000000000000621403746003700223540ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_094.json000066400000000000000000000000531403746003700225260ustar00rootroot00000000000000{ "items": [], "version": "0.94" } gofeed-1.1.3/testdata/parser/rss/version_rss_094.xml000066400000000000000000000000621403746003700223550ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_20.json000066400000000000000000000000521403746003700224320ustar00rootroot00000000000000{ "items": [], "version": "2.0" } gofeed-1.1.3/testdata/parser/rss/version_rss_20.xml000066400000000000000000000000611403746003700222610ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_201.json000066400000000000000000000000531403746003700225140ustar00rootroot00000000000000{ "items": [], "version": "2.01" } gofeed-1.1.3/testdata/parser/rss/version_rss_201.xml000066400000000000000000000000621403746003700223430ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_21.json000066400000000000000000000000521403746003700224330ustar00rootroot00000000000000{ "items": [], "version": "2.1" } gofeed-1.1.3/testdata/parser/rss/version_rss_21.xml000066400000000000000000000000611403746003700222620ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/rss/version_rss_missing.json000066400000000000000000000000471403746003700236660ustar00rootroot00000000000000{ "items": [], "version": "" } gofeed-1.1.3/testdata/parser/rss/version_rss_missing.xml000066400000000000000000000000431403746003700235110ustar00rootroot00000000000000 gofeed-1.1.3/testdata/parser/universal/000077500000000000000000000000001403746003700200665ustar00rootroot00000000000000gofeed-1.1.3/testdata/parser/universal/atom03_feed.xml000066400000000000000000000001751403746003700227010ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/universal/atom10_feed.xml000066400000000000000000000001621403746003700226730ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/universal/empty_feed.xml000066400000000000000000000000001403746003700227170ustar00rootroot00000000000000gofeed-1.1.3/testdata/parser/universal/invalid.json000066400000000000000000000000241403746003700224030ustar00rootroot00000000000000{ "verion": "1.0" gofeed-1.1.3/testdata/parser/universal/json10_feed.json000066400000000000000000000027571403746003700230710ustar00rootroot00000000000000{ "version": "1.0", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/universal/json11_feed.json000066400000000000000000000026061403746003700230630ustar00rootroot00000000000000{ "version": "1.1", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "authors": [ { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" } ], "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/universal/rdf_feed.xml000066400000000000000000000003561403746003700223520ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/universal/rss_feed.xml000066400000000000000000000001621403746003700224010ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/universal/rss_feed_bom.xml000066400000000000000000000002111403746003700232310ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/universal/rss_feed_leading_spaces.xml000066400000000000000000000003111403746003700254160ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/parser/universal/sample.json000066400000000000000000000027571403746003700222550ustar00rootroot00000000000000{ "version": "1.0", "title": "title", "home_page_url": "https://sample-json-feed.com", "feed_url": "https://sample-json-feed.com/feed.json", "description": "description", "user_comment": "user_comment", "next_url": "https://sample-json-feed.com/feed.json?next=500", "icon": "https://sample-json-feed.com/icon.png", "favicon": "https://sample-json-feed.com/favicon.png", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "expired": false, "items": [ { "id": "id", "url": "https://sample-json-feed.com/id", "external_url": "https://sample-json-feed.com/external", "title": "title", "content_html": "

content_html

", "content_text": "content_text", "summary": "summary", "image": "https://sample-json-feed.com/image.png", "banner_image": "https://sample-json-feed.com/banner_image.png", "date_published": "2019-10-12T07:20:50.52Z", "date_modified": "2019-10-12T07:20:50.52Z", "author": { "name": "author_name", "url": "https://sample-feed-author.com", "avatar": "https://sample-feed-author.com/me.png" }, "tags": ["tag1", "tag2"], "attachments": [ { "url": "https://sample-json-feed.com/attachment", "mime_type": "audio/mpeg", "title": "title", "size_in_bytes": 100, "duration_in_seconds": 100 } ] } ] } gofeed-1.1.3/testdata/parser/universal/unknown_feed.xml000066400000000000000000000001761403746003700232760ustar00rootroot00000000000000 Tove Jani Reminder Don't forget me this weekend! gofeed-1.1.3/testdata/translator/000077500000000000000000000000001403746003700167535ustar00rootroot00000000000000gofeed-1.1.3/testdata/translator/atom/000077500000000000000000000000001403746003700177135ustar00rootroot00000000000000gofeed-1.1.3/testdata/translator/atom/feed_author_email_-_atom03_feed_author_email.json000066400000000000000000000002661403746003700313610ustar00rootroot00000000000000{ "author": { "email": "email@example.org" }, "authors": [ { "email": "email@example.org" } ], "feedType": "atom", "feedVersion": "0.3", "items": [] }gofeed-1.1.3/testdata/translator/atom/feed_author_email_-_atom03_feed_author_email.xml000066400000000000000000000002421403746003700312020ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/translator/atom/feed_author_email_-_atom10_feed_author_email.json000066400000000000000000000002661403746003700313570ustar00rootroot00000000000000{ "author": { "email": "email@example.org" }, "authors": [ { "email": "email@example.org" } ], "feedType": "atom", "feedVersion": "1.0", "items": [] }gofeed-1.1.3/testdata/translator/atom/feed_author_email_-_atom10_feed_author_email.xml000066400000000000000000000002271403746003700312030ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/translator/atom/feed_author_name_-_atom03_feed_author_name.json000066400000000000000000000002501403746003700310340ustar00rootroot00000000000000{ "author": { "name": "Author Name" }, "authors": [ { "name": "Author Name" } ], "feedType": "atom", "feedVersion": "0.3", "items": [] }gofeed-1.1.3/testdata/translator/atom/feed_author_name_-_atom03_feed_author_name.xml000066400000000000000000000002311403746003700306620ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/translator/atom/feed_author_name_-_atom10_feed_author_name.json000066400000000000000000000002501403746003700310320ustar00rootroot00000000000000{ "author": { "name": "Author Name" }, "authors": [ { "name": "Author Name" } ], "feedType": "atom", "feedVersion": "1.0", "items": [] }gofeed-1.1.3/testdata/translator/atom/feed_author_name_-_atom10_feed_author_name.xml000066400000000000000000000002161403746003700306630ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/translator/atom/feed_copyright_-_atom03_feed_copyright.json000066400000000000000000000001511403746003700302500ustar00rootroot00000000000000{ "copyright": "Feed Copyright", "items": [], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_copyright_-_atom03_feed_copyright.xml000066400000000000000000000002131403746003700300760ustar00rootroot00000000000000 Feed Copyright gofeed-1.1.3/testdata/translator/atom/feed_copyright_-_atom10_feed_rights.json000066400000000000000000000001461403746003700275420ustar00rootroot00000000000000{ "copyright": "Feed Rights", "items": [], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_copyright_-_atom10_feed_rights.xml000066400000000000000000000001641403746003700273710ustar00rootroot00000000000000 Feed Rights gofeed-1.1.3/testdata/translator/atom/feed_description_-_atom03_feed_tagline.json000066400000000000000000000001511403746003700301760ustar00rootroot00000000000000{ "description": "Feed Tagline", "items": [], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_description_-_atom03_feed_tagline.xml000066400000000000000000000002031403746003700300230ustar00rootroot00000000000000 Feed Tagline gofeed-1.1.3/testdata/translator/atom/feed_description_-_atom10_feed_subtitle.json000066400000000000000000000001521403746003700304050ustar00rootroot00000000000000{ "description": "Feed Subtitle", "items": [], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_description_-_atom10_feed_subtitle.xml000066400000000000000000000001741403746003700302400ustar00rootroot00000000000000 Feed Subtitle gofeed-1.1.3/testdata/translator/atom/feed_feedlink_-_atom10_feed_link_rel_self.json000066400000000000000000000002361403746003700306230ustar00rootroot00000000000000{ "feedLink": "http://example.org", "links": [ "http://example.org" ], "items": [], "feedType": "atom", "feedVersion": "1.0" }gofeed-1.1.3/testdata/translator/atom/feed_feedlink_-_atom10_feed_link_rel_self.xml000066400000000000000000000002161403746003700304500ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_generator_-_atom03_feed_generator.json000066400000000000000000000002011403746003700302000ustar00rootroot00000000000000{ "generator": "Feed Generator v0.3 http://example.org", "items": [], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_generator_-_atom03_feed_generator.xml000066400000000000000000000002671403746003700300430ustar00rootroot00000000000000 Feed Generator gofeed-1.1.3/testdata/translator/atom/feed_generator_-_atom10_feed_generator_name.json000066400000000000000000000002011403746003700311760ustar00rootroot00000000000000{ "generator": "Feed Generator v1.2 http://example.org", "items": [], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_generator_-_atom10_feed_generator_name.xml000066400000000000000000000002541403746003700310350ustar00rootroot00000000000000 Feed Generator gofeed-1.1.3/testdata/translator/atom/feed_image_-_atom10_feed_logo.json000066400000000000000000000002111403746003700262450ustar00rootroot00000000000000{ "image": { "url": "http://example.org/logo.jpg" }, "items": [], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_image_-_atom10_feed_logo.xml000066400000000000000000000001761403746003700261060ustar00rootroot00000000000000 http://example.org/logo.jpg gofeed-1.1.3/testdata/translator/atom/feed_item_author_email_-_atom03_feed_entry_author_email.json000066400000000000000000000003441403746003700336150ustar00rootroot00000000000000{ "feedType": "atom", "feedVersion": "0.3", "items": [ { "author": { "email": "email@example.org" }, "authors": [ { "email": "email@example.org" } ] } ] }gofeed-1.1.3/testdata/translator/atom/feed_item_author_email_-_atom03_feed_entry_author_email.xml000066400000000000000000000002761403746003700334500ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/translator/atom/feed_item_author_email_-_atom10_feed_entry_author_email.json000066400000000000000000000003441403746003700336130ustar00rootroot00000000000000{ "feedType": "atom", "feedVersion": "1.0", "items": [ { "author": { "email": "email@example.org" }, "authors": [ { "email": "email@example.org" } ] } ] }gofeed-1.1.3/testdata/translator/atom/feed_item_author_email_-_atom10_feed_entry_author_email.xml000066400000000000000000000002631403746003700334420ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/translator/atom/feed_item_author_name_-_atom03_feed_entry_author_name.json000066400000000000000000000003261403746003700332770ustar00rootroot00000000000000{ "feedType": "atom", "feedVersion": "0.3", "items": [ { "author": { "name": "Author Name" }, "authors": [ { "name": "Author Name" } ] } ] }gofeed-1.1.3/testdata/translator/atom/feed_item_author_name_-_atom03_feed_entry_author_name.xml000066400000000000000000000002651403746003700331300ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/translator/atom/feed_item_author_name_-_atom10_feed_entry_author_name.json000066400000000000000000000003261403746003700332750ustar00rootroot00000000000000{ "feedType": "atom", "feedVersion": "1.0", "items": [ { "author": { "name": "Author Name" }, "authors": [ { "name": "Author Name" } ] } ] }gofeed-1.1.3/testdata/translator/atom/feed_item_author_name_-_atom10_feed_entry_author_name.xml000066400000000000000000000002521403746003700331220ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/translator/atom/feed_item_category_-_atom10_feed_entry_category.json000066400000000000000000000002421403746003700321200ustar00rootroot00000000000000{ "items": [ { "categories": [ "atom10" ] } ], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_item_category_-_atom10_feed_entry_category.xml000066400000000000000000000002211403746003700317440ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_item_content_-_atom03_feed_entry_content_value.json000066400000000000000000000002061403746003700330100ustar00rootroot00000000000000{ "items": [ { "content": "Entry Content" } ], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_item_content_-_atom03_feed_entry_content_value.xml000066400000000000000000000002521403746003700326400ustar00rootroot00000000000000 Entry Content gofeed-1.1.3/testdata/translator/atom/feed_item_content_-_atom10_feed_entry_content.json000066400000000000000000000002061403746003700316120ustar00rootroot00000000000000{ "items": [ { "content": "Entry Content" } ], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_item_content_-_atom10_feed_entry_content.xml000066400000000000000000000002671403746003700314500ustar00rootroot00000000000000 Entry Content gofeed-1.1.3/testdata/translator/atom/feed_item_description_-_atom03_feed_entry_summary.json000066400000000000000000000002121403746003700325050ustar00rootroot00000000000000{ "items": [ { "description": "Entry Summary" } ], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_item_description_-_atom03_feed_entry_summary.xml000066400000000000000000000002341403746003700323400ustar00rootroot00000000000000 Entry Summary gofeed-1.1.3/testdata/translator/atom/feed_item_description_-_atom10_feed_entry_summary.json000066400000000000000000000002121403746003700325030ustar00rootroot00000000000000{ "items": [ { "description": "Entry Summary" } ], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_item_description_-_atom10_feed_entry_summary.xml000066400000000000000000000002211403746003700323320ustar00rootroot00000000000000 Entry Summary feed_item_enclosure_-_atom10_feed_entry_link_rel_enclosure.json000066400000000000000000000004731403746003700342720ustar00rootroot00000000000000gofeed-1.1.3/testdata/translator/atom{ "items": [ { "enclosures": [ { "url": "http://example.org/podcast.mp3", "length": "123456", "type": "audio/mpeg" } ] } ], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_item_enclosure_-_atom10_feed_entry_link_rel_enclosure.xml000066400000000000000000000003361403746003700341760ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_item_guid_-_atom03_feed_entry_id.json000066400000000000000000000002101403746003700300070ustar00rootroot00000000000000{ "items": [ { "guid": "http://example.org" } ], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_item_guid_-_atom03_feed_entry_id.xml000066400000000000000000000002221403746003700276410ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/translator/atom/feed_item_guid_-_atom10_feed_entry_id.json000066400000000000000000000002101403746003700300050ustar00rootroot00000000000000{ "items": [ { "guid": "http://example.org" } ], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_item_guid_-_atom10_feed_entry_id.xml000066400000000000000000000002071403746003700276420ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/translator/atom/feed_item_link_-_atom03_feed_entry_link.json000066400000000000000000000003321403746003700303620ustar00rootroot00000000000000{ "items": [ { "link": "http://www.example.org", "links": [ "http://www.example.org" ] } ], "feedType": "atom", "feedVersion": "0.3" }gofeed-1.1.3/testdata/translator/atom/feed_item_link_-_atom03_feed_entry_link.xml000066400000000000000000000003111403746003700302060ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_item_link_-_atom10_feed_entry_link.json000066400000000000000000000003321403746003700303600ustar00rootroot00000000000000{ "items": [ { "link": "http://www.example.org", "links": [ "http://www.example.org" ] } ], "feedType": "atom", "feedVersion": "1.0" }gofeed-1.1.3/testdata/translator/atom/feed_item_link_-_atom10_feed_entry_link.xml000066400000000000000000000003121403746003700302050ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_item_published_-_atom03_feed_entry_issued.json000066400000000000000000000003171403746003700317460ustar00rootroot00000000000000{ "items": [ { "published": "Thu, 01 Jan 2004 19:48:21 GMT", "publishedParsed": "2004-01-01T19:48:21Z" } ], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_item_published_-_atom03_feed_entry_issued.xml000066400000000000000000000002511403746003700315720ustar00rootroot00000000000000 Thu, 01 Jan 2004 19:48:21 GMT gofeed-1.1.3/testdata/translator/atom/feed_item_title_-_atom03_feed_entry_title.json000066400000000000000000000002021403746003700307260ustar00rootroot00000000000000{ "items": [ { "title": "Entry Title" } ], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_item_title_-_atom03_feed_entry_title.xml000066400000000000000000000002241403746003700305610ustar00rootroot00000000000000 Entry Title gofeed-1.1.3/testdata/translator/atom/feed_item_title_-_atom10_feed_entry_title.json000066400000000000000000000002021403746003700307240ustar00rootroot00000000000000{ "items": [ { "title": "Entry Title" } ], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_item_title_-_atom10_feed_entry_title.xml000066400000000000000000000002111403746003700305530ustar00rootroot00000000000000 Entry Title gofeed-1.1.3/testdata/translator/atom/feed_item_updated_-_atom03_feed_entry_modified.json000066400000000000000000000004741403746003700317050ustar00rootroot00000000000000{ "items": [ { "updated": "Thu, 01 Jan 2004 19:48:21 GMT", "updatedParsed": "2004-01-01T19:48:21Z", "published": "Thu, 01 Jan 2004 19:48:21 GMT", "publishedParsed": "2004-01-01T19:48:21Z" } ], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_item_updated_-_atom03_feed_entry_modified.xml000066400000000000000000000002571403746003700315330ustar00rootroot00000000000000 Thu, 01 Jan 2004 19:48:21 GMT gofeed-1.1.3/testdata/translator/atom/feed_language_-_atom03_feed_xml_lang.json000066400000000000000000000001341403746003700276150ustar00rootroot00000000000000{ "language": "en", "items": [], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_language_-_atom03_feed_xml_lang.xml000066400000000000000000000001601403746003700274430ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_language_-_atom10_feed_xml_lang.json000066400000000000000000000001341403746003700276130ustar00rootroot00000000000000{ "language": "en", "items": [], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_language_-_atom10_feed_xml_lang.xml000066400000000000000000000001451403746003700274440ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_link_-_atom03_feed_link.json000066400000000000000000000002421403746003700261230ustar00rootroot00000000000000{ "link": "http://www.example.org", "links": [ "http://www.example.org" ], "items": [], "feedType": "atom", "feedVersion": "0.3" }gofeed-1.1.3/testdata/translator/atom/feed_link_-_atom03_feed_link.xml000066400000000000000000000002751403746003700257600ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_link_-_atom10_feed_link.json000066400000000000000000000002421403746003700261210ustar00rootroot00000000000000{ "link": "http://www.example.org", "links": [ "http://www.example.org" ], "items": [], "feedType": "atom", "feedVersion": "1.0" }gofeed-1.1.3/testdata/translator/atom/feed_link_-_atom10_feed_link.xml000066400000000000000000000002001403746003700257420ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/atom/feed_title_-_atom03_feed_title.json000066400000000000000000000001411403746003700264710ustar00rootroot00000000000000{ "title": "Feed Title", "items": [], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_title_-_atom03_feed_title.xml000066400000000000000000000001731403746003700263250ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/translator/atom/feed_title_-_atom10_feed_title.json000066400000000000000000000001411403746003700264670ustar00rootroot00000000000000{ "title": "Feed Title", "items": [], "feedType": "atom", "feedVersion": "1.0" } gofeed-1.1.3/testdata/translator/atom/feed_title_-_atom10_feed_title.xml000066400000000000000000000001601403746003700263170ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/translator/atom/feed_updated_-_atom03_feed_modified.json000066400000000000000000000002431403746003700274400ustar00rootroot00000000000000{ "updated": "Thu, 01 Jan 2004 19:48:21 GMT", "updatedParsed": "2004-01-01T19:48:21Z", "items": [], "feedType": "atom", "feedVersion": "0.3" } gofeed-1.1.3/testdata/translator/atom/feed_updated_-_atom03_feed_modified.xml000066400000000000000000000002311403746003700272640ustar00rootroot00000000000000 Thu, 01 Jan 2004 19:48:21 GMT gofeed-1.1.3/testdata/translator/json/000077500000000000000000000000001403746003700177245ustar00rootroot00000000000000gofeed-1.1.3/testdata/translator/json/json10_full.json000066400000000000000000000027571403746003700227660ustar00rootroot00000000000000{ "version": "1.0", "title": "title", "author": { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" }, "description": "description", "expired": false, "favicon": "https://sample-json-feed.com/favicon.png", "feed_url": "https://sample-json-feed.com/feed.json", "home_page_url": "https://sample-json-feed.com", "icon": "https://sample-json-feed.com/icon.png", "next_url": "https://sample-json-feed.com/feed.json?next=500", "user_comment": "user_comment", "items": [ { "attachments": [ { "duration_in_seconds": 100, "mime_type": "audio/mpeg", "size_in_bytes": 100, "title": "title", "url": "https://sample-json-feed.com/attachment" } ], "author": { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" }, "banner_image": "https://sample-json-feed.com/banner_image.png", "content_html": "

content_html

", "content_text": "content_text", "date_modified": "2019-10-12T07:20:50.52Z", "date_published": "2019-10-12T07:20:50.52Z", "external_url": "https://sample-json-feed.com/external", "id": "id", "image": "https://sample-json-feed.com/image.png", "summary": "summary", "tags": ["tag1", "tag2"], "title": "title", "url": "https://sample-json-feed.com/id" } ] } gofeed-1.1.3/testdata/translator/json/json10_full_expected.json000066400000000000000000000037501403746003700246410ustar00rootroot00000000000000{ "feedVersion": "1.0", "feedType": "json", "feedLink": "https://sample-json-feed.com/feed.json", "title": "title", "author": { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" }, "authors": [ { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" } ], "description": "description", "link": "https://sample-json-feed.com", "image": { "url": "https://sample-json-feed.com/icon.png" }, "updated": "2019-10-12T07:20:50.52Z", "updatedParsed": "2019-10-12T07:20:50.52Z", "published": "2019-10-12T07:20:50.52Z", "publishedParsed": "2019-10-12T07:20:50.52Z", "links": [ "https://sample-json-feed.com", "https://sample-json-feed.com/feed.json" ], "items": [ { "guid": "id", "title": "title", "link": "https://sample-json-feed.com/id", "links": [ "https://sample-json-feed.com/id", "https://sample-json-feed.com/external" ], "content": "

content_html

", "updated": "2019-10-12T07:20:50.52Z", "updatedParsed": "2019-10-12T07:20:50.52Z", "published": "2019-10-12T07:20:50.52Z", "publishedParsed": "2019-10-12T07:20:50.52Z", "description": "summary", "categories": [ "tag1", "tag2" ], "enclosures": [ { "length": "100", "type": "audio/mpeg", "url": "https://sample-json-feed.com/attachment" } ], "author": { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" }, "authors": [ { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" } ], "image": { "url": "https://sample-json-feed.com/image.png" } } ] }gofeed-1.1.3/testdata/translator/json/json10_simple.json000066400000000000000000000002411403746003700232770ustar00rootroot00000000000000{ "version": "1.0", "items": [ { "content_text": "content_text", "banner_image": "https://sample-json-feed.com/banner_image.png" } ] } gofeed-1.1.3/testdata/translator/json/json10_simple_expected.json000066400000000000000000000002621403746003700251630ustar00rootroot00000000000000{ "feedVersion": "1.0", "feedType": "json", "items": [ { "content": "content_text", "image": { "url": "https://sample-json-feed.com/banner_image.png" } } ] }gofeed-1.1.3/testdata/translator/json/json11_full.json000066400000000000000000000026511403746003700227600ustar00rootroot00000000000000{ "version": "1.1", "title": "title", "user_comment": "user_comment", "authors": [ { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" } ], "next_url": "https://sample-json-feed.com/feed.json?next=500", "description": "description", "expired": false, "favicon": "https://sample-json-feed.com/favicon.png", "feed_url": "https://sample-json-feed.com/feed.json", "home_page_url": "https://sample-json-feed.com", "icon": "https://sample-json-feed.com/icon.png", "language": "en", "items": [ { "attachments": [ { "duration_in_seconds": 100, "mime_type": "audio/mpeg", "size_in_bytes": 100, "title": "title", "url": "https://sample-json-feed.com/attachment" } ], "authors": [ { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" } ], "banner_image": "https://sample-json-feed.com/banner_image.png", "content_html": "

content_html

", "content_text": "content_text", "date_modified": "2019-10-12T07:20:50.52Z", "date_published": "2019-10-12T07:20:50.52Z", "external_url": "https://sample-json-feed.com/external", "id": "id", "image": "https://sample-json-feed.com/image.png", "summary": "summary", "tags": ["tag1", "tag2"], "title": "title", "url": "https://sample-json-feed.com/id" } ] } gofeed-1.1.3/testdata/translator/json/json11_full_expected.json000066400000000000000000000033061403746003700246370ustar00rootroot00000000000000{ "feedVersion": "1.1", "feedType": "json", "feedLink": "https://sample-json-feed.com/feed.json", "title": "title", "language": "en", "authors": [ { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" } ], "description": "description", "link": "https://sample-json-feed.com", "image": { "url": "https://sample-json-feed.com/icon.png" }, "updated": "2019-10-12T07:20:50.52Z", "updatedParsed": "2019-10-12T07:20:50.52Z", "published": "2019-10-12T07:20:50.52Z", "publishedParsed": "2019-10-12T07:20:50.52Z", "links": [ "https://sample-json-feed.com", "https://sample-json-feed.com/feed.json" ], "items": [ { "guid": "id", "title": "title", "link": "https://sample-json-feed.com/id", "links": [ "https://sample-json-feed.com/id", "https://sample-json-feed.com/external" ], "content": "

content_html

", "updated": "2019-10-12T07:20:50.52Z", "updatedParsed": "2019-10-12T07:20:50.52Z", "published": "2019-10-12T07:20:50.52Z", "publishedParsed": "2019-10-12T07:20:50.52Z", "description": "summary", "categories": [ "tag1", "tag2" ], "enclosures": [ { "length": "100", "type": "audio/mpeg", "url": "https://sample-json-feed.com/attachment" } ], "authors": [ { "avatar": "https://sample-feed-author.com/me.png", "name": "author_name", "url": "https://sample-feed-author.com" } ], "image": { "url": "https://sample-json-feed.com/image.png" } } ] }gofeed-1.1.3/testdata/translator/rss/000077500000000000000000000000001403746003700175625ustar00rootroot00000000000000gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_managingEditor_email.json000066400000000000000000000002651403746003700317170ustar00rootroot00000000000000{ "author": { "email": "email@example.org" }, "authors": [ { "email": "email@example.org" } ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_managingEditor_email.xml000066400000000000000000000002301403746003700315360ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_managingEditor_emailAndName.json000066400000000000000000000003551403746003700331430ustar00rootroot00000000000000{ "author": { "email": "email@example.org", "name": "Author Name" }, "authors": [ { "email": "email@example.org", "name": "Author Name" } ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_managingEditor_emailAndName.xml000066400000000000000000000002461403746003700327710ustar00rootroot00000000000000 email@example.org (Author Name) gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_managingEditor_name.json000066400000000000000000000002471403746003700315500ustar00rootroot00000000000000{ "author": { "name": "Feed Editor" }, "authors": [ { "name": "Feed Editor" } ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_managingEditor_name.xml000066400000000000000000000002221403746003700313700ustar00rootroot00000000000000 Feed Editor gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_managingEditor_nameAndEmail.json000066400000000000000000000003551403746003700331430ustar00rootroot00000000000000{ "author": { "email": "email@example.org", "name": "Feed Editor" }, "authors": [ { "email": "email@example.org", "name": "Feed Editor" } ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_managingEditor_nameAndEmail.xml000066400000000000000000000002461403746003700327710ustar00rootroot00000000000000 Feed Editor (email@example.org) gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_webMaster_email.json000066400000000000000000000002651403746003700307200ustar00rootroot00000000000000{ "author": { "email": "email@example.org" }, "authors": [ { "email": "email@example.org" } ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_webMaster_email.xml000066400000000000000000000002111403746003700305360ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_webMaster_emailAndName.json000066400000000000000000000003631403746003700321430ustar00rootroot00000000000000{ "author": { "email": "email@example.org", "name": "Feed WebMaster" }, "authors": [ { "email": "email@example.org", "name": "Feed WebMaster" } ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_webMaster_emailAndName.xml000066400000000000000000000002321403746003700317650ustar00rootroot00000000000000 email@example.org (Feed WebMaster) gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_webMaster_name.json000066400000000000000000000002551403746003700305500ustar00rootroot00000000000000{ "author": { "name": "Feed WebMaster" }, "authors": [ { "name": "Feed WebMaster" } ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_webMaster_name.xml000066400000000000000000000002061403746003700303730ustar00rootroot00000000000000 Feed WebMaster gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_webMaster_nameAndEmail.json000066400000000000000000000003631403746003700321430ustar00rootroot00000000000000{ "author": { "email": "email@example.org", "name": "Feed WebMaster" }, "authors": [ { "email": "email@example.org", "name": "Feed WebMaster" } ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_author_-_rss_channel_webMaster_nameAndEmail.xml000066400000000000000000000002321403746003700317650ustar00rootroot00000000000000 Feed WebMaster (email@example.org) gofeed-1.1.3/testdata/translator/rss/feed_category_-_rss_channel_category.json000066400000000000000000000002021403746003700277370ustar00rootroot00000000000000{ "categories": [ "Feed Category 1", "Feed Category 2" ], "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_category_-_rss_channel_category.xml000066400000000000000000000003731403746003700275770ustar00rootroot00000000000000 Feed Category 1 Feed Category 2 gofeed-1.1.3/testdata/translator/rss/feed_copyright_-_rss_channel_copyright.json000066400000000000000000000001371403746003700303340ustar00rootroot00000000000000{ "copyright": "Feed Copyright", "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_copyright_-_rss_channel_copyright.xml000066400000000000000000000002061403746003700301600ustar00rootroot00000000000000 Feed Copyright gofeed-1.1.3/testdata/translator/rss/feed_description_-_rdf_channel_description.json000066400000000000000000000001431403746003700311230ustar00rootroot00000000000000{ "description": "Feed Description", "feedType": "rss", "feedVersion": "1.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_description_-_rdf_channel_description.xml000066400000000000000000000004161403746003700307550ustar00rootroot00000000000000 Feed Description gofeed-1.1.3/testdata/translator/rss/feed_description_-_rss_channel_description.json000066400000000000000000000001431403746003700311570ustar00rootroot00000000000000{ "description": "Feed Description", "feedType": "rss", "feedVersion": "2.0", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_description_-_rss_channel_description.xml000066400000000000000000000002271403746003700310110ustar00rootroot00000000000000 Feed Description gofeed-1.1.3/testdata/translator/rss/feed_generator_-_rss_channel_generator.json000066400000000000000000000001371403746003700302700ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "generator": "Feed Generator", "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_generator_-_rss_channel_generator.xml000066400000000000000000000002061403746003700301140ustar00rootroot00000000000000 Feed Generator gofeed-1.1.3/testdata/translator/rss/feed_image_-_rdf_image.json000066400000000000000000000002421403746003700247310ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "1.0", "image": { "title": "XML.com", "url": "http://xml.com/universal/images/xml_tiny.gif" }, "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_image_-_rdf_image.xml000066400000000000000000000007431403746003700245660ustar00rootroot00000000000000 XML.com http://www.xml.com http://xml.com/universal/images/xml_tiny.gif gofeed-1.1.3/testdata/translator/rss/feed_image_-_rss_channel_image.json000066400000000000000000000002221403746003700264530ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "0.91", "image": { "title": "Sample image", "url": "http://example.org/url" }, "items": [] }gofeed-1.1.3/testdata/translator/rss/feed_image_-_rss_channel_image.xml000066400000000000000000000005311403746003700263050ustar00rootroot00000000000000 Sample image http://example.org/url http://example.org/link 80 15 Available in Netscape RSS 0.91 gofeed-1.1.3/testdata/translator/rss/feed_item_author_-_rss_channel_item_author_email.json000066400000000000000000000003431403746003700323220ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "author": { "email": "email@example.org" }, "authors": [ { "email": "email@example.org" } ] } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_author_-_rss_channel_item_author_email.xml000066400000000000000000000002261403746003700321510ustar00rootroot00000000000000 email@example.org gofeed-1.1.3/testdata/translator/rss/feed_item_author_-_rss_channel_item_author_emailAndName.json000066400000000000000000000004431403746003700335470ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "author": { "email": "email@example.org", "name": "Author Name" }, "authors": [ { "email": "email@example.org", "name": "Author Name" } ] } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_author_-_rss_channel_item_author_emailAndName.xml000066400000000000000000000002441403746003700333750ustar00rootroot00000000000000 email@example.org (Author Name) gofeed-1.1.3/testdata/translator/rss/feed_item_author_-_rss_channel_item_author_name.json000066400000000000000000000003251403746003700321530ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "author": { "name": "Author Name" }, "authors": [ { "name": "Author Name" } ] } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_author_-_rss_channel_item_author_name.xml000066400000000000000000000002201403746003700317740ustar00rootroot00000000000000 Author Name gofeed-1.1.3/testdata/translator/rss/feed_item_author_-_rss_channel_item_author_nameAndEmail.json000066400000000000000000000004431403746003700335470ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "author": { "email": "email@example.org", "name": "Author Name" }, "authors": [ { "email": "email@example.org", "name": "Author Name" } ] } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_author_-_rss_channel_item_author_nameAndEmail.xml000066400000000000000000000002441403746003700333750ustar00rootroot00000000000000 Author Name (email@example.org) gofeed-1.1.3/testdata/translator/rss/feed_item_category_-_rss_channel_item_category.json000066400000000000000000000002401403746003700317750ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "categories": [ "Item Category 1", "Item Category 2" ] } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_category_-_rss_channel_item_category.xml000066400000000000000000000004231403746003700316270ustar00rootroot00000000000000 Item Category 1 Item Category 2 gofeed-1.1.3/testdata/translator/rss/feed_item_category_-_rss_channel_item_custom.json000066400000000000000000000002321403746003700314730ustar00rootroot00000000000000{ "items": [ { "custom": { "apcategory": "s", "test": "test" } } ], "feedType": "rss", "feedVersion": "2.0" } gofeed-1.1.3/testdata/translator/rss/feed_item_category_-_rss_channel_item_custom.xml000066400000000000000000000002041403746003700313210ustar00rootroot00000000000000 test s gofeed-1.1.3/testdata/translator/rss/feed_item_description_-_rdf_item_description.json000066400000000000000000000001651403746003700314730ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "1.0", "items": [ { "description": "Item Description" } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_description_-_rdf_item_description.xml000066400000000000000000000006671403746003700313310ustar00rootroot00000000000000 Item Description gofeed-1.1.3/testdata/translator/rss/feed_item_description_-_rss_channel_item_description.json000066400000000000000000000001651403746003700332170ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "description": "Item Description" } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_description_-_rss_channel_item_description.xml000066400000000000000000000002441403746003700330440ustar00rootroot00000000000000 Item Description gofeed-1.1.3/testdata/translator/rss/feed_item_enclosure_-_rss_channel_item_enclosure.json000066400000000000000000000003571403746003700323520ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "enclosures": [ { "length": "123456", "type": "audio/mpeg", "url": "http://example.org/podcast.mp3" } ] } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_enclosure_-_rss_channel_item_enclosure.xml000066400000000000000000000003131403746003700321710ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/rss/feed_item_guid_-_rss_channel_item_guid.json000066400000000000000000000001441403746003700302260ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "guid": "abc123" } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_guid_-_rss_channel_item_guid.xml000066400000000000000000000002311403746003700300520ustar00rootroot00000000000000 abc123 gofeed-1.1.3/testdata/translator/rss/feed_item_link_-_rdf_item_link.json000066400000000000000000000002471403746003700265200ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "1.0", "items": [ { "link": "http://example.org", "links": [ "http://example.org" ] } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_link_-_rdf_item_link.xml000066400000000000000000000006441403746003700263500ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/translator/rss/feed_item_link_-_rss_channel_item_link.json000066400000000000000000000002471403746003700302440ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "link": "http://example.org", "links": [ "http://example.org" ] } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_link_-_rss_channel_item_link.xml000066400000000000000000000002211403746003700300630ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/translator/rss/feed_item_published_-_rss_channel_item_pubDate.json000066400000000000000000000002611403746003700317110ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "published": "Thu, 01 Jan 2004 19:48:21 GMT", "publishedParsed": "2004-01-01T19:48:21Z" } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_published_-_rss_channel_item_pubDate.xml000066400000000000000000000002451403746003700315420ustar00rootroot00000000000000 Thu, 01 Jan 2004 19:48:21 GMT gofeed-1.1.3/testdata/translator/rss/feed_item_title_-_rdf_item_title.json000066400000000000000000000001511403746003700270620ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "1.0", "items": [ { "title": "Item Title" } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_title_-_rdf_item_title.xml000066400000000000000000000006371403746003700267220ustar00rootroot00000000000000 Item Title gofeed-1.1.3/testdata/translator/rss/feed_item_title_-_rss_channel_item_title.json000066400000000000000000000001531403746003700306100ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [ { "title": "Item 1 title" } ] }gofeed-1.1.3/testdata/translator/rss/feed_item_title_-_rss_channel_item_title.xml000066400000000000000000000002161403746003700304370ustar00rootroot00000000000000 Item 1 title gofeed-1.1.3/testdata/translator/rss/feed_language_-_rss_channel_language.json000066400000000000000000000001251403746003700276570ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [], "language": "en-us" }gofeed-1.1.3/testdata/translator/rss/feed_language_-_rss_channel_language.xml000066400000000000000000000001721403746003700275100ustar00rootroot00000000000000 en-us gofeed-1.1.3/testdata/translator/rss/feed_link_-_rdf_channel_link.json000066400000000000000000000002121403746003700261440ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "1.0", "items": [], "link": "http://example.org", "links": [ "http://example.org" ] } gofeed-1.1.3/testdata/translator/rss/feed_link_-_rdf_channel_link.xml000066400000000000000000000003731403746003700260030ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/translator/rss/feed_link_-_rss_channel_atom_link.json000066400000000000000000000007001403746003700272220ustar00rootroot00000000000000{ "extensions": { "atom": { "link": [ { "attrs": { "href": "http://example.org", "rel": "self", "type": "application/rss+xml" }, "children": {}, "name": "link", "value": "" } ] } }, "feedLink": "http://example.org", "feedType": "rss", "feedVersion": "2.0", "items": [], "links": [ "http://example.org" ] } gofeed-1.1.3/testdata/translator/rss/feed_link_-_rss_channel_atom_link.xml000066400000000000000000000002511403746003700270520ustar00rootroot00000000000000 gofeed-1.1.3/testdata/translator/rss/feed_link_-_rss_channel_link.json000066400000000000000000000002111403746003700261770ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [], "link": "http://example.org", "links": [ "http://example.org" ] }gofeed-1.1.3/testdata/translator/rss/feed_link_-_rss_channel_link.xml000066400000000000000000000001721403746003700260340ustar00rootroot00000000000000 http://example.org gofeed-1.1.3/testdata/translator/rss/feed_published_-_rss_channel_pubDate.json000066400000000000000000000002331403746003700276540ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [], "published": "Thu, 01 Jan 2004 19:48:21 GMT", "publishedParsed": "2004-01-01T19:48:21Z" }gofeed-1.1.3/testdata/translator/rss/feed_published_-_rss_channel_pubDate.xml000066400000000000000000000002171403746003700275050ustar00rootroot00000000000000 Thu, 01 Jan 2004 19:48:21 GMT gofeed-1.1.3/testdata/translator/rss/feed_title_-_rdf_channel_title.json000066400000000000000000000001271403746003700265210ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "1.0", "items": [], "title": "Feed Title" }gofeed-1.1.3/testdata/translator/rss/feed_title_-_rdf_channel_title.xml000066400000000000000000000003661403746003700263550ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/translator/rss/feed_title_-_rss_channel_title.json000066400000000000000000000001271403746003700265550ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [], "title": "Feed Title" }gofeed-1.1.3/testdata/translator/rss/feed_title_-_rss_channel_title.xml000066400000000000000000000001771403746003700264110ustar00rootroot00000000000000 Feed Title gofeed-1.1.3/testdata/translator/rss/feed_updated_-_rss_channel_lastBuildDate.json000066400000000000000000000002271403746003700304630ustar00rootroot00000000000000{ "feedType": "rss", "feedVersion": "2.0", "items": [], "updated": "Sat, 07 Sep 2002 00:00:01 GMT", "updatedParsed": "2002-09-07T00:00:01Z" }gofeed-1.1.3/testdata/translator/rss/feed_updated_-_rss_channel_lastBuildDate.xml000066400000000000000000000002411403746003700303060ustar00rootroot00000000000000 Sat, 07 Sep 2002 00:00:01 GMT gofeed-1.1.3/translator.go000066400000000000000000000763261403746003700155070ustar00rootroot00000000000000package gofeed import ( "fmt" "strings" "time" "github.com/mmcdole/gofeed/atom" ext "github.com/mmcdole/gofeed/extensions" "github.com/mmcdole/gofeed/internal/shared" "github.com/mmcdole/gofeed/json" "github.com/mmcdole/gofeed/rss" ) // Translator converts a particular feed (atom.Feed or rss.Feed of json.Feed) // into the generic Feed struct type Translator interface { Translate(feed interface{}) (*Feed, error) } // DefaultRSSTranslator converts an rss.Feed struct // into the generic Feed struct. // // This default implementation defines a set of // mapping rules between rss.Feed -> Feed // for each of the fields in Feed. type DefaultRSSTranslator struct{} // Translate converts an RSS feed into the universal // feed type. func (t *DefaultRSSTranslator) Translate(feed interface{}) (*Feed, error) { rss, found := feed.(*rss.Feed) if !found { return nil, fmt.Errorf("Feed did not match expected type of *rss.Feed") } result := &Feed{} result.Title = t.translateFeedTitle(rss) result.Description = t.translateFeedDescription(rss) result.Link = t.translateFeedLink(rss) result.FeedLink = t.translateFeedFeedLink(rss) result.Links = t.translateFeedLinks(rss) result.Updated = t.translateFeedUpdated(rss) result.UpdatedParsed = t.translateFeedUpdatedParsed(rss) result.Published = t.translateFeedPublished(rss) result.PublishedParsed = t.translateFeedPublishedParsed(rss) result.Author = t.translateFeedAuthor(rss) result.Authors = t.translateFeedAuthors(rss) result.Language = t.translateFeedLanguage(rss) result.Image = t.translateFeedImage(rss) result.Copyright = t.translateFeedCopyright(rss) result.Generator = t.translateFeedGenerator(rss) result.Categories = t.translateFeedCategories(rss) result.Items = t.translateFeedItems(rss) result.ITunesExt = rss.ITunesExt result.DublinCoreExt = rss.DublinCoreExt result.Extensions = rss.Extensions result.FeedVersion = rss.Version result.FeedType = "rss" return result, nil } func (t *DefaultRSSTranslator) translateFeedItem(rssItem *rss.Item) (item *Item) { item = &Item{} item.Title = t.translateItemTitle(rssItem) item.Description = t.translateItemDescription(rssItem) item.Content = t.translateItemContent(rssItem) item.Link = t.translateItemLink(rssItem) item.Links = t.translateItemLinks(rssItem) item.Published = t.translateItemPublished(rssItem) item.PublishedParsed = t.translateItemPublishedParsed(rssItem) item.Author = t.translateItemAuthor(rssItem) item.Authors = t.translateItemAuthors(rssItem) item.GUID = t.translateItemGUID(rssItem) item.Image = t.translateItemImage(rssItem) item.Categories = t.translateItemCategories(rssItem) item.Enclosures = t.translateItemEnclosures(rssItem) item.DublinCoreExt = rssItem.DublinCoreExt item.ITunesExt = rssItem.ITunesExt item.Extensions = rssItem.Extensions item.Custom = rssItem.Custom return } func (t *DefaultRSSTranslator) translateFeedTitle(rss *rss.Feed) (title string) { if rss.Title != "" { title = rss.Title } else if rss.DublinCoreExt != nil && rss.DublinCoreExt.Title != nil { title = t.firstEntry(rss.DublinCoreExt.Title) } return } func (t *DefaultRSSTranslator) translateFeedDescription(rss *rss.Feed) (desc string) { return rss.Description } func (t *DefaultRSSTranslator) translateFeedLink(rss *rss.Feed) (link string) { if rss.Link != "" { link = rss.Link } else if rss.ITunesExt != nil && rss.ITunesExt.Subtitle != "" { link = rss.ITunesExt.Subtitle } return } func (t *DefaultRSSTranslator) translateFeedFeedLink(rss *rss.Feed) (link string) { atomExtensions := t.extensionsForKeys([]string{"atom", "atom10", "atom03"}, rss.Extensions) for _, ex := range atomExtensions { if links, ok := ex["link"]; ok { for _, l := range links { if l.Attrs["rel"] == "self" { link = l.Attrs["href"] } } } } return } func (t *DefaultRSSTranslator) translateFeedLinks(rss *rss.Feed) (links []string) { if rss.Link != "" { links = append(links, rss.Link) } if rss.ITunesExt != nil && rss.ITunesExt.Subtitle != "" { links = append(links, rss.ITunesExt.Subtitle) } atomExtensions := t.extensionsForKeys([]string{"atom", "atom10", "atom03"}, rss.Extensions) for _, ex := range atomExtensions { if lks, ok := ex["link"]; ok { for _, l := range lks { if l.Attrs["rel"] == "" || l.Attrs["rel"] == "alternate" || l.Attrs["rel"] == "self" { links = append(links, l.Attrs["href"]) } } } } return } func (t *DefaultRSSTranslator) translateFeedUpdated(rss *rss.Feed) (updated string) { if rss.LastBuildDate != "" { updated = rss.LastBuildDate } else if rss.DublinCoreExt != nil && rss.DublinCoreExt.Date != nil { updated = t.firstEntry(rss.DublinCoreExt.Date) } return } func (t *DefaultRSSTranslator) translateFeedUpdatedParsed(rss *rss.Feed) (updated *time.Time) { if rss.LastBuildDateParsed != nil { updated = rss.LastBuildDateParsed } else if rss.DublinCoreExt != nil && rss.DublinCoreExt.Date != nil { dateText := t.firstEntry(rss.DublinCoreExt.Date) date, err := shared.ParseDate(dateText) if err == nil { updated = &date } } return } func (t *DefaultRSSTranslator) translateFeedPublished(rss *rss.Feed) (published string) { return rss.PubDate } func (t *DefaultRSSTranslator) translateFeedPublishedParsed(rss *rss.Feed) (published *time.Time) { return rss.PubDateParsed } func (t *DefaultRSSTranslator) translateFeedAuthor(rss *rss.Feed) (author *Person) { if rss.ManagingEditor != "" { name, address := shared.ParseNameAddress(rss.ManagingEditor) author = &Person{} author.Name = name author.Email = address } else if rss.WebMaster != "" { name, address := shared.ParseNameAddress(rss.WebMaster) author = &Person{} author.Name = name author.Email = address } else if rss.DublinCoreExt != nil && rss.DublinCoreExt.Author != nil { dcAuthor := t.firstEntry(rss.DublinCoreExt.Author) name, address := shared.ParseNameAddress(dcAuthor) author = &Person{} author.Name = name author.Email = address } else if rss.DublinCoreExt != nil && rss.DublinCoreExt.Creator != nil { dcCreator := t.firstEntry(rss.DublinCoreExt.Creator) name, address := shared.ParseNameAddress(dcCreator) author = &Person{} author.Name = name author.Email = address } else if rss.ITunesExt != nil && rss.ITunesExt.Author != "" { name, address := shared.ParseNameAddress(rss.ITunesExt.Author) author = &Person{} author.Name = name author.Email = address } return } func (t *DefaultRSSTranslator) translateFeedAuthors(rss *rss.Feed) (authors []*Person) { if author := t.translateFeedAuthor(rss); author != nil { authors = []*Person{author} } return } func (t *DefaultRSSTranslator) translateFeedLanguage(rss *rss.Feed) (language string) { if rss.Language != "" { language = rss.Language } else if rss.DublinCoreExt != nil && rss.DublinCoreExt.Language != nil { language = t.firstEntry(rss.DublinCoreExt.Language) } return } func (t *DefaultRSSTranslator) translateFeedImage(rss *rss.Feed) (image *Image) { if rss.Image != nil { image = &Image{} image.Title = rss.Image.Title image.URL = rss.Image.URL } else if rss.ITunesExt != nil && rss.ITunesExt.Image != "" { image = &Image{} image.URL = rss.ITunesExt.Image } return } func (t *DefaultRSSTranslator) translateFeedCopyright(rss *rss.Feed) (rights string) { if rss.Copyright != "" { rights = rss.Copyright } else if rss.DublinCoreExt != nil && rss.DublinCoreExt.Rights != nil { rights = t.firstEntry(rss.DublinCoreExt.Rights) } return } func (t *DefaultRSSTranslator) translateFeedGenerator(rss *rss.Feed) (generator string) { return rss.Generator } func (t *DefaultRSSTranslator) translateFeedCategories(rss *rss.Feed) (categories []string) { cats := []string{} if rss.Categories != nil { for _, c := range rss.Categories { cats = append(cats, c.Value) } } if rss.ITunesExt != nil && rss.ITunesExt.Keywords != "" { keywords := strings.Split(rss.ITunesExt.Keywords, ",") for _, k := range keywords { cats = append(cats, k) } } if rss.ITunesExt != nil && rss.ITunesExt.Categories != nil { for _, c := range rss.ITunesExt.Categories { cats = append(cats, c.Text) if c.Subcategory != nil { cats = append(cats, c.Subcategory.Text) } } } if rss.DublinCoreExt != nil && rss.DublinCoreExt.Subject != nil { for _, c := range rss.DublinCoreExt.Subject { cats = append(cats, c) } } if len(cats) > 0 { categories = cats } return } func (t *DefaultRSSTranslator) translateFeedItems(rss *rss.Feed) (items []*Item) { items = []*Item{} for _, i := range rss.Items { items = append(items, t.translateFeedItem(i)) } return } func (t *DefaultRSSTranslator) translateItemTitle(rssItem *rss.Item) (title string) { if rssItem.Title != "" { title = rssItem.Title } else if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Title != nil { title = t.firstEntry(rssItem.DublinCoreExt.Title) } return } func (t *DefaultRSSTranslator) translateItemDescription(rssItem *rss.Item) (desc string) { if rssItem.Description != "" { desc = rssItem.Description } else if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Description != nil { desc = t.firstEntry(rssItem.DublinCoreExt.Description) } return } func (t *DefaultRSSTranslator) translateItemContent(rssItem *rss.Item) (content string) { return rssItem.Content } func (t *DefaultRSSTranslator) translateItemLink(rssItem *rss.Item) (link string) { return rssItem.Link } func (t *DefaultRSSTranslator) translateItemLinks(rssItem *rss.Item) (links []string) { if rssItem.Link == "" { return nil } return []string{rssItem.Link} } func (t *DefaultRSSTranslator) translateItemUpdated(rssItem *rss.Item) (updated string) { if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Date != nil { updated = t.firstEntry(rssItem.DublinCoreExt.Date) } return updated } func (t *DefaultRSSTranslator) translateItemUpdatedParsed(rssItem *rss.Item) (updated *time.Time) { if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Date != nil { updatedText := t.firstEntry(rssItem.DublinCoreExt.Date) updatedDate, err := shared.ParseDate(updatedText) if err == nil { updated = &updatedDate } } return } func (t *DefaultRSSTranslator) translateItemPublished(rssItem *rss.Item) (pubDate string) { if rssItem.PubDate != "" { return rssItem.PubDate } else if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Date != nil { return t.firstEntry(rssItem.DublinCoreExt.Date) } return } func (t *DefaultRSSTranslator) translateItemPublishedParsed(rssItem *rss.Item) (pubDate *time.Time) { if rssItem.PubDateParsed != nil { return rssItem.PubDateParsed } else if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Date != nil { pubDateText := t.firstEntry(rssItem.DublinCoreExt.Date) pubDateParsed, err := shared.ParseDate(pubDateText) if err == nil { pubDate = &pubDateParsed } } return } func (t *DefaultRSSTranslator) translateItemAuthor(rssItem *rss.Item) (author *Person) { if rssItem.Author != "" { name, address := shared.ParseNameAddress(rssItem.Author) author = &Person{} author.Name = name author.Email = address } else if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Author != nil { dcAuthor := t.firstEntry(rssItem.DublinCoreExt.Author) name, address := shared.ParseNameAddress(dcAuthor) author = &Person{} author.Name = name author.Email = address } else if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Creator != nil { dcCreator := t.firstEntry(rssItem.DublinCoreExt.Creator) name, address := shared.ParseNameAddress(dcCreator) author = &Person{} author.Name = name author.Email = address } else if rssItem.ITunesExt != nil && rssItem.ITunesExt.Author != "" { name, address := shared.ParseNameAddress(rssItem.ITunesExt.Author) author = &Person{} author.Name = name author.Email = address } return } func (t *DefaultRSSTranslator) translateItemAuthors(rssItem *rss.Item) (authors []*Person) { if author := t.translateItemAuthor(rssItem); author != nil { authors = []*Person{author} } return } func (t *DefaultRSSTranslator) translateItemGUID(rssItem *rss.Item) (guid string) { if rssItem.GUID != nil { guid = rssItem.GUID.Value } return } func (t *DefaultRSSTranslator) translateItemImage(rssItem *rss.Item) (image *Image) { if rssItem.ITunesExt != nil && rssItem.ITunesExt.Image != "" { image = &Image{} image.URL = rssItem.ITunesExt.Image } return } func (t *DefaultRSSTranslator) translateItemCategories(rssItem *rss.Item) (categories []string) { cats := []string{} if rssItem.Categories != nil { for _, c := range rssItem.Categories { cats = append(cats, c.Value) } } if rssItem.ITunesExt != nil && rssItem.ITunesExt.Keywords != "" { keywords := strings.Split(rssItem.ITunesExt.Keywords, ",") for _, k := range keywords { cats = append(cats, k) } } if rssItem.DublinCoreExt != nil && rssItem.DublinCoreExt.Subject != nil { for _, c := range rssItem.DublinCoreExt.Subject { cats = append(cats, c) } } if len(cats) > 0 { categories = cats } return } func (t *DefaultRSSTranslator) translateItemEnclosures(rssItem *rss.Item) (enclosures []*Enclosure) { if rssItem.Enclosure != nil { e := &Enclosure{} e.URL = rssItem.Enclosure.URL e.Type = rssItem.Enclosure.Type e.Length = rssItem.Enclosure.Length enclosures = []*Enclosure{e} } return } func (t *DefaultRSSTranslator) extensionsForKeys(keys []string, extensions ext.Extensions) (matches []map[string][]ext.Extension) { matches = []map[string][]ext.Extension{} if extensions == nil { return } for _, key := range keys { if match, ok := extensions[key]; ok { matches = append(matches, match) } } return } func (t *DefaultRSSTranslator) firstEntry(entries []string) (value string) { if entries == nil { return } if len(entries) == 0 { return } return entries[0] } // DefaultAtomTranslator converts an atom.Feed struct // into the generic Feed struct. // // This default implementation defines a set of // mapping rules between atom.Feed -> Feed // for each of the fields in Feed. type DefaultAtomTranslator struct{} // Translate converts an Atom feed into the universal // feed type. func (t *DefaultAtomTranslator) Translate(feed interface{}) (*Feed, error) { atom, found := feed.(*atom.Feed) if !found { return nil, fmt.Errorf("Feed did not match expected type of *atom.Feed") } result := &Feed{} result.Title = t.translateFeedTitle(atom) result.Description = t.translateFeedDescription(atom) result.Link = t.translateFeedLink(atom) result.FeedLink = t.translateFeedFeedLink(atom) result.Links = t.translateFeedLinks(atom) result.Updated = t.translateFeedUpdated(atom) result.UpdatedParsed = t.translateFeedUpdatedParsed(atom) result.Author = t.translateFeedAuthor(atom) result.Authors = t.translateFeedAuthors(atom) result.Language = t.translateFeedLanguage(atom) result.Image = t.translateFeedImage(atom) result.Copyright = t.translateFeedCopyright(atom) result.Categories = t.translateFeedCategories(atom) result.Generator = t.translateFeedGenerator(atom) result.Items = t.translateFeedItems(atom) result.Extensions = atom.Extensions result.FeedVersion = atom.Version result.FeedType = "atom" return result, nil } func (t *DefaultAtomTranslator) translateFeedItem(entry *atom.Entry) (item *Item) { item = &Item{} item.Title = t.translateItemTitle(entry) item.Description = t.translateItemDescription(entry) item.Content = t.translateItemContent(entry) item.Link = t.translateItemLink(entry) item.Links = t.translateItemLinks(entry) item.Updated = t.translateItemUpdated(entry) item.UpdatedParsed = t.translateItemUpdatedParsed(entry) item.Published = t.translateItemPublished(entry) item.PublishedParsed = t.translateItemPublishedParsed(entry) item.Author = t.translateItemAuthor(entry) item.Authors = t.translateItemAuthors(entry) item.GUID = t.translateItemGUID(entry) item.Image = t.translateItemImage(entry) item.Categories = t.translateItemCategories(entry) item.Enclosures = t.translateItemEnclosures(entry) item.Extensions = entry.Extensions return } func (t *DefaultAtomTranslator) translateFeedTitle(atom *atom.Feed) (title string) { return atom.Title } func (t *DefaultAtomTranslator) translateFeedDescription(atom *atom.Feed) (desc string) { return atom.Subtitle } func (t *DefaultAtomTranslator) translateFeedLink(atom *atom.Feed) (link string) { l := t.firstLinkWithType("alternate", atom.Links) if l != nil { link = l.Href } return } func (t *DefaultAtomTranslator) translateFeedFeedLink(atom *atom.Feed) (link string) { feedLink := t.firstLinkWithType("self", atom.Links) if feedLink != nil { link = feedLink.Href } return } func (t *DefaultAtomTranslator) translateFeedLinks(atom *atom.Feed) (links []string) { for _, l := range atom.Links { if l.Rel == "" || l.Rel == "alternate" || l.Rel == "self" { links = append(links, l.Href) } } return } func (t *DefaultAtomTranslator) translateFeedUpdated(atom *atom.Feed) (updated string) { return atom.Updated } func (t *DefaultAtomTranslator) translateFeedUpdatedParsed(atom *atom.Feed) (updated *time.Time) { return atom.UpdatedParsed } func (t *DefaultAtomTranslator) translateFeedAuthor(atom *atom.Feed) (author *Person) { a := t.firstPerson(atom.Authors) if a != nil { feedAuthor := Person{} feedAuthor.Name = a.Name feedAuthor.Email = a.Email author = &feedAuthor } return } func (t *DefaultAtomTranslator) translateFeedAuthors(atom *atom.Feed) (authors []*Person) { if atom.Authors != nil { authors = []*Person{} for _, a := range atom.Authors { authors = append(authors, &Person{ Name: a.Name, Email: a.Email, }) } } return } func (t *DefaultAtomTranslator) translateFeedLanguage(atom *atom.Feed) (language string) { return atom.Language } func (t *DefaultAtomTranslator) translateFeedImage(atom *atom.Feed) (image *Image) { if atom.Logo != "" { feedImage := Image{} feedImage.URL = atom.Logo image = &feedImage } return } func (t *DefaultAtomTranslator) translateFeedCopyright(atom *atom.Feed) (rights string) { return atom.Rights } func (t *DefaultAtomTranslator) translateFeedGenerator(atom *atom.Feed) (generator string) { if atom.Generator != nil { if atom.Generator.Value != "" { generator += atom.Generator.Value } if atom.Generator.Version != "" { generator += " v" + atom.Generator.Version } if atom.Generator.URI != "" { generator += " " + atom.Generator.URI } generator = strings.TrimSpace(generator) } return } func (t *DefaultAtomTranslator) translateFeedCategories(atom *atom.Feed) (categories []string) { if atom.Categories != nil { categories = []string{} for _, c := range atom.Categories { categories = append(categories, c.Term) } } return } func (t *DefaultAtomTranslator) translateFeedItems(atom *atom.Feed) (items []*Item) { items = []*Item{} for _, entry := range atom.Entries { items = append(items, t.translateFeedItem(entry)) } return } func (t *DefaultAtomTranslator) translateItemTitle(entry *atom.Entry) (title string) { return entry.Title } func (t *DefaultAtomTranslator) translateItemDescription(entry *atom.Entry) (desc string) { return entry.Summary } func (t *DefaultAtomTranslator) translateItemContent(entry *atom.Entry) (content string) { if entry.Content != nil { content = entry.Content.Value } return } func (t *DefaultAtomTranslator) translateItemLink(entry *atom.Entry) (link string) { l := t.firstLinkWithType("alternate", entry.Links) if l != nil { link = l.Href } return } func (t *DefaultAtomTranslator) translateItemLinks(entry *atom.Entry) (links []string) { for _, l := range entry.Links { if l.Rel == "" || l.Rel == "alternate" || l.Rel == "self" { links = append(links, l.Href) } } return } func (t *DefaultAtomTranslator) translateItemUpdated(entry *atom.Entry) (updated string) { return entry.Updated } func (t *DefaultAtomTranslator) translateItemUpdatedParsed(entry *atom.Entry) (updated *time.Time) { return entry.UpdatedParsed } func (t *DefaultAtomTranslator) translateItemPublished(entry *atom.Entry) (published string) { published = entry.Published if published == "" { published = entry.Updated } return } func (t *DefaultAtomTranslator) translateItemPublishedParsed(entry *atom.Entry) (published *time.Time) { published = entry.PublishedParsed if published == nil { published = entry.UpdatedParsed } return } func (t *DefaultAtomTranslator) translateItemAuthor(entry *atom.Entry) (author *Person) { a := t.firstPerson(entry.Authors) if a != nil { author = &Person{} author.Name = a.Name author.Email = a.Email } return } func (t *DefaultAtomTranslator) translateItemAuthors(entry *atom.Entry) (authors []*Person) { if entry.Authors != nil { authors = []*Person{} for _, a := range entry.Authors { authors = append(authors, &Person{ Name: a.Name, Email: a.Email, }) } } return } func (t *DefaultAtomTranslator) translateItemGUID(entry *atom.Entry) (guid string) { return entry.ID } func (t *DefaultAtomTranslator) translateItemImage(entry *atom.Entry) (image *Image) { return nil } func (t *DefaultAtomTranslator) translateItemCategories(entry *atom.Entry) (categories []string) { if entry.Categories != nil { categories = []string{} for _, c := range entry.Categories { categories = append(categories, c.Term) } } return } func (t *DefaultAtomTranslator) translateItemEnclosures(entry *atom.Entry) (enclosures []*Enclosure) { if entry.Links != nil { enclosures = []*Enclosure{} for _, e := range entry.Links { if e.Rel == "enclosure" { enclosure := &Enclosure{} enclosure.URL = e.Href enclosure.Length = e.Length enclosure.Type = e.Type enclosures = append(enclosures, enclosure) } } if len(enclosures) == 0 { enclosures = nil } } return } func (t *DefaultAtomTranslator) firstLinkWithType(linkType string, links []*atom.Link) *atom.Link { if links == nil { return nil } for _, link := range links { if link.Rel == linkType { return link } } return nil } func (t *DefaultAtomTranslator) firstPerson(persons []*atom.Person) (person *atom.Person) { if persons == nil || len(persons) == 0 { return } person = persons[0] return } // DefaultJSONTranslator converts an json.Feed struct // into the generic Feed struct. // // This default implementation defines a set of // mapping rules between json.Feed -> Feed // for each of the fields in Feed. type DefaultJSONTranslator struct{} // Translate converts an JSON feed into the universal // feed type. func (t *DefaultJSONTranslator) Translate(feed interface{}) (*Feed, error) { json, found := feed.(*json.Feed) if !found { return nil, fmt.Errorf("Feed did not match expected type of *json.Feed") } result := &Feed{} result.FeedVersion = json.Version result.Title = t.translateFeedTitle(json) result.Link = t.translateFeedLink(json) result.FeedLink = t.translateFeedFeedLink(json) result.Links = t.translateFeedLinks(json) result.Description = t.translateFeedDescription(json) result.Image = t.translateFeedImage(json) result.Author = t.translateFeedAuthor(json) result.Authors = t.translateFeedAuthors(json) result.Language = t.translateFeedLanguage(json) result.Items = t.translateFeedItems(json) result.Updated = t.translateFeedUpdated(json) result.UpdatedParsed = t.translateFeedUpdatedParsed(json) result.Published = t.translateFeedPublished(json) result.PublishedParsed = t.translateFeedPublishedParsed(json) result.FeedType = "json" // TODO UserComment is missing in global Feed // TODO NextURL is missing in global Feed // TODO Favicon is missing in global Feed // TODO Exipred is missing in global Feed // TODO Hubs is not supported in json.Feed // TODO Extensions is not supported in json.Feed return result, nil } func (t *DefaultJSONTranslator) translateFeedItem(jsonItem *json.Item) (item *Item) { item = &Item{} item.GUID = t.translateItemGUID(jsonItem) item.Link = t.translateItemLink(jsonItem) item.Links = t.translateItemLinks(jsonItem) item.Title = t.translateItemTitle(jsonItem) item.Content = t.translateItemContent(jsonItem) item.Description = t.translateItemDescription(jsonItem) item.Image = t.translateItemImage(jsonItem) item.Published = t.translateItemPublished(jsonItem) item.PublishedParsed = t.translateItemPublishedParsed(jsonItem) item.Updated = t.translateItemUpdated(jsonItem) item.UpdatedParsed = t.translateItemUpdatedParsed(jsonItem) item.Author = t.translateItemAuthor(jsonItem) item.Authors = t.translateItemAuthors(jsonItem) item.Categories = t.translateItemCategories(jsonItem) item.Enclosures = t.translateItemEnclosures(jsonItem) // TODO ExternalURL is missing in global Feed // TODO BannerImage is missing in global Feed return } func (t *DefaultJSONTranslator) translateFeedTitle(json *json.Feed) (title string) { if json.Title != "" { title = json.Title } return } func (t *DefaultJSONTranslator) translateFeedDescription(json *json.Feed) (desc string) { return json.Description } func (t *DefaultJSONTranslator) translateFeedLink(json *json.Feed) (link string) { if json.HomePageURL != "" { link = json.HomePageURL } return } func (t *DefaultJSONTranslator) translateFeedFeedLink(json *json.Feed) (link string) { if json.FeedURL != "" { link = json.FeedURL } return } func (t *DefaultJSONTranslator) translateFeedLinks(json *json.Feed) (links []string) { if json.HomePageURL != "" { links = append(links, json.HomePageURL) } if json.FeedURL != "" { links = append(links, json.FeedURL) } return } func (t *DefaultJSONTranslator) translateFeedUpdated(json *json.Feed) (updated string) { if len(json.Items) > 0 { updated = json.Items[0].DateModified } return } func (t *DefaultJSONTranslator) translateFeedUpdatedParsed(json *json.Feed) (updated *time.Time) { if len(json.Items) > 0 { updateTime, err := shared.ParseDate(json.Items[0].DateModified) if err == nil { updated = &updateTime } } return } func (t *DefaultJSONTranslator) translateFeedPublished(json *json.Feed) (published string) { if len(json.Items) > 0 { published = json.Items[0].DatePublished } return } func (t *DefaultJSONTranslator) translateFeedPublishedParsed(json *json.Feed) (published *time.Time) { if len(json.Items) > 0 { publishTime, err := shared.ParseDate(json.Items[0].DatePublished) if err == nil { published = &publishTime } } return } func (t *DefaultJSONTranslator) translateFeedAuthor(json *json.Feed) (author *Person) { if json.Author != nil { name, address := shared.ParseNameAddress(json.Author.Name) author = &Person{} author.Name = name author.Email = address } // Author.URL is missing in global feed // Author.Avatar is missing in global feed return } func (t *DefaultJSONTranslator) translateFeedAuthors(json *json.Feed) (authors []*Person) { if json.Authors != nil { authors = []*Person{} for _, a := range json.Authors { name, address := shared.ParseNameAddress(a.Name) author := &Person{} author.Name = name author.Email = address authors = append(authors, author) } } else if author := t.translateFeedAuthor(json); author != nil { authors = []*Person{author} } // Author.URL is missing in global feed // Author.Avatar is missing in global feed return } func (t *DefaultJSONTranslator) translateFeedLanguage(json *json.Feed) (language string) { language = json.Language return } func (t *DefaultJSONTranslator) translateFeedImage(json *json.Feed) (image *Image) { // Using the Icon rather than the image // icon (optional, string) is the URL of an image for the feed suitable to be used in a timeline. It should be square and relatively large — such as 512 x 512 if json.Icon != "" { image = &Image{} image.URL = json.Icon } return } func (t *DefaultJSONTranslator) translateFeedItems(json *json.Feed) (items []*Item) { items = []*Item{} for _, i := range json.Items { items = append(items, t.translateFeedItem(i)) } return } func (t *DefaultJSONTranslator) translateItemTitle(jsonItem *json.Item) (title string) { if jsonItem.Title != "" { title = jsonItem.Title } return } func (t *DefaultJSONTranslator) translateItemDescription(jsonItem *json.Item) (desc string) { if jsonItem.Summary != "" { desc = jsonItem.Summary } return } func (t *DefaultJSONTranslator) translateItemContent(jsonItem *json.Item) (content string) { if jsonItem.ContentHTML != "" { content = jsonItem.ContentHTML } else if jsonItem.ContentText != "" { content = jsonItem.ContentText } return } func (t *DefaultJSONTranslator) translateItemLink(jsonItem *json.Item) (link string) { return jsonItem.URL } func (t *DefaultJSONTranslator) translateItemLinks(jsonItem *json.Item) (links []string) { if jsonItem.URL != "" { links = append(links, jsonItem.URL) } if jsonItem.ExternalURL != "" { links = append(links, jsonItem.ExternalURL) } return } func (t *DefaultJSONTranslator) translateItemUpdated(jsonItem *json.Item) (updated string) { if jsonItem.DateModified != "" { updated = jsonItem.DateModified } return updated } func (t *DefaultJSONTranslator) translateItemUpdatedParsed(jsonItem *json.Item) (updated *time.Time) { if jsonItem.DateModified != "" { updatedTime, err := shared.ParseDate(jsonItem.DateModified) if err == nil { updated = &updatedTime } } return } func (t *DefaultJSONTranslator) translateItemPublished(jsonItem *json.Item) (pubDate string) { if jsonItem.DatePublished != "" { pubDate = jsonItem.DatePublished } return } func (t *DefaultJSONTranslator) translateItemPublishedParsed(jsonItem *json.Item) (pubDate *time.Time) { if jsonItem.DatePublished != "" { publishTime, err := shared.ParseDate(jsonItem.DatePublished) if err == nil { pubDate = &publishTime } } return } func (t *DefaultJSONTranslator) translateItemAuthor(jsonItem *json.Item) (author *Person) { if jsonItem.Author != nil { name, address := shared.ParseNameAddress(jsonItem.Author.Name) author = &Person{} author.Name = name author.Email = address } // Author.URL is missing in global feed // Author.Avatar is missing in global feed return } func (t *DefaultJSONTranslator) translateItemAuthors(jsonItem *json.Item) (authors []*Person) { if jsonItem.Authors != nil { authors = []*Person{} for _, a := range jsonItem.Authors { name, address := shared.ParseNameAddress(a.Name) author := &Person{} author.Name = name author.Email = address authors = append(authors, author) } } else if author := t.translateItemAuthor(jsonItem); author != nil { authors = []*Person{author} } // Author.URL is missing in global feed // Author.Avatar is missing in global feed return } func (t *DefaultJSONTranslator) translateItemGUID(jsonItem *json.Item) (guid string) { if jsonItem.ID != "" { guid = jsonItem.ID } return } func (t *DefaultJSONTranslator) translateItemImage(jsonItem *json.Item) (image *Image) { if jsonItem.Image != "" { image = &Image{} image.URL = jsonItem.Image } else if jsonItem.BannerImage != "" { image = &Image{} image.URL = jsonItem.BannerImage } return } func (t *DefaultJSONTranslator) translateItemCategories(jsonItem *json.Item) (categories []string) { if len(jsonItem.Tags) > 0 { categories = jsonItem.Tags } return } func (t *DefaultJSONTranslator) translateItemEnclosures(jsonItem *json.Item) (enclosures []*Enclosure) { if jsonItem.Attachments != nil { for _, attachment := range *jsonItem.Attachments { e := &Enclosure{} e.URL = attachment.URL e.Type = attachment.MimeType e.Length = fmt.Sprintf("%d", attachment.DurationInSeconds) // Title is not defined in global enclosure // SizeInBytes is not defined in global enclosure enclosures = append(enclosures, e) } } return } gofeed-1.1.3/translator_test.go000066400000000000000000000165471403746003700165450ustar00rootroot00000000000000package gofeed_test import ( jsonEncoding "encoding/json" "fmt" "io/ioutil" "os" "path/filepath" "strings" "testing" "github.com/mmcdole/gofeed" "github.com/mmcdole/gofeed/atom" "github.com/mmcdole/gofeed/json" "github.com/mmcdole/gofeed/rss" "github.com/stretchr/testify/assert" ) func TestDefaultRSSTranslator_Translate(t *testing.T) { files, _ := filepath.Glob("testdata/translator/rss/*.xml") for _, f := range files { base := filepath.Base(f) name := strings.TrimSuffix(base, filepath.Ext(base)) fmt.Printf("Testing %s... ", name) // Get actual source feed ff := fmt.Sprintf("testdata/translator/rss/%s.xml", name) f, _ := os.Open(ff) defer f.Close() // Parse actual feed translator := &gofeed.DefaultRSSTranslator{} fp := &rss.Parser{} rssFeed, _ := fp.Parse(f) actual, _ := translator.Translate(rssFeed) // Get json encoded expected feed result ef := fmt.Sprintf("testdata/translator/rss/%s.json", name) e, _ := ioutil.ReadFile(ef) // Unmarshal expected feed expected := &gofeed.Feed{} jsonEncoding.Unmarshal(e, &expected) if assert.Equal(t, expected, actual, "Feed file %s.xml did not match expected output %s.json", name, name) { fmt.Printf("OK\n") } else { fmt.Printf("Failed\n") } } } func TestDefaultRSSTranslator_Translate_WrongType(t *testing.T) { translator := &gofeed.DefaultRSSTranslator{} af, err := translator.Translate("wrong type") assert.Nil(t, af) assert.NotNil(t, err) } func TestDefaultAtomTranslator_Translate(t *testing.T) { files, _ := filepath.Glob("testdata/translator/atom/*.xml") for _, f := range files { base := filepath.Base(f) name := strings.TrimSuffix(base, filepath.Ext(base)) fmt.Printf("Testing %s... ", name) // Get actual source feed ff := fmt.Sprintf("testdata/translator/atom/%s.xml", name) f, _ := os.Open(ff) defer f.Close() // Parse actual feed translator := &gofeed.DefaultAtomTranslator{} fp := &atom.Parser{} atomFeed, _ := fp.Parse(f) actual, _ := translator.Translate(atomFeed) // Get json encoded expected feed result ef := fmt.Sprintf("testdata/translator/atom/%s.json", name) e, _ := ioutil.ReadFile(ef) // Unmarshal expected feed expected := &gofeed.Feed{} jsonEncoding.Unmarshal(e, &expected) if assert.Equal(t, expected, actual, "Feed file %s.xml did not match expected output %s.json", name, name) { fmt.Printf("OK\n") } else { fmt.Printf("Failed\n") } } } func TestDefaultAtomTranslator_Translate_WrongType(t *testing.T) { translator := &gofeed.DefaultAtomTranslator{} af, err := translator.Translate("wrong type") assert.Nil(t, af) assert.NotNil(t, err) } func TestDefaultJSONTranslator_Translate(t *testing.T) { files, _ := filepath.Glob("testdata/translator/json/*.json") for _, f := range files { base := filepath.Base(f) name := strings.TrimSuffix(base, filepath.Ext(base)) if strings.HasSuffix(name, "expected") { continue } fmt.Printf("Testing %s... ", name) // Get actual source feed ff := fmt.Sprintf("testdata/translator/json/%s.json", name) f, _ := os.Open(ff) defer f.Close() // Parse actual feed translator := &gofeed.DefaultJSONTranslator{} fp := json.Parser{} jsonFeed, _ := fp.Parse(f) actual, _ := translator.Translate(jsonFeed) // Get json encoded expected feed result ef := fmt.Sprintf("testdata/translator/json/%s_expected.json", name) e, _ := ioutil.ReadFile(ef) // Unmarshal expected feed expected := &gofeed.Feed{} jsonEncoding.Unmarshal(e, &expected) if assert.Equal(t, expected, actual, "Feed file %s.json did not match expected output %s_expected.json", name, name) { fmt.Printf("OK\n") } else { fmt.Printf("Failed\n") } } } /* func TestDefaultJSONTranslator_Translate(t *testing.T) { name := "sample" fmt.Printf("Testing %s... ", name) // Get actual source feed ff := fmt.Sprintf("testdata/translator/json/%s.json", name) fmt.Println(ff) f, _ := ioutil.ReadFile(ff) // Parse actual feed translator := &gofeed.DefaultJSONTranslator{} fp := json.Parser{} feed, _ := fp.Parse(bytes.NewReader(f)) actual, _ := translator.Translate(feed) assert.Equal(t, "title", actual.Title) assert.Equal(t, "description", actual.Description) assert.Equal(t, "https://sample-json-feed.com", actual.Link) assert.Equal(t, "https://sample-json-feed.com/feed.json", actual.FeedLink) assert.Equal(t, "2019-10-12T07:20:50.52Z", actual.Updated) assert.Equal(t, "2019-10-12T07:20:50Z", actual.UpdatedParsed.Format(time.RFC3339)) assert.Equal(t, "2019-10-12T07:20:50.52Z", actual.Published) assert.Equal(t, "2019-10-12T07:20:50Z", actual.PublishedParsed.Format(time.RFC3339)) assert.Equal(t, "author_name", actual.Author.Name) assert.Equal(t, "", actual.Author.Email) assert.Equal(t, "", actual.Language) assert.Equal(t, "https://sample-json-feed.com/icon.png", actual.Image.URL) assert.Equal(t, "", actual.Image.Title) assert.Equal(t, "", actual.Copyright) assert.Equal(t, "", actual.Generator) assert.Equal(t, 0, len(actual.Categories)) assert.Equal(t, (*ext.DublinCoreExtension)(nil), actual.DublinCoreExt) assert.Equal(t, (*ext.ITunesFeedExtension)(nil), actual.ITunesExt) assert.Equal(t, ext.Extensions(nil), actual.Extensions) assert.Equal(t, map[string]string(nil), actual.Custom) assert.Equal(t, "json", actual.FeedType) assert.Equal(t, "1.0", actual.FeedVersion) assert.Equal(t, "title", actual.Items[0].Title) assert.Equal(t, "summary", actual.Items[0].Description) assert.Equal(t, "

content_html

", actual.Items[0].Content) assert.Equal(t, "https://sample-json-feed.com/id", actual.Items[0].Link) assert.Equal(t, "2019-10-12T07:20:50.52Z", actual.Items[0].Updated) assert.Equal(t, "2019-10-12T07:20:50Z", actual.Items[0].UpdatedParsed.Format(time.RFC3339)) assert.Equal(t, "2019-10-12T07:20:50.52Z", actual.Items[0].Published) assert.Equal(t, "2019-10-12T07:20:50Z", actual.Items[0].PublishedParsed.Format(time.RFC3339)) assert.Equal(t, "author_name", actual.Items[0].Author.Name) assert.Equal(t, "", actual.Items[0].Author.Email) assert.Equal(t, "id", actual.Items[0].GUID) assert.Equal(t, "https://sample-json-feed.com/image.png", actual.Items[0].Image.URL) assert.Equal(t, "", actual.Items[0].Image.Title) assert.Equal(t, "tag1", actual.Items[0].Categories[0]) assert.Equal(t, "tag2", actual.Items[0].Categories[1]) assert.Equal(t, "https://sample-json-feed.com/attachment", (actual.Items[0].Enclosures)[0].URL) assert.Equal(t, "100", (actual.Items[0].Enclosures)[0].Length) assert.Equal(t, "audio/mpeg", (actual.Items[0].Enclosures)[0].Type) assert.Equal(t, (*ext.DublinCoreExtension)(nil), actual.Items[0].DublinCoreExt) assert.Equal(t, (*ext.ITunesItemExtension)(nil), actual.Items[0].ITunesExt) assert.Equal(t, ext.Extensions(nil), actual.Items[0].Extensions) assert.Equal(t, map[string]string(nil), actual.Items[0].Custom) name = "sample2" fmt.Printf("Testing %s... ", name) // Get actual source feed ff = fmt.Sprintf("testdata/translator/json/%s.json", name) fmt.Println(ff) f, _ = ioutil.ReadFile(ff) // Parse actual feed feed, _ = fp.Parse(bytes.NewReader(f)) actual, _ = translator.Translate(feed) assert.Equal(t, "content_text", actual.Items[0].Content) assert.Equal(t, "https://sample-json-feed.com/banner_image.png", actual.Items[0].Image.URL) } */ func TestDefaultJSONTranslator_Translate_WrongType(t *testing.T) { translator := &gofeed.DefaultJSONTranslator{} af, err := translator.Translate("wrong type") assert.Nil(t, af) assert.NotNil(t, err) }