LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
NormalizeDateTimeResources.cpp
Go to the documentation of this file.
1// Copyright 2002-2013 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6/************************************************************************
7 *
8 * @file NormalizeDateTimeResources.cpp
9 * @author Besancon Romaric (romaric.besancon@cea.fr)
10 * @date Wed Jun 14 2006
11 * copyright Copyright (C) 2006-2012 by CEA LIST
12 *
13 ***********************************************************************/
14
21#include "boost/algorithm/string/split.hpp"
22#include "boost/algorithm/string/classification.hpp"
23
24#include <fstream>
25
27using namespace boost::algorithm;
28using namespace std;
29
30namespace Lima {
31namespace LinguisticProcessing {
32namespace SpecificEntities {
33
36
37// initialization of static const members
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");
54
55
57m_language(0),
58// m_timezoneDatabase(0),
59m_months(),
60m_days()
61{
62}
63
65// if (m_timezoneDatabase!=0) {
66// delete m_timezoneDatabase;
67// m_timezoneDatabase=0;
68// }
69}
70
72init(GroupConfigurationStructure& unitConfiguration,
73 Manager* manager)
74
75{
76 m_language=manager->getInitializationParameters().language;
78
79 // read timezone database file
80 string tzDbFile("");
81 try
82 {
83 tzDbFile = unitConfiguration.getParamsValueAtKey("timezoneDatabase");
84 tzDbFile = Common::Misc::findFileInPaths(resourcesPath.c_str(), tzDbFile.c_str()).toUtf8().constData();
85// m_timezoneDatabase = new boost::local_time::tz_database();
86// m_timezoneDatabase->load_from_file(tzDbFile);
87 }
88 catch (NoSuchParam& ) {
90 LERROR << "No param 'timezoneDatabase' in NormalizeDateTimeResources group for language "
91 << (int)m_language;
93 }
94 catch (exception& e) {
96 LERROR << "Error loading timezoneDatabase '"
97 << tzDbFile << "':" << e.what();
98 // reset database to 0
99// delete m_timezoneDatabase;
100// m_timezoneDatabase=0;
101 }
102
103 // read resources for months and days
104 try
105 {
106 string monthsDaysFile = unitConfiguration.getParamsValueAtKey("monthsDays");
107 monthsDaysFile = Common::Misc::findFileInPaths(resourcesPath.c_str(), monthsDaysFile.c_str()).toUtf8().constData();
108 if (!readMonthDays(monthsDaysFile)) {
109 SELOGINIT;
110 LERROR << "Error loading monthsDays resources '"
111 << monthsDaysFile << "'";
112 }
113 }
114 catch (NoSuchParam& ) {
115 SELOGINIT;
116 LERROR << "No param 'monthsDays' in NormalizeDateTimeResources group for language "
117 << (int)m_language;
118 throw InvalidConfiguration();
119 }
120
121}
122
123bool NormalizeDateTimeResources::
124readMonthDays(const std::string& monthsDaysFile)
125{
126
127 m_wordCardinalSeparator[Common::Misc::utf8stdstring2limastring(" ")]=0;
128 ifstream file(monthsDaysFile.c_str(), std::ifstream::binary);
129 if (!file.good()) {
130 return false;
131 }
132 string utf8line;
133 LimaString line;
134 while (file.good()) {
135 utf8line = Lima::Common::Misc::readLine(file);
136 if (!utf8line.empty()) {
138 std::vector<std::string> elements;
139 split(elements,utf8line,is_any_of(MONTHSDAYS_MAIN_SEP));
140 // three elements in line: (month|day|ordinal|cardinal|suffix) num list-of-strings
141 if (elements.size()!=3) {
142 SELOGINIT;
143 LWARN << "MonthsDaysResources: cannot parse line " << utf8line;
144 continue;
145 }
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; }
153 else {
154 SELOGINIT;
155 LWARN << "MonthsDaysResources: cannot parse line " << utf8line
156 << ": first element must be 'm' 'd', 'c', 'w', 'n' or 's'";
157 continue;
158 }
159
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++) {
166 }
167 }
168 }
169 return true;
170}
171
172// const boost::local_time::tz_database& NormalizeDateTimeResources::
173// getTimezoneDatabase() const
174// {
175// if (m_timezoneDatabase==0) {
176// SELOGINIT;
177// LERROR << "No timezone available";
178// throw(LinguisticProcessingException("No timezone available"));
179// }
180// return *m_timezoneDatabase;
181// }
182
184getMonthNumber(const LimaString& monthName) const
185{
186 map<LimaString,unsigned short>::const_iterator
187 it=m_months.find(monthName);
188 if (it==m_months.end()) {
190 }
191 return (*it).second;
192}
193
195getDayNumber(const LimaString& dayName) const
196{
197 map<LimaString,unsigned short>::const_iterator
198 it=m_days.find(dayName);
199 if (it==m_days.end()) {
201 }
202 return (*it).second;
203}
204
207{
208 SELOGINIT;
209 unsigned short day(0);
210 // trim suffix first, second or th, or (ème, ième, ieme, eme)
211 LimaString numberAsString(dayName);
212 LDEBUG << "NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal() numberAsString="
213 << numberAsString;
214 map<LimaString,unsigned short>::const_iterator suffixIt=m_wordOrdinalSuffixes.begin();
215 for( ; suffixIt!=m_wordOrdinalSuffixes.end() ; suffixIt++ )
216 {
217 const LimaString& suffix = (*suffixIt).first;
218 int index = dayName.indexOf(suffix, 0, Qt::CaseInsensitive);
219 if (index >= 0) {
220 numberAsString = LimaString(dayName.constData(),index);
221 day += (*suffixIt).second;
222 break;
223 }
224 }
225 LDEBUG << "NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal: after trim numberAsString="
226 << numberAsString << ", day=" << day;
227 if( numberAsString.isEmpty() )
228 return day;
229 // compute value from left to right
230 int parsingPosition(0);
231 LDEBUG << "NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal: parsingPosition=" << parsingPosition;
232 for( ; ; )
233 {
234 int index(-1);
235 // identify component of number
236 map<LimaString,unsigned short>::const_iterator cardinalIt=m_wordCardinal.begin();
237 for( ; cardinalIt!=m_wordCardinal.end() ; cardinalIt++ )
238 {
239 const LimaString& word = (*cardinalIt).first;
240 int index = numberAsString.indexOf(word, parsingPosition, Qt::CaseInsensitive);
241 if (index >= 0) {
242 day += (*cardinalIt).second;
243 parsingPosition += word.length();
244 LDEBUG << "NormalizeDateTimeResources::getValueFromWordCardinalOrOrdinal: found"
245 << word << ", day=" << day << ", parsingPosition=" << parsingPosition;
246 break;
247 }
248 }
249 // skip separator
250 int skipIndex(-1);
251 do
252 {
253 map<LimaString,unsigned short>::const_iterator separatorIt=m_wordCardinalSeparator.begin();
254 for( ; separatorIt!=m_wordCardinalSeparator.end() ; separatorIt++ )
255 {
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;
262 break;
263 }
264 }
265 } while( skipIndex == 0 );
266 if( index == -1 )
267 break;
268 }
269 return day;
270}
271
273getValueFromNumberOrdinal(const LimaString& dayName) const
274{
275 // try to extract number as int from string <number><ordinalSuffix> like 4th, 22nd, 1st or 17
276 map<LimaString,unsigned short>::const_iterator it=m_numberOrdinalSuffixes.begin();
277 for( ; it!=m_numberOrdinalSuffixes.end() ; it++ )
278 {
279 // try to trim suffix th, nd, st or rd
280 const LimaString& suffix = (*it).first;
281 int index = dayName.indexOf(suffix, 0, Qt::CaseInsensitive);
282 LimaString numberAsString(dayName);
283 if (index > 0)
284 numberAsString = LimaString(dayName.constData(),index);
285 bool ok(false);
286 // try to convert trimmed string to int
287 unsigned short day = numberAsString.toUShort(&ok);
288 if( ok)
289 return day;
290 }
292}
293
294
295} // end namespace
296} // end namespace
297} // end namespace
#define LWARN
Definition LimaCommon.h:160
#define LDEBUG
Definition LimaCommon.h:157
#define LERROR
Definition LimaCommon.h:161
#define SELOGINIT
#define NORMALIZEDATETIMERESOURCES_CLASSID
Defines a Factory to create Object of type Base.
const std::string & getResourcesPath() const
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.
Definition LimaCommon.h:345
void init(Common::XMLConfigurationFiles::GroupConfigurationStructure &unitConfiguration, Manager *manager) override
static const MediaticData & single()
const singleton accessor
Definition Singleton.h:51
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)
NAUTITIA.
QString LimaString
Definition LimaString.h:33
std::vector< std::string > split(const std::string &str, char delim)
STL namespace.