/* -*- 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 "mltokenizer.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) { out += str[i]; i++; // Skip the next 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, '['), ']'); } Fields get_multilist_values(std::string mlvalue) { std::map values; 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; } std::string render_multilist_string(std::string mlvalue) { std::string output; std::vector< mltoken_t > tokens = mltokenize(mlvalue); std::vector< mltoken_t >::iterator i = tokens.begin(); while(i != tokens.end()) { output += i->value; i++; } return output; } 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 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)); std::string value = mapper.map(luaprogram); out += escape_resume_string(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"; 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 ${myname|bar} ${{dingo|dyt}} ${dims|dulle}."; printf("{%s}\n", render_multilist_string(mlstring).c_str()); */ std::string resumestring = "Ladidaa \n$[" "printfmlval(mlstring, ' * ', true, '

', 'myname', '

', 'PRE', 'dims', 'POST')" "] dalidaadoo."; printf("{%s}\n", render_resume_string(resumestring, fields).c_str()); // std::string resumestring2 = "Ladidaa \n$[printfmlval(mlstring, ' * ', false, '

', 'myname', '

', 'PRE', 'dims', 'POST')] dalidaadoo."; // printf("{%s}\n", render_resume_string(resumestring2, fields).c_str()); return 0; } #endif/*TEST_FORMATTOOLS*/