#pragma once #include #include #include #include "katom.h" #include "locator.h" class Target { public: Target() = default; // Target(std::vector::iterator begin, std::vector::iterator end, Argtype_registry argtypes); Target(const std::string& name, const std::string& desc, const Locator& loc) : m_name(name) , m_desc(desc) , m_loc(loc) {}; void add_transform(const std::string& original, const std::string& transformed); void add_transforms(const std::string& transforms); void add_transforms(const std::vector>& transforms); void transform(std::vector& katoms) const; void add_escapes(const std::string& escape_spec); std::string escape_text(std::string text) const; std::string unescape_text(std::string text) const; std::string resolve_escapes(std::string text) const; static std::string escape_marker(const std::string& ch); void add_after_apply(const std::string& function_specs); std::string m_name {}; std::string m_desc {}; std::vector m_includes {}; std::vector m_provides {}; std::vector m_after_apply {}; Locator m_loc {}; std::vector> m_transforms {}; std::vector> m_escapes {}; // Argtype_registry m_argtypes {}; }; std::vector> parse_transforms(const std::string& transform_string); // Decode every KTESCKTESC marker in text back to its original // characters. Used for the final output (after target-declared escapes have // been resolved to their replacements) and for programmatic use of argument // values. The Python counterpart is unescape_ktesc() in klammer_base.py. std::string ktesc_resolve(std::string text); // Replace each Klammertext structural character (@ | # ^ : *) in s with its // KTESC marker, so text that has already been interpreted once (quoted // specials, ^'...'^ literal content) survives re-katomization by // sub-Machines and the @eval result read-back. Resolved by ktesc_resolve() // at final processing. std::string hide_structural_characters(const std::string& s);