21#include "boost/algorithm/string/split.hpp"
22#include "boost/algorithm/string/classification.hpp"
27using namespace boost::algorithm;
31namespace LinguisticProcessing {
32namespace SpecificEntities {
38const std::string NormalizeDateTimeResources::
39MONTHSDAYS_MAIN_SEP=std::string(
" ");
40const std::string NormalizeDateTimeResources::
41MONTHSDAYS_NAMELIST_SEP=std::string(
",");
42const std::string NormalizeDateTimeResources::
43MONTHSDAYS_MONTH_ID=std::string(
"m");
44const std::string NormalizeDateTimeResources::
45MONTHSDAYS_DAY_ID=std::string(
"d");
46const std::string NormalizeDateTimeResources::
47WORD_CARDINAL_ID=std::string(
"c");
48const std::string NormalizeDateTimeResources::
49WORD_CARDINAL_SEPARATOR_ID=std::string(
"s");
50const std::string NormalizeDateTimeResources::
51WORD_ORDINAL_SUFFIX_ID=std::string(
"w");
52const std::string NormalizeDateTimeResources::
53NUMBER_ORDINAL_SUFFIX_ID=std::string(
"n");
90 LERROR <<
"No param 'timezoneDatabase' in NormalizeDateTimeResources group for language "
94 catch (exception& e) {
96 LERROR <<
"Error loading timezoneDatabase '"
97 << tzDbFile <<
"':" << e.what();
108 if (!readMonthDays(monthsDaysFile)) {
110 LERROR <<
"Error loading monthsDays resources '"
111 << monthsDaysFile <<
"'";
116 LERROR <<
"No param 'monthsDays' in NormalizeDateTimeResources group for language "
123bool NormalizeDateTimeResources::
124readMonthDays(
const std::string& monthsDaysFile)
128 ifstream file(monthsDaysFile.c_str(), std::ifstream::binary);
134 while (file.good()) {
136 if (!utf8line.empty()) {
138 std::vector<std::string> elements;
139 split(elements,utf8line,is_any_of(MONTHSDAYS_MAIN_SEP));
141 if (elements.size()!=3) {
143 LWARN <<
"MonthsDaysResources: cannot parse line " << utf8line;
146 map<LimaString,unsigned short>* names(0);
147 if (elements[0] == MONTHSDAYS_MONTH_ID) { names=&m_months; }
148 else if (elements[0] == MONTHSDAYS_DAY_ID) { names=&m_days; }
149 else if (elements[0] == WORD_CARDINAL_SEPARATOR_ID) { names=&m_wordCardinalSeparator; }
150 else if (elements[0] == WORD_CARDINAL_ID) { names=&m_wordCardinal; }
151 else if (elements[0] == WORD_ORDINAL_SUFFIX_ID) { names=&m_wordOrdinalSuffixes; }
152 else if (elements[0] == NUMBER_ORDINAL_SUFFIX_ID) { names=&m_numberOrdinalSuffixes; }
155 LWARN <<
"MonthsDaysResources: cannot parse line " << utf8line
156 <<
": first element must be 'm' 'd', 'c', 'w', 'n' or 's'";
160 uint64_t n=atoi(elements[1].c_str());
161 vector<std::string> namesToAdd;
162 split(namesToAdd,elements[2],is_any_of(MONTHSDAYS_NAMELIST_SEP));
163 for (vector<std::string>::const_iterator it=namesToAdd.begin(),
164 it_end=namesToAdd.end();it!=it_end; it++) {
186 map<LimaString,unsigned short>::const_iterator
187 it=m_months.find(monthName);
188 if (it==m_months.end()) {
197 map<LimaString,unsigned short>::const_iterator
198 it=m_days.find(dayName);
199 if (it==m_days.end()) {
209 unsigned short day(0);
212 LDEBUG <<
"NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal() numberAsString="
214 map<LimaString,unsigned short>::const_iterator suffixIt=m_wordOrdinalSuffixes.begin();
215 for( ; suffixIt!=m_wordOrdinalSuffixes.end() ; suffixIt++ )
218 int index = dayName.indexOf(suffix, 0, Qt::CaseInsensitive);
220 numberAsString =
LimaString(dayName.constData(),index);
221 day += (*suffixIt).second;
225 LDEBUG <<
"NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal: after trim numberAsString="
226 << numberAsString <<
", day=" << day;
227 if( numberAsString.isEmpty() )
230 int parsingPosition(0);
231 LDEBUG <<
"NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal: parsingPosition=" << parsingPosition;
236 map<LimaString,unsigned short>::const_iterator cardinalIt=m_wordCardinal.begin();
237 for( ; cardinalIt!=m_wordCardinal.end() ; cardinalIt++ )
240 int index = numberAsString.indexOf(word, parsingPosition, Qt::CaseInsensitive);
242 day += (*cardinalIt).second;
243 parsingPosition += word.length();
244 LDEBUG <<
"NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal: found"
245 << word <<
", day=" << day <<
", parsingPosition=" << parsingPosition;
253 map<LimaString,unsigned short>::const_iterator separatorIt=m_wordCardinalSeparator.begin();
254 for( ; separatorIt!=m_wordCardinalSeparator.end() ; separatorIt++ )
256 const LimaString& separator = (*separatorIt).first;
257 int skipIndex = numberAsString.indexOf(separator, parsingPosition, Qt::CaseInsensitive);
258 if (skipIndex == 0) {
259 parsingPosition += separator.length();
260 LDEBUG <<
"NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal: found"
261 << separator <<
", day=" << day <<
", parsingPosition=" << parsingPosition;
265 }
while( skipIndex == 0 );
276 map<LimaString,unsigned short>::const_iterator it=m_numberOrdinalSuffixes.begin();
277 for( ; it!=m_numberOrdinalSuffixes.end() ; it++ )
281 int index = dayName.indexOf(suffix, 0, Qt::CaseInsensitive);
284 numberAsString =
LimaString(dayName.constData(),index);
287 unsigned short day = numberAsString.toUShort(&ok);
#define NORMALIZEDATETIMERESOURCES_CLASSID
Defines a Factory to create Object of type Base.
std::string & getParamsValueAtKey(const std::string &key)
return a message when a 'param' was not found
Manage initialization of InitializableObjects using configuration module and parameters.
const InitializationParameters & getInitializationParameters() const
get Initialization Parameters
Use this exception to signal an error in one of the configuration files.
static const unsigned short no_day
unsigned short getMonthNumber(const LimaString &monthName) const
static const unsigned short no_month
NormalizeDateTimeResources()
~NormalizeDateTimeResources()
unsigned short getValueFromWordCardinalOrOrdinal(const LimaString &dayName) const
unsigned short getValueFromNumberOrdinal(const LimaString &dayName) const
void init(Common::XMLConfigurationFiles::GroupConfigurationStructure &unitConfiguration, Manager *manager) override
unsigned short getDayNumber(const LimaString &dayName) const
static const MediaticData & single()
const singleton accessor
std::string readLine(std::istream &inputFile)
QString findFileInPaths(const QString &paths, const QString &fileName, const QChar &separator)
Find the given file in the given paths.
LimaString utf8stdstring2limastring(const std::string &src)
SimpleFactory< AbstractResource, NormalizeDateTimeResources > NormalizeDateTimeResourcesFactory(NORMALIZEDATETIMERESOURCES_CLASSID)
std::vector< std::string > split(const std::string &str, char delim)