module Utils.Print where import Import.NoModel import qualified Data.Foldable as Fold -- hiding (foldr) import Data.Foldable (foldr) import Control.Monad.Except import Import hiding (embedFile) import Data.FileEmbed (embedFile) import qualified Text.Pandoc as P -- import qualified Text.Pandoc.PDF as P import qualified Text.Pandoc.Builder as P -- import Model.Types.Markup -- TODO-QSV: should this module be moved accordingly? templateRenewal :: Text templateRenewal = decodeUtf8 $(Data.FileEmbed.embedFile "templates/letter/fraport_renewal.md") templateDIN5008 :: Text templateDIN5008 = decodeUtf8 $(Data.FileEmbed.embedFile "templates/letter/din5008.latex") -- setMeta :: (HasMeta a, ToMetaValue b) => Text -> b -> a -> a -- foldr :: forall b. (Element mono0 -> b -> b) -> b -> mono0 -> b applyMetas :: (P.HasMeta p, Foldable t, P.ToMetaValue a) => t (Text, a) -> p -> p applyMetas metas doc = Fold.foldr (uncurry P.setMeta) doc metas addMeta :: P.Meta -> P.Pandoc -> P.Pandoc addMeta m p = meta <> p where meta = P.Pandoc m mempty -- | Apply StoredMarkup as a template to itself and return the resulting Markup -- This is a hack to allow variable interpolation within a document. -- Pandoc currently only allows interpolation within templates. -- An alternative Route would be to use Builders, but this prevents User-edited Markup Templates reTemplateLetter :: P.PandocMonad m => P.Meta -> StoredMarkup -> m Text reTemplateLetter meta StoredMarkup{..} = do let strictMarkupInput = toStrict markupInput partialPath = "" -- no partials used, see Text.DocTemplates mdTemplate <- P.runWithDefaultPartials $ P.compileTemplate partialPath strictMarkupInput case mdTemplate of (Left err) -> throwError . P.PandocTemplateError $ pack err (Right templ) -> do let readeropts = def { P.readerExtensions = P.pandocExtensions } writeropts = def { P.writerTemplate = Just templ } -- reader :: (P.PandocMonad m, P.ToSources a) => P.ReaderOptions -> a -> m P.Pandoc areader = case markupInputFormat of MarkupHtml -> P.readHtml MarkupMarkdown -> P.readMarkdown MarkupPlaintext -> P.readMarkdown doc1 <- areader readeropts strictMarkupInput P.writeMarkdown writeropts $ addMeta meta doc1 -- should we apply metas here? {- renewalLetter :: (Foldable t, ToMetaValue b, PandocMonad m) => t (Text, b) -> PandocMonad m -> Text renewalLetter pdfDIN5008 :: MetaPinRenewal -> IO (Either ByteString ByteString) pdfDIN5008 -}