{-# LANGUAGE OverloadedStrings, DeriveGeneric #-} module Internal.Elements (getTitle, Find(..), find) where import Text.XML import qualified Data.Map as M import Data.Text as Txt hiding (find) import Control.Concurrent.MVar import Internal import Data.Aeson import Data.Text (Text, pack) import GHC.Generics -- Selector engines import qualified Text.XML.Cursor as X import qualified XML.Selectors.CSS as CSS getTitle :: Session -> IO Text getTitle session = getTitle' <$> documentRoot <$> document <$> readMVar session getTitle' (Element "title" _ childs) = Txt.concat [txt | NodeContent txt <- childs] getTitle' (Element "h1" _ childs) = Txt.concat [txt | NodeContent txt <- childs] getTitle' (Element _ _ childs) -- FIXME: Caught Rhapsode bug repaired here, needs that filtering condition. | title:_ <- [getTitle' el | NodeElement el <- childs, getTitle' el /= ""] = title | otherwise = "" --- data Find = Find { using :: Text, value :: String } deriving Generic instance FromJSON Find find :: Find -> X.Cursor -> Either (Bool, String) [X.Cursor] find (Find "css selector" sel) root = case CSS.parsePath sel of Right sel' -> Right $ CSS.toAxis sel' root Left msg -> Left (True, msg) find (Find type_ _) _ = Left (False, "Invalid selector type: " ++ Txt.unpack type_)