{-# OPTIONS_GHC -Wall #-} module Main where import ALON.Diff.HTML (diffHTML) import qualified Data.Text as T import Data.Text.Lazy (toStrict) import Data.Text.Lazy.Encoding (decodeUtf8) import qualified Data.Aeson as DA import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy.Char8 as LBC8 import System.IO (hPutStrLn, stderr) import System.IO.Error (IOError) import System.Exit (exitFailure) import Control.Exception (catch) import System.Environment (getArgs) readUTF8File :: String -> IO T.Text readUTF8File filePath = L.readFile filePath `catch` errorHandler >>= return . toStrict . decodeUtf8 where errorHandler e = let _ = (e :: IOError) in hPutStrLn stderr ("Error opening HTML file " ++ filePath) >> exitFailure deltaFiles :: String -> String -> IO () deltaFiles sourceHtmlFile targetHtmlFile = do sourceHtml <- readUTF8File sourceHtmlFile targetHtml <- readUTF8File targetHtmlFile let diff = diffHTML sourceHtml targetHtml let jsonValue = diff >>= return . DA.encode case jsonValue of (Just json) -> LBC8.putStr json Nothing -> hPutStrLn stderr "Couldn't perform diff, is HTML in both source and target well formed?" >> exitFailure main :: IO () main = do args <- getArgs case args of (sourceHtmlFile:targetHtmlFile:_) -> deltaFiles sourceHtmlFile targetHtmlFile _ -> hPutStrLn stderr "Expects 2 command line parameters" >> exitFailure