// Copyright 2019 Google LLC. // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #include "include/core/SkTypes.h" #include "modules/skplaintexteditor/src/word_boundaries.h" #include "modules/skunicode/include/SkUnicode.h" #include #if defined(SK_UNICODE_ICU_IMPLEMENTATION) #include "modules/skunicode/include/SkUnicode_icu.h" #endif #if defined(SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION) #include "modules/skunicode/include/SkUnicode_libgrapheme.h" #endif #if defined(SK_UNICODE_ICU4X_IMPLEMENTATION) #include "modules/skunicode/include/SkUnicode_icu4x.h" #endif namespace { sk_sp get_unicode() { #if defined(SK_UNICODE_ICU_IMPLEMENTATION) if (auto unicode = SkUnicodes::ICU::Make()) { return unicode; } #endif // defined(SK_UNICODE_ICU_IMPLEMENTATION) #if defined(SK_UNICODE_LIBGRAPHEME_IMPLEMENTATION) if (auto unicode = SkUnicodes::Libgrapheme::Make()) { return unicode; } #endif #if defined(SK_UNICODE_ICU4X_IMPLEMENTATION) if (auto unicode = SkUnicodes::ICU4X::Make()) { return unicode; } #endif SkDEBUGFAIL("Cannot make SkUnicode"); return nullptr; } } std::vector GetUtf8WordBoundaries(const char* begin, size_t byteCount, const char* locale) { auto unicode = get_unicode(); if (nullptr == unicode) { return {}; } std::vector positions; if (!unicode->getWords(begin, byteCount, locale, &positions) || byteCount == 0) { return {}; } std::vector result; result.resize(byteCount); for (auto& pos : positions) { result[pos] = true; } return result; }