RSS feed in planet

release
Slava Pestov 2007-12-05 23:16:20 -05:00
parent 214974ec52
commit 4eb4982e60
1 changed files with 65 additions and 70 deletions

View File

@ -1,41 +1,14 @@
USING: sequences rss arrays concurrency kernel sorting USING: sequences rss arrays concurrency kernel sorting
html.elements io assocs namespaces math threads vocabs html html.elements io assocs namespaces math threads vocabs html
furnace http.server.templating calendar math.parser splitting furnace http.server.templating calendar math.parser splitting
continuations debugger system http.server.responders ; continuations debugger system http.server.responders
xml.writer ;
IN: webapps.planet IN: webapps.planet
TUPLE: posting author title date link body ;
: diagnostic write print flush ;
: fetch-feed ( pair -- feed )
second
dup "Fetching " diagnostic
dup download-feed feed-entries
swap "Done fetching " diagnostic ;
: fetch-blogroll ( blogroll -- entries )
#! entries is an array of { author entries } pairs.
dup [
[ fetch-feed ] [ error. drop f ] recover
] parallel-map
[ [ >r first r> 2array ] curry* map ] 2map concat ;
: sort-entries ( entries -- entries' )
[ [ second entry-pub-date ] compare ] sort <reversed> ;
: <posting> ( pair -- posting )
#! pair has shape { author entry }
first2
{ entry-title entry-pub-date entry-link entry-description }
get-slots posting construct-boa ;
: print-posting-summary ( posting -- ) : print-posting-summary ( posting -- )
<p "news" =class p> <p "news" =class p>
<b> dup posting-title write </b> <br/> <b> dup entry-title write </b> <br/>
"- " write <a entry-link =href "more" =class a>
dup posting-author write bl
<a posting-link =href "more" =class a>
"Read More..." write "Read More..." write
</a> </a>
</p> ; </p> ;
@ -63,14 +36,16 @@ TUPLE: posting author title date link body ;
: print-posting ( posting -- ) : print-posting ( posting -- )
<h2 "posting-title" =class h2> <h2 "posting-title" =class h2>
<a dup posting-link =href a> <a dup entry-link =href a>
dup posting-title write-html dup entry-title write-html
" - " write
dup posting-author write
</a> </a>
</h2> </h2>
<p "posting-body" =class p> dup posting-body write-html </p> <p "posting-body" =class p>
<p "posting-date" =class p> posting-date format-date write </p> ; dup entry-description write-html
</p>
<p "posting-date" =class p>
entry-pub-date format-date write
</p> ;
: print-postings ( postings -- ) : print-postings ( postings -- )
[ print-posting ] each ; [ print-posting ] each ;
@ -83,38 +58,56 @@ TUPLE: posting author title date link body ;
SYMBOL: default-blogroll SYMBOL: default-blogroll
SYMBOL: cached-postings SYMBOL: cached-postings
: update-cached-postings ( -- )
default-blogroll get fetch-blogroll sort-entries
[ <posting> ] map
cached-postings set-global ;
: mini-planet-factor ( -- ) : mini-planet-factor ( -- )
cached-postings get 4 head print-posting-summaries ; cached-postings get 4 head print-posting-summaries ;
: planet-factor ( -- ) : planet-factor ( -- )
serving-html [ serving-html [ "planet" render-template ] with-html-stream ;
"resource:extra/webapps/planet/planet.fhtml"
run-template-file
] with-html-stream ;
\ planet-factor { } define-action \ planet-factor { } define-action
{ : planet-feed ( -- feed )
{ "Berlin Brown" "http://factorlang-fornovices.blogspot.com/feeds/posts/default" "http://factorlang-fornovices.blogspot.com" } "[ planet-factor ]"
{ "Chris Double" "http://www.bluishcoder.co.nz/atom.xml" "http://www.bluishcoder.co.nz/" } "http://planet.factorcode.org"
{ "Elie Chaftari" "http://fun-factor.blogspot.com/feeds/posts/default" "http://fun-factor.blogspot.com/" } cached-postings get 30 head <feed> ;
{ "Doug Coleman" "http://code-factor.blogspot.com/feeds/posts/default" "http://code-factor.blogspot.com/" }
{ "Daniel Ehrenberg" "http://useless-factor.blogspot.com/feeds/posts/default" "http://useless-factor.blogspot.com/" } : feed.xml
{ "Kio M. Smallwood" "text/xml" serving-content
"http://sekenre.wordpress.com/feed/atom/" planet-feed feed>xml write-xml ;
"http://sekenre.wordpress.com/" }
{ "Phil Dawes" "http://www.phildawes.net/blog/category/factor/feed/atom" "http://www.phildawes.net/blog/" } \ feed.xml { } define-action
{ "Samuel Tardieu" "http://www.rfc1149.net/blog/tag/factor/feed/atom/" "http://www.rfc1149.net/blog/tag/factor/" }
{ "Slava Pestov" "http://factor-language.blogspot.com/atom.xml" "http://factor-language.blogspot.com/" }
} default-blogroll set-global
SYMBOL: last-update SYMBOL: last-update
: diagnostic write print flush ;
: fetch-feed ( triple -- feed )
second
dup "Fetching " diagnostic
dup download-feed feed-entries
swap "Done fetching " diagnostic ;
: <posting> ( author entry -- entry' )
clone
[ ": " swap entry-title 3append ] keep
[ set-entry-title ] keep ;
: ?fetch-feed ( triple -- feed/f )
[ fetch-feed ] [ error. drop f ] recover ;
: fetch-blogroll ( blogroll -- entries )
dup 0 <column>
swap [ ?fetch-feed ] parallel-map
[ [ <posting> ] curry* map ] 2map concat ;
: sort-entries ( entries -- entries' )
[ [ entry-pub-date ] compare ] sort <reversed> ;
: update-cached-postings ( -- )
default-blogroll get
fetch-blogroll sort-entries
cached-postings set-global ;
: update-thread ( -- ) : update-thread ( -- )
millis last-update set-global millis last-update set-global
[ update-cached-postings ] in-thread [ update-cached-postings ] in-thread
@ -126,14 +119,16 @@ SYMBOL: last-update
"planet" "planet-factor" "extra/webapps/planet" web-app "planet" "planet-factor" "extra/webapps/planet" web-app
: merge-feeds ( feeds -- feed ) {
[ feed-entries ] map concat sort-entries ; { "Berlin Brown" "http://factorlang-fornovices.blogspot.com/feeds/posts/default" "http://factorlang-fornovices.blogspot.com" }
{ "Chris Double" "http://www.bluishcoder.co.nz/atom.xml" "http://www.bluishcoder.co.nz/" }
: planet-feed ( -- feed ) { "Elie Chaftari" "http://fun-factor.blogspot.com/feeds/posts/default" "http://fun-factor.blogspot.com/" }
default-blogroll get [ second download-feed ] map merge-feeds { "Doug Coleman" "http://code-factor.blogspot.com/feeds/posts/default" "http://code-factor.blogspot.com/" }
>r "[ planet-factor ]" "http://planet.factorcode.org" r> <entry> { "Daniel Ehrenberg" "http://useless-factor.blogspot.com/feeds/posts/default" "http://useless-factor.blogspot.com/" }
feed>xml ; { "Kio M. Smallwood"
"http://sekenre.wordpress.com/feed/atom/"
: feed.xml planet-feed ; "http://sekenre.wordpress.com/" }
! { "Phil Dawes" "http://www.phildawes.net/blog/category/factor/feed/atom" "http://www.phildawes.net/blog/" }
\ feed.xml { } define-action { "Samuel Tardieu" "http://www.rfc1149.net/blog/tag/factor/feed/atom/" "http://www.rfc1149.net/blog/tag/factor/" }
{ "Slava Pestov" "http://factor-language.blogspot.com/atom.xml" "http://factor-language.blogspot.com/" }
} default-blogroll set-global