/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2010, Tomasz Sowa * All rights reserved. * */ #include "localefilter.h" #include "../core/misc.h" LocaleFilter::LocaleFilter() { open_mark = '{'; closing_mark = '}'; } void LocaleFilter::ReadKey() { key.clear(); for( ; *pchar && *pchar != closing_mark ; ++pchar) key += *pchar; // skipping last closing mark (if exists) if( *pchar == closing_mark ) ++pchar; TrimWhite(key); } std::string & LocaleFilter::FilterValue(const std::string & in) { value.clear(); const char * p = in.c_str(); while( *p ) { if( *p == '\\' && (*(p+1) == 'n') ) { value += '\n'; p += 2; } else if( *p == '\\' && (*(p+1) == '\\') ) { value += '\\'; p += 2; } else { value += *p; p += 1; } } return value; } void LocaleFilter::Parse(std::string & str) { res.clear(); pchar = str.c_str(); while( *pchar ) { if( *pchar == open_mark ) { ++pchar; ReadKey(); res += FilterValue(plocale->Get(key, lang)); } else if( *pchar == '\\' && (*(pchar+1) == open_mark || *(pchar+1) == closing_mark || *(pchar+1) == '\\') ) { res += *(pchar+1); pchar += 2; } else { res += *pchar; pchar += 1; } } str = res; } void LocaleFilter::FilterText(Ezc::Pattern::Item & item) { if( !item.text.empty() ) Parse(item.text); std::vector::iterator i = item.item_tab.begin(); for( ; i != item.item_tab.end() ; ++i ) FilterText(**i); } void LocaleFilter::Filter(Ezc::Pattern & pattern, const Locale & locale, Locale::Lang lang_) { plocale = &locale; lang = lang_; FilterText( pattern.item_root ); }