#ifndef NEW_YORK_TRANSIT_LINE_TEMPLATER_H #define NEW_YORK_TRANSIT_LINE_TEMPLATER_H #include #include #include #include #include "html_case.h" namespace nytl { typedef json::JSON expression_t; namespace element_part_types { enum element_part_type_E { code, /* write statements really mean PUT str2text X */ put, for_put, ref_put }; } typedef element_part_types::element_part_type_E element_part_type_t; struct ElementPart { /* Used with all types */ element_part_type_t type = element_part_types::code; struct when_code_S { std::string lines; } when_code; struct when_put_S { expression_t called_element; std::vector passed_arguments; } when_put; struct when_for_put_S { expression_t ref_over; ssize_t where_key_var = -1; ssize_t where_value_var = -1; std::string internal_element; bool line_feed = true; } when_for_put; struct when_ref_put_S { expression_t ref_over; std::string internal_element; } when_ref_put; }; struct Element { /* Stores signature of element */ std::vector arguments; /* `base` is true for builtin elements (jesc str2code str2text). Parts for such ' are empty */ bool base = false; std::vector parts; }; struct TemplaterDetourRules { std::string root_dir_path; std::string postfix_rule_for_element_cont = ".nytl.html"; std::string postfix_rule_for_static_files = ".html"; }; struct TemplaterSettings { TemplaterDetourRules det; std::string magic_block_start = "{%"; std::string magic_block_end = "%}"; std::function escape = html_case_espace_string; }; typedef std::map global_elem_set_t; struct Templater { TemplaterSettings settings; global_elem_set_t elements; explicit Templater(TemplaterSettings settings); /* Throws exception, derived from std::exception */ void update(); /* Throws exception, derived from std::exception */ std::string render(const std::string& element, const std::vector& arguments) const; }; } #endif