31#include <boost/spirit/include/qi_match.hpp>
34using namespace Common;
35using namespace Common::Misc;
36using namespace Common::MediaticData;
37using namespace Common::XMLConfigurationFiles;
41namespace LinguisticProcessing {
42namespace FlatTokenizer {
47 m_unicodeCategories(),
48 m_unicodeCategories2LimaClasses()
50#if QT_VERSION < 0x050000
56 <<
"Mark_SpacingCombining"
58 <<
"Number_DecimalDigit"
63 <<
"Separator_Paragraph"
68 <<
"Other_NotAssigned"
74 <<
"Punctuation_Connector"
77 <<
"Punctuation_Close"
78 <<
"Punctuation_InitialQuote"
79 <<
"Punctuation_FinalQuote"
80 <<
"Punctuation_Other"
90 m_unicodeCategories2LimaClasses.insert(
"Number_DecimalDigit",
"c_5");
91 m_unicodeCategories2LimaClasses.insert(
"Number_Letter",
"c_5");
92 m_unicodeCategories2LimaClasses.insert(
"Number_Other",
"c_5");
93 m_unicodeCategories2LimaClasses.insert(
"Separator_Space",
"c_b");
94 m_unicodeCategories2LimaClasses.insert(
"Separator_Line",
"c_par");
95 m_unicodeCategories2LimaClasses.insert(
"Separator_Paragraph",
"c_par");
96 m_unicodeCategories2LimaClasses.insert(
"Other_Control",
"c_b");
99 m_unicodeCategories2LimaClasses.insert(
"Other_PrivateUse",
"c_hyphen");
100 m_unicodeCategories2LimaClasses.insert(
"Other_NotAssigned",
"unknwn");
101 m_unicodeCategories2LimaClasses.insert(
"Letter_Uppercase",
"c_M");
102 m_unicodeCategories2LimaClasses.insert(
"Letter_Lowercase",
"c_m");
103 m_unicodeCategories2LimaClasses.insert(
"Letter_Titlecase",
"c_M");
104 m_unicodeCategories2LimaClasses.insert(
"Letter_Modifier",
"c_Mm");
105 m_unicodeCategories2LimaClasses.insert(
"Letter_Other",
"c_Mm");
106 m_unicodeCategories2LimaClasses.insert(
"Punctuation_Connector",
"c_hyphen");
107 m_unicodeCategories2LimaClasses.insert(
"Punctuation_Dash",
"c_hyphen");
108 m_unicodeCategories2LimaClasses.insert(
"Punctuation_Open",
"c_par");
109 m_unicodeCategories2LimaClasses.insert(
"Punctuation_Close",
"c_par");
110 m_unicodeCategories2LimaClasses.insert(
"Punctuation_InitialQuote",
"c_quote");
111 m_unicodeCategories2LimaClasses.insert(
"Punctuation_FinalQuote",
"c_quote");
112 m_unicodeCategories2LimaClasses.insert(
"Punctuation_Other",
"c_dot");
113 m_unicodeCategories2LimaClasses.insert(
"Symbol_Math",
"c_plus");
114 m_unicodeCategories2LimaClasses.insert(
"Symbol_Currency",
"c_del1");
115 m_unicodeCategories2LimaClasses.insert(
"Symbol_Modifier",
"c_del1");
116 m_unicodeCategories2LimaClasses.insert(
"Symbol_Other",
"c_del1");
121 std::vector<CharClass*>::iterator itcc, itcc_end;
122 itcc = m_classes.begin(); itcc_end = m_classes.end();
123 for (; itcc != itcc_end; itcc++)
127 std::vector<Char*>::iterator itc, itc_end;
128 itc = m_chars.begin(); itc_end = m_chars.end();
129 for (; itc != itc_end; itc++)
142 LDEBUG <<
"Creating a CharChart (loads file)";
151 LERROR <<
"no parameter 'charFile' in charchart group for language " << (int) language <<
" !";
164 if (c.unicode() >= m_chars.size() || m_chars[c.unicode()] == 0 || m_chars[c.unicode()]->charClass() == 0)
166 if (c.category() < m_unicodeCategories.size())
168 QString unicodeCategory = m_unicodeCategories[c.category()];
169 if (m_unicodeCategories2LimaClasses.contains(unicodeCategory))
173 LDEBUG <<
"CharChart::charClass using unicode category" << unicodeCategory <<
"and LIMA class" << m_unicodeCategories2LimaClasses[unicodeCategory] ;
175 return classNamed(m_unicodeCategories2LimaClasses[unicodeCategory]);
179 LNOTICE <<
"CharChart::charClass undefined char: " << c;
184 LTRACE <<
"CharChart::charClass" << c << c.unicode() << m_chars.size() << m_chars[c.unicode()]<< m_chars[c.unicode()]->charClass();
186 return m_chars[c.unicode()]->charClass();
191 if (m_surrogates.find(c1) == m_surrogates.end())
194 LNOTICE <<
"CharChart::charClass undefined 32 bytes char: " << c1 << c2 ;
197 const std::map<LimaChar,Char*>& c1classes = (*(m_surrogates.find(c1))).second;
198 if (c1classes.find(c2) == c1classes.end())
201 LNOTICE <<
"CharChart::charClass undefined 32 bytes char: " << c1 << c2 ;
206 return (*(c1classes.find(c2))).second->charClass();
231 if (c.unicode() >= m_chars.size())
233 if (m_chars[c.unicode()] == 0)
235 if (m_chars[c.unicode()]->charClass() == 0)
237 if (m_chars[c.unicode()]->longUnmark() != 0)
239 if (m_chars[c.unicode()]->min() != 0
240 && m_chars[c.unicode()]->min()->unmark() != 0)
241 return (*(m_chars[c.unicode()]->min()->unmark()))();
242 if (m_chars[c.unicode()]->unmark() != 0)
243 return (*(m_chars[c.unicode()]->unmark()))();
255 LDEBUG <<
"CharChart::unmarkByString" << c;
257 if (c.unicode() >= m_chars.size())
259 if (m_chars[c.unicode()] == 0)
264 LDEBUG <<
"CharChart::unmarkByString" << result;
268 if (!m_chars[c.unicode()]->charClass())
272 if (m_chars[c.unicode()]->unmark() != 0 && m_chars[c.unicode()]->unmark() != m_chars[c.unicode()])
273 result.push_back(m_chars[c.unicode()]->unmark()->code());
274 if (m_chars[c.unicode()]->longUnmark() != 0 && m_chars[c.unicode()]->longUnmark() != m_chars[c.unicode()])
275 result.push_back(m_chars[c.unicode()]->longUnmark()->code());
277 LDEBUG <<
"CharChart::unmarkByString" << result;
285 desaccented.reserve(str.size());
286 for (
int i = 0; i < str.size(); i++)
293 desaccented.push_back(chr);
294 if (m_chars[str.at(i).unicode()]->hasLongUnmark())
295 desaccented.push_back(m_chars[str.at(i).unicode()]->longUnmark()->code());
302 desaccented.append(s);
316 desaccented.reserve(str.size());
317 mapping.resize(str.size());
320 unsigned char desaccIndex=0;
321 for (
int i = 0; i < str.size(); i++)
327 desaccented.push_back(chr);
328 mapping[i]=desaccIndex;
334 desaccented.append(s);
335 mapping[i]=desaccIndex;
336 desaccIndex+=s.size();
351 LDEBUG <<
"toLower("<<src<<
") = " << src.toLower();
353 return src.toLower();
362 std::vector<CharClass*>::const_iterator itcc, itcc_end;
363 itcc = m_classes.begin(); itcc_end = m_classes.end();
364 for (; itcc != itcc_end; itcc++)
367 if ( (*itcc)->id() == name)
384 LDEBUG <<
"Loading CharChart from " << fileName;
386 std::ifstream file(fileName.c_str(), std::ifstream::binary);
390 LERROR <<
" CharChart::loadFromFile Unable to open" << fileName;
396 std::string::const_iterator iter = str.begin();
397 std::string::const_iterator end = str.end();
409 std::vector<charchart_class>::const_iterator classIt, classItend;
411 for (; classIt != classItend; classIt++)
417 if (ch.
parent.is_initialized() && !ch.
parent.get().empty()
429 LDEBUG <<
" Loaded class " << ch.
name <<
" < NONE";
432 m_classes.push_back(newClass);
434 std::vector<charchart_char>::const_iterator charIt, charItend;
436 for (; charIt != charItend; charIt++)
439 Char* newChar = lazyGetChar(QChar(ch.
code));
443 LERROR <<
"Error loading char '" << ch.
code <<
"'";
447 if (newCharClass == 0)
450 LERROR <<
"Error loading char '" << ch.
code <<
"' : unknown class '" << ch.
charclass <<
"'";
456 LDEBUG <<
"Adding char" << newChar->
name() << newCharClass->
name();
460 for (; charIt != charItend; charIt++)
463 Char* newChar = lazyGetChar(QChar(ch.
code));
468 std::vector<modifierdef>::const_iterator modIt, modItEnd;
470 for (; modIt != modItEnd; modIt++)
473 LDEBUG <<
" modifier "<< (*modIt).first <<
":" << lazyGetChar(QChar{(*modIt).second})->name();
475 switch ( (*modIt).first )
478 newChar->
setMin(lazyGetChar(QChar{(*modIt).second}));
481 newChar->
setMaj(lazyGetChar(QChar{(*modIt).second}));
484 newChar->
setUnmark(lazyGetChar(QChar{(*modIt).second}));
489 if (newChar->
code().isHighSurrogate())
493 surrogates().insert(std::make_pair(newChar->
code(),std::map< LimaChar, Char* >()));
502 LERROR <<
"Error while parsing: " << fileName;
512 if (
chars().size() <= code.unicode())
514 chars().resize(code.unicode()+1);
516 if (
chars()[code.unicode()] == 0)
518 newChar =
new Char(code);
519 chars()[code.unicode()] = newChar;
523 newChar =
chars()[code.unicode()];
#define FLATTOKENIZERCHARCHART_CLASSID
#define TOKENIZERLOADERLOGINIT
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.
Lima::LimaChar unmark(const Lima::LimaChar &c) const
Gets the unmark character corresponding to the specified character.
LimaString unmarkWithMapping(const LimaString &str, std::vector< unsigned char > &mapping) const
Lima::LimaString unmarkByString(const Lima::LimaChar &c) const
Gets the unmark string corresponding to the specified character.
void init(Common::XMLConfigurationFiles::GroupConfigurationStructure &, Manager *) override
const CharClass * classNamed(const Lima::LimaString &name) const
const CharClass * charClass(const Lima::LimaChar &c) const
Gets the Class of the specified character.
Lima::LimaString toLower(const Lima::LimaString &src) const
Converts src to its lowercase equivalent.
Lima::LimaChar maj(const Lima::LimaChar &c) const
Gets the upper case corresponding to the specified character.
const std::map< LimaChar, std::map< LimaChar, Char * > > & surrogates() const
bool loadFromFile(const std::string &fileName)
Lima::LimaChar min(const Lima::LimaChar &c) const
Gets the lower case corresponding to the specified character.
const std::vector< Char * > & chars() const
void setName(const Lima::LimaString &name)
void setId(const Lima::LimaString &id)
const CharClass * superClass() const
void setSuperClass(const CharClass *c)
const Lima::LimaString & id() const
const Lima::LimaString & name() const
const Lima::LimaString & name() const
Lima::LimaChar code() const
void setName(const Lima::LimaString &name)
void setMaj(const Char *maj)
Lima::LimaChar surrogate() const
void setMin(const Char *min)
void setUnmark(const Char *un)
void setCharClass(const CharClass *cl)
static const MediaticData & single()
const singleton accessor
std::string limastring2utf8stdstring(const Lima::LimaString &phrase, uint32_t size0)
Convert a wide string to a string , in dest up to size bytes.
void readStream(std::istream &is, std::string &dest)
Read an input stream into a string, until EOF.
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, CharChart > flatTokenizerCharChartFactory(FLATTOKENIZERCHARCHART_CLASSID)
std::vector< modifierdef > modifiers
boost::optional< std::string > parent
std::vector< charchart_char > chars
std::vector< charchart_class > classes