HTML to SPIFF template bootstrap 5

This commit is contained in:
Rene Zeldenthuis
2022-09-10 23:27:41 +02:00
parent 4381af77e9
commit ac8064f20c
8 changed files with 285 additions and 91 deletions

View File

@@ -6,12 +6,46 @@ typedef struct
{
const char *key;
const String value;
} template_substitution_t;
} template_variable_t;
template <typename T, size_t n>
inline String template_render(const char *format, T (&values)[n])
inline String template_render(const String& format, T (&values)[n])
{
auto s = String(format);
// Conditional sections
for (size_t i = 0; i < n; i++)
{
// Include Section {{#expr}}
auto match_section_begin = "{{#" + String(values[i].key) + "}}";
// Inverted section {{^expr}}
auto match_section_inverted_begin = "{{^" + String(values[i].key) + "}}";
// End section {{/expr}}
auto match_section_end = "{{/" + String(values[i].key) + "}}";
while (true)
{
bool inverted = false;
auto first = s.indexOf(match_section_begin);
if (first < 0)
{
inverted = true;
first = s.indexOf(match_section_inverted_begin);
if (first < 0)
break;
}
auto second = s.indexOf(match_section_end, first + match_section_begin.length());
if (second < 0)
break;
// Arduino returns 0 and 1 for bool.toString()
if ((!inverted && (values[i].value == "1")) || (inverted && (values[i].value == "0")))
s = s.substring(0, first) + s.substring(first + match_section_begin.length(), second) + s.substring(second + match_section_end.length());
else
s = s.substring(0, first) + s.substring(second + match_section_end.length());
}
}
// Replace variables {{variable}}
for (size_t i = 0; i < n; i++)
s.replace("{{" + String(values[i].key) + "}}", values[i].value);