{-# LANGUAGE DoAndIfThenElse #-} module Main where import Data.Maybe (fromJust) import Prelude hiding (readFile) import System.Directory (doesFileExist) import System.IO ( Handle, IOMode (WriteMode), hPutStrLn, openBinaryFile, stderr, stdout) import System.IO.UTF8 (readFile) import Text.XML.HXT.Core ( IOStateArrow, XmlTree) import CommandLine (show_help) import Configuration (Cfg(..), get_cfg, use_account) import LWN.Article (real_article_path) import LWN.HTTP (get_page, log_in, make_cookie_jar) import LWN.Page (epublish, parse) import LWN.XHTML (parse_lwn) -- | Try to parse the given article using HXT. We try a few different -- methods; if none of them work, we return 'Nothing'. get_xml_from_article :: Cfg -> IO (Maybe (IOStateArrow s b XmlTree)) get_xml_from_article cfg = do my_article <- real_article_path (article cfg) is_file <- doesFileExist my_article case is_file of True -> do contents <- readFile my_article return $ Just $ parse_lwn contents False -> do -- Download the URL and try to parse it. if use_account cfg then do -- use_account would be false if these fromJusts would fail. cj <- make_cookie_jar li_result <- log_in cj (fromJust $ username cfg) (fromJust $ password cfg) case li_result of Left err -> do let msg = "Failed to log in. " ++ err hPutStrLn stderr msg Right response_body -> do hPutStrLn stderr response_body html <- get_page (Just cj) my_article case html of Left err -> do let msg = "Failed to retrieve page. " ++ err hPutStrLn stderr msg return Nothing Right h -> return $ Just $ parse_lwn h else do html <- get_page Nothing my_article case html of Left err -> do let msg = "Failed to retrieve page. " ++ err hPutStrLn stderr msg return Nothing Right h -> return $ Just $ parse_lwn h -- | If we're given an empty path, return a handle to -- 'stdout'. Otherwise, open the given file and return a read/write -- handle to that. get_output_handle :: FilePath -> IO Handle get_output_handle path = if (null path) then return stdout else openBinaryFile path WriteMode main :: IO () main = do cfg <- get_cfg output_handle <- get_output_handle (output cfg) maybe_html <- get_xml_from_article cfg case maybe_html of Just html -> do result <- parse html case result of Just stuff -> epublish stuff output_handle Nothing -> do _ <- show_help return () Nothing -> do _ <- show_help return ()