]> gitweb.factorcode.org Git - factor.git/commitdiff
hacker-news: Fix hacker-news. for job ads.
authorDoug Coleman <doug.coleman@gmail.com>
Mon, 24 Sep 2012 18:32:12 +0000 (11:32 -0700)
committerDoug Coleman <doug.coleman@gmail.com>
Mon, 24 Sep 2012 18:32:12 +0000 (11:32 -0700)
extra/hacker-news/hacker-news.factor

index d9776507b22d83b25f3be7bd7dad5d9495e9e884..01d6c40631f5683bfd42220caf9d642b924e00f7 100644 (file)
@@ -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 ;
 
+<PRIVATE
+
+: json-null>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 ;