module HTML where import Control.Applicative ( pure ) import Control.Exception ( SomeException, catch ) import Control.Monad ( guard ) import Data.List ( isPrefixOf ) import Network.HTTP.Conduit import Text.Regex.Posix ( (=~) ) htmlTitle :: String -> IO (Maybe String) htmlTitle url = do -- test http; if it fails, test https http <- flip catch handleException $ fmap (extractTitle . show) $ simpleHttp httpPrefixedURL case http of Just _ -> pure http Nothing -> flip catch handleException $ fmap (extractTitle . show) $ simpleHttp httpsPrefixedURL where httpPrefixedURL = if "http://" `isPrefixOf` url then url else "http://" ++ url httpsPrefixedURL = if "https://" `isPrefixOf` url then url else "https://" ++ url handleException :: SomeException -> IO (Maybe String) handleException _ = pure Nothing extractTitle :: String -> Maybe String extractTitle body = do guard (not $ null titleHTML) pure $ dropAround (length "