This repository has been archived on 2024-10-24. You can view files and clone it, but cannot push or open issues or pull requests.
fradrive-old/src/Utils/Print.hs

67 lines
2.5 KiB
Haskell

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
-}