/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * formattools.cc * * Mon Oct 27 09:34:46 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 "formattools.h" #include "luaformatmapper.h" /** * Replace all ocurrences of c with cc. */ static std::string escape_string(std::string str, char c) { std::string out; for(size_t i = 0; i < str.length(); i++) { if(str[i] == c) out += str[i]; out += str[i]; } 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, '{'), '}'); } 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) { std::map 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) { 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, Fields &fields) { 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; } #endif/*TEST_FORMATTOOLS*/