pubsubhubbub support by samueltardieu. Fixes #148.
parent
3356a3a3bb
commit
1eaea88912
|
@ -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 ;
|
||||
|
|
|
@ -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
|
|
@ -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 ;
|
|
@ -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> ;
|
||||
|
|
|
@ -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>
|
||||
[
|
||||
|
|
Loading…
Reference in New Issue