feat(argtype): :alone - the value of an option written without one
An optional argument has three values: the default (the name is absent), the argument type's :alone value (the name is written alone), and a written value. :alone is declared by the argument type only, never by a klammer's parameter declaration -- a default is what one klammer means by silence, but a bare option name must read the same way in every klammer. The bool type declares :alone true, which is the whole of the convention that a bare boolean option means true; there is no boolean special case in the engine. A type whose pattern matches running text cannot declare :alone, since an option's value runs to the next bar or option name and would swallow the following text. kdesc and `ktext -m` now show [default: X] and [alone: Y] per argument type. In the Standard Klammer Set: @code :number becomes a bool (it was an untyped string tested only for truthiness, so a bare :number was a no-op); decimal_mark declares :alone comma; table_hline and table_vline declare :alone all. The 35 bools that default false gained the bare form for free. Tests: tst/alone_test.sh (21 cases) joins the shipped suite. (from dev 6024f49c2859)
This commit is contained in:
@@ -417,6 +417,16 @@ Parameter_set::value_map(
|
||||
}
|
||||
auto optional_values = check_optional(optional, loc);
|
||||
for (auto [key, value] : optional_values) {
|
||||
// check_optional returns only the options that were actually
|
||||
// written, so an empty value here means the name was written alone
|
||||
// (":number" rather than ":number 10") — distinct from the option
|
||||
// being absent, which is filled from the default below. The
|
||||
// argument type supplies the alone value; bool declares "true",
|
||||
// which is what makes a bare boolean option mean true.
|
||||
const Parameter* parameter = find(key);
|
||||
if (value.empty() && parameter && !parameter->m_argtype.m_alone.empty()) {
|
||||
value = parameter->m_argtype.m_alone;
|
||||
}
|
||||
values[key] = value;
|
||||
}
|
||||
for (auto opt : m_optional) {
|
||||
|
||||
Reference in New Issue
Block a user