pubsubhubbub support by samueltardieu. Fixes #148.

db4
John Benediktsson 2011-11-28 09:57:03 -08:00
parent 3356a3a3bb
commit 1eaea88912
5 changed files with 120 additions and 25 deletions

View File

@ -39,16 +39,18 @@ M: object >entry
"UTF-8" >>content-charset
utf8 >>content-encoding ;
TUPLE: feed-action < action title url entries ;
TUPLE: feed-action < action title url hubs entries ;
: <feed-action> ( -- action )
feed-action new-action
dup '[
feed new
_
[ title>> call >>title ]
[ url>> call adjust-url >>url ]
[ entries>> call process-entries >>entries ]
tri
{
[ title>> call >>title ]
[ url>> call adjust-url >>url ]
[ hubs>> [ call [ adjust-url ] map >>hubs ] when* ]
[ entries>> call process-entries >>entries ]
} cleave
<feed-content>
] >>display ;

View File

@ -0,0 +1,41 @@
! Copyright (c) 2010 Samuel Tardieu.
! See http://factorcode.org/license.txt for BSD license.
USING: http syndication.pubsubhubbub tools.test urls ;
[
T{ request
{ method "POST" }
{ url URL" http://rfc1149.superfeedr.com:80/" }
{ version "1.1" }
{ header
H{
{ "user-agent" "Factor http.client" }
{ "connection" "close" }
}
}
{ post-data
T{ post-data
{ data
B{
104 117 98 46 109 111 100 101 61 112 117 98
108 105 115 104 38 104 117 98 46 117 114
108 61 104 116 116 112 58 47 47 119 119 119
46 114 102 99 49 49 52 57 46 110 101 116 47
98 108 111 103 47 102 101 101 100 47 38 104
117 98 46 117 114 108 61 104 116 116 112 58
47 47 119 119 119 46 114 102 99 49 49 52 57
46 110 101 116 47 98 108 111 103 47 101 110
47 102 101 101 100 47
}
}
{ content-type
"application/x-www-form-urlencoded"
}
}
}
{ cookies V{ } }
{ redirects 10 }
}
] [
{ "http://www.rfc1149.net/blog/feed/" "http://www.rfc1149.net/blog/en/feed/" } "http://rfc1149.superfeedr.com/" <ping-request>
] unit-test

View File

@ -0,0 +1,20 @@
! Copyright (c) 2010 Samuel Tardieu.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors byte-arrays kernel http http.client sequences urls.encoding ;
IN: syndication.pubsubhubbub
<PRIVATE
: <ping-data> ( feeds -- post-data )
[ url-encode "hub.url=" prepend ] map "&" join
"hub.mode=publish&" prepend >byte-array
"application/x-www-form-urlencoded" <post-data> [ data<< ] keep ;
PRIVATE>
: <ping-request> ( feeds url -- request )
[ <ping-data> ] [ <post-request> ] bi* ;
: ping ( feeds url -- )
<ping-request> http-request drop
dup code>> 204 = [ drop ] [ download-failed ] if ;

View File

