summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/formattools.cc109
-rw-r--r--server/src/luaformatmapper.cc17
-rw-r--r--server/src/luaformatmapperutils.cc98
-rw-r--r--server/src/mltokenizer.cc196
-rw-r--r--server/src/mltokenizer.h55
5 files changed, 300 insertions, 175 deletions
diff --git a/server/src/formattools.cc b/server/src/formattools.cc
index 63cfec6..6a58d74 100644
--- a/server/src/formattools.cc
+++ b/server/src/formattools.cc
@@ -25,7 +25,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
#include "formattools.h"
-
+#include "mltokenizer.h"
#include "luaformatmapper.h"
/**
@@ -49,7 +49,8 @@ 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.
+ out += str[i];
+ i++; // Skip the next character
} else {
out += str[i];
}
@@ -67,82 +68,32 @@ std::string escape_resume_string(std::string str)
return escape_string(escape_string(str, '['), ']');
}
-// FIXME: This function doesn't work... reimplement using regexps.
-Fields get_multilist_values(std::string str)
+Fields get_multilist_values(std::string mlvalue)
{
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;
-
- }
- }
+ std::vector< mltoken_t > tokens = mltokenize(mlvalue);
+ std::vector< mltoken_t >::iterator i = tokens.begin();
+ while(i != tokens.end()) {
+ if(i->type == MLTT_VALUE) values[i->name] = i->value;
+ i++;
}
return values;
}
-
-// FIXME: This function doesn't work... reimplement using regexps.
-std::string render_multilist_string(std::string str)
+std::string render_multilist_string(std::string mlvalue)
{
- 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);
+ std::string output;
- out += value;
-
- i = j;
-
- } else out += str[i];
- } else {
- out += str[i];
- }
+ std::vector< mltoken_t > tokens = mltokenize(mlvalue);
+ std::vector< mltoken_t >::iterator i = tokens.begin();
+ while(i != tokens.end()) {
+ output += i->value;
+ i++;
}
-
- return deescape_string(deescape_string(out, '{'), '}');
+
+ return output;
}
std::string render_resume_string(std::string str, Fields &fields)
@@ -158,7 +109,7 @@ std::string render_resume_string(std::string str, Fields &fields)
str[i+1] == '[' && str[i+2] != '[') {
// We are in a key/value
- // Look for end marker, and |
+ // Look for end marker
size_t j;
for(j = i + 2; j < str.length(); j++) {
if(str[j] == ']' && str[j + 1] != ']') {
@@ -168,11 +119,8 @@ std::string render_resume_string(std::string str, Fields &fields)
}
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;
+ out += escape_resume_string(value);
i = j;
@@ -192,19 +140,28 @@ int main()
Fields fields;
fields["dingo"] = "[[meget dyr]]";
fields["fnuld"] = "Zimbabwe";
- fields["mlstring"] = "Ladidaa ${foo|bar} ${{dingo|dyt}} ${dims|dulle}.";
+ fields["mlstring"] =
+ "Ladidaa ${myname|bar} ${{dingo|dyt}} ${dims|{{dimmer}}}.\n"
+ "Ladidaa ${myname|bole} ${{dingo|dyt}} ${dims|[[fillerhejs]]}.\n"
+ "Ladidaa ${myname|daske} ${{dingo|dyt}} ${dims|buller}.\n";
+ /*
printf("%s\n", deescape_string(deescape_string("[[] []]", '['), ']').c_str());
if(escape_multilist_string("${} {{}}") != "${{}} {{{{}}}}") return 1;
if(escape_resume_string("$[] [[]]") != "$[[]] [[[[]]]]") return 1;
- std::string mlstring = "Ladidaa ${foo|bar} ${{dingo|dyt}} ${dims|dulle}.";
+ std::string mlstring = "Ladidaa ${myname|bar} ${{dingo|dyt}} ${dims|dulle}.";
printf("{%s}\n", render_multilist_string(mlstring).c_str());
+ */
- // std::string resumestring = "Ladidaa $[printval('dims' .. dingo)] $[[et eller andet]] $[printval('noget andet')].";
- std::string resumestring = "Ladidaa \n$[printfmlval('mlstring', ' * ', true, '<p>', 'myname', '</p>')] dalidaadoo.";
+ std::string resumestring = "Ladidaa \n$["
+ "printfmlval(mlstring, ' * ', true, '<p>', 'myname', '</p>', 'PRE', 'dims', 'POST')"
+ "] dalidaadoo.";
printf("{%s}\n", render_resume_string(resumestring, fields).c_str());
+
+ // std::string resumestring2 = "Ladidaa \n$[printfmlval(mlstring, ' * ', false, '<p>', 'myname', '</p>', 'PRE', 'dims', 'POST')] dalidaadoo.";
+ // printf("{%s}\n", render_resume_string(resumestring2, fields).c_str());
return 0;
}
diff --git a/server/src/luaformatmapper.cc b/server/src/luaformatmapper.cc
index 6c0115d..652a34d 100644
--- a/server/src/luaformatmapper.cc
+++ b/server/src/luaformatmapper.cc
@@ -31,20 +31,22 @@
#include "exception.h"
#include "luaformatmapperutils.h"
-
+/*
static std::string loadresultstring(Fields &fields)
{
std::string s;
Fields::iterator v = fields.begin();
while(v != fields.end()) {
- s += (*v).first + " = \"" + (*v).second + "\"\n";
+ lua_pushstring(L, v->second); // Push the pointer to 'this' instance
+ lua_setglobal(L, v->first); // Assign it to a global lua var.
+ // s += (*v).first + " = \"" + (*v).second + "\"\n";
v++;
}
return s;
}
-
+*/
LUAFormatMapper::LUAFormatMapper(Fields &fields)
{
L = luaL_newstate();
@@ -58,6 +60,13 @@ LUAFormatMapper::LUAFormatMapper(Fields &fields)
setGlobal(L, "LUAFormatMapper", this);
preload_formatutils(L);
+ Fields::iterator v = fields.begin();
+ while(v != fields.end()) {
+ lua_pushstring(L, v->second.c_str()); // Push the pointer to 'this' instance
+ lua_setglobal(L, v->first.c_str()); // Assign it to a global lua var.
+ v++;
+ }
+ /*
std::string preload = loadresultstring(fields);
if(luaL_loadbuffer(L, preload.c_str(), preload.size(), "preload")) {
@@ -70,7 +79,7 @@ LUAFormatMapper::LUAFormatMapper(Fields &fields)
error(lua_tostring(L, lua_gettop(L)));
return;
}
-
+ */
clean_top = lua_gettop(L);
}
diff --git a/server/src/luaformatmapperutils.cc b/server/src/luaformatmapperutils.cc
index 228c9f5..b163477 100644
--- a/server/src/luaformatmapperutils.cc
+++ b/server/src/luaformatmapperutils.cc
@@ -26,6 +26,7 @@
*/
#include "luaformatmapperutils.h"
#include "luaformatmapper.h"
+#include "mltokenizer.h"
#include <string>
#include <vector>
@@ -88,97 +89,6 @@ void setGlobal(lua_State *L, const char *name, void *p)
}
}
-typedef enum {
- MLTT_VALUE,
- MLTT_TEXT,
- MLTT_ENDOFITEM, // newline
- MLTT_UNDEFINED
-} mltokentype_t;
-
-typedef struct {
- mltokentype_t type;
- std::string name;
- std::string value;
-} mltoken_t;
-
-std::vector< mltoken_t > mltokenize(std::string mlvalue)
-{
- std::vector< mltoken_t > tokens;
- /*
- mltoken_t token;
- token = MLTT_UNDEFINED;
- for(size_t i = 0; i < mlvalue.length(); i++) {
- switch(mlvalue[i]) {
- case '$':
- case '[':
- case ']':
- case '\n':
- default:
- }
- }
- */
- {
- mltoken_t token;
- token.type = MLTT_TEXT;
- token.value = "noget tekst ";
- tokens.push_back(token);
- }
-
- {
- mltoken_t token;
- token.type = MLTT_VALUE;
- token.name = "myname";
- token.value = "myvalue";
- tokens.push_back(token);
- }
-
- {
- mltoken_t token;
- token.type = MLTT_TEXT;
- token.value = " noget mere tekst";
- tokens.push_back(token);
- }
-
- {
- mltoken_t token;
- token.type = MLTT_ENDOFITEM;
- token.value = "\n";
- tokens.push_back(token);
- }
-
- // en entry mere...
- {
- mltoken_t token;
- token.type = MLTT_TEXT;
- token.value = "yet another ";
- tokens.push_back(token);
- }
-
- {
- mltoken_t token;
- token.type = MLTT_VALUE;
- token.name = "myname";
- token.value = "another value";
- tokens.push_back(token);
- }
-
- {
- mltoken_t token;
- token.type = MLTT_TEXT;
- token.value = " and thats final!";
- tokens.push_back(token);
- }
-
- {
- mltoken_t token;
- token.type = MLTT_ENDOFITEM;
- token.value = "\n";
- tokens.push_back(token);
- }
-
- return tokens;
-}
-
typedef struct {
std::string prefix;
std::string postfix;
@@ -207,20 +117,18 @@ int printfmlval(lua_State *L)
std::string bullet = lua_tostring(L, lua_gettop(L) - (n - 2));
bool usetext = lua_toboolean(L, lua_gettop(L) - (n - 3));
- printf("[%s], [%s], [%d]\n", mlvalue.c_str(), bullet.c_str(), usetext); fflush(stdout);
+ // printf("[%s], [%s], [%d]\n", mlvalue.c_str(), bullet.c_str(), usetext); fflush(stdout);
// Read in the (prefix, name, postfix) 3-tuples
int m = 4;
while(m < lua_gettop(L)) {
- printf("!\n"); fflush(stdout);
-
transform_params_t p;
p.prefix = lua_tostring(L, lua_gettop(L) - (n - m));
std::string name = lua_tostring(L, lua_gettop(L) - (n - (m + 1)));
p.postfix = lua_tostring(L, lua_gettop(L) - (n - (m + 2)));
- printf("[%s], [%s], [%s]\n", p.prefix.c_str(), name.c_str(), p.postfix.c_str()); fflush(stdout);
+ // printf("[%s], [%s], [%s]\n", p.prefix.c_str(), name.c_str(), p.postfix.c_str()); fflush(stdout);
transforms[name] = p;
diff --git a/server/src/mltokenizer.cc b/server/src/mltokenizer.cc
new file mode 100644
index 0000000..91d5b4b
--- /dev/null
+++ b/server/src/mltokenizer.cc
@@ -0,0 +1,196 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * mltokenizer.cc
+ *
+ * Tue Nov 4 08:46:35 CET 2008
+ * Copyright 2008 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Pracro.
+ *
+ * Pracro is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Pracro is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Pracro; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "mltokenizer.h"
+
+static std::string rereplaceescaping(std::string mlvalue)
+{
+ std::string output;
+ size_t i = 0;
+ while(i < mlvalue.length()) {
+ if(mlvalue[i] == '\1') {
+ output += '{';
+ i++;
+ } else if(mlvalue[i] == '\2') {
+ output += '}';
+ i++;
+ } else {
+ output += mlvalue[i];
+ i++;
+ }
+ }
+ return output;
+}
+
+static std::string replaceescaping(std::string mlvalue)
+{
+ std::string output;
+ size_t i = 0;
+ while(i < mlvalue.length()) {
+ if(i < mlvalue.length() - 1 && mlvalue[i] == '{' && mlvalue[i + 1] == '{') {
+ output += '\1';
+ i+=2;
+ } else if(i < mlvalue.length() - 1 && mlvalue[i] == '}' && mlvalue[i + 1] == '}') {
+ output += '\2';
+ i+=2;
+ } else {
+ output += mlvalue[i];
+ i++;
+ }
+ }
+ return output;
+}
+
+static std::string gettoken(std::string input, size_t start, std::string term)
+{
+ std::string output;
+
+ size_t i = start;
+ while(i < input.length()) {
+
+ size_t j = 0;
+ while(j < term.length()) {
+ if(input[i] == term[j]) return output;
+ j++;
+ }
+
+ output += input[i];
+ i++;
+ }
+
+ return output;
+}
+
+typedef enum {
+ NAME,
+ VALUE,
+ TEXT,
+ ENDOFITEM,
+ UNDEFINED
+} tokenizerstate_t;
+
+std::vector< mltoken_t > mltokenize(std::string mlvalue)
+{
+ std::vector< mltoken_t > tokens;
+
+ mlvalue = replaceescaping(mlvalue);
+
+ tokenizerstate_t state = UNDEFINED;
+ mltoken_t token;
+ size_t i = 0;
+ while(i < mlvalue.length()) {
+ switch(state) {
+ case NAME:
+ token.name = gettoken(mlvalue, i, "|");
+ i += token.name.length() + 1;
+ token.type = MLTT_VALUE;
+ token.value = "";
+ state = VALUE;
+ break;
+
+ case VALUE:
+ token.value = gettoken(mlvalue, i, "}\n");
+ i += token.value.length() + 1;
+
+ token.value = rereplaceescaping(token.value);
+ token.type = MLTT_VALUE;
+ tokens.push_back(token);
+
+ state = UNDEFINED;
+ break;
+
+ case TEXT:
+ if(mlvalue[i] == '$') token.value = "$";
+ else token.value = gettoken(mlvalue, i, "$\n");
+ i += token.value.length();
+
+ token.value = rereplaceescaping(token.value);
+ token.type = MLTT_TEXT;
+ token.name = "";
+ if(tokens.size() && tokens.back().type == MLTT_TEXT) tokens.back().value += token.value;
+ else tokens.push_back(token);
+
+ state = UNDEFINED;
+ break;
+
+ case ENDOFITEM:
+ token.value = "\n";
+ i++;
+
+ token.type = MLTT_ENDOFITEM;
+ token.name = "";
+ tokens.push_back(token);
+
+ state = UNDEFINED;
+ break;
+
+ case UNDEFINED:
+ switch(mlvalue[i]) {
+ case '$':
+ if(i < mlvalue.length() - 1 && mlvalue[i + 1] == '{') { i++; break; } // ignore
+ else { state = TEXT; break; }
+ case '{': state = NAME; i++; break;
+ case '\n': state = ENDOFITEM; break;
+ default: state = TEXT; break;
+ }
+ }
+ }
+
+ if(state != UNDEFINED) {
+ printf("Oups... missed something in the end!\n");
+ tokens.push_back(token);
+ }
+
+ return tokens;
+}
+
+#ifdef TEST_MLTOKENIZER
+
+int main()
+{
+ std::string mlvalue = "$ab}}c\ndef ${na$me|${{va$lue}}}\n12${34}\n";
+
+ std::vector< mltoken_t > tokens = mltokenize(mlvalue);
+ std::vector< mltoken_t >::iterator i = tokens.begin();
+ while(i != tokens.end()) {
+ printf("Token:\n");
+ printf("\tType: ");
+ switch(i->type) {
+ case MLTT_VALUE: printf("VALUE\n"); break;
+ case MLTT_TEXT: printf("TEXT\n"); break;
+ case MLTT_ENDOFITEM: printf("ENDOFITEM\n"); break;
+ case MLTT_UNDEFINED: printf("UNDEFINED\n"); break;
+ }
+ printf("\tName: %s\n", i->name.c_str());
+ printf("\tValue: %s\n", i->value.c_str());
+ printf("\n");
+ i++;
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/server/src/mltokenizer.h b/server/src/mltokenizer.h
new file mode 100644
index 0000000..d784178
--- /dev/null
+++ b/server/src/mltokenizer.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * mltokenizer.h
+ *
+ * Tue Nov 4 08:46:35 CET 2008
+ * Copyright 2008 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Pracro.
+ *
+ * Pracro is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Pracro is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Pracro; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#ifndef __PRACRO_MLTOKENIZER_H__
+#define __PRACRO_MLTOKENIZER_H__
+
+#include <string>
+#include <vector>
+
+typedef enum {
+ MLTT_VALUE,
+ MLTT_TEXT,
+ MLTT_ENDOFITEM, // newline
+ MLTT_UNDEFINED
+} mltokentype_t;
+
+typedef struct {
+ mltokentype_t type;
+ std::string name;
+ std::string value;
+} mltoken_t;
+
+/**
+ * Split a multilist string into a sequence of tokens, eg.
+ * This is ${{}} some text ${myname|myvalue}\n
+ * MLTT_TEXT(value="This is ${{}} some text "),
+ * MLTT_VALUE(name="myname", value="myvalue"),
+ * MLTT_ENDOFITEM()
+ */
+std::vector< mltoken_t > mltokenize(std::string mlvalue);
+
+#endif/*__PRACRO_MLTOKENIZER_H__*/