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

194 lines
6.7 KiB
Nix

{ bibliography, chemistry, core, document, glossaries, ... } @ libs:
{ configuration, content, date, dependencies, language ? "eng", name, place, resources, ... } @ document:
let
inherit(core) debug indentation library list path string time;
renderBeginDocument = library.import ./beginDocument.nix libs';
renderEnclosures = library.import ./enclosures.nix libs';
renderLetter = library.import ./letter.nix libs';
renderPrelude = library.import ./prelude.nix libs';
renderResume = library.import ./resume libs';
libs'
= libs
// {
toTex = libs.document.toTex { inherit configuration language resources; };
};
packages
= [
"logging"
"dependencies"
"chemistry/chem"
"chemistry/elements"
"bibliography/citation"
"floats/floats"
"geometry"
"glossaries/glossaries"
"links"
"symbols"
"text/text"
"utils"
];
acronyms = glossaries.acronyms.toLua { inherit configuration resources; };
references = bibliography.toBibTeX { inherit configuration resources; } resources.references;
substances = chemistry.substances.toLua { inherit configuration resources; } resources.substances;
prelude
= {
acronyms = acronyms.dst;
assets = "assets/";
packages = list.map (name: "\\input{\\source/source/${name}.tex}") packages;
references = references.dst;
source
= {
lua = "source/lua/";
tex = "source/";
};
substances = substances.dst;
inherit(resume) publications;
};
letter
= {
inherit(document) configuration date language place;
sender
= {
inherit(resume) name social;
};
subject = document.title;
}
// (path.import content.letter libs' document);
resume
= {
inherit(document) date language place;
}
// (path.import content.resume libs' document);
pdfMeta
= {
author = "${resume.name.given} ${resume.name.family}";
title
= "${document.title} ${{ deu = "am"; eng = "on"; }.${language}} ${time.formatDate document.date language}";
subject
= {
deu = "Bewerbung";
eng = "Application";
}.${language};
};
enclosures
= {
inherit(document) language;
inherit(letter) enclosures;
};
content'
= indentation { initial = ""; tab = " "; }
(
[]
++ ( renderPrelude prelude )
++ [ "\\begin{document}" indentation.more ]
++ ( renderBeginDocument pdfMeta )
++ list.ifOrEmpty'
((configuration.application or {}).letter or true)
( renderLetter letter )
++ list.ifOrEmpty'
((configuration.application or {}).resume or true)
( renderResume resume )
++ list.ifOrEmpty'
((configuration.application or {}).enclosures or true)
( renderEnclosures enclosures )
++ [ "\\directlua{commonFinal()}" ] # ToDo: Remove!
++ [ indentation.less "\\end{document}" ]
);
optimiser
= if configuration.optimise or false
then
''
# Optimise and linearise
# This removes tooltips, sorry
mv "${name}.pdf" "${name}-raw.pdf"
gs \
-dBATCH \
-dColorImageResolution=288 \
-dCompatibilityLevel=1.7 \
-dDEBUG \
-dDetectDuplicateImages \
-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dFastWebView \
-dGrayImageResolution=288 \
-dMonoImageResolution=288 \
-dNOPAUSE \
-dPDFSETTINGS=/ebook \
-dPrinted=false \
-sDEVICE=pdfwrite \
-sOutputFile="${name}.pdf" \
"${name}-raw.pdf" \
> "${name}.gslog" 2>&1
''
else
"";
compile
= path.toFile "compile-${name}.sh"
''
#!/usr/bin/env bash
echo "$out/${name}.tex"
#exit 0
newHash="false"
oldHash="true"
out="$1"
counter=""
while [[ "$newHash" != "$oldHash" && "$counter" != "${configuration.foo or "+++++"}" ]]
do
if lualatex \
--interaction=nonstopmode \
--halt-on-error \
--output-format=pdf \
"\def\source{$out}\def\build{.}\input{$out/${name}.tex}" #2> /dev/null > /dev/null
then
oldHash="$newHash"
newHash="$(md5sum "${name}.pdf")"
echo "$newHash"
mv "${name}.log" "$out/${name}.log"
mv "${name}.llg" "$out/${name}.llg"
biber "${name}"
counter="+$counter"
else
exit 1
fi
done
${optimiser}
# move the generated and processed document to the final-directory
mv "${name}.pdf" "$out/${name}.pdf"
'';
texFile = path.toFile "${name}.tex" content';
in
document
// {
content = content';
dependencies
= dependencies
++ [
acronyms
references
substances
{
src = texFile;
dst = "${name}.tex";
}
{
src = { store = compile; executable = true; };
dst = "compile-${name}.sh";
}
];
}