diff --git a/extra/hacker-news/hacker-news.factor b/extra/hacker-news/hacker-news.factor index d9776507b2..01d6c40631 100644 --- a/extra/hacker-news/hacker-news.factor +++ b/extra/hacker-news/hacker-news.factor @@ -2,13 +2,27 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors assocs classes.tuple colors.constants colors.hex combinators formatting fry http.client io io.styles -json.reader kernel make math sequences splitting urls ; +json.reader kernel make math sequences splitting urls json +math.parser ; IN: hacker-news TUPLE: post title postedBy points id url commentCount postedAgo ; +f ( obj -- obj/f ) + dup json-null = [ drop f ] when ; + : items> ( seq -- seq' ) - [ \ post from-slots ] map ; + [ + \ post from-slots + [ json-null>f ] change-postedAgo + [ json-null>f ] change-postedBy + dup url>> "/comments" head? [ + dup url>> "/" split last string>number >>id + "self" >>url + ] when + ] map ; : hacker-news-items ( -- seq ) "http://api.ihackernews.com/page" http-get nip @@ -35,17 +49,26 @@ TUPLE: post title postedBy points id url commentCount postedAgo ; : post>comments-url ( post -- user-url ) id>> "http://news.ycombinator.com/item?id=%d" sprintf >url ; +! Api is funky, gives id=0 and /comment/2342342 for self-post ads +: post>url ( post -- url ) + dup url>> "self" = [ + post>comments-url + ] [ + url>> >url + ] if ; + +PRIVATE> : post. ( post index -- ) "%2d. " sprintf write-text { - [ [ title>> ] [ url>> ] bi write-title ] - [ url>> >url host>> " (" ")" surround write-text nl ] + [ [ title>> ] [ post>url ] bi write-title ] + [ post>url host>> " (" ")" surround write-text nl ] [ points>> " %d points" sprintf write-text ] - [ " by " write-text [ postedBy>> ] [ post>user-url ] bi write-link ] - [ " " write-text postedAgo>> write-text ] + [ dup postedBy>> [ " by " write-text [ postedBy>> ] [ post>user-url ] bi write-link ] [ drop ] if ] + [ dup postedAgo>> [ " " write-text postedAgo>> write-text ] [ drop ] if ] [ - "|" write-text - [ commentCount>> "%d comments" sprintf ] + " | " write-text + [ commentCount>> [ "discuss" ] [ "%d comments" sprintf ] if-zero ] [ post>comments-url ] bi write-link nl nl ] } cleave ;