-{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE DoAndIfThenElse #-}
module Main
where
-import Data.Maybe (fromJust)
-import Text.HandsomeSoup (parseHtml)
+import Control.Concurrent.ParallelIO (stopGlobalPool)
+import System.Directory (doesFileExist)
+import System.IO (
+ Handle,
+ IOMode (WriteMode),
+ hPutStrLn,
+ openBinaryFile,
+ stderr,
+ stdout
+ )
-import Epublishable
-import LWN.ArticlePage
-import LWN.FullPage
-import XHTML
+import CommandLine (show_help)
+import Configuration (Cfg(..), get_cfg)
+import LWN.Article (real_article_path)
+import LWN.HTTP (get_login_cookie)
+import LWN.Page (epublish, page_from_url)
+
+
+-- | 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
+
+
+argument_is_file :: Cfg -> IO Bool
+argument_is_file cfg = do
+ path <- real_article_path (article cfg)
+ doesFileExist path
main :: IO ()
main = do
- article_html <- readFile "test/fixtures/501317-article.html"
- ioap <- parse $ parseHtml article_html
- let article_page :: ArticlePage = fromJust $ ioap
- epublish article_page "single_article.epub"
-
- page_html <- readFile "test/fixtures/500848-page.html"
- ioap_f <- parse $ parseHtml page_html
- let full_page :: FullPage = fromJust $ ioap_f
- --putStrLn $ to_xhtml full_page
- --epublish full_page "full_page.epub"
- putStrLn "Done."
+ cfg' <- get_cfg
+ aif <- argument_is_file cfg'
+ cfg <- case aif of
+ False -> get_login_cookie cfg'
+ True -> return cfg'
+
+ page <- page_from_url cfg (article cfg)
+ case page of
+ Just p -> do
+ output_handle <- get_output_handle (output cfg)
+ epublish p output_handle
+ Nothing -> do
+ hPutStrLn stderr "ERROR: could not parse an LWN page from the given URL."
+ _ <- show_help
+ return ()
+
+ -- Necessary, for some reason.
+ stopGlobalPool