{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StrictData #-} {-# OPTIONS_GHC -Wno-missing-signatures #-} module Textphile.CLI.Source where import Control.Applicative (Applicative(..), Alternative(..)) import Control.Monad (Monad(..), forM_, unless, when) import Control.Monad.Trans.Except (runExcept) import Control.Monad.Trans.Maybe (MaybeT(..)) import Control.Monad.Trans.State.Strict (runState) import Data.Bool import Data.Either (Either(..)) import Data.Eq (Eq(..)) import Data.Foldable as Foldable (Foldable(..)) import Data.Function (($), (.), id, flip) import Data.Functor ((<$>)) import Data.Maybe (Maybe(..), fromMaybe) import Data.Ord (Ord(..)) import Data.Proxy (Proxy(..)) import Data.Semigroup (Semigroup(..)) import Data.Text (Text) import Prelude (error) import Symantic.CLI as CLI import System.FilePath ((-<.>)) import System.IO (IO, FilePath) import Text.Show (Show(..)) import qualified Data.ByteString as BS import qualified Data.List as List import qualified Data.Text as Text import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.IO as TL import qualified Data.TreeSeq.Strict as Tree import qualified Paths_textphile as Textphile import qualified Symantic.Document as Doc import qualified System.Directory as IO import qualified System.Environment as Env import qualified System.FilePath as FP import qualified System.FilePath as FilePath import qualified System.IO as IO import qualified Text.Blaze.DTC as Blaze.DTC import qualified Text.Blaze.HTML5 as Blaze.HTML5 import qualified Text.Blaze.Renderer.Utf8 as Blaze import qualified Text.Blaze.Utils as Blaze import qualified Text.Megaparsec as P import qualified Textphile.DTC.Read.TCT as DTC import qualified Textphile.DTC.Sym as DTC import qualified Textphile.DTC.Write.HTML5 as DTC import qualified Textphile.DTC.Write.XML as DTC import qualified Textphile.TCT as TCT import qualified Textphile.TCT.Write.HTML5 as TCT import qualified Textphile.TCT.Write.Plain as TCT import qualified Textphile.TCT.Write.XML as TCT import qualified Textphile.Utils as FS import Textphile.CLI.Lang import Textphile.CLI.Utils data Cfg_Source = Cfg_Source { cfg_source_dump_tct :: Bool } api_command_source = helps l10n_help_command_source $ command "source" $ (Cfg_Source <$> api_dump_tct ) api_format where api_dump_tct = flag "dump-tct" api_format = api_format_plain api_format_html5 api_format_plain = command "plain" $ api_input <.> response @() api_format_html5 = command "html5" $ api_input <.> response @() api_input = helps l10n_help_opt_input $ var @FP.FilePath "INPUT" run_command_source cfg_global@Cfg_Global{..} cfg_source@Cfg_Source{..} = run_source_plain :!: run_source_html5 where run_source_tct cfg_source_input cfg_source_output = do TCT.readTCT cfg_source_input >>= \case Left err -> error $ show err Right tct -> do when cfg_source_dump_tct $ FS.writeFile (cfg_source_output-<.>"tct.dump") $ TL.pack $ Tree.prettyTrees tct return tct run_source_plain cfg_source_input = do let cfg_source_output = cfg_source_input FilePath.<.>"txt" tct <- run_source_tct cfg_source_input cfg_source_output FS.writeFile cfg_source_output $ TCT.writePlain tct run_source_html5 cfg_source_input = do let cfg_source_output = cfg_source_input FilePath.<.>"html5" tct <- run_source_tct cfg_source_input cfg_source_output FS.withFile cfg_source_output IO.WriteMode $ \h -> Blaze.renderMarkupToByteStringIO (BS.hPutStr h) $ TCT.writeHTML5 tct