summaryrefslogtreecommitdiff
path: root/server/src/formattools.cc
diff options
context:
space:
mode:
authordeva <deva>2008-10-30 13:09:47 +0000
committerdeva <deva>2008-10-30 13:09:47 +0000
commit5968c3af2c26abe61cf98bf45f672835ef4b51ba (patch)
tree5dd6672a8bcd038cc3bc705367b40a226798dc1a /server/src/formattools.cc
parentaa8483b30a4e824ede7f10e03fdd41d2f28c9947 (diff)
Complete but highly unstable implementation of formattools.
Diffstat (limited to 'server/src/formattools.cc')
-rw-r--r--server/src/formattools.cc137
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;
}