module Main where
import Cheapskate
import Text.Blaze.Html.Renderer.Utf8 (renderHtmlToByteStringIO)
import Text.Blaze.Html
import System.Environment
import Data.Text (Text)
import qualified Data.ByteString as B
import qualified Data.Text.IO as T
import qualified Data.Text as T
import System.Console.GetOpt
import System.IO (stderr, hPutStr)
import System.Exit
import Data.Version (showVersion)
import Paths_cheapskate (version)
import Control.Monad
convert :: [Option] -> Text -> IO ()
convert opts t = renderHtmlToByteStringIO B.putStr $ toHtml $
markdown def{ sanitize = Sanitize `elem` opts
, allowRawHtml = EscapeRawHtml `notElem` opts
, preserveHardBreaks = HardBreaks `elem` opts
, debug = Debug `elem` opts
} t
main :: IO ()
main = do
argv <- getArgs
let (flags, args, errs) = getOpt Permute options argv
let header = "Usage: citeproc [OPTION..] [FILE..]"
unless (null errs) $ do
hPutStr stderr $ usageInfo (unlines $ errs ++ [header]) options
exitWith $ ExitFailure 1
when (Version `elem` flags) $ do
putStrLn $ "biblio2yaml " ++ showVersion version
exitWith ExitSuccess
when (Help `elem` flags) $ do
putStrLn $ usageInfo header options
exitWith ExitSuccess
let handle = convert flags
case args of
[] -> T.getContents >>= handle
_ -> mapM T.readFile args >>= handle . T.unlines
data Option =
Help | Version | Debug | Sanitize | EscapeRawHtml | HardBreaks
deriving (Ord, Eq, Show)
options :: [OptDescr Option]
options =
[ Option ['h'] ["help"] (NoArg Help) "show usage information"
, Option ['V'] ["version"] (NoArg Version) "show program version"
, Option [] ["debug"] (NoArg Debug) "print container structure"
, Option ['s'] ["sanitize"] (NoArg Sanitize) "sanitize output"
, Option ['e'] ["escape-raw-html"] (NoArg EscapeRawHtml) "escape raw HTML"
, Option ['b'] ["hard-line-breaks"] (NoArg HardBreaks) "treat newlines as hard breaks"
]