extra/rss now works with some Atom 0.3 feeds
parent
9b69278b90
commit
c2e2fb2304
|
@ -9,6 +9,9 @@ USING: xml.utilities kernel assocs
|
||||||
: ?children>string ( tag/f -- string/f )
|
: ?children>string ( tag/f -- string/f )
|
||||||
[ children>string ] [ f ] if* ;
|
[ children>string ] [ f ] if* ;
|
||||||
|
|
||||||
|
: any-tag-named ( tag names -- tag-inside )
|
||||||
|
f -rot [ tag-named nip dup ] curry* find 2drop ;
|
||||||
|
|
||||||
TUPLE: feed title link entries ;
|
TUPLE: feed title link entries ;
|
||||||
|
|
||||||
C: <feed> feed
|
C: <feed> feed
|
||||||
|
@ -17,50 +20,51 @@ TUPLE: entry title link description pub-date ;
|
||||||
|
|
||||||
C: <entry> entry
|
C: <entry> entry
|
||||||
|
|
||||||
|
: rss1.0-entry ( tag -- entry )
|
||||||
|
[ "title" tag-named children>string ] keep
|
||||||
|
[ "link" tag-named children>string ] keep
|
||||||
|
[ "description" tag-named children>string ] keep
|
||||||
|
f "date" "http://purl.org/dc/elements/1.1/" <name>
|
||||||
|
tag-named ?children>string
|
||||||
|
<entry> ;
|
||||||
|
|
||||||
: rss1.0 ( xml -- feed )
|
: rss1.0 ( xml -- feed )
|
||||||
[
|
[
|
||||||
"channel" tag-named
|
"channel" tag-named
|
||||||
[ "title" tag-named children>string ] keep
|
[ "title" tag-named children>string ] keep
|
||||||
"link" tag-named children>string
|
"link" tag-named children>string
|
||||||
] keep
|
] keep
|
||||||
"item" tags-named [
|
"item" tags-named [ rss1.0-entry ] map <feed> ;
|
||||||
[ "title" tag-named children>string ] keep
|
|
||||||
[ "link" tag-named children>string ] keep
|
: rss2.0-entry ( tag -- entry )
|
||||||
[ "description" tag-named children>string ] keep
|
[ "title" tag-named children>string ] keep
|
||||||
f "date" "http://purl.org/dc/elements/1.1/" <name>
|
[ "link" tag-named ] keep
|
||||||
tag-named ?children>string
|
[ "guid" tag-named dupd ? children>string ] keep
|
||||||
<entry>
|
[ "description" tag-named children>string ] keep
|
||||||
] map <feed> ;
|
"pubDate" tag-named children>string <entry> ;
|
||||||
|
|
||||||
: rss2.0 ( xml -- feed )
|
: rss2.0 ( xml -- feed )
|
||||||
"channel" tag-named
|
"channel" tag-named
|
||||||
[ "title" tag-named children>string ] keep
|
[ "title" tag-named children>string ] keep
|
||||||
[ "link" tag-named children>string ] keep
|
[ "link" tag-named children>string ] keep
|
||||||
"item" tags-named [
|
"item" tags-named [ rss2.0-entry ] map <feed> ;
|
||||||
[ "title" tag-named children>string ] keep
|
|
||||||
[ "link" tag-named ] keep
|
: atom1.0-entry ( tag -- entry )
|
||||||
[ "guid" tag-named dupd ? children>string ] keep
|
[ "title" tag-named children>string ] keep
|
||||||
[ "description" tag-named children>string ] keep
|
[ "link" tag-named "href" swap at ] keep
|
||||||
"pubDate" tag-named children>string <entry>
|
[
|
||||||
] map <feed> ;
|
{ "content" "summary" } any-tag-named
|
||||||
|
dup tag-children [ string? not ] contains?
|
||||||
|
[ tag-children [ write-chunk ] string-out ]
|
||||||
|
[ children>string ] if
|
||||||
|
] keep
|
||||||
|
{ "published" "updated" "issued" "modified" } any-tag-named
|
||||||
|
children>string <entry> ;
|
||||||
|
|
||||||
: atom1.0 ( xml -- feed )
|
: atom1.0 ( xml -- feed )
|
||||||
[ "title" tag-named children>string ] keep
|
[ "title" tag-named children>string ] keep
|
||||||
[ "link" tag-named "href" swap at ] keep
|
[ "link" tag-named "href" swap at ] keep
|
||||||
"entry" tags-named [
|
"entry" tags-named [ atom1.0-entry ] map <feed> ;
|
||||||
[ "title" tag-named children>string ] keep
|
|
||||||
[ "link" tag-named "href" swap at ] keep
|
|
||||||
[
|
|
||||||
dup "content" tag-named
|
|
||||||
[ nip ] [ "summary" tag-named ] if*
|
|
||||||
dup tag-children [ tag? ] contains?
|
|
||||||
[ tag-children [ write-chunk ] string-out ]
|
|
||||||
[ children>string ] if
|
|
||||||
] keep
|
|
||||||
dup "published" tag-named
|
|
||||||
[ nip ] [ "updated" tag-named ] if*
|
|
||||||
children>string <entry>
|
|
||||||
] map <feed> ;
|
|
||||||
|
|
||||||
: xml>feed ( xml -- feed )
|
: xml>feed ( xml -- feed )
|
||||||
dup name-tag {
|
dup name-tag {
|
||||||
|
@ -74,7 +78,7 @@ C: <entry> entry
|
||||||
|
|
||||||
: download-feed ( url -- feed )
|
: download-feed ( url -- feed )
|
||||||
#! Retrieve an news syndication file, return as a feed tuple.
|
#! Retrieve an news syndication file, return as a feed tuple.
|
||||||
http-get rot 200 = [
|
http-get-stream rot 200 = [
|
||||||
nip read-feed
|
nip read-feed
|
||||||
] [
|
] [
|
||||||
2drop "Error retrieving newsfeed file" throw
|
2drop "Error retrieving newsfeed file" throw
|
||||||
|
|
Loading…
Reference in New Issue