diff options
Diffstat (limited to 'server/src/formattools.cc')
-rw-r--r-- | server/src/formattools.cc | 137 |
1 files changed, 132 insertions, 5 deletions
diff --git a/server/src/formattools.cc b/server/src/formattools.cc index 883f6ba..b90ca51 100644 --- a/server/src/formattools.cc +++ b/server/src/formattools.cc @@ -26,6 +26,8 @@ */ #include "formattools.h" +#include "luaformatmapper.h" + /** * Replace all ocurrences of c with cc. */ @@ -39,6 +41,22 @@ static std::string escape_string(std::string str, char c) return out; } +/** + * Replace all ocurrences of cc with c. + */ +static std::string deescape_string(std::string str, char c) +{ + std::string out; + for(size_t i = 0; i < str.length(); i++) { + if(i < str.length() - 1 && str[i] == c && str[i + 1] == c) { + // We simply do nothing here, thus skipping the current character. + } else { + out += str[i]; + } + } + return out; +} + std::string escape_multilist_string(std::string str) { return escape_string(escape_string(str, '{'), '}'); @@ -49,29 +67,138 @@ std::string escape_resume_string(std::string str) return escape_string(escape_string(str, '['), ']'); } -std::map<std::string, std::string> get_multilist_values(std::string str) +// FIXME: This function doesn't work... reimplement using regexps. +Fields get_multilist_values(std::string str) { std::map<std::string, std::string> values; + + // Replace ${foo|bar} with bar + for(size_t i = 0; i < str.length(); i++) { + if(str[i] == '$') { + if(i < str.length() - 2 && + str[i+1] == '{' && str[i+2] != '{') { + // We are in a key/value + + // Look for end marker, and | + size_t j; + for(j = i + 2; j < str.length(); j++) { + if(str[j] == '}' && str[j + 1] != '}') { + // We have an end marker + break; + } + } + + std::string key_value = str.substr(i + 2, j - (i + 2)); + printf("Found [%s]\n", key_value.c_str()); + + std::string value = key_value.substr(key_value.find('|') + 1); + std::string key = key_value.substr(0, key_value.find('|') - 1); + + values[key] = value; + + i = j; + + } + } + } + return values; } + +// FIXME: This function doesn't work... reimplement using regexps. std::string render_multilist_string(std::string str) { - return str; + std::string out; + + // Replace ${foo|bar} with bar + for(size_t i = 0; i < str.length(); i++) { + if(str[i] == '$') { + if(i < str.length() - 2 && + str[i+1] == '{' && str[i+2] != '{') { + // We are in a key/value + + // Look for end marker, and | + size_t j; + for(j = i + 2; j < str.length(); j++) { + if(str[j] == '}' && str[j + 1] != '}') { + // We have an end marker + break; + } + } + + std::string key_value = str.substr(i + 2, j - (i + 2)); + printf("Found [%s]\n", key_value.c_str()); + + std::string value = key_value.substr(key_value.find('|') + 1); + + out += value; + + i = j; + + } else out += str[i]; + } else { + out += str[i]; + } + } + + return deescape_string(deescape_string(out, '{'), '}'); } -std::string render_resume_string(std::string str) +std::string render_resume_string(std::string str, Fields &fields) { - return str; + std::string out; + + LUAFormatMapper mapper(fields); + + // Replace ${foo|bar} with bar + for(size_t i = 0; i < str.length(); i++) { + if(str[i] == '$') { + if(i < str.length() - 2 && + str[i+1] == '[' && str[i+2] != '[') { + // We are in a key/value + + // Look for end marker, and | + size_t j; + for(j = i + 2; j < str.length(); j++) { + if(str[j] == ']' && str[j + 1] != ']') { + // We have an end marker + break; + } + } + + std::string luaprogram = str.substr(i + 2, j - (i + 2)); + printf("Found [%s]\n", luaprogram.c_str()); + + std::string value = mapper.map(luaprogram); + + out += value; + + i = j; + + } else out += str[i]; + } else { + out += str[i]; + } + } + + return deescape_string(deescape_string(out, '['), ']'); } #ifdef TEST_FORMATTOOLS int main() { + Fields fields; + fields["dingo"] = "[[meget dyr]]"; + fields["fnuld"] = "Zimbabwe"; + + printf("%s\n", deescape_string(deescape_string("[[] []]", '['), ']').c_str()); + if(escape_multilist_string("${} {{}}") != "${{}} {{{{}}}}") return 1; if(escape_resume_string("$[] [[]]") != "$[[]] [[[[]]]]") return 1; - + printf("{%s}\n", render_multilist_string("Ladidaa ${foo|bar} ${{dingo|dyt}} ${dims|dulle}.").c_str()); + printf("{%s}\n", render_resume_string("Ladidaa $[return 'dims' .. dingo] $[[et eller andet]] $[return 'noget andet'].", fields).c_str()); return 0; } |