2026-07-18 18:48:23 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <variant>
|
|
|
|
|
#include <functional>
|
|
|
|
|
#include <regex>
|
|
|
|
|
|
|
|
|
|
#include "locator.h"
|
|
|
|
|
|
|
|
|
|
using argtype_t = std::variant<bool,double,std::string,std::vector<std::string>>;
|
|
|
|
|
|
|
|
|
|
using modify_string_f = std::function<std::string(std::vector<std::string>)>;
|
|
|
|
|
|
|
|
|
|
class Argtype
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
Argtype()
|
|
|
|
|
: m_name("default")
|
|
|
|
|
, m_desc("default argument type")
|
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
|
|
|
, m_symbolic_pattern(R"((?:.|\n)*)")
|
|
|
|
|
, m_pattern(R"((?:.|\n)*)")
|
2026-07-18 18:48:23 +02:00
|
|
|
, m_python_cast("str")
|
|
|
|
|
, m_python_format()
|
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
|
|
|
, m_regex(std::regex(R"((?:.|\n)*)"))
|
2026-07-18 18:48:23 +02:00
|
|
|
, m_loc()
|
|
|
|
|
{};
|
|
|
|
|
|
|
|
|
|
Argtype(std::string name, std::string desc, std::string symbolic_pattern, std::string pattern,
|
2026-07-28 22:24:32 +02:00
|
|
|
std::string default_value, std::string alone_value,
|
|
|
|
|
std::string python_cast, modify_string_f python_format,
|
2026-07-18 18:48:23 +02:00
|
|
|
const Locator& loc);
|
|
|
|
|
|
|
|
|
|
std::string python_value(const std::string& var_name, std::vector<std::string> value, size_t name_size);
|
|
|
|
|
|
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
|
|
|
// True for the match-everything pattern shared by the string family
|
|
|
|
|
// (string, rest, literal, and the default type). Validating against
|
|
|
|
|
// it is pointless, and running std::regex over a large value (e.g.
|
|
|
|
|
// @document's :text holding a whole document) overflows the regex
|
|
|
|
|
// executor's recursion stack.
|
|
|
|
|
bool matches_all() const { return m_pattern == R"((?:.|\n)*)"; };
|
|
|
|
|
|
2026-07-18 18:48:23 +02:00
|
|
|
std::string m_name {};
|
|
|
|
|
std::string m_desc {};
|
|
|
|
|
std::string m_symbolic_pattern {};
|
|
|
|
|
std::string m_pattern {};
|
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
|
|
|
// Default value for parameters of this type; a default given in a
|
|
|
|
|
// klammer's parameter declaration overrides it (see
|
|
|
|
|
// parse_optional_parameter). Useful for single-purpose types
|
|
|
|
|
// (cell_hpos, column_width); general types (bool, float) have no
|
|
|
|
|
// sensible universal default and leave it empty.
|
|
|
|
|
std::string m_default {};
|
2026-07-28 22:24:32 +02:00
|
|
|
// Value for an optional argument whose name is written alone, with no
|
|
|
|
|
// value after it (:number rather than :number 10). Declared by the
|
|
|
|
|
// argument type, never by a klammer's parameter declaration: the
|
|
|
|
|
// default is what a klammer means by silence and is properly
|
|
|
|
|
// per-klammer, but a bare option name must read the same way in every
|
|
|
|
|
// klammer or the writer cannot know what it means without consulting
|
|
|
|
|
// each signature. bool declares "true", which is where the
|
|
|
|
|
// presence-means-true convention comes from; a type whose pattern
|
|
|
|
|
// matches everything cannot declare it (the value would swallow the
|
|
|
|
|
// following text instead). Empty means the type has no alone value,
|
|
|
|
|
// and a bare option name yields the empty string as before.
|
|
|
|
|
std::string m_alone {};
|
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
|
|
|
// Type parameter for parameterized types like rest(2): the value N
|
|
|
|
|
// is bound around the python cast as (lambda N: <cast>)(2)(...).
|
|
|
|
|
// Empty means unparameterized; a type with a default parameter
|
|
|
|
|
// (rest -> "1") is specialized by writing type(N) in a declaration.
|
|
|
|
|
std::string m_parameter {};
|
2026-07-18 18:48:23 +02:00
|
|
|
std::string m_python_cast {};
|
|
|
|
|
modify_string_f m_python_format {};
|
|
|
|
|
std::regex m_regex {};
|
|
|
|
|
int m_count {1};
|
|
|
|
|
int m_mincount {1};
|
|
|
|
|
int m_maxcount {1};
|
|
|
|
|
Locator m_loc;
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
std::string pyformat_string(const std::vector<std::string>& value);
|
|
|
|
|
std::string pyformat_bool(const std::vector<std::string>& value);
|
|
|
|
|
std::string pyformat_number(const std::vector<std::string>& value);
|
|
|
|
|
std::string pyformat_list(const std::vector<std::string>& value);
|
|
|
|
|
std::string pyformat_dlist(const std::vector<std::string>& value);
|