refactor(letter): i18n renewal letter templating

This commit is contained in:
Steffen Jost 2022-07-07 18:56:10 +02:00
parent a6782d8637
commit d078257a70
7 changed files with 71 additions and 76 deletions

View File

@ -133,7 +133,7 @@ MenuLmsUpload: Hochladen
MenuLmsDirect: Direkter Upload
MenuAvs: Schnittstelle AVS
MenuApc: Schnittstelle Druckerei
MenuApc: Druckerei
MenuPrintSend: Manueller Briefversand
MenuApiDocs: API-Dokumentation (Englisch)

View File

@ -134,7 +134,7 @@ MenuLmsUpload: Upload
MenuLmsDirect: Direct Upload
MenuAvs: AVS Interface
MenuApc: Print Center Interface
MenuApc: Printing
MenuPrintSend: Send Letter
MenuApiDocs: API documentation

View File

@ -4,8 +4,8 @@ module Handler.Admin.Test
, getAdminTestPdfR
) where
import Import
import Utils.Print
import Import
import Utils.Print
import Handler.Utils
import Jobs
@ -279,15 +279,15 @@ postAdminTestR = do
getAdminTestPdfR :: Handler TypedContent
getAdminTestPdfR = do
-- uUser <- maybeAuth -- to determine language for test
-- uUser <- maybeAuth -- to determine language for test
templates <- liftIO $ do
letter_tp <- P.compileTemplate "" templateRenewal
din5008 <- P.compileTemplate "" templateDIN5008
now <- getCurrentTime
return (now, letter_tp, din5008)
case templates of
(_,Left err,_) -> sendResponseStatus internalServerError500 $ tshow err
(_,_,Left err) -> sendResponseStatus internalServerError500 $ tshow err
(_,Left err,_) -> sendResponseStatus internalServerError500 $ "Markdown template error: \n" <> err
(_,_,Left err) -> sendResponseStatus internalServerError500 $ "LaTeX template error: \n" <> err
(now, Right templ, Right latex) -> do
content <- liftIO . P.runIO $ do
let texopts = []
@ -305,5 +305,5 @@ getAdminTestPdfR = do
Right (Right bs) -> do
liftIO $ L.writeFile "/tmp/generated.pdf" bs
sendByteStringAsFile "demoPDF.pdf" (L.toStrict bs) now
Right (Left err) -> sendResponseStatus internalServerError500 $ tshow err
Left err -> sendResponseStatus internalServerError500 $ P.renderError err
Right (Left err) -> sendResponseStatus internalServerError500 $ decodeUtf8 $ L.toStrict $ "LaTeX compile error: \n" <> err
Left err -> sendResponseStatus internalServerError500 $ "Pandoc error: \n" <> P.renderError err

View File

