Hatena::Grouphaskell

eagletmtの日記 このページをアンテナに追加

 | 

2009-10-26

HXT の練習

00:03 | HXT の練習 - eagletmtの日記 を含むブックマーク はてなブックマーク - HXT の練習 - eagletmtの日記 HXT の練習 - eagletmtの日記 のブックマークコメント

hxt-9.1.0: A collection of tools for processing XML with Haskell. とか no title を見ながらがんばる.

コンセプトは HaXml と同様にフィルタの組み合わせなんだけど,読み込みや書き込みも含めてすべて Arrow で繋げる.

IO を伴わない場合は [State]ListArrow ([S]LA),伴う場合は IO[State]ListArrow (IO[S]LA) を使うかんじでいいのかな.


引数として与えた screen_name のユーザのふぁぼり最新20をいいかんじに table に変換して出力するもの書いた.

それぞれのユーザ毎に API 1つ消費.

toString とか prepare とか醜い…

import Prelude hiding (id)
import Control.Monad (forM_)
import System.Environment (getArgs)
import qualified System.IO.UTF8 as U
import Text.XML.HXT.Arrow
import Data.Tree.NTree.TypeDefs (NTree)

data Status = S {text :: String, id :: String, name :: String, imgurl :: String}

toString :: LA [a] XmlTree -> String
toString a = head $ runLA (selem "dummy" [a] >>> xshow getChildren) []

main = do
  users <- getArgs
  forM_ users $ \u -> do
    elems <- runX $ readDocument [] ("http://twitter.com/favorites/" ++ u ++ ".xml") >>> deep (isElem >>> hasName "status")

    putStrLn "<table border=\"1\" bgcolor=\"#FFFFFF\">"
    mapM_ (U.putStrLn . toString . prepare . parse) elems
    putStrLn "</table>"

parse :: NTree XNode -> Status
parse s = let get e n = head $ runLA (getChildren >>> hasName n >>> getChildren >>> getText) e
              [text, id] = map (get s) ["text", "id"]
              [name, imgurl] = map (get (head $ runLA (getChildren >>> hasName "user") s)) ["screen_name", "profile_image_url"]
          in S text id name imgurl

prepare :: (ArrowXml a) => Status -> a n XmlTree
prepare s = mkelem "tr" [sattr "width" "32", sattr "height" "32"]
              [ mkelem "td" [sattr "width" "32", sattr "height" "32"] [mkelem "img" [sattr "src" (imgurl s), sattr "width" "32", sattr "height" "32"] []]
              , selem "td" [mkelem "a" [sattr "href" ("http://twitter.com/" ++ name s)] [txt (name s)]]
              , selem "td" [txt (text s)]
              , selem "td" [mkelem "a" [sattr "href" ("http://twitter.com/" ++ name s ++ "/status/" ++ id s)] [txt "link"]]]

HTML 生成は moe のほうが数段読み書きしやすいですね…

ゲスト



 |