163 lines
5.7 KiB
Nix
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;
|
|
}
|
|
);
|
|
}
|