nixfiles/NixTeX/source/evaluate.nix
Sebastian Walz 860d31cee1
Tohu vaBohu
2023-04-21 00:22:52 +02:00

165 lines
5.6 KiB
Nix

{ bibliography, chemistry, core, document, ... }:
let
inherit(core) context expression list path set string;
inherit(chemistry) substances;
inherit(document) evaluate;
in
evaluationOrder:
{ configuration, content, dependencies, name, resources, state ? {}, titleNotes ? null, ... } @ document:
let
initialState
= {
bibliography = bibliography.initEvaluationState;
dependencies = [];
figures
= {
counter = 1;
};
notes
= let
notes
= {
enableMarkdown= true;
fontSize = 20;
version = 1;
}
// (configuration.notes or {});
in
{
inherit(notes) enableMarkdown fontSize version;
label = if titleNotes != null then 1 else 0;
pages
= list.ifOrEmpty'
(titleNotes != null)
[
{
title = "Title Page";
level = 0;
}
{
label = "1";
overlay = 0;
note = titleNotes;
}
];
};
schemes
= {
counter = 1;
};
source = context name;
substances = substances.evaluate configuration.concise;
tables
= {
counter = if configuration.concise then 0 else 1; # ToDo !!!
};
todos = [];
}
// state;
evaluatedState
= list.fold
(
state:
part:
if set.hasAttribute part content
then
evaluate
{ inherit configuration resources; }
(state // { context = [ ]; })
content.${part}
else
state
)
initialState
evaluationOrder;
notes
= let
inherit(evaluatedState) notes;
in
{
dst = "${name}.md";
src
= path.toFile "${name}.md"
(
string.concatMappedLines
(
{ level ? 0, note ? [], title ? null, ... }:
if title != null
then
let
title'
= if list.isInstanceOf title
then
string.concatWith " " title
else
string title;
in
if level == 0
then
"# ${title'}"
else
"## ${title'}"
else
note
)
notes.pages
);
};
pdfpc
= let
inherit(evaluatedState) notes;
in
{
dst = "${name}.pdfpc";
src
= path.toFile "${name}.pdfpc"
(
expression.toJSON
{
pdfpcFormat = notes.version;
disableMarkdown = !notes.enableMarkdown;
noteFontSize = notes.fontSize;
pages
= list.imap
(idx: page: page // { inherit idx; })
(
list.filter
({ title ? null, ... }: title == null)
notes.pages
);
}
);
};
in
document
// {
dependencies
= dependencies
++ evaluatedState.dependencies
++ (list.ifOrEmpty' (evaluatedState.notes.label != 0) [ pdfpc notes ])
++ [
{
dst = "todos";
src
= path.toFile "todos"
(
string.concatMappedLines
({ context, task }: "${string.concatWith " " context}: ${task}")
evaluatedState.todos
);
}
];
resources
= resources
// {
substances
= substances.finalise
resources.substances
evaluatedState.substances;
};
state = evaluatedState;
}