@ -21,9 +21,7 @@ import qualified Control.Monad.State.Class as State
import Handler.Utils
data MetaPinRenewal = MetaPinRenewal
{ mppOpening :: Maybe Text
, mppClosing :: Maybe Text
, mppDate :: Maybe Text
{ mppDate :: Maybe Text
, mppURL :: Maybe Text
, mppLogin :: Text
, mppPin :: Text
@ -35,9 +33,7 @@ data MetaPinRenewal = MetaPinRenewal
formToMetaValues :: MetaPinRenewal -> P.Meta
formToMetaValues MetaPinRenewal{..} = P.Meta $ mconcat
[ mbMeta "opening" mppOpening
, mbMeta "closing" mppClosing
, mbMeta "date" mppDate
[ mbMeta "date" mppDate
, mbMeta "url" mppURL
, toMeta "login" mppLogin
, toMeta "pin" mppPin
@ -51,13 +47,10 @@ formToMetaValues MetaPinRenewal{..} = P.Meta $ mconcat
html2textlines :: StoredMarkup -> [Text]
html2textlines sm = T.lines . LT.toStrict $ markupInput sm
makeRenewalForm :: Maybe MetaPinRenewal -> Form MetaPinRenewal
makeRenewalForm tmpl = identifyForm FIDLmsLetter . validateForm validateMetaPinRenewal $ \html ->
flip (renderAForm FormStandard) html $ MetaPinRenewal
<$> aopt textField (fslI MsgMppOpening) (mppOpening <$> tmpl)
<*> aopt textField (fslI MsgMppClosing) (mppClosing <$> tmpl)
<*> aopt textField (fslI MsgMppDate) (mppDate <$> tmpl)
<$> aopt textField (fslI MsgMppDate) (mppDate <$> tmpl)
<*> aopt textField (fslI MsgMppURL) (mppURL <$> tmpl)
<*> areq textField (fslI MsgMppLogin) (mppLogin <$> tmpl)
<*> areq textField (fslI MsgMppPin) (mppPin <$> tmpl)

View File

@ -4,7 +4,7 @@ import Import.NoModel
-- import qualified Data.Foldable as Fold
-- hiding (foldr) import Data.Foldable (foldr)
import qualified Data.Text as T
import qualified Data.Text as T
import qualified Data.ByteString.Lazy as L
import Control.Monad.Except
import Import hiding (embedFile)
@ -35,23 +35,23 @@ templateDIN5008 = decodeUtf8 $(Data.FileEmbed.embedFile "templates/letter/din500
----------------------
-- Pandoc Functions --
----------------------
-- Either I don't understand how pandoc works or
-- Either I don't understand how pandoc works or
-- I don't understand why these are not included
compileTemplate :: (P.PandocMonad m) => Text -> m (P.Template Text)
compileTemplate tmpl = do
compileTemplate tmpl = do
let partialPath = "" -- no partials used, see Text.DocTemplates
mbTemplate <- P.runWithDefaultPartials $ P.compileTemplate partialPath tmpl
mbTemplate <- P.runWithDefaultPartials $ P.compileTemplate partialPath tmpl
liftEither $ str2pandocError mbTemplate
where
where
str2pandocError = over _Left $ P.PandocTemplateError . pack
makePDF :: P.WriterOptions -> P.Pandoc -> P.PandocIO L.ByteString
-- makePDF :: (PandocMonad m, MonadIO m, MonadMask m) => P.WriterOptions -> P.Pandoc -> m L.ByteString -- only pandoc >= 2.18
makePDF wopts doc = do
mbPdf <- P.makePDF "lualatex" texopts P.writeLaTeX wopts doc
makePDF wopts doc = do
mbPdf <- P.makePDF "lualatex" texopts P.writeLaTeX wopts doc
liftEither $ bs2pandocError mbPdf
where
where
texopts = []
bs2pandocError = over _Left (P.PandocMakePDFError . decodeUtf8 . L.toStrict)
@ -59,7 +59,7 @@ makePDF wopts doc = do
appMeta :: (P.Meta -> P.Meta) -> P.Pandoc -> P.Pandoc
appMeta f (P.Pandoc m bs) = P.Pandoc (f m) bs
-- applyMetas :: (P.HasMeta p, Foldable t, P.ToMetaValue a) => t (Text, a) -> p -> p
-- applyMetas :: (P.HasMeta p, Foldable t, P.ToMetaValue a) => t (Text, a) -> p -> p
-- applyMetas metas doc = Fold.foldr (uncurry P.setMeta) doc metas
-- | Add meta to pandoc. Existing variables will be overwritten.
@ -70,15 +70,15 @@ addMeta m = appMeta (m <>)
-- | Pandoc conditionals only test if a variable is set or isn't set.
-- Variable "is-de" will be set to True if the "lang" variable starts with "de"
-- and will be unset otherwise
-- and will be unset otherwise
setIsDeFromLang :: P.Meta -> P.Meta
setIsDeFromLang m
setIsDeFromLang m
| (Just (P.MetaString t)) <- P.lookupMeta "lang" m
, T.isPrefixOf "de" t
, T.isPrefixOf "de" t
= P.setMeta isde True m
| otherwise = P.deleteMeta isde m
where
isde = "is-de"
| otherwise = P.deleteMeta isde m
where
isde = "is-de"
@ -92,31 +92,31 @@ setIsDeFromLang m
-- 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
tmpl <- compileTemplate strictMarkupInput
tmpl <- compileTemplate strictMarkupInput
-- TODO: write cacheHere Version using DB Key of StoredMarkup with Unique DB Argument instead of StoredMarkup
doc1 <- areader readerOpts strictMarkupInput
doc1 <- areader readerOpts strictMarkupInput
let writerOpts = def { P.writerTemplate = Just tmpl }
P.writeMarkdown writerOpts
P.writeMarkdown writerOpts
$ appMeta setIsDeFromLang
$ addMeta meta doc1
where
$ addMeta meta doc1
where
strictMarkupInput = toStrict markupInput
readerOpts = def { P.readerExtensions = P.pandocExtensions
readerOpts = def { P.readerExtensions = P.pandocExtensions
, P.readerStripComments = True
}
-- reader :: (P.PandocMonad m, P.ToSources a) => P.ReaderOptions -> a -> m P.Pandoc
areader = case markupInputFormat of
-- 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
--pdfDIN5008 :: P.PandocMonad m => Text -> m L.ByteString -- for pandoc > 2.18
pdfDIN5008 :: Text -> P.PandocIO L.ByteString
pdfDIN5008 md = do
tmpl <- compileTemplate templateDIN5008
let readerOpts = def { P.readerExtensions = P.pandocExtensions }
writerOpts = def { P.writerTemplate = Just tmpl }
doc <- P.readMarkdown readerOpts md
doc <- P.readMarkdown readerOpts md
makePDF writerOpts doc
@ -125,9 +125,9 @@ pdfDIN5008' md = do
etmpl <- $cachedHereBinary ("din5008"::Text) (liftIO . P.runIO $ compileTemplate templateDIN5008)
case etmpl of
Left err -> return $ Left err
Right tmpl -> liftIO . P.runIO $ do
Right tmpl -> liftIO . P.runIO $ do
let readerOpts = def { P.readerExtensions = P.pandocExtensions }
writerOpts = def { P.writerTemplate = Just tmpl }
doc <- P.readMarkdown readerOpts md
doc <- P.readMarkdown readerOpts md
makePDF writerOpts doc

View File

@ -8,7 +8,7 @@
fromlogo=false, % don't show logo in letter head
version=last, % latest version of KOMA letter
pagenumber=botright, % show pagenumbers on bottom right
firstfoot=true % first-page footer
firstfoot=false % first-page footer
]{scrlttr2}
\PassOptionsToPackage{hyphens}{url}
@ -76,6 +76,7 @@ $endif$
\usepackage{parskip}
\usepackage{graphics}
\usepackage{xcolor}
\usepackage{booktabs}
\usepackage{longtable}
@ -123,16 +124,28 @@ $endif$
$endfor$
}
\opening{$opening$}
$if(is-de)$
\opening{$de-opening$}
$else$
\opening{$en-opening$}
$endif$
\begin{textblock}{13}(15,45)
$pin$
\textcolor{gray}{
\begin{labeling}{Login:x}
\item[Login:] $login$
\item[Pin:] $pin$
\end{labeling}
~}
\end{textblock}
$body$
\vspace{1.2cm}
\closing{$closing$}
$if(is-de)$
\closing{$de-closing$}
$else$
\closing{$en-closing$}
$endif$
%\ps $postskriptum$

View File

@ -5,13 +5,18 @@ subject: Verlängerung Vorfeldführerschein
author: Fraport AG - Fahrerausbildung (AVN-AR)
phone: +49 69 690-30306
email: fahrerausbildung@fraport.de
url: <http://www.fraport.de/fahrerausbildung>
place: Frankfurt/Main
return-address:
- 60547 Frankfurt
opening: Sehr geehrte Damen und Herren,
closing: |
de-opening: Sehr geehrte Damen und Herren,
en-opening: Dear driver,
de-closing: |
Mit freundlichen Grüßen,
Ihre Fahrerausbildung.
en-closing: |
Best wishes,
Your fraport driving instructors from "Fahrerausbildung".
encludes:
hyperrefoptions: hidelinks
@ -36,21 +41,13 @@ Durch die erfolgreiche Teilnahme an einem E-Lernen können Sie
die Gültigkeit um 2 Jahre verlängern. Verwenden Sie dazu folgende
Login-Daten.
URL
: <http://www.fraport.de/fahrerausbildung>
Name:
Name
: $recipient$
Login
URL
: $login$
Pin
: $pin$
: $url$
Sobald die Frist abgelaufen ist, muss zur Wiedererlangung des Vorfeldführerscheins
@ -66,21 +63,13 @@ your apron diving licence is about to expire soon.
You may renew your apron driving licence by two years through successfully
completing an e-learning course. Please use the following login data.
URL
: <http://www.fraport.de/fahrerausbildung>
Name:
Name
: $recipient$
Login
URL
: $login$
Pin
: $pin$
: $url$
Should your apron driving licence expire before completing this