129 lines
4.4 KiB
Nix
129 lines
4.4 KiB
Nix
# TODO: Remove LaTeX-Code, replace with renderer-methods
|
|
{ chunks, core, evaluator, renderer, ... }:
|
|
let
|
|
inherit(core) debug indentation list string type;
|
|
inherit(evaluator) evaluate;
|
|
inherit(renderer) putCaption toBody toTitle render;
|
|
|
|
evaluateHeading
|
|
= { ... } @ document:
|
|
{ ... } @ state:
|
|
{ body, dependencies, ... } @ heading:
|
|
let
|
|
state' = evaluate document state body;
|
|
in
|
|
state'
|
|
// {
|
|
dependencies = state'.dependencies ++ dependencies;
|
|
};
|
|
|
|
renderHeading
|
|
= { level, ... } @ document:
|
|
{ before, body, clearDoublePage, clearPage, clearPageOnLastQuarter, concise, label, rotate, title, ... } @ heading:
|
|
output:
|
|
let
|
|
body' = render (document // { level = list.tailOr level []; }) body;
|
|
level' = list.headOr level "paragraph";
|
|
in
|
|
if output == "LaTeX"
|
|
then
|
|
let
|
|
label'
|
|
= if label != null
|
|
then
|
|
[ "\\label{${label}}%" ]
|
|
else
|
|
[ ];
|
|
header
|
|
= [ "\\${level'}[\\nolink{%" indentation.more ]
|
|
++ title.bookmark
|
|
++ [ indentation.less "}]{%" indentation.more ]
|
|
++ title.caption
|
|
++ [ indentation.less "}" ];
|
|
header'
|
|
= if title.visible
|
|
then
|
|
header
|
|
else
|
|
[
|
|
"\\begingroup" indentation.more
|
|
"\\makeatletter\\let\\@makechapterhead\\@gobble\\makeatother"
|
|
]
|
|
++ header
|
|
++ [ indentation.less "\\endgroup" ];
|
|
clearPage'
|
|
= if !concise
|
|
&& ( clearDoublePage || level' == "chapter" )
|
|
then
|
|
[ "\\cleardoublepage%" ]
|
|
else if clearPage
|
|
then
|
|
[ "\\clearpage%" ]
|
|
else if clearPageOnLastQuarter
|
|
then
|
|
[ "\\clearPageOnLastQuarter%" ]
|
|
else
|
|
[];
|
|
rotate'
|
|
= if rotate
|
|
then
|
|
[ "\\rotatePages%" ]
|
|
else
|
|
[ "\\unrotatePages%" ];
|
|
before'
|
|
= if before == null
|
|
then
|
|
[ ]
|
|
else if list.isInstanceOf before
|
|
then
|
|
before
|
|
else
|
|
[ before ];
|
|
in
|
|
before' ++ clearPage' ++ rotate' ++ label' ++ header' ++ body'
|
|
else if output == "Markdown"
|
|
then
|
|
let
|
|
level''
|
|
= {
|
|
chapter = "# ";
|
|
section = "## ";
|
|
subsection = "### ";
|
|
subsubsection = "#### ";
|
|
}.${level'} or "";
|
|
in
|
|
[
|
|
"${level''}${string.concatWith " " title.caption}"
|
|
]
|
|
++ body'
|
|
else
|
|
[];
|
|
|
|
Heading = title: body: Heading' title body {};
|
|
Heading'
|
|
= title:
|
|
body:
|
|
{
|
|
after ? null,
|
|
before ? null,
|
|
clearDoublePage ? false,
|
|
clearPage ? false,
|
|
clearPageOnLastQuarter ? false,
|
|
concise ? false,
|
|
dependencies ? [],
|
|
label ? null,
|
|
LaTeX ? false,
|
|
rotate ? false,
|
|
}:
|
|
chunks.Chunk "Heading"
|
|
{
|
|
render = renderHeading;
|
|
evaluate = evaluateHeading;
|
|
}
|
|
{
|
|
inherit after before clearDoublePage clearPage clearPageOnLastQuarter concise dependencies label rotate;
|
|
title = toTitle title LaTeX;
|
|
body = toBody body;
|
|
};
|
|
in
|
|
{ inherit Heading Heading'; } |