diff options
author | Arsentiy Milchakov <milcars@mapswithme.com> | 2016-11-02 12:43:23 +0300 |
---|---|---|
committer | Ilya Grechuhin <i.grechuhin@gmail.com> | 2016-11-11 11:05:56 +0300 |
commit | 7bd2eed6a4825cf4036011079fa1c8abb7ef5915 (patch) | |
tree | e37ec9364de67211ce0f4745ffd76da48f974114 /indexer/feature_utils.cpp | |
parent | 36e7c13457c8850567276c60eb25dabb2c720ea5 (diff) |
Naming priority for poi objects was changed
Diffstat (limited to 'indexer/feature_utils.cpp')
-rw-r--r-- | indexer/feature_utils.cpp | 121 |
1 files changed, 56 insertions, 65 deletions
diff --git a/indexer/feature_utils.cpp b/indexer/feature_utils.cpp index 1da89805d2..a4b94028c3 100644 --- a/indexer/feature_utils.cpp +++ b/indexer/feature_utils.cpp @@ -7,8 +7,6 @@ #include "geometry/point2d.hpp" -#include "platform/preferred_languages.hpp" - #include "coding/multilang_utf8_string.hpp" #include "base/base.hpp" @@ -17,15 +15,12 @@ namespace { -void GetMwmLangName(FeatureID const & id, StringUtf8Multilang const & src, string & out) -{ - auto const mwmInfo = id.m_mwmId.GetInfo(); - - if (!mwmInfo) - return; +using StrUtf8 = StringUtf8Multilang; +void GetMwmLangName(feature::RegionData const & regionData, StringUtf8Multilang const & src, string & out) +{ vector<int8_t> mwmLangCodes; - mwmInfo->GetRegionData().GetLanguages(mwmLangCodes); + regionData.GetLanguages(mwmLangCodes); for (auto const code : mwmLangCodes) { @@ -34,22 +29,9 @@ void GetMwmLangName(FeatureID const & id, StringUtf8Multilang const & src, strin } } -void GetNames(FeatureID const & id, StringUtf8Multilang const & src, string & primary, - string & secondary) +void GetBestName(StringUtf8Multilang const & src, vector<int8_t> const & priorityList, string & out) { - primary.clear(); - secondary.clear(); - - if (src.IsEmpty()) - return; - - vector<int8_t> primaryCodes = {StringUtf8Multilang::kDefaultCode}; - vector<int8_t> secondaryCodes = {StringUtf8Multilang::GetLangIndex(languages::GetCurrentNorm()), - StringUtf8Multilang::kInternationalCode, - StringUtf8Multilang::kEnglishCode}; - - auto primaryIndex = primaryCodes.size(); - auto secondaryIndex = secondaryCodes.size(); + auto bestIndex = priorityList.size(); auto const findAndSet = [](vector<int8_t> const & langs, int8_t const code, string const & name, size_t & bestIndex, string & outName) @@ -64,23 +46,19 @@ void GetNames(FeatureID const & id, StringUtf8Multilang const & src, string & pr src.ForEach([&](int8_t code, string const & name) { - if (primaryIndex != 0) - findAndSet(primaryCodes, code, name, primaryIndex, primary); + if (bestIndex == 0) + return false; - if (secondaryIndex != 0) - findAndSet(secondaryCodes, code, name, secondaryIndex, secondary); + findAndSet(priorityList, code, name, bestIndex, out); return true; }); - if (primary.empty()) - GetMwmLangName(id, src, primary); - - if (secondaryIndex < secondaryCodes.size() && - secondaryCodes[secondaryIndex] == StringUtf8Multilang::kInternationalCode) + // There are many "junk" names in Arabian island. + if (bestIndex < priorityList.size() && + priorityList[bestIndex] == StrUtf8::kInternationalCode) { - // There are many "junk" names in Arabian island. - secondary = secondary.substr(0, secondary.find_first_of(',')); + out = out.substr(0, out.find_first_of(',')); } } } // namespace @@ -225,41 +203,54 @@ int GetFeatureViewportScale(TypesHolder const & types) return impl::GetFeatureEstimator().GetViewportScale(types); } -void GetPreferredNames(FeatureID const & id, StringUtf8Multilang const & src, string & primary, - string & secondary) +void GetPreferredNames(RegionData const & regionData, StringUtf8Multilang const & src, + int8_t const deviceLang, string & primary, string & secondary) { - // Primary name using priority: - // - default name; - // - country language name. - // Secondary name using priority: - // - device language name; - // - international name; - // - english name. - GetNames(id, src, primary, secondary); + primary.clear(); + secondary.clear(); + + if (src.IsEmpty()) + return; + + vector<int8_t> const primaryCodes = {deviceLang, + StrUtf8::kInternationalCode, + StrUtf8::kEnglishCode}; + vector<int8_t> secondaryCodes = {StrUtf8::kDefaultCode, + StrUtf8::kInternationalCode}; + + vector<int8_t> mwmLangCodes; + regionData.GetLanguages(mwmLangCodes); + + secondaryCodes.insert(secondaryCodes.end(), mwmLangCodes.begin(), mwmLangCodes.end()); + secondaryCodes.push_back(StrUtf8::kEnglishCode); + + GetBestName(src, primaryCodes, primary); + GetBestName(src, secondaryCodes, secondary); if (primary.empty()) - { - primary.swap(secondary); - } - else - { - // Filter out similar intName. - if (!secondary.empty() && primary.find(secondary) != string::npos) - secondary.clear(); - } + primary.swap(secondary); + else if (!secondary.empty() && primary.find(secondary) != string::npos) + secondary.clear(); } -void GetReadableName(FeatureID const & id, StringUtf8Multilang const & src, string & out) +void GetReadableName(RegionData const & regionData, StringUtf8Multilang const & src, + int8_t const deviceLang, string & out) { - // Names using priority: - // - device language name; - // - international name; - // - english name; - // - default name; - // - country language name. - // Secondary name is preffered to display on the map and place page. - string primary, secondary; - GetNames(id, src, primary, secondary); - out = secondary.empty() ? primary : secondary; + out.clear(); + + if (src.IsEmpty()) + return; + + vector<int8_t> codes; + // If MWM contains user's language. + if (regionData.HasLanguage(deviceLang)) + codes = {deviceLang, StrUtf8::kDefaultCode, StrUtf8::kInternationalCode, StrUtf8::kEnglishCode}; + else + codes = {deviceLang, StrUtf8::kInternationalCode, StrUtf8::kEnglishCode, StrUtf8::kDefaultCode}; + + GetBestName(src, codes, out); + + if (out.empty()) + GetMwmLangName(regionData, src, out); } } // namespace feature |