diff --git a/nix/docker/default.nix b/nix/docker/default.nix index cc8897469..8252a192b 100644 --- a/nix/docker/default.nix +++ b/nix/docker/default.nix @@ -26,7 +26,7 @@ let cups # needed for interface with print center #texlive.combined.scheme-medium # too large for container in LMU build environment. (texlive.combine { - inherit (texlive) scheme-basic xcolor + inherit (texlive) scheme-basic xcolor "scrlttr2" # lualatex luatexbase unicode-math lualatex-math selnolig ; diff --git a/package.yaml b/package.yaml index 90563c088..4f1b83ff8 100644 --- a/package.yaml +++ b/package.yaml @@ -145,6 +145,7 @@ dependencies: - rfc5051 - unidecode - pandoc + - pandoc-types - token-bucket - async - pointedlist diff --git a/shell.nix b/shell.nix index f34fe2909..8c4467c71 100644 --- a/shell.nix +++ b/shell.nix @@ -74,14 +74,12 @@ in pkgs.mkShell { ++ (with pkgs; [ nodejs-14_x postgresql_12 openldap google-chrome exiftool memcached minio minio-client gup skopeo - # texlive.combined.scheme-medium + texlive.combined.scheme-medium # texlive.combined.scheme-small - (texlive.combine { - inherit (texlive) scheme-basic xcolor - # lualatex - luatexbase unicode-math lualatex-math selnolig - ; - }) + #(texlive.combine { + # inherit (texlive) scheme-basic xcolor scrlttr2 luatexbase unicode-math lualatex-math selnolig; + # ERROR: attribute 'scrlttr2' missing - gleicher Fehler kommt bei ausgedachten Namen, auch ohne Zahl am Ende + #}) ] ) ++ (with pkgs.haskellPackages; [ stack yesod-bin hlint cabal-install weeder profiteur ]); diff --git a/src/Handler/Admin/Test.hs b/src/Handler/Admin/Test.hs index 4c9695be0..7b7798f1e 100644 --- a/src/Handler/Admin/Test.hs +++ b/src/Handler/Admin/Test.hs @@ -10,6 +10,7 @@ import Jobs import Data.Char (isDigit) import qualified Data.Text as Text +import qualified Data.Text.IO as Text import qualified Data.ByteString.Lazy as L import qualified Data.Set as Set @@ -17,7 +18,7 @@ import qualified Data.Map as Map import qualified Text.Pandoc as P import qualified Text.Pandoc.PDF as P --- import qualified Text.Pandoc.Builder as P +import qualified Text.Pandoc.Builder as P import Handler.Admin.Test.Download (testDownload) @@ -239,7 +240,7 @@ postAdminTestR = do
#{tshow res}
|]
-
+
i18nIdent <- newIdent
let i18nForm' = wrapForm i18nWidget FormSettings
{ formMethod = POST
@@ -276,22 +277,31 @@ postAdminTestR = do
getAdminTestPdfR :: Handler TypedContent
getAdminTestPdfR = do
- -- let -- typePDF = "application/pdf" :: ContentType
- -- typePDF = Settings.Mime.mimeLookup "pdfdemo.pdf"
- content <- liftIO . P.runIO $ do
- tmpl <- P.compileDefaultTemplate "latex"
- let
- md = "# Hello \n\n This is some *more* Text." :: Text
- texopts = []
- writeropts = def { P.writerTemplate = Just tmpl }
- doc <- P.readMarkdown def md
- -- P.makePDF "pdflatex" texopts P.writeLaTeX writeropts doc -- xcolor.sty not found
- P.makePDF "lualatex" texopts P.writeLaTeX writeropts doc -- unicode-math.sty not found
- case content of
- Right (Right bs) -> do
- liftIO $ L.writeFile "/tmp/generated.pdf" bs
- now <- liftIO getCurrentTime
- sendByteStringAsFile "demoPDF.pdf" (L.toStrict bs) now
- -- sendResponse (typePDF, toContent bs)
- Right (Left err) -> sendResponseStatus internalServerError500 $ tshow err
- Left err -> sendResponseStatus internalServerError500 $ P.renderError err
\ No newline at end of file
+ templates <- liftIO $ do
+ letter_md <- Text.readFile "templates/letter/fraport_renewal.md"
+ letter_tp <- P.compileTemplate "" letter_md
+ din5008 <- Text.readFile "templates/letter/din5008.latex" >>= P.compileTemplate ""
+ now <- getCurrentTime
+ return (now, letter_md, letter_tp, din5008)
+ case templates of
+ (_,_,Left err,_) -> sendResponseStatus internalServerError500 $ tshow err
+ (_,_,_,Left err) -> sendResponseStatus internalServerError500 $ tshow err
+ (now, md, Right templ, Right latex) -> do
+ content <- liftIO . P.runIO $ do
+ let texopts = []
+ readeropts = def { P.readerExtensions = P.pandocExtensions }
+ writeropts1 = def { P.writerTemplate = Just templ }
+ writeropts2 = def { P.writerTemplate = Just latex }
+ -- https://github.com/jgm/pandoc/issues/1950
+ -- using markdown as a template for itself for interpolation:
+ doc1 <- P.readMarkdown readeropts md
+ doc2 <- P.writeMarkdown writeropts1 doc1
+ doc3 <- P.readMarkdown readeropts doc2
+ P.makePDF "pdflatex" texopts P.writeLaTeX writeropts2 $
+ P.setDate (P.text . tshow $ utctDay now) doc3
+ case content of
+ 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
diff --git a/templates/letter/din5008.latex b/templates/letter/din5008.latex
new file mode 100644
index 000000000..9af7f1941
--- /dev/null
+++ b/templates/letter/din5008.latex
@@ -0,0 +1,98 @@
+%Based upon https://github.com/benedictdudel/pandoc-letter-din5008
+\documentclass[
+ foldmarks=BTm, % show foldmarks top, middle, bottom
+ foldmarks=false, % don't print foldmarks
+ fromalign=left, % letter head on the right
+ fromphone=true, % show phone number
+ fromemail=true, % show email
+ fromlogo=false, % don't show logo in letter head
+ version=last % latest version of KOMA letter
+ pagenumber=botright % show pagenumbers on bottom right
+]{scrlttr2}
+
+\usepackage[ngerman]{babel}
+\usepackage{iftex}
+\ifPDFTeX
+ \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}
+ \usepackage[utf8]{inputenc}
+ \usepackage{textcomp} % provide euro and other symbols
+\else % if luatex or xetex
+$if(mathspec)$
+ \ifXeTeX
+ \usepackage{mathspec}
+ \else
+ \usepackage{unicode-math}
+ \fi
+$else$
+ \usepackage{unicode-math}
+$endif$
+
+\usepackage{parskip}
+
+\usepackage{graphics}
+
+\usepackage{booktabs}
+\usepackage{longtable}
+
+\usepackage[right]{eurosym}
+
+\usepackage[hyphens]{url}
+\usepackage{enumitem}
+
+\makeatletter
+ \setlength{\@tempskipa}{-1.2cm}%
+ \@addtoplength{toaddrheight}{\@tempskipa}
+\makeatother
+
+\setlength{\oddsidemargin}{\useplength{toaddrhpos}}
+\addtolength{\oddsidemargin}{-1in}
+\setlength{\textwidth}{\useplength{firstheadwidth}}
+
+\providecommand{\tightlist}{%
+ \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
+
+\begin{document}
+ \setkomavar{fromname}{$author$}
+ \renewcommand*{\raggedsignature}{\raggedright}
+ \setkomavar{fromaddress}{
+ $for(return-address)$
+ $return-address$$sep$\\
+ $endfor$
+ }
+ \setkomavar{fromphone}{$phone$}
+ \setkomavar{fromemail}{$email$}
+ \setkomavar{signature}{$author$}
+
+ \setkomavar{date}{$date$}
+ \setkomavar{place}{$place$}
+
+ \setkomavar{subject}{$subject$}
+
+ \begin{letter}{%
+ $for(address)$
+ $address$$sep$\\
+ $endfor$
+ }
+
+ \opening{$opening$}
+
+ This paragraph is fixed within the template.
+ Not sure if this is the way to go though.
+
+ \begin{description}[leftmargin=!,labelwidth=1.5cm,labelindent=1cm]
+ \item[Login] $login$
+ \item[Pin] $pin$
+ \end{description}
+
+ $body$
+
+ \closing{$closing$}
+
+ \ps $postskriptum$
+
+ $if(encludes)$
+ \setkomavar*{enclseparator}{Anlage}
+ \encl{$encludes$}
+ $endif$
+ \end{letter}
+\end{document}
diff --git a/templates/letter/fraport_renewal.md b/templates/letter/fraport_renewal.md
new file mode 100644
index 000000000..9769aaea7
--- /dev/null
+++ b/templates/letter/fraport_renewal.md
@@ -0,0 +1,58 @@
+---
+### Metadaten, welche hier eingestellt werden:
+# Absender
+subject: Verlängerung Vorfeldführerschein
+author: Fraport AG - Fahrerausbildung (AVN-AR)
+phone: +49 69 690-30306
+email: fahrerausbildung@fraport.de
+place: Frankfurt/Main
+return-address:
+ - 60547 Frankfurt
+opening: Sehr geehrte Damen und Herren,
+closing: |
+ Mit freundlichen Grüßen,
+ Ihre Fahrerausbildung.
+encludes:
+
+### Metadaten, welche automatisch ersetzt werden:
+date: 11.11.1111
+lang: de-de
+is-de: NULL
+lms-login: 123456
+lms-pin: abcdef
+# Emfpänger
+name: E. M. Pfänger
+address:
+ - Musterfirma GmbH
+ - E. M. Pfänger
+ - Musterstraße 11
+ - 12345 Musterstadt
+...
+
+die Gültigkeit Ihres Vorfeldführerscheines läuft demnächst ab.
+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
+
+ :