Typed arguments, calculated tables, spans, closed-world fonts, top-level fnt/ and env/

Sync with klammertext-dev through b90b0e09:

- Argument types end to end: :python_cast values are applied (Python
  @eval receives real bools/numbers/lists), argument values are
  validated against their argtype patterns with the argtype's
  description as the error message, argtypes can declare :default
  (overridable per declaration), and parameterized type families are
  supported: rest(N) casts a rest argument to an N-dimensional list
  (bar-count = dimension).
- Unified indexed_range syntax (selector with parenthesized subsets,
  composable mnemonic names) for table lines and spans.
- Table klammer: caption fonts fixed in both targets, :column_width /
  :leading / :colsep wired, :colspan and :rowspan render (HTML
  attributes; \multicolumn / \multirow), calculated cell values (:calc)
  with prefix operators, display-precision semantics, :calc_format and
  :decimal period|comma.
- Fonts: closed-world resolution on the Klammertext font store
  (infrastructure in mac/font_store; no Google Fonts links or fetch).
  Default fonts live in the top-level fnt/; additional fonts install
  into KLAMMERTEXT_FONTS directories via kdesc --font (list, samples,
  preview, install — classification by font metadata).  CSS font family
  names are quoted (digit-initial families were silently lost).
- Environment files moved from mac/env/ to the top-level env/; shell
  profiles source env/runtime.env.  Dead per-host variants removed.
- Container: fnt/ ships in the image; curl removed (no network use).
This commit is contained in:
2026-07-22 18:17:43 +02:00
parent 6b75aa0c54
commit 8a2699a253
100 changed files with 1726 additions and 1152 deletions

View File

@@ -25,9 +25,9 @@ std::vector<std::string> Frame::names() const
}
void Frame::set(std::string name, std::string value,
std::string delim, std::string desc, Locator loc)
std::string delim, std::string desc, Locator loc, Argtype argtype)
{
Var v(name, value, delim, desc, loc);
Var v(name, value, delim, desc, loc, argtype);
m_vars[name] = v;
}
@@ -70,7 +70,7 @@ void State::close_frame()
}
void State::set(std::string name, std::string value, bool update,
std::string delim, std::string desc, Locator loc)
std::string delim, std::string desc, Locator loc, Argtype argtype)
{
if (m_frames.empty()) {
std::stringstream ss {};
@@ -86,7 +86,7 @@ void State::set(std::string name, std::string value, bool update,
<< q_(current.m_value) << ".";
throw Argument_error(ss.str(), current.m_loc);
}
m_frames[0].set(name, value, delim, desc, loc);
m_frames[0].set(name, value, delim, desc, loc, argtype);
}
void State::set(std::map<std::string, std::string> varmap)
@@ -96,6 +96,16 @@ void State::set(std::map<std::string, std::string> varmap)
}
}
void State::set(const std::map<std::string, std::string>& varmap,
const Parameter_set& parameters)
{
for (const auto& [name, value] : varmap) {
const Parameter* parameter = parameters.find(name);
set(name, value, false, " ", "", Locator(),
parameter ? parameter->m_argtype : Argtype());
}
}
void State::replace(std::string name, std::string value, bool error_if_not_defined)
{
@@ -269,13 +279,8 @@ std::string State::python_code()
<< margin << std::left << std::setw(name_length) << "K_eval_id" << " = "
<< State::class_id++ << "\n";
for (const auto& name : names) {
// auto [var_value, argtype] = value_type(name);
// ss << argtype.python_value(name, var_value, name_length) << "\n";
std::string v = value(name);
v = string_replace(v, "\\", "\\\\");
v = string_replace(v, "\"", "\\\"");
std::string var_value = qq_(v);
ss << margin << std::left << std::setw(name_length) << name << " = " << var_value << "\n";
Var var = get(name);
ss << var.m_argtype.python_value(name, {var.m_value}, name_length) << "\n";
}
}
// msg() << ss.str() << "\n";