diff --git a/adapter/ohos/capability/html/html_to_span.cpp b/adapter/ohos/capability/html/html_to_span.cpp index 909a84d17982cc97ec836a172c470db6027e62c1..3a8fa9219e52a2eff4e7821f06cfbd3fe6d11765 100644 --- a/adapter/ohos/capability/html/html_to_span.cpp +++ b/adapter/ohos/capability/html/html_to_span.cpp @@ -1081,7 +1081,7 @@ void HtmlToSpan::AddSpans(const SpanInfo& info, RefPtr mutabl span = CreateSpan(index, info, value); } if (span != nullptr) { - mutableSpan->AddSpan(span); + mutableSpan->AddSpan(span, false); } } } @@ -1102,17 +1102,23 @@ RefPtr HtmlToSpan::GenerateSpans( const std::string& allContent, const std::vector& spanInfos) { auto mutableSpan = AceType::MakeRefPtr(UtfUtils::Str8DebugToStr16(allContent)); - RefPtr span; - for (auto& info : spanInfos) { + if (spanInfos.empty()) { + return mutableSpan; + } + for (int32_t i = 0; i < static_cast(spanInfos.size()); ++i) { + auto info = spanInfos[i]; + if (info.type == HtmlType::IMAGE) { + AddImageSpans(info, mutableSpan); + } + } + for (int32_t i = static_cast(spanInfos.size()) - 1; i >= 0; --i) { + auto info = spanInfos[i]; if (info.type == HtmlType::PARAGRAPH) { AddSpans(info, mutableSpan); - } else if (info.type == HtmlType::IMAGE) { - AddImageSpans(info, mutableSpan); - } else { + } else if (info.type != HtmlType::IMAGE) { AddSpans(info, mutableSpan); } } - return mutableSpan; } diff --git a/frameworks/core/components_ng/pattern/text/span/span_string.cpp b/frameworks/core/components_ng/pattern/text/span/span_string.cpp index 4e7461e0b02576c6ce8b92ac25a9a1c770c41eaa..e3af704b6fe84b60da4c5254c3c30e3ae235afce 100644 --- a/frameworks/core/components_ng/pattern/text/span/span_string.cpp +++ b/frameworks/core/components_ng/pattern/text/span/span_string.cpp @@ -355,7 +355,7 @@ RefPtr SpanString::MakeCustomSpanItem(const RefPtr& span) +void SpanString::AddSpan(const RefPtr& span, bool removeOriginStyle) { if (!span || !CheckRange(span)) { return; @@ -371,7 +371,9 @@ void SpanString::AddSpan(const RefPtr& span) ApplyToSpans(span, { start, end }, SpanOperation::ADD); return; } - RemoveSpan(start, end - start, span->GetSpanType()); + if (removeOriginStyle) { + RemoveSpan(start, end - start, span->GetSpanType()); + } auto spans = spansMap_[span->GetSpanType()]; ApplyToSpans(span, { start, end }, SpanOperation::ADD); SplitInterval(spans, { start, end }); diff --git a/frameworks/core/components_ng/pattern/text/span/span_string.h b/frameworks/core/components_ng/pattern/text/span/span_string.h index 161e6c7069902172a6f8de31c53479e805037459..eccb9701bc77f2fea921fdbd8b13985baaf4ed1f 100644 --- a/frameworks/core/components_ng/pattern/text/span/span_string.h +++ b/frameworks/core/components_ng/pattern/text/span/span_string.h @@ -60,7 +60,7 @@ public: RefPtr GetSpan(int32_t start, int32_t length, SpanType spanType) const; bool operator==(const SpanString& other) const; std::list> GetSpanItems() const; - void AddSpan(const RefPtr& span); + void AddSpan(const RefPtr& span, bool removeOriginStyle = true); void RemoveSpan(int32_t start, int32_t length, SpanType key); bool CheckRange(int32_t start, int32_t length, bool allowLengthZero = false) const; void BindWithSpans(const std::vector>& spans); diff --git a/test/unittest/adapter/ohos/capability/html_to_spanstring_test.cpp b/test/unittest/adapter/ohos/capability/html_to_spanstring_test.cpp index b9437a02411cc6a4aa87f5d6a00991cb1bb0154c..26f0d06faf1857456428ce9a73066750aee609ff 100644 --- a/test/unittest/adapter/ohos/capability/html_to_spanstring_test.cpp +++ b/test/unittest/adapter/ohos/capability/html_to_spanstring_test.cpp @@ -1271,6 +1271,31 @@ HWTEST_F(HtmlConvertTestNg, HtmlConvert017, TestSize.Level1) EXPECT_EQ(hmtlString, htmlFromSpan); } +/** + * @tc.name: HtmlConvertPriorityText + * @tc.desc: This test case checks the conversion priority of html text + * where inner attribute has the higher priority. + * @tc.level: 1 + */ +HWTEST_F(HtmlConvertTestNg, HtmlConvertPriorityText, TestSize.Level1) +{ + const std::string html = "

\n" + "test1\ntest2\ntest3\nstrong1\ntest4\n

"; + HtmlToSpan toSpan; + auto dstSpan = toSpan.ToSpanString(html); + std::list> spans = dstSpan->GetSpanItems(); + EXPECT_EQ(spans.size(), 9); + auto it = spans.begin(); + EXPECT_EQ((*it)->fontStyle->GetFontSize().value(), Dimension(20, DimensionUnit::VP)); + ++it; + ++it; + EXPECT_EQ((*it)->fontStyle->GetTextColor().value(), Color::RED); + ++it; + ++it; + ++it; + EXPECT_EQ((*it)->fontStyle->GetFontWeight().value(), FontWeight::BOLD); +} + /** * @tc.name: HtmlConverter001 * @tc.desc: This test case checks the conversion of a span string with a font-family property applied. @@ -1432,7 +1457,7 @@ HWTEST_F(HtmlConvertTestNg, HtmlConverter006, TestSize.Level1) std::list> spans = dstSpan->GetSpanItems(); EXPECT_EQ(spans.size(), 2); auto it = spans.begin(); - EXPECT_EQ((*it)->fontStyle->GetFontSize().value(), Dimension(50, DimensionUnit::VP)); + EXPECT_EQ((*it)->fontStyle->GetFontSize().value(), Dimension(100, DimensionUnit::VP)); } /**