diff --git a/BaseToolkit.cpp b/BaseToolkit.cpp index 26dafd6..c09535f 100644 --- a/BaseToolkit.cpp +++ b/BaseToolkit.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -52,23 +53,35 @@ std::string BaseToolkit::uniqueName(const std::string &basename, std::list dictionnary_; + std::map::const_iterator existingentry = dictionnary_.find(input); - UErrorCode status = U_ZERO_ERROR; - icu::Transliterator *firstTrans = icu::Transliterator::createInstance( - "any-NFKD ; [:Nonspacing Mark:] Remove; NFKC; Latin", UTRANS_FORWARD, status); - firstTrans->transliterate(ucs); - delete firstTrans; + if (existingentry == dictionnary_.cend()) { - icu::Transliterator *secondTrans = icu::Transliterator::createInstance( - "any-NFKD ; [:Nonspacing Mark:] Remove; [@!#$*%~] Remove; NFKC", UTRANS_FORWARD, status); - secondTrans->transliterate(ucs); - delete secondTrans; + auto ucs = icu::UnicodeString::fromUTF8(input); - std::ostringstream output; - output << ucs; + UErrorCode status = U_ZERO_ERROR; + icu::Transliterator *firstTrans = icu::Transliterator::createInstance( + "any-NFKD ; [:Nonspacing Mark:] Remove; NFKC; Latin", UTRANS_FORWARD, status); + firstTrans->transliterate(ucs); + delete firstTrans; - return output.str(); + icu::Transliterator *secondTrans = icu::Transliterator::createInstance( + "any-NFKD ; [:Nonspacing Mark:] Remove; [@!#$*%~] Remove; NFKC", UTRANS_FORWARD, status); + secondTrans->transliterate(ucs); + delete secondTrans; + + std::ostringstream output; + output << ucs; + + // remember for future + dictionnary_[input] = output.str(); + } + + // return remembered transliterated text + return dictionnary_[input]; }