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

163 lines
5.7 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) toCaption toDescription putCaption;
evaluateTable
= { ... } @ document:
{ ... } @ state:
{ dependencies, ... } @ table:
let
state' = state;
in
state'
// {
dependencies = state'.dependencies ++ dependencies;
tables
= state'.tables
// {
counter = state'.tables.counter + 1;
};
};
# { ... } -> Document::Chunk::Table -> [ string | Indentation ]
renderTable
= _:
{ header, body, label, fontsize, ... } @ table:
output:
if output == "LaTeX"
then
let
header'
= list.fold
(
state:
entry:
type.matchPrimitiveOrPanic entry
{
string
= {
line = state.line ++ [ entry ];
config = "${state.config}l";
bar = false;
};
set
= let
bar = entry.bar or false;
bar' = if bar then "|" else "";
in
if entry.config == "."
then
{
line = state.line ++ [ "\\${if bar then "T" else "t"}head{${entry.title}}" ];
config = "${state.config}.${bar'}";
inherit bar;
}
else
{
line = state.line ++ [ entry.title ];
config = "${state.config}${entry.config}${bar'}";
inherit bar;
};
}
)
{
line = [ ];
config = "";
bar = false;
}
header;
in
[
"\\begin{table}[H]%" indentation.more
"\\centering{%" indentation.more
]
++ ( putCaption table )
++ (
if label != null
then
[ "\\labelTable{${label}}%" ]
else
[ ]
)
++ (
if fontsize != null
then
[ fontsize ]
else
[ ]
)
++ [
"\\begin{tabular}{${header'.config}}" indentation.more
"\\toprule%"
"${string.concatWith " & " header'.line} \\\\"
"\\midrule%"
]
++ (
list.map
(
# list | string -> string
line:
type.matchPrimitiveOrPanic line
{
null = "\\midrule";
list = "${string.concatWith " & " line} \\\\";
string = line;
}
)
body
)
++ [
"\\bottomrule%"
indentation.less "\\end{tabular}"
indentation.less "}%"
indentation.less "\\end{table}"
]
else if output == "Markdown"
then
[]
else
debug.panic "render" "Unknown output ${output}";
in
{
# set | string -> list -> list -> Document::Chunk::Table
Table
= config:
header:
body:
chunks.Chunk "Table"
{
render = renderTable;
evaluate = evaluateTable;
}
(
type.matchPrimitiveOrPanic config
{
string
= {
caption = toCaption config;
description = toDescription config;
cite = null;
label = null;
fontsize = null;
dependencies = [];
};
set
= {
caption = toCaption ( config.caption or config.description or "" );
description = toDescription ( config.description or config.caption or "" );
cite = config.cite or null;
label = config.label or null;
fontsize = config.fontsize or null;
dependencies = config.dependencies or [];
};
}
// {
header = list.expect header;
body = list.expect body;
}
);
}