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 := p.NextTag() 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) 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) 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) parseSkipDays(p *xpp.XMLPullParser) ([]string, error) { if err := p.Expect(xpp.StartTag, "skipdays"); err != nil { return nil, err } days := []string{} for { tok, err := p.NextTag() 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) 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 := p.NextTag() 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) 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 := p.NextTag() 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 == "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 { // Skip any elements not part of the item spec p.Skip() } } } 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) 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 := p.NextTag() 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 }