207 lines
8.3 KiB
Nix
207 lines
8.3 KiB
Nix
# 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 [];
|
||
} |