katom types from ref/ in groups, @table :leading in lines of text and :rulesep, @code under txt, one table style attribute, literal-klammer options (from dev 2e453744f5e9)
kdesc --katoms is Klammertext rendered from ref/, the types in titled groups, with --katoms full for the regex column. @table :leading L is L lines of the surrounding text in html as in pdf (default 1), and :rulesep spaces the horizontal rules. The html table has one style attribute, so :column_width fractions take effect again. @code and @source_listing render in plain text; captions are numbered per kind there, and a table needs no blank line around it. @c takes :nd, and an option-shaped word before a bar inside literal code is code. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
63956c00e5
commit
217c0f3fc5
23 files changed
+625
-290
No files matched your search
+11
-116
@@ -2,6 +2,7 @@
|
||||
#include <iomanip>
|
||||
#include <algorithm>
|
||||
#include <utility>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "locator.h"
|
||||
#include "ktype.h"
|
||||
@@ -43,127 +44,21 @@ bool is_deftype(katom_t type)
|
||||
type == katom_t::klammer_default;
|
||||
}
|
||||
|
||||
std::string pattern_display(Ktype t)
|
||||
const Ktype& type_to_katom_instance(katom_t type)
|
||||
{
|
||||
std::string pat{};
|
||||
if (t.m_type == katom_t::space) {
|
||||
pat = "<space>";
|
||||
} else if (t.m_type == katom_t::newline) {
|
||||
pat = "\\n";
|
||||
} else if (t.m_type == katom_t::ws_space) {
|
||||
pat = "#+ or #+<number>";
|
||||
} else if (t.m_type == katom_t::ws_newline) {
|
||||
pat = "#/ or #/<number>";
|
||||
} else if (t.m_type == katom_t::special) {
|
||||
pat = "^@, ^|, ^#, ^:, or ^^";
|
||||
} else if (t.m_type == katom_t::apply_end) {
|
||||
pat = "@ or <name>@";
|
||||
} else if (t.m_type == katom_t::define_end) {
|
||||
pat = "@@ or <name>@@";
|
||||
} else if (t.m_type == katom_t::machine_end) {
|
||||
pat = "@@@ or <name>@@@";
|
||||
} else if (t.m_type == katom_t::ws_added) {
|
||||
pat = "<space> or \\n";
|
||||
} else if (t.m_type == katom_t::word) {
|
||||
pat = "<only-letters>";
|
||||
} else if (t.m_type == katom_t::text) {
|
||||
pat = "<no-special-chars>";
|
||||
} else if (t.m_type == katom_t::nonascii) {
|
||||
pat = "^<code> or ^<code>^";
|
||||
} else {
|
||||
pat = t.m_pattern;
|
||||
pat = string_replace(pat, definition_name, "<name>");
|
||||
pat = string_replace(pat, "\\", "");
|
||||
auto var = std::find_if(katom_types.begin(), katom_types.end(),
|
||||
[&] (const Ktype& t) { return t.m_type == type; });
|
||||
if (var == katom_types.end()) {
|
||||
throw std::logic_error(
|
||||
"type_to_katom_instance: katom type " +
|
||||
std::to_string(static_cast<int>(type)) +
|
||||
" has no entry in katom_types. See file mac/ktype.h.");
|
||||
}
|
||||
return pat;
|
||||
}
|
||||
|
||||
std::string regex_display(Ktype t)
|
||||
{
|
||||
std::string rgx{};
|
||||
if (t.m_type == katom_t::space) {
|
||||
rgx = "<space>";
|
||||
} else if (t.m_type == katom_t::newline) {
|
||||
rgx = "\\n";
|
||||
} else {
|
||||
rgx = t.m_pattern;
|
||||
}
|
||||
return rgx;
|
||||
}
|
||||
|
||||
Ktype find_katom_type(katom_t type)
|
||||
{
|
||||
for (auto t : katom_types) {
|
||||
if (t.m_type == type) {
|
||||
return t;
|
||||
}
|
||||
}
|
||||
throw Internal_error("Unknown katom_t: " + std::to_string((int)type));
|
||||
}
|
||||
|
||||
void describe_katoms(bool show_regex)
|
||||
{
|
||||
size_t name_w = 0;
|
||||
size_t pattern_w = 0;
|
||||
size_t regex_w = 0;
|
||||
size_t description_w = 0;
|
||||
std::stringstream ss {};
|
||||
ss << R"(
|
||||
A "katom" is an individual element in the Klammertext input text.
|
||||
Each katom has a type, listed below. You can see how Klammertext
|
||||
divides up text into katoms with the "kdiag" command.)" << "\n\n";
|
||||
if (show_regex) {
|
||||
ss << R"(The "Regex" column is the argument to the std::regex C++ function.)";
|
||||
} else {
|
||||
ss << R"(In the katom patterns, "<name>" is a word that begins with a letter
|
||||
and only contains letters, numbers, or the underscore (_) or period (.) characters. )";
|
||||
}
|
||||
ss << "A <number> is an integer greater than or equal to 1. "
|
||||
"A <code> is one of the non-ASCII codes that are displayed by the command "
|
||||
"\"kdesc -c\".";
|
||||
|
||||
for (auto t : katom_types) {
|
||||
name_w = std::max(name_w, t.m_name.size());
|
||||
pattern_w = std::max(pattern_w, pattern_display(t).size());
|
||||
regex_w = std::max(regex_w, regex_display(t).size());
|
||||
description_w = std::max(description_w, t.m_description.size());
|
||||
}
|
||||
pattern_w++;
|
||||
regex_w++;
|
||||
|
||||
std::cout << justify(ss.str()) << "\n\n"
|
||||
<< std::setfill(' ') << boldblack << std::right << std::setw(6) << "Index"
|
||||
<< std::left
|
||||
<< std::setw(name_w) << " Name" << " ";
|
||||
if (show_regex) {
|
||||
std::cout << std::setw(regex_w) << " Regex" << " ";
|
||||
} else {
|
||||
std::cout << std::setw(pattern_w) << " Pattern" << " ";
|
||||
}
|
||||
std::cout << std::setw(description_w) << "Description"
|
||||
<< "\n" << black;
|
||||
|
||||
for (auto typ : katom_type_display_order) {
|
||||
auto t = find_katom_type(typ);
|
||||
std::cout << " " << std::right << std::setw(3)
|
||||
<< static_cast<int>(t.m_type) << " "
|
||||
<< std::left
|
||||
<< std::setw(name_w) << t.m_name << " ";
|
||||
if (show_regex) {
|
||||
std::cout << std::setw(regex_w) << regex_display(t) << " ";
|
||||
} else {
|
||||
std::cout << std::setw(pattern_w) << pattern_display(t) << " ";
|
||||
}
|
||||
|
||||
std::cout << std::setw(description_w) << t.m_description << "\n";
|
||||
}
|
||||
std::cout << "\n";
|
||||
return *var;
|
||||
}
|
||||
|
||||
|
||||
std::string type_to_name(katom_t type)
|
||||
{
|
||||
auto var = std::find_if(katom_types.begin(), katom_types.end(),
|
||||
[&] (Ktype t) { return t.m_type == type; });
|
||||
return var->m_name;
|
||||
return type_to_katom_instance(type).m_name;
|
||||
}
|
||||
Reference in new issue
Block a user