3030 "src" : true ,
3131 "uri" : true ,
3232 }
33+
34+ // No known explicit extension parsers for Atom, currently
35+ emptyExtParsers = make (shared.ExtParsers )
3336)
3437
3538// Parser is an Atom Parser
@@ -50,6 +53,15 @@ func (ap *Parser) Parse(feed io.Reader) (*Feed, error) {
5053 return ap .parseRoot (p )
5154}
5255
56+ func (ap * Parser ) ParseAsExtension (p * xpp.XMLPullParser ) (interface {}, error ) {
57+ ap .base = & shared.XMLBase {URIAttrs : atomURIAttrs } // TODO: do we need the surrounding base for the urlstack?
58+ entry := & Entry {}
59+ if err := ap .parseEntryContent (p , entry ); err != nil {
60+ return nil , err
61+ }
62+ return entry , nil
63+ }
64+
5365func (ap * Parser ) parseRoot (p * xpp.XMLPullParser ) (* Feed , error ) {
5466 if err := p .Expect (xpp .StartTag , "feed" ); err != nil {
5567 return nil , err
@@ -81,7 +93,7 @@ func (ap *Parser) parseRoot(p *xpp.XMLPullParser) (*Feed, error) {
8193 name := strings .ToLower (p .Name )
8294
8395 if shared .IsExtension (p ) {
84- e , err := shared .ParseExtension (extensions , p )
96+ e , err := shared .ParseExtension (extensions , p , emptyExtParsers )
8597 if err != nil {
8698 return nil , err
8799 }
@@ -227,103 +239,14 @@ func (ap *Parser) parseEntry(p *xpp.XMLPullParser) (*Entry, error) {
227239 }
228240
229241 if tok == xpp .StartTag {
230-
231- name := strings .ToLower (p .Name )
232-
233242 if shared .IsExtension (p ) {
234- e , err := shared .ParseExtension (extensions , p )
243+ e , err := shared .ParseExtension (extensions , p , emptyExtParsers )
235244 if err != nil {
236245 return nil , err
237246 }
238247 extensions = e
239- } else if name == "title" {
240- result , err := ap .parseAtomText (p )
241- if err != nil {
242- return nil , err
243- }
244- entry .Title = result
245- } else if name == "id" {
246- result , err := ap .parseAtomText (p )
247- if err != nil {
248- return nil , err
249- }
250- entry .ID = result
251- } else if name == "rights" ||
252- name == "copyright" {
253- result , err := ap .parseAtomText (p )
254- if err != nil {
255- return nil , err
256- }
257- entry .Rights = result
258- } else if name == "summary" {
259- result , err := ap .parseAtomText (p )
260- if err != nil {
261- return nil , err
262- }
263- entry .Summary = result
264- } else if name == "source" {
265- result , err := ap .parseSource (p )
266- if err != nil {
267- return nil , err
268- }
269- entry .Source = result
270- } else if name == "updated" ||
271- name == "modified" {
272- result , err := ap .parseAtomText (p )
273- if err != nil {
274- return nil , err
275- }
276- entry .Updated = result
277- date , err := shared .ParseDate (result )
278- if err == nil {
279- utcDate := date .UTC ()
280- entry .UpdatedParsed = & utcDate
281- }
282- } else if name == "contributor" {
283- result , err := ap .parsePerson ("contributor" , p )
284- if err != nil {
285- return nil , err
286- }
287- entry .Contributors = append (entry .Contributors , result )
288- } else if name == "author" {
289- result , err := ap .parsePerson ("author" , p )
290- if err != nil {
291- return nil , err
292- }
293- entry .Authors = append (entry .Authors , result )
294- } else if name == "category" {
295- result , err := ap .parseCategory (p )
296- if err != nil {
297- return nil , err
298- }
299- entry .Categories = append (entry .Categories , result )
300- } else if name == "link" {
301- result , err := ap .parseLink (p )
302- if err != nil {
303- return nil , err
304- }
305- entry .Links = append (entry .Links , result )
306- } else if name == "published" ||
307- name == "issued" {
308- result , err := ap .parseAtomText (p )
309- if err != nil {
310- return nil , err
311- }
312- entry .Published = result
313- date , err := shared .ParseDate (result )
314- if err == nil {
315- utcDate := date .UTC ()
316- entry .PublishedParsed = & utcDate
317- }
318- } else if name == "content" {
319- result , err := ap .parseContent (p )
320- if err != nil {
321- return nil , err
322- }
323- entry .Content = result
324248 } else {
325- err := p .Skip ()
326- if err != nil {
249+ if err := ap .parseEntryContent (p , entry ); err != nil {
327250 return nil , err
328251 }
329252 }
@@ -341,6 +264,103 @@ func (ap *Parser) parseEntry(p *xpp.XMLPullParser) (*Entry, error) {
341264 return entry , nil
342265}
343266
267+ func (ap * Parser ) parseEntryContent (p * xpp.XMLPullParser , entry * Entry ) error {
268+ name := strings .ToLower (p .Name )
269+
270+ if name == "title" {
271+ result , err := ap .parseAtomText (p )
272+ if err != nil {
273+ return err
274+ }
275+ entry .Title = result
276+ } else if name == "id" {
277+ result , err := ap .parseAtomText (p )
278+ if err != nil {
279+ return err
280+ }
281+ entry .ID = result
282+ } else if name == "rights" ||
283+ name == "copyright" {
284+ result , err := ap .parseAtomText (p )
285+ if err != nil {
286+ return err
287+ }
288+ entry .Rights = result
289+ } else if name == "summary" {
290+ result , err := ap .parseAtomText (p )
291+ if err != nil {
292+ return err
293+ }
294+ entry .Summary = result
295+ } else if name == "source" {
296+ result , err := ap .parseSource (p )
297+ if err != nil {
298+ return err
299+ }
300+ entry .Source = result
301+ } else if name == "updated" ||
302+ name == "modified" {
303+ result , err := ap .parseAtomText (p )
304+ if err != nil {
305+ return err
306+ }
307+ entry .Updated = result
308+ date , err := shared .ParseDate (result )
309+ if err == nil {
310+ utcDate := date .UTC ()
311+ entry .UpdatedParsed = & utcDate
312+ }
313+ } else if name == "contributor" {
314+ result , err := ap .parsePerson ("contributor" , p )
315+ if err != nil {
316+ return err
317+ }
318+ entry .Contributors = append (entry .Contributors , result )
319+ } else if name == "author" {
320+ result , err := ap .parsePerson ("author" , p )
321+ if err != nil {
322+ return err
323+ }
324+ entry .Authors = append (entry .Authors , result )
325+ } else if name == "category" {
326+ result , err := ap .parseCategory (p )
327+ if err != nil {
328+ return err
329+ }
330+ entry .Categories = append (entry .Categories , result )
331+ } else if name == "link" {
332+ result , err := ap .parseLink (p )
333+ if err != nil {
334+ return err
335+ }
336+ entry .Links = append (entry .Links , result )
337+ } else if name == "published" ||
338+ name == "issued" {
339+ result , err := ap .parseAtomText (p )
340+ if err != nil {
341+ return err
342+ }
343+ entry .Published = result
344+ date , err := shared .ParseDate (result )
345+ if err == nil {
346+ utcDate := date .UTC ()
347+ entry .PublishedParsed = & utcDate
348+ }
349+ } else if name == "content" {
350+ result , err := ap .parseContent (p )
351+ if err != nil {
352+ return err
353+ }
354+ entry .Content = result
355+ } else {
356+ err := p .Skip ()
357+ if err != nil {
358+ return err
359+ }
360+ }
361+ return nil
362+ }
363+
344364func (ap * Parser ) parseSource (p * xpp.XMLPullParser ) (* Source , error ) {
345365
346366 if err := p .Expect (xpp .StartTag , "source" ); err != nil {
@@ -370,7 +390,7 @@ func (ap *Parser) parseSource(p *xpp.XMLPullParser) (*Source, error) {
370390 name := strings .ToLower (p .Name )
371391
372392 if shared .IsExtension (p ) {
373- e , err := shared .ParseExtension (extensions , p )
393+ e , err := shared .ParseExtension (extensions , p , emptyExtParsers )
374394 if err != nil {
375395 return nil , err
376396 }
0 commit comments