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

207 lines
8.3 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TODO: Remove LaTeX-Code, replace with renderer-methods
{ chunks, core, evaluator, renderer, ... }:
let
inherit(core) debug error indentation list string type;
inherit(evaluator) evaluate;
inherit(renderer) toBody render;
evaluateDedication
= { ... } @ document:
{ ... } @ state:
{ body, ... } @ dedication:
let
state' = evaluate document state body;
in
state';
replaceNewline
= text:
string.replace
[ "\n" ]
[ "\\noexpand\\linebreak " ]
(string.trim text);
renderDedication
= { ... } @ document:
{ body, epigraph, ... } @ dedication:
output:
let
epigraph'
= if epigraph != null
then
{
author
= let
author = epigraph.author or null;
in
type.matchPrimitiveOrPanic author
{
null = null;
string = { name = author; about = null; };
set = { name = author.name; about = author.about or null; };
};
text
= let
text = epigraph.text or null;
in
type.matchPrimitiveOrPanic text
{
null = error.throw "Must not be null";
string
= {
language= null;
original= text;
};
set = { language = null; } // text;
};
translation = epigraph.translation or null;
}
else
null;
epigraphTeX
= let
transliteration
= let
lines
= let
lines = list.filter (line: line != "") (list.map string.trim (string.splitLines epigraph'.text.latin));
first = list.head lines;
last = list.foot lines;
middle = list.map (line: "${line}\\linebreak%") ( list.body ( list.tail lines ) );
length = list.length lines;
in
if length == 1
then
[ "[${first}]%" ]
else
[ "[${first}\\linebreak%" ]
++ middle
++ [ "${last}]%" ];
in
if epigraph'.text.language != null
&& epigraph'.text ? latin
then
[
"\\par%"
"{\\tiny%" indentation.more
]
++ lines
++ [ indentation.less "}%" ]
else
[];
text
= let
lines
= let
lines = list.filter (line: line != "") (list.map string.trim (string.splitLines epigraph'.text.original));
first = list.head lines;
last = list.foot lines;
middle = list.map (line: "${line}\\linebreak%") ( list.body ( list.tail lines ) );
in
if list.length lines == 1
then
if epigraph'.text.language != null
then
"\\foreignquote{${epigraph'.text.language}}{${first}}%"
else
[ "${first}%" ]
else
[ "\\begin{quote}%" indentation.more ]
++ (
if epigraph'.text.language != null
then
[ "\\selectlanguage{${epigraph'.text.language}}%" ]
else
[]
)
++ [ "${first}\\linebreak%" ]
++ middle
++ [
last
indentation.less "\\end{quote}%"
];
text
= [ "{\\normalsize%" indentation.more ]
++ lines
++ [ indentation.less "}%" ];
in
text ++ transliteration;
translation
= let
formatTranslation
= text:
let
lines = list.filter (line: line != "") (list.map string.trim (string.splitLines text));
first = list.head lines;
last = list.foot lines;
middle = list.map (line: "${line}\\newline%") ( list.body ( list.tail lines ) );
in
if list.length lines == 1
then
[ "\\par\\footnotesize(»${text}«)%" ]
else
[ "\\par\\footnotesize(»${first}\\newline%" ]
++ middle
++ [ "${last}«)%" ];
in
type.matchPrimitiveOrPanic epigraph'.translation
{
null = [];
string = formatTranslation epigraph'.translation;
set = formatTranslation epigraph'.translation.deu;
};
author
= if epigraph'.author != null
then
if epigraph'.author.about != null
then
[ "\\par{\\raggedleft\\footnotesize \\person{${epigraph'.author.name}}~(${replaceNewline epigraph'.author.about})}" ]
else
[ "\\par{\\raggedleft\\footnotesize \\person{${epigraph'.author.name}}}" ]
else
[];
in
text
++ translation
++ author;
epigraphTeX'
= if epigraph != null
then
[
"{~\\vfill\\hfill\\parbox[][][t]{0.666\\linewidth}{{%" indentation.more
"\\tolerance 500%"
"\\emergencystretch 3em%"
"\\hfuzz=2pt%"
"\\vfuzz=2pt%"
"\\hyphenchar\\font=-1%"
]
++ epigraphTeX
++ [ indentation.less "}}\\newpage}" ]
else
[];
in
( render document body ) ++ epigraphTeX';
Dedication
= body:
epigraph:
chunks.Chunk "Dedication"
{
render = renderDedication;
evaluate = evaluateDedication;
}
{
body = toBody body;
inherit epigraph;
};
in
{
inherit Dedication;
Epigraph = Dedication [];
}