@ -5,13 +5,13 @@ USING: xml.traversal kernel assocs math.order strings sequences
xml.data xml.writer io.streams.string combinators xml
xml.entities.html io.files io http.client namespaces make
xml.syntax hashtables calendar.format accessors continuations
urls present byte-arrays ;
urls present byte-arrays fry arrays ;
IN: syndication
: any-tag-named ( tag names -- tag-inside )
[ f ] 2dip [ tag-named nip dup ] with find 2drop ;
TUPLE: feed title url entries ;
TUPLE: feed title url entries hubs ;
: <feed> ( -- feed ) feed new ;
@ -65,15 +65,19 @@ TUPLE: entry title url description date ;
[ "item" tags-named [ rss2.0-entry ] map set-entries ]
tri ;
: atom-entry-link ( tag -- url/f )
"link" tags-named
[ "rel" attr { f "alternate" } member? ] find nip
dup [ "href" attr >url ] when ;
: atom-links ( tag rel -- seq )
[ "links" tags-named ] dip
dup "alternate" = [ f 2array ] [ 1array ] if
'[ "rel" attr _ member? ] filter
[ "href" attr >url ] map ;
: atom-link ( tag rel -- url/f )
atom-links [ f ] [ first ] if-empty ;
: atom1.0-entry ( tag -- entry )
<entry> swap {
[ "title" tag-named children>string >>title ]
[ atom-entry-link >>url ]
[ "alternate" atom-link >>url ]
[
{ "content" "summary" } any-tag-named
dup children>> [ string? not ] any?
@ -88,11 +92,12 @@ TUPLE: entry title url description date ;
} cleave ;
: atom1.0 ( xml -- feed )
<feed> swap
[ "title" tag-named children>string >>title ]
[ "link" tag-named "href" attr >url >>url ]
[ "entry" tags-named [ atom1.0-entry ] map set-entries ]
tri ;
<feed> swap {
[ "title" tag-named children>string >>title ]
[ "alternate" atom-link >>url ]
[ "hub" atom-links >>hubs ]
[ "entry" tags-named [ atom1.0-entry ] map set-entries ]
} cleave ;
: xml>feed ( xml -- feed )
dup main>> {
@ -129,14 +134,21 @@ M: byte-array parse-feed [ bytes>xml xml>feed ] with-html-entities ;
</entry>
XML] ;
: hub>xml ( hub -- xml )
present [XML <link rel="hub" href=<-> /> XML] ;
: feed>xml ( feed -- xml )
[ title>> ]
[ url>> present ]
[ entries>> [ entry>xml ] map ] tri
{
[ title>> ]
[ url>> present ]
[ hubs>> [ hub>xml ] map ]
[ entries>> [ entry>xml ] map ]
} cleave
<XML
<feed xmlns="http://www.w3.org/2005/Atom">
<title><-></title>
<link href=<-> />
<->
<->
</feed>
XML> ;

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license.
USING: kernel accessors sequences sorting math math.order
calendar timers logging concurrency.combinators namespaces
db.types db.tuples db fry locals hashtables
db.types db.tuples db fry locals hashtables continuations
syndication urls xml.writer validators
html.forms
html.components
@ -15,7 +15,8 @@ furnace.redirection
furnace.boilerplate
furnace.auth.login
furnace.auth
furnace.syndication ;
furnace.syndication
syndication.pubsubhubbub ;
IN: webapps.planet
TUPLE: planet < dispatcher ;
@ -51,6 +52,9 @@ posting "POSTINGS"
{ "date" "DATE" TIMESTAMP +not-null+ }
} define-persistent
CONSTANT: hubs { { URL" http://pubsubhubbub.appspot.com/"
URL" http://pubsubhubbub.appspot.com/publish" } }
: <blog> ( id -- todo )
blog new
swap >>id ;
@ -59,9 +63,12 @@ posting "POSTINGS"
f <blog> select-tuples
[ name>> ] sort-with ;
: sort-postings ( seq -- seq )
[ date>> ] inv-sort-with ;
: postings ( -- seq )
posting new select-tuples
[ date>> ] inv-sort-with ;
sort-postings ;
: <edit-blogroll-action> ( -- action )
<page-action>
@ -77,10 +84,19 @@ posting "POSTINGS"
{ planet "planet" } >>template ;
: hubs-urls ( -- seq )
hubs [ first ] map ;
: ping-hubs ( -- )
{ URL" http://planet.factorcode.org/feed.xml" }
hubs [ second ] map
[ [ ping ] [ 3drop ] recover ] with each ;
: <planet-feed-action> ( -- action )
<feed-action>
[ "Planet Factor" ] >>title
[ URL" $planet" ] >>url
[ hubs-urls ] >>hubs
[ postings ] >>entries ;
:: <posting> ( entry name -- entry' )
@ -102,12 +118,16 @@ posting "POSTINGS"
: sort-entries ( entries -- entries' )
[ date>> ] inv-sort-with ;
: update-cached-postings ( -- )
blogroll fetch-blogroll sort-entries 8 short head [
: set-cached-postings ( seq -- )
[
posting new delete-tuples
[ insert-tuple ] each
] with-transaction ;
: update-cached-postings ( -- )
blogroll fetch-blogroll sort-entries 8 short head sort-postings
dup postings = [ drop ] [ set-cached-postings ping-hubs ] if ;
: <update-action> ( -- action )
<action>
[