2026-07-18 18:48:23 +02:00
|
|
|
#include "util.h"
|
|
|
|
|
#include "machine.h"
|
|
|
|
|
#include "error.h"
|
|
|
|
|
#include "kutil.h"
|
|
|
|
|
#include "html_util.h"
|
|
|
|
|
#include "latex_util.h"
|
|
|
|
|
#include "locator.h"
|
|
|
|
|
// #include "state.h"
|
|
|
|
|
#include "document_class.h"
|
|
|
|
|
#include "show.h"
|
|
|
|
|
#include "log.h"
|
|
|
|
|
#include "file.h"
|
|
|
|
|
|
Klammerset: the @@@klammerset construct, its search path, and const correctness
The @@@klammerset system command formally declares a klammerset — a
named, logically related group of klammer definitions — with an
operative, idempotent declaration (:requires and :files load in order
at the declaration point, relative to the declaring file). A bare
symbol given to ktext -k, kdesc --input, or :requires resolves to
x/x.k on the search path: the document's directory, then
KLAMMERTEXT_KLAMMERSETS, then KLAMMERTEXT_HOME; kdesc --klammerset
lists the available sets. sks/sks.k is the first declared klammerset,
so `-k sks` loads the SKS by name. The engine's lookup classes were
renamed *_set → *_registry to keep the two concepts apart, and the
whole C++ tree now follows standard const-correctness conventions.
tst/ gains klammerset_test.sh (18 cases).
(from dev 64b1abf23e56)
2026-07-30 23:50:07 +02:00
|
|
|
bool strbool(const std::string& s, const Locator& loc)
|
2026-07-18 18:48:23 +02:00
|
|
|
{
|
|
|
|
|
std::vector<std::string> values = {"false", "False", "0", "true", "True", "1"};
|
|
|
|
|
if (is_not_in(s, values)) {
|
|
|
|
|
std::stringstream ss {};
|
|
|
|
|
ss << "The value \"" << s << "\" is not a Boolean values. Possible values are:\n"
|
|
|
|
|
<< join(values, ", ");
|
|
|
|
|
throw Argument_error(ss.str(), loc, false);
|
|
|
|
|
}
|
|
|
|
|
bool result = (find(values.begin(), values.end(), s) - values.begin()) > 2;
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Document_class::Document_class(Machine& machine) : Klammer_base(machine)
|
|
|
|
|
{
|
|
|
|
|
(void)K::log(3);
|
|
|
|
|
// show("document in main SKS");
|
|
|
|
|
m_machine = machine;
|
|
|
|
|
sloc = get("K_loc");
|
|
|
|
|
m_title = get("title");
|
|
|
|
|
m_subtitle = get("subtitle");
|
|
|
|
|
m_page_title = get("page_title");
|
|
|
|
|
m_author = get("author");
|
|
|
|
|
m_date = get("date");
|
|
|
|
|
|
|
|
|
|
// m_nav = strbool(get("nav"), loc);
|
|
|
|
|
// m_toc = strbool(get("toc"), loc);
|
|
|
|
|
|
|
|
|
|
m_structure = docstruct(get("structure"));
|
|
|
|
|
|
|
|
|
|
m_date = get("date");
|
|
|
|
|
m_version = get("version");
|
|
|
|
|
m_logo = get("logo");
|
|
|
|
|
|
|
|
|
|
m_text = get("text");
|
2026-07-26 23:22:59 +02:00
|
|
|
// Filename lists: standalone-"/" separation, existence rescue for
|
|
|
|
|
// spaces, ~ expansion (resolve_filename_list in mac/file.cpp); the
|
|
|
|
|
// existence checks resolve relative names against the input directory,
|
|
|
|
|
// as parse_input_filename() will.
|
|
|
|
|
m_files = resolve_filename_list(get("files"), get("K_input_dir"));
|
2026-07-18 18:48:23 +02:00
|
|
|
|
|
|
|
|
m_css_text = get("css_text");
|
2026-07-26 23:22:59 +02:00
|
|
|
m_css_filenames = resolve_filename_list(get("css_files"), get("K_input_dir"));
|
2026-07-18 18:48:23 +02:00
|
|
|
m_include_sks_css = strbool(get("include_sks_css"), loc);
|
|
|
|
|
frame_background_color = get("frame_background_color");
|
|
|
|
|
frame_text_color = get("frame_text_color");
|
|
|
|
|
nav_background_color = get("nav_background_color");
|
|
|
|
|
nav_text_color = get("nav_text_color");
|
|
|
|
|
|
|
|
|
|
js_text = get("js_text");
|
2026-07-26 23:22:59 +02:00
|
|
|
m_js_filenames = resolve_filename_list(get("js_files"), get("K_input_dir"));
|
2026-07-18 18:48:23 +02:00
|
|
|
m_include_sks_js = strbool(get("include_sks_js"), loc);
|
|
|
|
|
|
|
|
|
|
// font_dirs = word_split(get("font_dirs"));
|
|
|
|
|
|
|
|
|
|
auto strip_quotes = [](std::string s) {
|
|
|
|
|
if (s.size() >= 2 && s.front() == '"' && s.back() == '"')
|
|
|
|
|
s = s.substr(1, s.size() - 2);
|
|
|
|
|
return s;
|
|
|
|
|
};
|
|
|
|
|
m_serif_font = strip_quotes(get("serif_font"));
|
|
|
|
|
m_sans_font = strip_quotes(get("sans_font"));
|
|
|
|
|
m_mono_font = strip_quotes(get("mono_font"));
|
|
|
|
|
m_font_scale = stof(get("font_scale"));
|
|
|
|
|
|
|
|
|
|
if (!m_serif_font.empty())
|
|
|
|
|
m_resolved_serif = resolve_font(m_serif_font);
|
|
|
|
|
if (!m_sans_font.empty())
|
|
|
|
|
m_resolved_sans = resolve_font(m_sans_font);
|
|
|
|
|
if (!m_mono_font.empty())
|
|
|
|
|
m_resolved_mono = resolve_font(m_mono_font);
|
|
|
|
|
paper_size = get("paper_size");
|
|
|
|
|
landscape = strbool(get("landscape"), loc);
|
|
|
|
|
leading = stof(get("leading"));
|
|
|
|
|
point_size = stoi(get("point_size"));
|
|
|
|
|
ragged_right = strbool(get("ragged_right"), loc);
|
|
|
|
|
cover = get("cover");
|
|
|
|
|
prolog = get("prolog");
|
|
|
|
|
m_two_column = strbool(get("two_column"), loc);
|
|
|
|
|
|
|
|
|
|
m_copyright = get("copyright");
|
|
|
|
|
m_bottom = get("bottom");
|
|
|
|
|
|
|
|
|
|
create_output_directory = strbool(get("create_output_directory"), loc);
|
|
|
|
|
output_directory_name = get("output_directory_name");
|
|
|
|
|
|
|
|
|
|
resources_in_file = strbool(get("resources_in_file"), loc);
|
|
|
|
|
|
|
|
|
|
//use_pages_dir = strbool(get("use_pages_dir"), loc);
|
|
|
|
|
|
|
|
|
|
// m_toc_only = strbool(get("K_toc_only"), loc);
|
2026-07-26 23:22:59 +02:00
|
|
|
m_kt_root_filename = get("K_input_filename");
|
2026-07-18 18:48:23 +02:00
|
|
|
|
|
|
|
|
m_no_cache = !strbool(get("cache"), loc);
|
|
|
|
|
|
|
|
|
|
write_files = !strbool(get("K_stdout_only"), loc);
|
|
|
|
|
m_input_dir = get("K_input_dir");
|
|
|
|
|
|
|
|
|
|
if (m_text.size() == 0 and m_files.size() == 0) {
|
|
|
|
|
throw Argument_error(
|
|
|
|
|
"Neither the :text or :files options have values"); //,
|
|
|
|
|
//get("K_loc"));
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
for (std::string file : m_files) {
|
|
|
|
|
sources.push_back(string_from_file(find_kt_file(file)));
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
// std::cout << "IN DOCUMENT CLASS:\n" << m_state << "\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Document_class::save_string_input_as_file()
|
|
|
|
|
{
|
|
|
|
|
if (!m_text.empty()) {
|
|
|
|
|
std::string input_text_filename = m_cache_dir + "/_text.kt";
|
|
|
|
|
// msg() << "Write string input to cache file: "
|
|
|
|
|
// << input_text_filename << "\n";
|
|
|
|
|
string_to_file(input_text_filename, m_text);
|
|
|
|
|
m_files.insert(m_files.begin(), input_text_filename);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
Klammerset: the @@@klammerset construct, its search path, and const correctness
The @@@klammerset system command formally declares a klammerset — a
named, logically related group of klammer definitions — with an
operative, idempotent declaration (:requires and :files load in order
at the declaration point, relative to the declaring file). A bare
symbol given to ktext -k, kdesc --input, or :requires resolves to
x/x.k on the search path: the document's directory, then
KLAMMERTEXT_KLAMMERSETS, then KLAMMERTEXT_HOME; kdesc --klammerset
lists the available sets. sks/sks.k is the first declared klammerset,
so `-k sks` loads the SKS by name. The engine's lookup classes were
renamed *_set → *_registry to keep the two concepts apart, and the
whole C++ tree now follows standard const-correctness conventions.
tst/ gains klammerset_test.sh (18 cases).
(from dev 64b1abf23e56)
2026-07-30 23:50:07 +02:00
|
|
|
fs::path parse_input_filename(const std::string& s, const std::string& input_dir)
|
2026-07-18 18:48:23 +02:00
|
|
|
{
|
|
|
|
|
fs::path p(s);
|
|
|
|
|
if (p.extension() != ".kt") {
|
|
|
|
|
p += ".kt";
|
|
|
|
|
}
|
2026-07-26 23:22:59 +02:00
|
|
|
if (p.is_absolute()) {
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
// A relative :files name resolves against the input file's directory
|
|
|
|
|
// (K_input_dir), so a document renders identically wherever ktext is
|
|
|
|
|
// run from; then the legacy kt/ subdirectory; a name found in neither
|
|
|
|
|
// is returned as given (cwd-relative) and errors downstream.
|
An output policy for the three commands, and @cond as a true special form
A snapshot of the development tree. The substantial changes since the last one:
COMMAND OUTPUT POLICY. The three commands display text in exactly three cases,
and each owns a stream: LOGGING under "-v" greater than 0 and an ERROR before
termination go to STDERR; OUTPUT THE USER ASKED FOR goes to STDOUT. For ktext
that output is a document, so "ktext doc.kt -d | ..." is now safe -- logging
used to share the stream and land inside the document. A bare command prints
its usage and succeeds rather than failing. Colour is emitted only to a
terminal, per stream, and NO_COLOR is honoured.
"-v 1" reports every decision whose outcome you could not have read off your own
input: the klammerset that was loaded and from which file, a font's directory, a
":files" name's file, how "-o" was expanded. Higher levels are the trace.
The commands no longer warn and continue: an anomaly is an error, described with
its location. Two exceptions remain, each for a stated reason -- a condition
that is expected and temporary by design, and a judgment that is a heuristic
rather than exact.
@cond IS NOW A TRUE SPECIAL FORM, resolved at APPLICATION time rather than when
the file is read. Two consequences for a writer:
* a state variable reaches the predicate. "@@@state Flag :value true @@@
@cond *Flag* | T | F @" renders "T"; it used to see the literal "*Flag*" and
silently take the false branch. The document now behaves like a klammer
body, whose arguments are bound before its conditionals are decided.
* nothing in a discarded branch happens -- it is not read, not evaluated, not
expanded. An @eval in the branch not taken used to run anyway.
Its predicate relation is total and strict: true, True, 1; false, False, 0, and
empty; anything else is an error at the @cond rather than silently false.
@eval REACHING OUTSIDE. ":shell" and ":haskell" now keep the command's standard
error out of the document (it appears under "-v 1") and treat a nonzero exit as
an error naming what the command reported. A command that exits nonzero on
purpose -- "grep" finding no match -- says so with "|| true".
KLAMMER SETS. Several combine: "--klammersets a b c" loads all three in the
order given, sharing one namespace, with the definition modes deciding
collisions. "none" means none and may not be combined with other symbols. A
klammerset with symbol X is declared in a file X/X.k, which is what lets two
sets require the same third set without loading it twice.
TESTS. Four new suites: the kdiag command's interface, the @eval primitive's
contract with the outside world, and verbosity at both tiers. Three suites
that could not run on macOS at all now do.
Assembled from dev commit 6c8ee6c22fca.
2026-08-16 01:37:59 +02:00
|
|
|
// Which of the three a name landed on is a DERIVED value -- the ".kt" may
|
|
|
|
|
// have been supplied, and the directory certainly was -- so "-v 1" reports
|
|
|
|
|
// it. A ":files chapter1" that quietly found kt/chapter1.kt rather than
|
|
|
|
|
// the file beside the document is exactly what the author cannot see.
|
2026-07-26 23:22:59 +02:00
|
|
|
fs::path in_input_dir = fs::path(input_dir) / p;
|
|
|
|
|
if (file_exists(in_input_dir.string())) {
|
An output policy for the three commands, and @cond as a true special form
A snapshot of the development tree. The substantial changes since the last one:
COMMAND OUTPUT POLICY. The three commands display text in exactly three cases,
and each owns a stream: LOGGING under "-v" greater than 0 and an ERROR before
termination go to STDERR; OUTPUT THE USER ASKED FOR goes to STDOUT. For ktext
that output is a document, so "ktext doc.kt -d | ..." is now safe -- logging
used to share the stream and land inside the document. A bare command prints
its usage and succeeds rather than failing. Colour is emitted only to a
terminal, per stream, and NO_COLOR is honoured.
"-v 1" reports every decision whose outcome you could not have read off your own
input: the klammerset that was loaded and from which file, a font's directory, a
":files" name's file, how "-o" was expanded. Higher levels are the trace.
The commands no longer warn and continue: an anomaly is an error, described with
its location. Two exceptions remain, each for a stated reason -- a condition
that is expected and temporary by design, and a judgment that is a heuristic
rather than exact.
@cond IS NOW A TRUE SPECIAL FORM, resolved at APPLICATION time rather than when
the file is read. Two consequences for a writer:
* a state variable reaches the predicate. "@@@state Flag :value true @@@
@cond *Flag* | T | F @" renders "T"; it used to see the literal "*Flag*" and
silently take the false branch. The document now behaves like a klammer
body, whose arguments are bound before its conditionals are decided.
* nothing in a discarded branch happens -- it is not read, not evaluated, not
expanded. An @eval in the branch not taken used to run anyway.
Its predicate relation is total and strict: true, True, 1; false, False, 0, and
empty; anything else is an error at the @cond rather than silently false.
@eval REACHING OUTSIDE. ":shell" and ":haskell" now keep the command's standard
error out of the document (it appears under "-v 1") and treat a nonzero exit as
an error naming what the command reported. A command that exits nonzero on
purpose -- "grep" finding no match -- says so with "|| true".
KLAMMER SETS. Several combine: "--klammersets a b c" loads all three in the
order given, sharing one namespace, with the definition modes deciding
collisions. "none" means none and may not be combined with other symbols. A
klammerset with symbol X is declared in a file X/X.k, which is what lets two
sets require the same third set without loading it twice.
TESTS. Four new suites: the kdiag command's interface, the @eval primitive's
contract with the outside world, and verbosity at both tiers. Three suites
that could not run on macOS at all now do.
Assembled from dev commit 6c8ee6c22fca.
2026-08-16 01:37:59 +02:00
|
|
|
(void)K::log(1, "Input file \"" + s + "\": " + in_input_dir.string());
|
2026-07-26 23:22:59 +02:00
|
|
|
return in_input_dir;
|
|
|
|
|
}
|
|
|
|
|
fs::path in_kt_dir = fs::path(input_dir) / "kt" / p;
|
|
|
|
|
if (file_exists(in_kt_dir.string())) {
|
An output policy for the three commands, and @cond as a true special form
A snapshot of the development tree. The substantial changes since the last one:
COMMAND OUTPUT POLICY. The three commands display text in exactly three cases,
and each owns a stream: LOGGING under "-v" greater than 0 and an ERROR before
termination go to STDERR; OUTPUT THE USER ASKED FOR goes to STDOUT. For ktext
that output is a document, so "ktext doc.kt -d | ..." is now safe -- logging
used to share the stream and land inside the document. A bare command prints
its usage and succeeds rather than failing. Colour is emitted only to a
terminal, per stream, and NO_COLOR is honoured.
"-v 1" reports every decision whose outcome you could not have read off your own
input: the klammerset that was loaded and from which file, a font's directory, a
":files" name's file, how "-o" was expanded. Higher levels are the trace.
The commands no longer warn and continue: an anomaly is an error, described with
its location. Two exceptions remain, each for a stated reason -- a condition
that is expected and temporary by design, and a judgment that is a heuristic
rather than exact.
@cond IS NOW A TRUE SPECIAL FORM, resolved at APPLICATION time rather than when
the file is read. Two consequences for a writer:
* a state variable reaches the predicate. "@@@state Flag :value true @@@
@cond *Flag* | T | F @" renders "T"; it used to see the literal "*Flag*" and
silently take the false branch. The document now behaves like a klammer
body, whose arguments are bound before its conditionals are decided.
* nothing in a discarded branch happens -- it is not read, not evaluated, not
expanded. An @eval in the branch not taken used to run anyway.
Its predicate relation is total and strict: true, True, 1; false, False, 0, and
empty; anything else is an error at the @cond rather than silently false.
@eval REACHING OUTSIDE. ":shell" and ":haskell" now keep the command's standard
error out of the document (it appears under "-v 1") and treat a nonzero exit as
an error naming what the command reported. A command that exits nonzero on
purpose -- "grep" finding no match -- says so with "|| true".
KLAMMER SETS. Several combine: "--klammersets a b c" loads all three in the
order given, sharing one namespace, with the definition modes deciding
collisions. "none" means none and may not be combined with other symbols. A
klammerset with symbol X is declared in a file X/X.k, which is what lets two
sets require the same third set without loading it twice.
TESTS. Four new suites: the kdiag command's interface, the @eval primitive's
contract with the outside world, and verbosity at both tiers. Three suites
that could not run on macOS at all now do.
Assembled from dev commit 6c8ee6c22fca.
2026-08-16 01:37:59 +02:00
|
|
|
(void)K::log(1, "Input file \"" + s + "\": " + in_kt_dir.string()
|
|
|
|
|
+ " (found in the kt/ subdirectory)");
|
2026-07-26 23:22:59 +02:00
|
|
|
return in_kt_dir;
|
2026-07-18 18:48:23 +02:00
|
|
|
}
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
Klammerset: the @@@klammerset construct, its search path, and const correctness
The @@@klammerset system command formally declares a klammerset — a
named, logically related group of klammer definitions — with an
operative, idempotent declaration (:requires and :files load in order
at the declaration point, relative to the declaring file). A bare
symbol given to ktext -k, kdesc --input, or :requires resolves to
x/x.k on the search path: the document's directory, then
KLAMMERTEXT_KLAMMERSETS, then KLAMMERTEXT_HOME; kdesc --klammerset
lists the available sets. sks/sks.k is the first declared klammerset,
so `-k sks` loads the SKS by name. The engine's lookup classes were
renamed *_set → *_registry to keep the two concepts apart, and the
whole C++ tree now follows standard const-correctness conventions.
tst/ gains klammerset_test.sh (18 cases).
(from dev 64b1abf23e56)
2026-07-30 23:50:07 +02:00
|
|
|
void Document_class::write(const std::string& filename, const std::string& contents)
|
2026-07-18 18:48:23 +02:00
|
|
|
{
|
|
|
|
|
write_file(filename, contents, write_files);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
Klammerset: the @@@klammerset construct, its search path, and const correctness
The @@@klammerset system command formally declares a klammerset — a
named, logically related group of klammer definitions — with an
operative, idempotent declaration (:requires and :files load in order
at the declaration point, relative to the declaring file). A bare
symbol given to ktext -k, kdesc --input, or :requires resolves to
x/x.k on the search path: the document's directory, then
KLAMMERTEXT_KLAMMERSETS, then KLAMMERTEXT_HOME; kdesc --klammerset
lists the available sets. sks/sks.k is the first declared klammerset,
so `-k sks` loads the SKS by name. The engine's lookup classes were
renamed *_set → *_registry to keep the two concepts apart, and the
whole C++ tree now follows standard const-correctness conventions.
tst/ gains klammerset_test.sh (18 cases).
(from dev 64b1abf23e56)
2026-07-30 23:50:07 +02:00
|
|
|
void write_file(const std::string& filename, const std::string& contents, bool write_p)
|
2026-07-18 18:48:23 +02:00
|
|
|
{
|
|
|
|
|
if (write_p) {
|
|
|
|
|
string_to_file(filename, contents);
|
|
|
|
|
} else {
|
An output policy for the three commands, and @cond as a true special form
A snapshot of the development tree. The substantial changes since the last one:
COMMAND OUTPUT POLICY. The three commands display text in exactly three cases,
and each owns a stream: LOGGING under "-v" greater than 0 and an ERROR before
termination go to STDERR; OUTPUT THE USER ASKED FOR goes to STDOUT. For ktext
that output is a document, so "ktext doc.kt -d | ..." is now safe -- logging
used to share the stream and land inside the document. A bare command prints
its usage and succeeds rather than failing. Colour is emitted only to a
terminal, per stream, and NO_COLOR is honoured.
"-v 1" reports every decision whose outcome you could not have read off your own
input: the klammerset that was loaded and from which file, a font's directory, a
":files" name's file, how "-o" was expanded. Higher levels are the trace.
The commands no longer warn and continue: an anomaly is an error, described with
its location. Two exceptions remain, each for a stated reason -- a condition
that is expected and temporary by design, and a judgment that is a heuristic
rather than exact.
@cond IS NOW A TRUE SPECIAL FORM, resolved at APPLICATION time rather than when
the file is read. Two consequences for a writer:
* a state variable reaches the predicate. "@@@state Flag :value true @@@
@cond *Flag* | T | F @" renders "T"; it used to see the literal "*Flag*" and
silently take the false branch. The document now behaves like a klammer
body, whose arguments are bound before its conditionals are decided.
* nothing in a discarded branch happens -- it is not read, not evaluated, not
expanded. An @eval in the branch not taken used to run anyway.
Its predicate relation is total and strict: true, True, 1; false, False, 0, and
empty; anything else is an error at the @cond rather than silently false.
@eval REACHING OUTSIDE. ":shell" and ":haskell" now keep the command's standard
error out of the document (it appears under "-v 1") and treat a nonzero exit as
an error naming what the command reported. A command that exits nonzero on
purpose -- "grep" finding no match -- says so with "|| true".
KLAMMER SETS. Several combine: "--klammersets a b c" loads all three in the
order given, sharing one namespace, with the definition modes deciding
collisions. "none" means none and may not be combined with other symbols. A
klammerset with symbol X is declared in a file X/X.k, which is what lets two
sets require the same third set without loading it twice.
TESTS. Four new suites: the kdiag command's interface, the @eval primitive's
contract with the outside world, and verbosity at both tiers. Three suites
that could not run on macOS at all now do.
Assembled from dev commit 6c8ee6c22fca.
2026-08-16 01:37:59 +02:00
|
|
|
// Not writing: name the file that would have been written. A
|
|
|
|
|
// derived value, so "-v 1" -- and never on stdout, which carries
|
|
|
|
|
// the document itself.
|
|
|
|
|
(void)K::log(1, "Output filename:", filename);
|
2026-07-18 18:48:23 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
Klammerset: the @@@klammerset construct, its search path, and const correctness
The @@@klammerset system command formally declares a klammerset — a
named, logically related group of klammer definitions — with an
operative, idempotent declaration (:requires and :files load in order
at the declaration point, relative to the declaring file). A bare
symbol given to ktext -k, kdesc --input, or :requires resolves to
x/x.k on the search path: the document's directory, then
KLAMMERTEXT_KLAMMERSETS, then KLAMMERTEXT_HOME; kdesc --klammerset
lists the available sets. sks/sks.k is the first declared klammerset,
so `-k sks` loads the SKS by name. The engine's lookup classes were
renamed *_set → *_registry to keep the two concepts apart, and the
whole C++ tree now follows standard const-correctness conventions.
tst/ gains klammerset_test.sh (18 cases).
(from dev 64b1abf23e56)
2026-07-30 23:50:07 +02:00
|
|
|
void output_msg(const std::string& msg)
|
2026-07-18 18:48:23 +02:00
|
|
|
{
|
|
|
|
|
std::cout << red;
|
|
|
|
|
(void)K::log(1, msg);
|
|
|
|
|
std::cout << black;
|
|
|
|
|
}
|
|
|
|
|
|
Klammerset: the @@@klammerset construct, its search path, and const correctness
The @@@klammerset system command formally declares a klammerset — a
named, logically related group of klammer definitions — with an
operative, idempotent declaration (:requires and :files load in order
at the declaration point, relative to the declaring file). A bare
symbol given to ktext -k, kdesc --input, or :requires resolves to
x/x.k on the search path: the document's directory, then
KLAMMERTEXT_KLAMMERSETS, then KLAMMERTEXT_HOME; kdesc --klammerset
lists the available sets. sks/sks.k is the first declared klammerset,
so `-k sks` loads the SKS by name. The engine's lookup classes were
renamed *_set → *_registry to keep the two concepts apart, and the
whole C++ tree now follows standard const-correctness conventions.
tst/ gains klammerset_test.sh (18 cases).
(from dev 64b1abf23e56)
2026-07-30 23:50:07 +02:00
|
|
|
void Document_class::create_directory(const std::string& directory)
|
2026-07-18 18:48:23 +02:00
|
|
|
{
|
|
|
|
|
if (write_files) {
|
|
|
|
|
fs::create_directories(directory);
|
|
|
|
|
} else {
|
|
|
|
|
output_msg("Output directory: " + directory);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*/
|