From 2be537a5ae015e84d5cfd09c35fc003415f31761 Mon Sep 17 00:00:00 2001 From: yamadapc Date: Mon, 2 Oct 2017 10:31:05 -0700 Subject: [PATCH] Get started with #27 --- jats2tex.cabal | 2 ++ src/Text/JaTex/Cmd/Main.hs | 26 +++++++++++++++++++++----- src/Text/JaTex/Template/Types.hs | 4 ++-- src/Text/JaTex/TemplateWrapper.hs | 19 +++++++++++++++++++ src/Text/JaTex/TexWriter.hs | 2 +- src/Text/JaTex/UpgradeTemplate.hs | 16 ++++++++++++++++ 6 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 src/Text/JaTex/TemplateWrapper.hs create mode 100644 src/Text/JaTex/UpgradeTemplate.hs diff --git a/jats2tex.cabal b/jats2tex.cabal index 2f643d4..373ea75 100644 --- a/jats2tex.cabal +++ b/jats2tex.cabal @@ -79,8 +79,10 @@ library Text.JaTex.Template.TemplateInterp Text.JaTex.Template.TemplateInterp.Helpers Text.JaTex.Template.Types + Text.JaTex.TemplateWrapper Text.JaTex.TexWriter Text.JaTex.Upgrade + Text.JaTex.UpgradeTemplate Text.JaTex.Util other-modules: Paths_jats2tex diff --git a/src/Text/JaTex/Cmd/Main.hs b/src/Text/JaTex/Cmd/Main.hs index 6749aad..fb26fc8 100644 --- a/src/Text/JaTex/Cmd/Main.hs +++ b/src/Text/JaTex/Cmd/Main.hs @@ -7,7 +7,7 @@ module Text.JaTex.Cmd.Main import Data.Maybe import Data.Monoid -import qualified Data.Text.IO as Text +import qualified Data.Text.IO as Text import GHC.IO.Encoding import System.FilePath import System.IO @@ -17,11 +17,13 @@ import Options.Applicative import System.Win32.Console #endif import Text.JaTex -import qualified Text.JaTex.Upgrade as Upgrade +import qualified Text.JaTex.Upgrade as Upgrade +import qualified Text.JaTex.UpgradeTemplate as UpgradeTemplate data Options = RunUpgrade + | RunUpgradeTemplate FilePath | RunVersion | Options { optsOutputFile :: Maybe FilePath , optsTemplateFile :: Maybe String @@ -43,6 +45,17 @@ options = command "upgrade" (info (pure RunUpgrade) (fullDesc <> progDesc "Upgrade jats2tex"))) <|> + subparser + (metavar "upgrade-template" <> + command + "upgrade-template" + (info + (RunUpgradeTemplate <$> + argument + str + (metavar "INPUT_TEMPLATE_FILE" <> + help "The legacy template to upgrade")) + (fullDesc <> progDesc "Upgrade template to version 1"))) <|> Options <$> optional (strOption @@ -61,9 +74,11 @@ options = optional (strOption (short 'e' <> long "input-encoding" <> metavar "INPUT_ENCODING" <> - help (unlines [ "The input file/handle encoding (defaults to latin-1)" - , "Output and FFI with Lua is always with UTF-8" - ]))) <*> + help + (unlines + [ "The input file/handle encoding (defaults to latin-1)" + , "Output and FFI with Lua is always with UTF-8" + ]))) <*> argument str (metavar "INPUT_FILE" <> help "XML Input File") optionsPI :: ParserInfo Options @@ -94,6 +109,7 @@ run Options{..} = do Text.writeFile outputFile result putStrLn $ "Wrote: " <> outputFile run RunUpgrade = Upgrade.runUpgrade +run (RunUpgradeTemplate fp) = UpgradeTemplate.run fp run RunVersion = Upgrade.putVersionInfo makeSafe :: Handle -> IO () diff --git a/src/Text/JaTex/Template/Types.hs b/src/Text/JaTex/Template/Types.hs index f186a23..f355b35 100644 --- a/src/Text/JaTex/Template/Types.hs +++ b/src/Text/JaTex/Template/Types.hs @@ -44,6 +44,7 @@ data PreparedTemplateNode m | PreparedTemplateLua (LuaExprType m) | PreparedTemplatePlain Text +type ConcreteTemplate = [ConcreteTemplateNode] data ConcreteTemplateNode = ConcreteTemplateNode { templateSelector :: Text @@ -56,7 +57,7 @@ instance Yaml.FromJSON ConcreteTemplateNode where case v of String s -> return $ ConcreteTemplateNode "" "" s Object o -> verboseForm o - _ -> fail "Template inválido" + _ -> fail "Invalid Template" where trimTrailingNewline "" = "" trimTrailingNewline i = @@ -86,7 +87,6 @@ newtype Template = type MonadTex m = (MonadCatch m, MonadState TexState m, MonadIO m, MonadMask m) type TexM = StateT TexState Identity - data TexState = TexState { tsFileName :: FilePath , tsDebug :: Bool diff --git a/src/Text/JaTex/TemplateWrapper.hs b/src/Text/JaTex/TemplateWrapper.hs new file mode 100644 index 0000000..00bfce9 --- /dev/null +++ b/src/Text/JaTex/TemplateWrapper.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE OverloadedStrings #-} +module Text.JaTex.TemplateWrapper + where + +import Data.Aeson +import Data.Text (Text) +import qualified Data.Yaml as Yaml +import Text.JaTex.Template.Types (ConcreteTemplate) + +data TemplateWrapper = TemplateWrapper + { templateWrapperVersion :: Int + , templateWrapperExtends :: (Maybe Text) + , templateWrapperRules :: ConcreteTemplate + } + +instance Yaml.FromJSON TemplateWrapper where + parseJSON (Object o) = + TemplateWrapper <$> o .: "version" <*> o .:? "extends" <*> o .: "rules" + parseJSON _ = fail "Invalid Template" diff --git a/src/Text/JaTex/TexWriter.hs b/src/Text/JaTex/TexWriter.hs index 395c482..18d002f 100644 --- a/src/Text/JaTex/TexWriter.hs +++ b/src/Text/JaTex/TexWriter.hs @@ -513,7 +513,7 @@ isTruthy (String s) = s /= mempty isTruthy Null = False isTruthy (Array _) = True -parseCTemplateFromJson :: Value -> Either [Text] [ConcreteTemplateNode] +parseCTemplateFromJson :: Value -> Either [Text] ConcreteTemplate parseCTemplateFromJson (Object o) = mergeEithers $ HashMap.foldrWithKey parsePair [] o where diff --git a/src/Text/JaTex/UpgradeTemplate.hs b/src/Text/JaTex/UpgradeTemplate.hs new file mode 100644 index 0000000..1bced39 --- /dev/null +++ b/src/Text/JaTex/UpgradeTemplate.hs @@ -0,0 +1,16 @@ +{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE OverloadedStrings #-} +module Text.JaTex.UpgradeTemplate + where + +import Data.Aeson +import qualified Data.Yaml as Yaml + +run :: FilePath -> IO () +run targetTemplateFile = do + minput <- Yaml.decodeFile targetTemplateFile :: IO (Maybe Value) + case minput of + Nothing -> error "Failed to parse input template" + Just !input -> + Yaml.encodeFile targetTemplateFile $ + object ["version" .= (Number 1), "rules" .= input]