2121 "uri" : true ,
2222 "url" : true , // atom 0.3
2323 }
24+
25+ // No known explicit extension parsers for Atom, currently
26+ emptyExtParsers = make (shared.ExtParsers )
2427)
2528
2629// Parser is an Atom Parser
@@ -38,6 +41,14 @@ func (ap *Parser) Parse(feed io.Reader) (*Feed, error) {
3841 return ap .parseRoot (p )
3942}
4043
44+ func (ap * Parser ) ParseAsExtension (p * xpp.XMLPullParser ) (interface {}, error ) {
45+ entry := & Entry {}
46+ if err := ap .parseEntryContent (p , entry ); err != nil {
47+ return nil , err
48+ }
49+ return entry , nil
50+ }
51+
4152func (ap * Parser ) parseRoot (p * xpp.XMLPullParser ) (* Feed , error ) {
4253 if err := p .Expect (xpp .StartTag , "feed" ); err != nil {
4354 return nil , err
@@ -69,7 +80,7 @@ func (ap *Parser) parseRoot(p *xpp.XMLPullParser) (*Feed, error) {
6980 name := strings .ToLower (p .Name )
7081
7182 if shared .IsExtension (p ) {
72- e , err := shared .ParseExtension (extensions , p )
83+ e , err := shared .ParseExtension (extensions , p , emptyExtParsers )
7384 if err != nil {
7485 return nil , err
7586 }
@@ -215,103 +226,14 @@ func (ap *Parser) parseEntry(p *xpp.XMLPullParser) (*Entry, error) {
215226 }
216227
217228 if tok == xpp .StartTag {
218-
219- name := strings .ToLower (p .Name )
220-
221229 if shared .IsExtension (p ) {
222- e , err := shared .ParseExtension (extensions , p )
230+ e , err := shared .ParseExtension (extensions , p , emptyExtParsers )
223231 if err != nil {
224232 return nil , err
225233 }
226234 extensions = e
227- } else if name == "title" {
228- result , err := ap .parseAtomText (p )
229- if err != nil {
230- return nil , err
231- }
232- entry .Title = result
233- } else if name == "id" {
234- result , err := ap .parseAtomText (p )
235- if err != nil {
236- return nil , err
237- }
238- entry .ID = result
239- } else if name == "rights" ||
240- name == "copyright" {
241- result , err := ap .parseAtomText (p )
242- if err != nil {
243- return nil , err
244- }
245- entry .Rights = result
246- } else if name == "summary" {
247- result , err := ap .parseAtomText (p )
248- if err != nil {
249- return nil , err
250- }
251- entry .Summary = result
252- } else if name == "source" {
253- result , err := ap .parseSource (p )
254- if err != nil {
255- return nil , err
256- }
257- entry .Source = result
258- } else if name == "updated" ||
259- name == "modified" {
260- result , err := ap .parseAtomText (p )
261- if err != nil {
262- return nil , err
263- }
264- entry .Updated = result
265- date , err := shared .ParseDate (result )
266- if err == nil {
267- utcDate := date .UTC ()
268- entry .UpdatedParsed = & utcDate
269- }
270- } else if name == "contributor" {
271- result , err := ap .parsePerson ("contributor" , p )
272- if err != nil {
273- return nil , err
274- }
275- entry .Contributors = append (entry .Contributors , result )
276- } else if name == "author" {
277- result , err := ap .parsePerson ("author" , p )
278- if err != nil {
279- return nil , err
280- }
281- entry .Authors = append (entry .Authors , result )
282- } else if name == "category" {
283- result , err := ap .parseCategory (p )
284- if err != nil {
285- return nil , err
286- }
287- entry .Categories = append (entry .Categories , result )
288- } else if name == "link" {
289- result , err := ap .parseLink (p )
290- if err != nil {
291- return nil , err
292- }
293- entry .Links = append (entry .Links , result )
294- } else if name == "published" ||
295- name == "issued" {
296- result , err := ap .parseAtomText (p )
297- if err != nil {
298- return nil , err
299- }
300- entry .Published = result
301- date , err := shared .ParseDate (result )
302- if err == nil {
303- utcDate := date .UTC ()
304- entry .PublishedParsed = & utcDate
305- }
306- } else if name == "content" {
307- result , err := ap .parseContent (p )
308- if err != nil {
309- return nil , err
310- }
311- entry .Content = result
312235 } else {
313- err := p .Skip ()
314- if err != nil {
236+ if err := ap .parseEntryContent (p , entry ); err != nil {
315237 return nil , err
316238 }
317239 }
@@ -329,6 +251,103 @@ func (ap *Parser) parseEntry(p *xpp.XMLPullParser) (*Entry, error) {
329251 return entry , nil
330252}
331253
254+ func (ap * Parser ) parseEntryContent (p * xpp.XMLPullParser , entry * Entry ) error {
255+ name := strings .ToLower (p .Name )
256+
257+ if name == "title" {
258+ result , err := ap .parseAtomText (p )
259+ if err != nil {
260+ return err
261+ }
262+ entry .Title = result
263+ } else if name == "id" {
264+ result , err := ap .parseAtomText (p )
265+ if err != nil {
266+ return err
267+ }
268+ entry .ID = result
269+ } else if name == "rights" ||
270+ name == "copyright" {
271+ result , err := ap .parseAtomText (p )
272+ if err != nil {
273+ return err
274+ }
275+ entry .Rights = result
276+ } else if name == "summary" {
277+ result , err := ap .parseAtomText (p )
278+ if err != nil {
279+ return err
280+ }
281+ entry .Summary = result
282+ } else if name == "source" {
283+ result , err := ap .parseSource (p )
284+ if err != nil {
285+ return err
286+ }
287+ entry .Source = result
288+ } else if name == "updated" ||
289+ name == "modified" {
290+ result , err := ap .parseAtomText (p )
291+ if err != nil {
292+ return err
293+ }
294+ entry .Updated = result
295+ date , err := shared .ParseDate (result )
296+ if err == nil {
297+ utcDate := date .UTC ()
298+ entry .UpdatedParsed = & utcDate
299+ }
300+ } else if name == "contributor" {
301+ result , err := ap .parsePerson ("contributor" , p )
302+ if err != nil {
303+ return err
304+ }
305+ entry .Contributors = append (entry .Contributors , result )
306+ } else if name == "author" {
307+ result , err := ap .parsePerson ("author" , p )
308+ if err != nil {
309+ return err
310+ }
311+ entry .Authors = append (entry .Authors , result )
312+ } else if name == "category" {
313+ result , err := ap .parseCategory (p )
314+ if err != nil {
315+ return err
316+ }
317+ entry .Categories = append (entry .Categories , result )
318+ } else if name == "link" {
319+ result , err := ap .parseLink (p )
320+ if err != nil {
321+ return err
322+ }
323+ entry .Links = append (entry .Links , result )
324+ } else if name == "published" ||
325+ name == "issued" {
326+ result , err := ap .parseAtomText (p )
327+ if err != nil {
328+ return err
329+ }
330+ entry .Published = result
331+ date , err := shared .ParseDate (result )
332+ if err == nil {
333+ utcDate := date .UTC ()
334+ entry .PublishedParsed = & utcDate
335+ }
336+ } else if name == "content" {
337+ result , err := ap .parseContent (p )
338+ if err != nil {
339+ return err
340+ }
341+ entry .Content = result
342+ } else {
343+ err := p .Skip ()
344+ if err != nil {
345+ return err
346+ }
347+ }
348+ return nil
349+ }
350+
332351func (ap * Parser ) parseSource (p * xpp.XMLPullParser ) (* Source , error ) {
333352
334353 if err := p .Expect (xpp .StartTag , "source" ); err != nil {
@@ -358,7 +377,7 @@ func (ap *Parser) parseSource(p *xpp.XMLPullParser) (*Source, error) {
358377 name := strings .ToLower (p .Name )
359378
360379 if shared .IsExtension (p ) {
361- e , err := shared .ParseExtension (extensions , p )
380+ e , err := shared .ParseExtension (extensions , p , emptyExtParsers )
362381 if err != nil {
363382 return nil , err
364383 }
0 commit comments