From 390ee07f13b0b1cf38d8c76987660756f878c17c Mon Sep 17 00:00:00 2001 From: guichuang <13343468815@163.com> Date: Tue, 29 Oct 2024 15:03:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9E=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E8=BE=93=E5=87=BA=E4=B8=8D=E5=90=8CStrategy?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E7=9A=84=E4=BA=B2=E5=92=8C=E5=BA=A6=E5=80=BC?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8Dmask=E5=92=8Cunmask=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=8F=AF=E8=83=BD=E4=BC=9A=E7=94=B1=E4=BA=8E=E7=A9=BA?= =?UTF-8?q?=E6=8C=87=E9=92=88=E9=97=AA=E9=80=80=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- harmony/text_input_mask.har | Bin 0 -> 18609 bytes .../src/main/cpp/RNTextInputMask.cpp | 64 +- .../src/main/cpp/common/Compiler.h | 4 + .../src/main/cpp/common/Mask.h | 613 +++++++++--------- .../model/AffinityCalculationStrategy.h | 1 - 5 files changed, 354 insertions(+), 328 deletions(-) create mode 100644 harmony/text_input_mask.har diff --git a/harmony/text_input_mask.har b/harmony/text_input_mask.har new file mode 100644 index 0000000000000000000000000000000000000000..ca3991cb16192c854ba1b733e5047372e43bbbed GIT binary patch literal 18609 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Ð}?sl!!)6gp*3{gr-vSOD9vJ zmsmHZLfqu=FcPx#>&Py=Zb5iL5%CtWXcR*TEOB(QQCR9QWu>=ixoQuG5d5w*L`ZA` zLc)a)6FjkE0%FoQgCrp7isakINd}f zyPja}O|8SvERt+ax{3uFyw{jBn{t%pAgRNS2$Bl8H7gJuzp#y#C- zd*Q`;Z8RK$5$?fT!9GpLFAShA8Gq-;JEM%$LZj-06D1FctaZU_LJm>O`qq#+au{rS zsPl=Fkbdwz+iroz)S-^ofhN_ZU`U-c&K*L(N|G3z35(R(f9W*>hY(q*vqL?=qL;EP zbyl4`5f&YYMj5VZ`h#P=8-> zpZ67*O-$Wt9Egkd8fRnnW6LiuNRw7YEL)conUYu`7kNUh@HtN$#X*8fZh)eNytKuq@O2joRgRF=+>A!mf7Yw zvQ^~RD0Iz;JLp62$h Ik^sm70H*TSR{#J2 literal 0 HcmV?d00001 diff --git a/harmony/text_input_mask/src/main/cpp/RNTextInputMask.cpp b/harmony/text_input_mask/src/main/cpp/RNTextInputMask.cpp index 5b05765..2386d91 100644 --- a/harmony/text_input_mask/src/main/cpp/RNTextInputMask.cpp +++ b/harmony/text_input_mask/src/main/cpp/RNTextInputMask.cpp @@ -1,3 +1,4 @@ +#pragma once #include "RNTextInputMask.h" #include "RNOH/arkui/TextInputNode.h" #include "RNOH/ComponentInstance.h" @@ -49,19 +50,17 @@ void myEventReceiver(ArkUI_NodeEvent *event) { : std::make_shared(CaretString::Forward(useAutocomplete)); CaretString text(content, content.length(), caretGravity); try { - // if (!isDelete) { - auto maskObj = self->pickMask(text, userData->maskOptions, userData->primaryFormat); - auto result = maskObj->apply(text); - std::string resultString = result.formattedText.string; - DLOG(INFO) << "mask result complete: " << result.complete; - userData->lastInputText = resultString; - std::string finalString = isDelete ? content : resultString; - ArkUI_AttributeItem item{.string = finalString.c_str()}; - userData->lastInputText = finalString; - maybeThrow(NativeNodeApi::getInstance()->setAttribute(userData->data, NODE_TEXT_INPUT_TEXT, &item)); - //} + auto maskObj = self->pickMask(text, userData->maskOptions, userData->primaryFormat); + auto result = maskObj->apply(text); + std::string resultString = result.formattedText.string; + DLOG(INFO) << "mask result complete: " << result.complete; + userData->lastInputText = resultString; + std::string finalString = isDelete ? content : resultString; + ArkUI_AttributeItem item{.string = finalString.c_str()}; + userData->lastInputText = finalString; + maybeThrow(NativeNodeApi::getInstance()->setAttribute(userData->data, NODE_TEXT_INPUT_TEXT, &item)); } catch (FormatError e) { - DLOG(ERROR) << " mask complier error " << e.what(); + DLOG(ERROR) << " mask compiler error " << e.what(); } } // onFocus 事件 @@ -73,11 +72,11 @@ void myEventReceiver(ArkUI_NodeEvent *event) { CaretString string(text, text.length(), std::make_shared(userData->maskOptions.autocomplete.value())); auto maskObj = self->pickMask(string, userData->maskOptions, userData->primaryFormat); - std::string resultString = maskObj->apply(string).formattedText.string; + std::string resultString = maskObj.get()->apply(string).formattedText.string; ArkUI_AttributeItem item{.string = resultString.c_str()}; maybeThrow(NativeNodeApi::getInstance()->setAttribute(userData->data, NODE_TEXT_INPUT_TEXT, &item)); } catch (FormatError e) { - DLOG(ERROR) << " mask complier error " << e.what(); + DLOG(ERROR) << " mask compiler error " << e.what(); } } } @@ -94,7 +93,9 @@ int calculateAffinity(Mask mask, const CaretString &text, std::string affinityCa } else { strategy = AffinityCalculationStrategy::EXTRACTED_VALUE_CAPACITY; } - return AffinityCalculator::calculateAffinityOfMask(strategy, mask, text); + int affinity = AffinityCalculator::calculateAffinityOfMask(strategy, mask, text); + + return affinity; } // 获取或创建 Mask std::shared_ptr maskGetOrCreate(const std::string &format, const std::vector &customNotations, @@ -109,8 +110,13 @@ std::shared_ptr maskGetOrCreate(const std::string &format, const std::vect std::shared_ptr RNTextInputMask::pickMask(const CaretString &text, MaskOptions maskOptions, std::string primaryMask) { // 如果 affineFormats 为空,直接返回 primaryMask - if (maskOptions.affineFormats->size() <= 0) - return maskGetOrCreate(primaryMask, maskOptions.customNotations.value(), maskOptions.rightToLeft.value()); + if (maskOptions.affineFormats->size() <= 0) { + auto mask = maskGetOrCreate(primaryMask, maskOptions.customNotations.value(), maskOptions.rightToLeft.value()); + int affinity = calculateAffinity(*mask, text, maskOptions.affinityCalculationStrategy.value()); + DLOG(INFO) << " ======= pickMask calculateAffinity value: " << affinity + << "\n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy.value(); + return mask; + } // 定义 MaskAffinity 结构体,用于存储 Mask 和相应的亲和度 struct MaskAffinity { Mask mask; // Mask 对象 @@ -120,7 +126,8 @@ std::shared_ptr RNTextInputMask::pickMask(const CaretString &text, MaskOpt // 计算 primaryMask 的亲和度 int primaryAffinity = calculateAffinity(primaryMask, text, maskOptions.affinityCalculationStrategy.value()); - + DLOG(INFO) << " ======= pickMask calculateAffinity value: " << primaryAffinity << " \n mask: " << primaryMask + << "\n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy.value(); // 存储所有 mask 和亲和度的列表 std::vector masksAndAffinities; @@ -129,6 +136,8 @@ std::shared_ptr RNTextInputMask::pickMask(const CaretString &text, MaskOpt std::shared_ptr mask = maskGetOrCreate(format, maskOptions.customNotations.value(), maskOptions.rightToLeft.value()); int affinity = calculateAffinity(*mask, text, maskOptions.affinityCalculationStrategy.value()); + DLOG(INFO) << " ======= pickMask calculateAffinity value: " << affinity << "\n affineFormat: " << format + << "\n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy.value(); masksAndAffinities.emplace_back(*mask, affinity); } @@ -187,11 +196,13 @@ void RNTextInputMask::setMask(int reactNode, std::string primaryFormat, MaskOpti NativeNodeApi::getInstance()->addNodeEventReceiver(textInputNode->getArkUINodeHandle(), myEventReceiver); }; this->m_ctx.taskExecutor->runTask(TaskThread::MAIN, std::move(task)); + } std::string getString(std::string maskValue, std::string value, bool autocomplete, bool isMask) { - Mask maskObj(maskValue); + + auto maskObj = Mask::MaskFactory::getOrCreate(maskValue, {}); CaretString text(value, value.length(), std::make_shared(autocomplete)); - auto r = maskObj.apply(text); + auto r = maskObj->apply(text); std::string result; if (isMask) { result = r.formattedText.string; @@ -208,8 +219,14 @@ static jsi::Value __hostFunction_RNTextInputMask_unmask(jsi::Runtime &rt, react: return createPromiseAsJSIValue( rt, [maskValue, value, autocomplete](jsi::Runtime &rt2, std::shared_ptr promise) { try { + auto start = std::chrono::high_resolution_clock::now(); std::string result = getString(maskValue, value, autocomplete, 0); promise->resolve(jsi::String::createFromUtf8(rt2, result)); + // 获取结束时间点 + auto end = std::chrono::high_resolution_clock::now(); + // 计算延迟 + std::chrono::duration latency = end - start; + DLOG(INFO) << "=======unmask 响应时长: " << latency.count() << " 毫秒" << std::endl; } catch (FormatError e) { promise->reject(e.what()); } @@ -217,15 +234,20 @@ static jsi::Value __hostFunction_RNTextInputMask_unmask(jsi::Runtime &rt, react: } static jsi::Value __hostFunction_RNTextInputMask_mask(jsi::Runtime &rt, react::TurboModule &turboModule, const jsi::Value *args, size_t count) { - std::string maskValue = args[0].getString(rt).utf8(rt); std::string value = args[1].getString(rt).utf8(rt); bool autocomplete = args[2].getBool(); return createPromiseAsJSIValue( rt, [maskValue, value, autocomplete](jsi::Runtime &rt2, std::shared_ptr promise) { try { + auto start = std::chrono::high_resolution_clock::now(); std::string result = getString(maskValue, value, autocomplete, 1); promise->resolve(jsi::String::createFromUtf8(rt2, result)); + // 获取结束时间点 + auto end = std::chrono::high_resolution_clock::now(); + // 计算延迟 + std::chrono::duration latency = end - start; + DLOG(INFO) << "=======mask 响应时长: " << latency.count() << " 毫秒" << std::endl; } catch (FormatError e) { promise->reject(e.what()); } diff --git a/harmony/text_input_mask/src/main/cpp/common/Compiler.h b/harmony/text_input_mask/src/main/cpp/common/Compiler.h index 9f3dd31..d6d5d06 100644 --- a/harmony/text_input_mask/src/main/cpp/common/Compiler.h +++ b/harmony/text_input_mask/src/main/cpp/common/Compiler.h @@ -105,14 +105,17 @@ class Compiler { } std::unique_ptr compileWithCustomNotations(char c, const std::string &str) { + DLOG(ERROR) << "====== compileWithCustomNotations customNotations size: " << customNotations.size(); for (const auto &customNotation : customNotations) { if (customNotation.character == c) { std::shared_ptr compiledState = compile(str.substr(1), true, false, c); if (customNotation.isOptional) { + DLOG(ERROR) << "====== compileWithCustomNotations customNotations isOptional :" << customNotation.isOptional; return std::make_unique( std::move(compiledState), std::make_shared(c, customNotation.characterSet)); } else { + DLOG(ERROR) << "======= compileWithCustomNotations customNotations isOptional :" << customNotation.isOptional; return std::make_unique( std::move(compiledState), std::make_shared(c, customNotation.characterSet)); } @@ -150,6 +153,7 @@ class Compiler { if (!lastCharacter.has_value()) { throw FormatError(); // 处理空字符情况,抛出异常 } + DLOG(INFO) << "======determineTypeWithCustomNotations customNotations size: "< customNotations; - - private: - std::shared_ptr initialState; - - private: - std::string format; - +class Mask { +protected: + std::vector customNotations; + +private: + std::shared_ptr initialState; + +private: + std::string format; + +public: + // 主构造函数 + Mask(const std::string &format, const std::vector &customNotations) : customNotations(customNotations) { + this->format = format; + this->customNotations = customNotations; + this->initialState = Compiler(customNotations).compile(format); + } + + // 便利构造函数 + Mask(const std::string &format) : Mask(format, {}) { // 调用主构造函数,传入空的 customNotations + std::vector emptyVector; + this->format = format; + this->customNotations = emptyVector; + this->initialState = Compiler(this->customNotations).compile(this->format); + } + + + class MaskFactory { public: - // 主构造函数 - Mask(const std::string &format, const std::vector &customNotations) - : customNotations(customNotations) { - this->format = format; - this->customNotations = customNotations; - this->initialState = Compiler(customNotations).compile(format); - } - - // 便利构造函数 - Mask(const std::string &format) : Mask(format, {}) { // 调用主构造函数,传入空的 customNotations - std::vector emptyVector; - this->format = format; - this->customNotations = emptyVector; - this->initialState = Compiler(this->customNotations).compile(this->format); - } - + static std::unordered_map> maskCache; - class MaskFactory { - public: - static std::unordered_map> maskCache; - - public: - /** - * Factory constructor. - * - * Operates over own ``Mask`` cache where initialized ``Mask`` objects are stored under - * corresponding format key: `[format : mask]` - * - * @returns Previously cached ``Mask`` object for requested format string. If such it - * doesn't exist in cache, the object is constructed, cached and returned. - */ - static std::shared_ptr getOrCreate(const std::string &format, - const std::vector &customNotations) { - auto cachedMask = maskCache.find(format); - if (cachedMask == maskCache.end()) { - auto newMask = std::make_shared(format, customNotations); - maskCache[format] = newMask; - return newMask; - } - return cachedMask->second; + public: + /** + * Factory constructor. + * + * Operates over own ``Mask`` cache where initialized ``Mask`` objects are stored under + * corresponding format key: `[format : mask]` + * + * @returns Previously cached ``Mask`` object for requested format string. If such it + * doesn't exist in cache, the object is constructed, cached and returned. + */ + static std::shared_ptr getOrCreate(const std::string &format, + const std::vector &customNotations) { + auto cachedMask = maskCache.find(format); + if (cachedMask == maskCache.end()) { + auto newMask = std::make_shared(format, customNotations); + maskCache[format] = newMask; + return newMask; } + return cachedMask->second; + } - /** - * Check your mask format is valid. - * - * @param format mask format. - * @param customNotations a list of custom rules to compile square bracket `[]` groups of format symbols. - * - * @returns `true` if this format coupled with custom notations will compile into a working ``Mask`` object. - * Otherwise `false`. - */ - static bool isValid(const std::string &format, const std::vector &customNotations) { - try { - Mask(format, customNotations); - return true; - } catch (const FormatError &) { - return false; - } - } - }; /** - * Apply mask to the user input string. + * Check your mask format is valid. * - * @param text user input string with current cursor position + * @param format mask format. + * @param customNotations a list of custom rules to compile square bracket `[]` groups of format symbols. * - * @returns Formatted text with extracted value an adjusted cursor position. + * @returns `true` if this format coupled with custom notations will compile into a working ``Mask`` object. + * Otherwise `false`. */ - virtual Result apply(const CaretString &text) { - auto iterator = makeIterator(text); // Assume this function is defined - - int affinity = 0; - std::string extractedValue; - std::string modifiedString; - int modifiedCaretPosition = text.caretPosition; - - std::shared_ptr state = initialState; - AutocompletionStack autocompletionStack; - - bool insertionAffectsCaret = iterator->insertionAffectsCaret(); - bool deletionAffectsCaret = iterator->deletionAffectsCaret(); - char character = iterator->next(); - while (character != '\0') { - auto next = state->accept(character); - - if (next != nullptr) { - if (deletionAffectsCaret) { - auto opt = state->autocomplete(); - if (opt != nullptr) { - autocompletionStack.push(*opt); - } - } - state = next->state; - if (next->insert == '\0') { - modifiedString += ""; - } else { - modifiedString += next->insert; - } - if (next->value == '\0') { - extractedValue += ""; - } else { - extractedValue += next->value; - } - if (next->pass) { - insertionAffectsCaret = iterator->insertionAffectsCaret(); - deletionAffectsCaret = iterator->deletionAffectsCaret(); - character = iterator->next(); - affinity += 1; - } else { - if (insertionAffectsCaret && next->insert != '\0') { - modifiedCaretPosition += 1; - } - affinity -= 1; - } - } else { - if (deletionAffectsCaret) { - modifiedCaretPosition -= 1; + static bool isValid(const std::string &format, const std::vector &customNotations) { + try { + Mask(format, customNotations); + return true; + } catch (const FormatError &) { + return false; + } + } + }; + /** + * Apply mask to the user input string. + * + * @param text user input string with current cursor position + * + * @returns Formatted text with extracted value an adjusted cursor position. + */ + virtual Result apply(const CaretString &text) { + auto iterator = makeIterator(text); // Assume this function is defined + + int affinity = 0; + std::string extractedValue; + std::string modifiedString; + int modifiedCaretPosition = text.caretPosition; + + std::shared_ptr state = initialState; + AutocompletionStack autocompletionStack; + + bool insertionAffectsCaret = iterator->insertionAffectsCaret(); + bool deletionAffectsCaret = iterator->deletionAffectsCaret(); + char character = iterator->next(); + while (character != '\0') { + auto next = state->accept(character); + + if (next != nullptr) { + if (deletionAffectsCaret) { + auto opt = state->autocomplete(); + if (opt != nullptr) { + autocompletionStack.push(*opt); } - insertionAffectsCaret = iterator->insertionAffectsCaret(); - deletionAffectsCaret = iterator->deletionAffectsCaret(); - character = iterator->next(); - affinity -= 1; } - } - - while (text.caretGravity->autocomplete() && insertionAffectsCaret) { - auto next = state->autocomplete(); - if (next == nullptr) - break; - state = next->state; if (next->insert == '\0') { modifiedString += ""; @@ -161,211 +122,251 @@ namespace TinpMask { } else { extractedValue += next->value; } - if (next->insert == '\0') { - modifiedCaretPosition += 1; - } - } - std::shared_ptr tailState = state; - std::string tail; - while (text.caretGravity->autoskip() && !autocompletionStack.isEmpty()) { - auto skip = autocompletionStack.pop(); - if (modifiedString.length() == modifiedCaretPosition) { - if (!skip->insert == '\0' && skip->insert == modifiedString.back()) { - modifiedString.pop_back(); - modifiedCaretPosition -= 1; - } - if (skip.has_value() && skip.value().value == modifiedString.back()) { - extractedValue.pop_back(); - } + if (next->pass) { + insertionAffectsCaret = iterator->insertionAffectsCaret(); + deletionAffectsCaret = iterator->deletionAffectsCaret(); + character = iterator->next(); + affinity += 1; } else { - if (!skip->insert == '\0') { - modifiedCaretPosition -= 1; + if (insertionAffectsCaret && next->insert != '\0') { + modifiedCaretPosition += 1; } + affinity -= 1; } - tailState = skip->state; - tail += skip->insert; + } else { + if (deletionAffectsCaret) { + modifiedCaretPosition -= 1; + } + insertionAffectsCaret = iterator->insertionAffectsCaret(); + deletionAffectsCaret = iterator->deletionAffectsCaret(); + character = iterator->next(); + affinity -= 1; } - - std::string tailPlaceholder = appendPlaceholder(tailState.get(), tail); // Assume this function is defined - - return Result(CaretString(modifiedString, modifiedCaretPosition, text.caretGravity), extractedValue, - affinity, - noMandatoryCharactersLeftAfterState(state.get()), // Assume this function is defined - tailPlaceholder); } + while (text.caretGravity->autocomplete() && insertionAffectsCaret) { + auto next = state->autocomplete(); + if (next == nullptr) + break; - public: - std::shared_ptr makeIterator(const CaretString &text) const { - return std::make_shared(text); + state = next->state; + if (next->insert == '\0') { + modifiedString += ""; + } else { + modifiedString += next->insert; + } + if (next->value == '\0') { + extractedValue += ""; + } else { + extractedValue += next->value; + } + if (next->insert == '\0') { + modifiedCaretPosition += 1; + } } - - /** - * Generate placeholder. - * - * @return Placeholder string. - */ - public: - std::string placeholder() { return appendPlaceholder(initialState.get(), ""); } - /** - * Minimal length of the text inside the field to fill all mandatory characters in the mask. - * - * @return Minimal satisfying count of characters inside the text field. - */ - public: - int acceptableTextLength() { - std::shared_ptr state = std::move(initialState); - ; - int length = 0; - - while (state != nullptr && dynamic_cast(state.get()) == nullptr) { - if (dynamic_cast(state.get()) != nullptr || - dynamic_cast(state.get()) != nullptr || - dynamic_cast(state.get()) != nullptr) { - length += 1; + std::shared_ptr tailState = state; + std::string tail; + while (text.caretGravity->autoskip() && !autocompletionStack.isEmpty()) { + auto skip = autocompletionStack.pop(); + if (modifiedString.length() == modifiedCaretPosition) { + if (!skip->insert == '\0' && skip->insert == modifiedString.back()) { + modifiedString.pop_back(); + modifiedCaretPosition -= 1; + } + if (skip.has_value() && skip.value().value == modifiedString.back()) { + extractedValue.pop_back(); + } + } else { + if (!skip->insert == '\0') { + modifiedCaretPosition -= 1; } - state = state->child; // 移动到下一个子状态 } - - return length; + tailState = skip->state; + tail += skip->insert; } + std::string tailPlaceholder = appendPlaceholder(tailState.get(), tail); // Assume this function is defined + + return Result(CaretString(modifiedString, modifiedCaretPosition, text.caretGravity), extractedValue, affinity, + noMandatoryCharactersLeftAfterState(state.get()), // Assume this function is defined + tailPlaceholder); + } + + +public: + std::shared_ptr makeIterator(const CaretString &text) const { + return std::make_shared(text); + } + + /** + * Generate placeholder. + * + * @return Placeholder string. + */ +public: + std::string placeholder() { return appendPlaceholder(initialState.get(), ""); } + /** + * Minimal length of the text inside the field to fill all mandatory characters in the mask. + * + * @return Minimal satisfying count of characters inside the text field. + */ +public: + int acceptableTextLength() { + std::shared_ptr state = std::move(initialState); + ; + int length = 0; + + while (state != nullptr && dynamic_cast(state.get()) == nullptr) { + if (dynamic_cast(state.get()) != nullptr || + dynamic_cast(state.get()) != nullptr || + dynamic_cast(state.get()) != nullptr) { + length += 1; + } + state = state->child; // 移动到下一个子状态 + } - /** - * Maximal length of the text inside the field. - * - * @return Total available count of mandatory and optional characters inside the text field. - */ - public: - int totalTextLength() const { - std::shared_ptr state = initialState; - ; - int length = 0; - - while (state != nullptr && dynamic_cast(state.get()) == nullptr) { - if (dynamic_cast(state.get()) != nullptr || - dynamic_cast(state.get()) != nullptr || - dynamic_cast(state.get()) != nullptr || - dynamic_cast(state.get()) != nullptr) { - length += 1; - } - state = state->child; // 移动到下一个子状态 + return length; + } + + + /** + * Maximal length of the text inside the field. + * + * @return Total available count of mandatory and optional characters inside the text field. + */ +public: + int totalTextLength() const { + std::shared_ptr state = initialState; + ; + int length = 0; + + while (state != nullptr && dynamic_cast(state.get()) == nullptr) { + if (dynamic_cast(state.get()) != nullptr || + dynamic_cast(state.get()) != nullptr || + dynamic_cast(state.get()) != nullptr || + dynamic_cast(state.get()) != nullptr) { + length += 1; } + state = state->child; // 移动到下一个子状态 + } - return length; + return length; + } + /** + * Minimal length of the extracted value with all mandatory characters filled.\ + * + * @return Minimal satisfying count of characters in extracted value. + */ +public: + int acceptableValueLength() const { + std::shared_ptr state = initialState; + int length = 0; + while (state != nullptr && dynamic_cast(state.get()) == nullptr) { + if (dynamic_cast(state.get()) != nullptr || + dynamic_cast(state.get()) != nullptr) { + length += 1; + } + state = state->child; // 移动到下一个子状态 } - /** - * Minimal length of the extracted value with all mandatory characters filled.\ - * - * @return Minimal satisfying count of characters in extracted value. - */ - public: - int acceptableValueLength() const { - std::shared_ptr state = initialState; - int length = 0; - while (state != nullptr && dynamic_cast(state.get()) == nullptr) { - if (dynamic_cast(state.get()) != nullptr || - dynamic_cast(state.get()) != nullptr) { - length += 1; - } - state = state->child; // 移动到下一个子状态 + + return length; + } + /** + * Maximal length of the extracted value. + * + * @return Total available count of mandatory and optional characters for extracted value. + */ +public: + int totalValueLength() const { + std::shared_ptr state = initialState; + int length = 0; + while (state != nullptr && dynamic_cast(state.get()) == nullptr) { + if (dynamic_cast(state.get()) != nullptr || + dynamic_cast(state.get()) != nullptr || + dynamic_cast(state.get()) != nullptr) { + length += 1; } + state = state->child; // 移动到下一个子状态 + } + return length; + } - return length; +private: + std::string appendPlaceholder(State *state, const std::string &placeholder) const { + if (state == nullptr) { + return placeholder; } - /** - * Maximal length of the extracted value. - * - * @return Total available count of mandatory and optional characters for extracted value. - */ - public: - int totalValueLength() const { - std::shared_ptr state = initialState; - int length = 0; - while (state != nullptr && dynamic_cast(state.get()) == nullptr) { - if (dynamic_cast(state.get()) != nullptr || - dynamic_cast(state.get()) != nullptr || - dynamic_cast(state.get()) != nullptr) { - length += 1; - } - state = state->child; // 移动到下一个子状态 - } - return length; + + if (dynamic_cast(state)) { + return placeholder; } - private: - std::string appendPlaceholder(State *state, const std::string &placeholder) const { - if (state == nullptr) { - return placeholder; - } + if (auto fixedState = dynamic_cast(state)) { + return appendPlaceholder(fixedState->child.get(), placeholder + fixedState->ownCharacter); + } - if (dynamic_cast(state)) { - return placeholder; - } + if (auto freeState = dynamic_cast(state)) { + return appendPlaceholder(freeState->child.get(), placeholder + freeState->ownCharacter); + } - if (auto fixedState = dynamic_cast(state)) { - return appendPlaceholder(fixedState->child.get(), placeholder + fixedState->ownCharacter); + if (auto optionalValueState = dynamic_cast(state)) { + if (!state) { + return placeholder; // 如果 state 为 nullptr,直接返回原始 placeholder } - - if (auto freeState = dynamic_cast(state)) { - return appendPlaceholder(freeState->child.get(), placeholder + freeState->ownCharacter); + // 使用 if-else 替代 switch + if (optionalValueState->type->getName() == StateTypeName::Numeric) { + return appendPlaceholder(state->child.get(), placeholder + "0"); + } else if (optionalValueState->type->getName() == StateTypeName::Literal) { + return appendPlaceholder(state->child.get(), placeholder + "a"); + } else if (optionalValueState->type->getName() == StateTypeName::AlphaNumeric) { + return appendPlaceholder(state->child.get(), placeholder + "-"); + } else if (optionalValueState->type->getName() == StateTypeName::Custom) { + auto customValueState = dynamic_cast(state); + auto customStateType = dynamic_cast(customValueState->type.get()); + return appendPlaceholder(state->child.get(), placeholder + customStateType->character); + } else { + return placeholder; // 未知类型,返回原始 placeholder } + } - if (auto optionalValueState = dynamic_cast(state)) { - if (!state) { - return placeholder; // 如果 state 为 nullptr,直接返回原始 placeholder - } - // 使用 if-else 替代 switch - if (optionalValueState->type->getName() == StateTypeName::Numeric) { - return appendPlaceholder(state->child.get(), placeholder + "0"); - } else if (optionalValueState->type->getName() == StateTypeName::Literal) { - return appendPlaceholder(state->child.get(), placeholder + "a"); - } else if (optionalValueState->type->getName() == StateTypeName::AlphaNumeric) { - return appendPlaceholder(state->child.get(), placeholder + "-"); - } else if (optionalValueState->type->getName() == StateTypeName::Custom) { - auto customValueState = dynamic_cast(state); - auto customStateType = dynamic_cast(customValueState->type.get()); - return appendPlaceholder(state->child.get(), - placeholder + customStateType->character); - } else { - return placeholder; // 未知类型,返回原始 placeholder - } + if (auto valueState = dynamic_cast(state)) { + if (!state) { + return placeholder; // 如果 state 为 nullptr,直接返回原始 placeholder } - - if (auto valueState = dynamic_cast(state)) { - if (!state) { - return placeholder; // 如果 state 为 nullptr,直接返回原始 placeholder + // 使用 if-else 替代 switch + if (valueState->type->getName() == StateTypeName::Numeric) { + return appendPlaceholder(state->child.get(), placeholder + "0"); + } else if (valueState->type->getName() == StateTypeName::Literal) { + return appendPlaceholder(state->child.get(), placeholder + "a"); + } else if (valueState->type->getName() == StateTypeName::AlphaNumeric) { + return appendPlaceholder(state->child.get(), placeholder + "-"); + } else if (valueState->type->getName() == StateTypeName::Custom) { + auto customValueState = dynamic_cast(state); + if (customValueState->type.get()) { + auto customStateType = dynamic_cast(customValueState->type.get()); + return appendPlaceholder(state->child.get(), placeholder + customStateType->character); + }else { + throw FormatError("appendPlaceholder customValueState type is null"); // 未找到匹配项,抛出异常 } - // 使用 if-else 替代 switch - if (valueState->type->getName() == StateTypeName::Numeric) { - return appendPlaceholder(state->child.get(), placeholder + "0"); - } else if (valueState->type->getName() == StateTypeName::Literal) { - return appendPlaceholder(state->child.get(), placeholder + "a"); - } else if (valueState->type->getName() == StateTypeName::AlphaNumeric) { - return appendPlaceholder(state->child.get(), placeholder + "-"); - } else if (valueState->type->getName() == StateTypeName::Custom) { - auto customValueState = dynamic_cast(state); - auto customStateType = dynamic_cast(customValueState->type.get()); - return appendPlaceholder(state->child.get(), - placeholder + customStateType->character); - } else { - return placeholder; // 未知类型,返回原始 placeholder - } - } - - return placeholder; - } - bool noMandatoryCharactersLeftAfterState(State *state) const { - if (dynamic_cast(state)) { - return true; - } else if (auto valueState = dynamic_cast(state)) { - return valueState->isElliptical(); - } else if (dynamic_cast(state)) { - return false; } else { - return noMandatoryCharactersLeftAfterState(state->nextState().get()); + return placeholder; // 未知类型,返回原始 placeholder } } - }; -} \ No newline at end of file + + return placeholder; + } + + bool noMandatoryCharactersLeftAfterState(State *state) const { + if (dynamic_cast(state)) { + return true; + } else if (auto valueState = dynamic_cast(state)) { + return valueState->isElliptical(); + } else if (dynamic_cast(state)) { + return false; + } else { + return noMandatoryCharactersLeftAfterState(state->nextState().get()); + } + } +}; +} // namespace TinpMask \ No newline at end of file diff --git a/harmony/text_input_mask/src/main/cpp/common/model/AffinityCalculationStrategy.h b/harmony/text_input_mask/src/main/cpp/common/model/AffinityCalculationStrategy.h index b72a907..afb5678 100644 --- a/harmony/text_input_mask/src/main/cpp/common/model/AffinityCalculationStrategy.h +++ b/harmony/text_input_mask/src/main/cpp/common/model/AffinityCalculationStrategy.h @@ -30,7 +30,6 @@ class AffinityCalculator { ? std::numeric_limits::min() : extractedValue.length() - mask.totalValueLength(); } - default: throw std::invalid_argument("Unknown AffinityCalculationStrategy"); } From 3c18fed6bfccc21f1771689780120d616c70a863 Mon Sep 17 00:00:00 2001 From: guichuang <13343468815@163.com> Date: Tue, 29 Oct 2024 15:26:24 +0800 Subject: [PATCH 2/2] release:@react-native-oh-tpl/react-native-text-input-mask@3.1.5-0.0.3 (#8) --- harmony/text_input_mask.har | Bin 18609 -> 18606 bytes harmony/text_input_mask/BuildProfile.ets | 2 +- harmony/text_input_mask/oh-package.json5 | 2 +- package.json | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/harmony/text_input_mask.har b/harmony/text_input_mask.har index ca3991cb16192c854ba1b733e5047372e43bbbed..aa9587983903b542eb7402b808e4ffa29839edf3 100644 GIT binary patch delta 16684 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

;<0$KLa_WH}pXp@Qd$@3_n6KdKt-o?Gy4 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 diff --git a/harmony/text_input_mask/BuildProfile.ets b/harmony/text_input_mask/BuildProfile.ets index b8000f1..8dec343 100644 --- a/harmony/text_input_mask/BuildProfile.ets +++ b/harmony/text_input_mask/BuildProfile.ets @@ -1,7 +1,7 @@ /** * Use these variables when you tailor your ArkTS code. They must be of the const type. */ -export const HAR_VERSION = '3.1.5-0.0.2'; +export const HAR_VERSION = '3.1.5-0.0.3'; export const BUILD_MODE_NAME = 'debug'; export const DEBUG = true; export const TARGET_NAME = 'default'; diff --git a/harmony/text_input_mask/oh-package.json5 b/harmony/text_input_mask/oh-package.json5 index d9285de..05ee0ab 100644 --- a/harmony/text_input_mask/oh-package.json5 +++ b/harmony/text_input_mask/oh-package.json5 @@ -1,6 +1,6 @@ { "name": "@react-native-oh-tpl/react-native-text-input-mask", - "version": "3.1.5-0.0.2", + "version": "3.1.5-0.0.3", "description": "Please describe the basic information.", "main": "Index.ets", "author": "", diff --git a/package.json b/package.json index 34c8f98..a844e64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@react-native-oh-tpl/react-native-text-input-mask", - "version": "3.1.5-0.0.2", + "version": "3.1.5-0.0.3", "description": "Text input mask for React Native.", "main": "dist/index.js", "typings": "dist/index.d.ts",