Sebastian Walz 860d31cee1
Tohu vaBohu
2023-04-21 00:22:52 +02:00

320 lines
10 KiB
Nix

{ core, letters, phonenumbers, symbols, toTex, urls, ... }:
{
body,
closing,
configuration,
copies ? null,
customer ? null,
date,
enclosures ? null,
invoice ? null,
language ? "eng",
logo ? null,
my ? {},
opening,
place,
recipient,
sender,
signature ? null,
subject,
your ? {},
...
}:
let
inherit(core) indentation list string time;
inherit(sender) name social;
inherit(social) address;
inherit(symbols.forkAwesome) email-bulk fax globe gnupg mobile phone;
country'
= if address.country or null != null
then
"${address.country}\\,"
else
"";
fluent
= {
deu
= {
cellPhone = "Mobil";
copies = "Verteiler";
email = "E-Mail";
enclosures = "Anlagen";
homePage = "Homepage";
pgpKey = "PGP-Schlüssel";
teleFax = "Fax";
telePhone = "Telefon";
};
eng
= {
cellPhone = "Cellphone";
copies = "Copies";
email = "Email";
enclosures = "Enclosures";
homePage = "Homepage";
pgpKey = "PGP-Key";
teleFax = "Telefax";
telePhone = "Telephone";
};
};
signatureHeight = "1.2cm";
formatEmail
= label:
address:
list.ifOrEmpty
(address != null)
"${label}: & ${urls.formatEmailTeXboxed address "\\texttt{${address}}"} \\\\";
formatPhoneNumber
= label:
number:
list.ifOrEmpty
(number != null)
"${label}: & ${phonenumbers.formatTeX number} \\\\";
formatURL
= label:
url:
list.ifOrEmpty
(url != null)
"${label}: & ${urls.formatHttpsTeXboxed url "\\texttt{${url}}"} \\\\";
cellPhone = social.phone.cell or null;
email = social.email or null;
homePage = social.homepage or null;
pgpURL = social.pgpURL or null;
teleFax = social.phone.fax or null;
telePhone = social.phone.home or null;
opening'
= if recipient.name or null != null
then
letters.openingFromName recipient.name language
else
opening;
recipientToList
= { institute ? null, municipality ? null, name ? null, street ? null, ... }:
let
institute'
= institute;
name'
= let
honorific
= if name.honorific or null != null
then
"${name.honorific}~"
else
"";
title
= if name.title or null != null
then
"${name.title}~"
else
"";
actualName
= if name.given or null != null
&& name.family or null != null
then
"${name.given}~${name.family}"
else
name.given or name.family or name;
in
"${honorific}${title}${actualName}";
street'
= if street.name or null != null
&& street.number or null != null
then
"${street.name}~${string street.number}"
else
street.name or street;
municipality'
= let
country
= if municipality.country or null != null
then
if postalCode != ""
then
"${municipality.country}\\,"
else
"${municipality.country}~"
else
"";
postalCode
= if municipality.code or null != null
then
"${string municipality.code}~"
else
"";
in
"${country}${postalCode}${municipality.name or municipality}";
in []
++ (list.ifOrEmpty (institute != null) institute' )
++ (list.ifOrEmpty (name != null) name' )
++ (list.ifOrEmpty (street != null) street' )
++ (list.ifOrEmpty (municipality != null) municipality');
recipient'
= if list.isInstanceOf recipient
then
recipient
else
recipientToList recipient;
in
[
#"\\addsectiontocentry{}{Anschreiben}"
"\\setkomavar{backaddress}{" indentation.more
"${name.given}\\ ${name.family} \\\\"
"${address.street.name}~${address.street.number} \\\\"
]
++ (
list.ifOrEmpty
(address.street.extra or null != null)
"${address.street.extra} \\\\"
)
++ [
"${country'}${address.postalCode}~${address.municipality}"
indentation.less "}%"
"\\setkomavar{backaddressseparator}{\\,·\\,}"
"\\KOMAoptions{" indentation.more
"foldmarks = H,"
"subject = titled,"
"pagenumber = off,"
indentation.less "}%"
]
++ (
list.ifOrEmpty
(customer != null)
"\\setkomavar{customer}[${customer.name or "Kunden\\-nummer"}]{${customer.value or customer}}%"
)
++ [
"\\setkomavar{date}{${time.formatDate date language}}%"
]
++ (
list.ifOrEmpty' (logo != null)
[
"\\KOMAoptions{fromlogo=true}"
"\\setkomavar{fromlogo}{\\includegraphics[width=${logo.width}]{\\source/${logo.file}}}"
]
)
++ (
list.ifOrEmpty
(invoice != null)
"\\setkomavar{custominvoiceer}[${invoice.name or "Rechnungs\\-nummer"}]{${invoice.value or invoice}}%"
)
++ [
"\\setkomavar{location}{{" indentation.more
"\\scriptsize"
"\\begin{tabular}{r@{\\,}ll}" indentation.more
"\\multicolumn{3}{l}{${name.given}\\ ${name.family}} \\\\"
"\\multicolumn{3}{l}{${address.street.name}~${address.street.number}} \\\\"
]
++ (
list.ifOrEmpty
(address.street.extra or null != null)
"\\multicolumn{3}{l}{${address.street.extra}} \\\\"
)
++ [ "\\multicolumn{3}{l}{${country'}${address.postalCode}~${address.municipality}} \\\\" ]
++ ( formatPhoneNumber "${phone} & ${fluent.${language}.telePhone}" telePhone )
++ ( formatPhoneNumber "${fax} & ${fluent.${language}.teleFax}" teleFax )
++ ( formatPhoneNumber "${mobile} & ${fluent.${language}.cellPhone}" cellPhone )
++ ( formatEmail "${email-bulk} & ${fluent.${language}.email}" email )
++ ( formatURL "${gnupg} & ${fluent.${language}.pgpKey}" pgpURL )
++ ( formatURL "${globe} & ${fluent.${language}.homePage}" homePage )
++ [
indentation.less "\\end{tabular}"
indentation.less "}}%"
]
++ (
list.ifOrEmpty
(my.ref or null != null)
"\\setkomavar{myref}[${my.ref.name or "Mein Zeichen"}]{${my.ref.value or my.ref}}%"
)
++ [
"\\setkomavar{place}{${place}}%"
"\\makeatletter%"
"\\@setplength{lochpos}{1.0cm}%"
"\\@setplength{locwidth}{7.5cm}%"
"\\makeatother%"
"\\setkomavar{signature}{" indentation.more
]
++ (
list.ifOrEmpty' (signature != null)
[
"\\vspace{-${signatureHeight}}%"
"\\includegraphics[height=${signatureHeight}]{\\source/${signature}}\\\\[-.3\\normalbaselineskip]%"
]
)
++ [
"${name.given}~${name.family}"
indentation.less "}%"
"\\setkomavar{subject}{${subject}}%"
]
++ (
list.ifOrEmpty
(your.mail or null != null)
"\\setkomavar{yourref}[${your.mail.name or "Ihr Zeichen"}]{${your.ref.value or your.ref}}%"
)
++ (
list.ifOrEmpty
(your.ref or null != null)
"\\setkomavar{yourmail}[${your.ref.name or "Ihr Schreiben vom"}]{${your.ref.value or your.ref}}%"
)
++ [
"\\begin{letter}{" indentation.more
]
++ (list.map (line: "${line}\\\\") recipient')
++ [
indentation.less "}" indentation.more
"\\opening{${opening'}}"
]
++ (toTex body)
++ [
"\\closing{${closing}}"
"\\vfill"
]
++ (
list.ifOrEmpty'
(
enclosures != null
&& enclosures != []
&& (configuration.application or {}).enclosures or true
)
(
[
"\\setkomavar*{enclseparator}{${fluent.${language}.enclosures}}%"
"\\encl{%" indentation.more
]
++ (
list.map
({ title, ... }: "${title},")
(list.body enclosures)
)
++ [
"${(list.foot enclosures).title}"
indentation.less "}%"
]
)
)
++ (
list.ifOrEmpty'
(
copies != null
&& copies != []
&& (configuration.application or {}).copies or true
)
[
"\\setkomavar*{ccseparator}{${fluent.${language}.copies}}%"
"\\cc{%" indentation.more
indentation.less "}%"
]
)
++ [ indentation.less "\\end{letter}" ]