2026-07-18 18:48:23 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <vector>
|
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
|
|
#include "argtype.h"
|
|
|
|
|
#include "katom.h"
|
|
|
|
|
#include "argument_set.h"
|
|
|
|
|
|
|
|
|
|
class Argtype_set
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
static Parameter_set& parameters();
|
|
|
|
|
|
|
|
|
|
Argtype_set();
|
|
|
|
|
|
|
|
|
|
std::string replace_symbols(const std::string& pattern, const Locator& loc);
|
|
|
|
|
void check_for_existing_definition(const std::string& name, const Locator& loc);
|
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).
2026-07-22 18:17:43 +02:00
|
|
|
void add(const std::string& name, const std::string& desc,
|
|
|
|
|
const std::string& pattern, const std::string& default_value,
|
|
|
|
|
const std::string& python_cast, modify_string_f python_format,
|
2026-07-18 18:48:23 +02:00
|
|
|
const Locator& loc);
|
|
|
|
|
void add(std::vector<Katom>::iterator begin, std::vector<Katom>::iterator end, std::vector<Katom>& katoms);
|
|
|
|
|
|
|
|
|
|
Argtype get(const std::string& name, const Locator& loc) const;
|
|
|
|
|
|
|
|
|
|
std::string eval(const std::string& value, const std::string& type_name, const Locator& loc);
|
|
|
|
|
std::string describe(bool long_form=false, int indent_width=4) const;
|
|
|
|
|
|
|
|
|
|
inline bool is_defined(std::string name) {
|
|
|
|
|
return count(m_names.begin(), m_names.end(), name) > 0;
|
|
|
|
|
}
|
|
|
|
|
std::vector<std::string> m_names {};
|
|
|
|
|
std::map<std::string, Argtype> m_types {};
|
|
|
|
|
size_t m_name_size = 0;
|
|
|
|
|
size_t m_pattern_size = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const
|
|
|
|
|
std::string default_argtype = "string";
|
|
|
|
|
|
|
|
|
|
const
|
|
|
|
|
std::vector<std::tuple<std::string, std::string, std::string, std::string, modify_string_f>> base_argtypes = {
|
|
|
|
|
{ "string", "arbitrary text",
|
|
|
|
|
R"((?:.|\n)*)", "str",
|
|
|
|
|
pyformat_string },
|
|
|
|
|
|
|
|
|
|
{ "word", "a series of characters without a space",
|
|
|
|
|
R"([^\s]+)", "str",
|
|
|
|
|
pyformat_string },
|
|
|
|
|
|
|
|
|
|
{ "bool", "a Boolean value of 'false', 'False', '0', 'true', 'True', or '1'",
|
|
|
|
|
R"(0|1|true|false|True|False)",
|
|
|
|
|
"(lambda b : True if b not in {'0','false','False'} else False)",
|
|
|
|
|
pyformat_bool },
|
|
|
|
|
|
|
|
|
|
{ "uint", "an integer greater than or equal to zero",
|
|
|
|
|
R"(\d\d*)", "int",
|
|
|
|
|
pyformat_number },
|
|
|
|
|
|
|
|
|
|
{ "int","an integer",
|
|
|
|
|
R"([-+]?'uint')", "int",
|
|
|
|
|
pyformat_number },
|
|
|
|
|
|
|
|
|
|
{ "float", "a floating-point number",
|
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).
2026-07-22 18:17:43 +02:00
|
|
|
R"([-+]?(\d+(\.\d*)?|\.\d+))", "float",
|
2026-07-18 18:48:23 +02:00
|
|
|
pyformat_number },
|
|
|
|
|
|
|
|
|
|
{ "fraction", "a number in the form 'n/d'",
|
|
|
|
|
R"('int'/'uint')", "(lambda f : float(f.split('/')[0]) / float(f.split('/')[1]))",
|
|
|
|
|
pyformat_number },
|
|
|
|
|
|
|
|
|
|
{ "list", "list of elements separated by whitespace",
|
|
|
|
|
R"((?:.|\n)*)", "(lambda s : s.split())",
|
|
|
|
|
pyformat_list },
|
|
|
|
|
|
|
|
|
|
{ "dlist", "list of elements separated by the first word",
|
|
|
|
|
R"((?:.|\n)*)", "",
|
|
|
|
|
pyformat_dlist },
|
|
|
|
|
|
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).
2026-07-22 18:17:43 +02:00
|
|
|
{ "rest", "the remaining arguments as a list nested to N dimensions "
|
|
|
|
|
"(rest(N)); the delimiter for dimension n is a run of n bar "
|
|
|
|
|
"characters, so | separates elements and || lists of elements",
|
|
|
|
|
R"((?:.|\n)*)", R"((lambda s : __import__("kutil").rest_split(s, N)))",
|
|
|
|
|
nullptr },
|
2026-07-18 18:48:23 +02:00
|
|
|
|
|
|
|
|
{ "literal", "literal text passed without interpretation",
|
|
|
|
|
R"((?:.|\n)*)", "str",
|
|
|
|
|
pyformat_string },
|
|
|
|
|
};
|