From 8ef941787d6c53b99d72ab3cef4a55ae1d9e7e6d Mon Sep 17 00:00:00 2001 From: ssabah Date: Mon, 14 Mar 2022 00:48:55 +0300 Subject: [PATCH] Support Strikethrough with Height attribute in markup The attribute of strikethrough in tag : - height The attribute of strikethrough in tag : - s-height How to apply it in TextEditor: textEditor.SetProperty(Dali::Toolkit::TextEditor::Property::TEXT, " hello world span tagnothing hello world s tag "); textEditor.SetProperty(Dali::Toolkit::TextEditor::Property::ENABLE_MARKUP, true); This patch should be preceded by the patch below: https://review.tizen.org/gerrit/c/platform/core/uifw/dali-toolkit/+/272017 Change-Id: I3332531528f53e9bc87c6bf194fb6c58d131a269 --- .../utc-Dali-TextEditor-internal.cpp | 108 +++++++++++++++++++-- .../utc-Dali-TextField-internal.cpp | 108 +++++++++++++++++++-- .../utc-Dali-TextLabel-internal.cpp | 108 +++++++++++++++++++-- .../internal/text/markup-processor-span.cpp | 6 ++ .../text/markup-processor-strikethrough.cpp | 15 ++- .../internal/text/markup-processor-strikethrough.h | 8 ++ dali-toolkit/internal/text/markup-processor.cpp | 2 +- 7 files changed, 335 insertions(+), 20 deletions(-) diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextEditor-internal.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextEditor-internal.cpp index 14bdfa0..ade6b11 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextEditor-internal.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextEditor-internal.cpp @@ -600,6 +600,93 @@ int UtcDaliTextEditorMarkupNestedUnderlineTags(void) END_TEST; } +int UtcDaliTextEditorMarkupStrikethroughAttributes(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextEditorMarkupStrikethroughAttributes "); + + TextEditor textEditor = TextEditor::New(); + + application.GetScene().Add(textEditor); + + std::string testText = + "startABC1then" + "ABC2then" + "ABC3then" + "ABC4end"; + + textEditor.SetProperty(TextEditor::Property::TEXT, testText); + textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true); + + application.SendNotification(); + application.Render(); + + const uint32_t expectedNumberOfStrikethroughRuns = 4u; + + Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor); + const Text::Length numberOfStrikethroughRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns(); + + DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughRuns, TEST_LOCATION); + + Vector strikethroughRuns; + strikethroughRuns.Resize(numberOfStrikethroughRuns); + textEditorImpl.GetTextController()->GetTextModel()->GetStrikethroughRuns(strikethroughRuns.Begin(), 0u, numberOfStrikethroughRuns); + + struct DataOfCase + { + std::string title; + GlyphIndex glyphIndex; + Length numberOfGlyphs; + StrikethroughStyleProperties properties; + }; + DataOfCase data[] = + { + + {"ABC1", + 5u, + 4u, + {Color::BLACK, + 0.0f, + false, + false}}, + + {"ABC2", + 13u, + 4u, + {Color::GREEN, + 0.0f, + true, + false}}, + + {"ABC3", + 21u, + 4u, + {Color::BLACK, + 5.0f, + false, + true}}, + + {"ABC4", + 29u, + 4u, + {Color::BLUE, + 4.0f, + true, + true}}, + + }; + + for(uint32_t i = 0; i < expectedNumberOfStrikethroughRuns; i++) + { + tet_infoline(data[i].title.c_str()); + DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == strikethroughRuns[i].properties); + } + + END_TEST; +} + int UtcDaliTextEditorMarkupSpanStrikethrough(void) { ToolkitTestApplication application; @@ -612,7 +699,8 @@ int UtcDaliTextEditorMarkupSpanStrikethrough(void) std::string testText = "startABC1then" "ABC2then" - "ABC3end"; + "ABC3then" + "ABC4end"; textEditor.SetProperty(TextEditor::Property::TEXT, testText); textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true); @@ -620,7 +708,7 @@ int UtcDaliTextEditorMarkupSpanStrikethrough(void) application.SendNotification(); application.Render(); - const uint32_t expectedNumberOfStrikethroughRuns = 2u; + const uint32_t expectedNumberOfStrikethroughRuns = 3u; Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor); const Text::Length numberOfStrikethroughRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns(); @@ -645,17 +733,25 @@ int UtcDaliTextEditorMarkupSpanStrikethrough(void) 13u, 4u, {Color::BLUE, - 0u, + 0.0f, true, false}}, - {"ABC3", + {"ABC3then", 21u, 4u, + {Color::BLACK, + 2.0f, + false, + true}}, + + {"ABC4", + 29u, + 4u, {Color::GREEN, - 0u, + 5.0f, true, - false}}, + true}}, }; diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextField-internal.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextField-internal.cpp index 18e2b06..da74a7a 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextField-internal.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextField-internal.cpp @@ -684,6 +684,93 @@ int UtcDaliTextFieldMarkupNestedUnderlineTags(void) END_TEST; } +int UtcDaliTextFieldMarkupStrikethroughAttributes(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextFieldMarkupStrikethroughAttributes "); + + TextField textField = TextField::New(); + + application.GetScene().Add(textField); + + std::string testText = + "startABC1then" + "ABC2then" + "ABC3then" + "ABC4end"; + + textField.SetProperty(TextField::Property::TEXT, testText); + textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true); + + application.SendNotification(); + application.Render(); + + const uint32_t expectedNumberOfStrikethroughRuns = 4u; + + Toolkit::Internal::TextField& textFieldImpl = GetImpl(textField); + const Text::Length numberOfStrikethroughRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns(); + + DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughRuns, TEST_LOCATION); + + Vector strikethroughRuns; + strikethroughRuns.Resize(numberOfStrikethroughRuns); + textFieldImpl.GetTextController()->GetTextModel()->GetStrikethroughRuns(strikethroughRuns.Begin(), 0u, numberOfStrikethroughRuns); + + struct DataOfCase + { + std::string title; + GlyphIndex glyphIndex; + Length numberOfGlyphs; + StrikethroughStyleProperties properties; + }; + DataOfCase data[] = + { + + {"ABC1", + 5u, + 4u, + {Color::BLACK, + 0.0f, + false, + false}}, + + {"ABC2", + 13u, + 4u, + {Color::GREEN, + 0.0f, + true, + false}}, + + {"ABC3", + 21u, + 4u, + {Color::BLACK, + 5.0f, + false, + true}}, + + {"ABC4", + 29u, + 4u, + {Color::BLUE, + 4.0f, + true, + true}}, + + }; + + for(uint32_t i = 0; i < expectedNumberOfStrikethroughRuns; i++) + { + tet_infoline(data[i].title.c_str()); + DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == strikethroughRuns[i].properties); + } + + END_TEST; +} + int UtcDaliTextFieldMarkupSpanStrikethrough(void) { ToolkitTestApplication application; @@ -696,7 +783,8 @@ int UtcDaliTextFieldMarkupSpanStrikethrough(void) std::string testText = "startABC1then" "ABC2then" - "ABC3end"; + "ABC3then" + "ABC4end"; textField.SetProperty(TextField::Property::TEXT, testText); textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true); @@ -704,7 +792,7 @@ int UtcDaliTextFieldMarkupSpanStrikethrough(void) application.SendNotification(); application.Render(); - const uint32_t expectedNumberOfStrikethroughRuns = 2u; + const uint32_t expectedNumberOfStrikethroughRuns = 3u; Toolkit::Internal::TextField& textFieldImpl = GetImpl(textField); const Text::Length numberOfStrikethroughRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns(); @@ -729,17 +817,25 @@ int UtcDaliTextFieldMarkupSpanStrikethrough(void) 13u, 4u, {Color::BLUE, - 0u, + 0.0f, true, false}}, - {"ABC3", + {"ABC3then", 21u, 4u, + {Color::BLACK, + 2.0f, + false, + true}}, + + {"ABC4", + 29u, + 4u, {Color::GREEN, - 0u, + 5.0f, true, - false}}, + true}}, }; diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextLabel-internal.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextLabel-internal.cpp index 2bd7df1..6c07302 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextLabel-internal.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextLabel-internal.cpp @@ -561,6 +561,93 @@ int UtcDaliTextLabelMarkupNestedUnderlineTags(void) END_TEST; } +int UtcDaliTextLabelMarkupStrikethroughAttributes(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextLabelMarkupStrikethroughAttributes "); + + TextLabel textLabel = TextLabel::New(); + + application.GetScene().Add(textLabel); + + std::string testText = + "startABC1then" + "ABC2then" + "ABC3then" + "ABC4end"; + + textLabel.SetProperty(TextLabel::Property::TEXT, testText); + textLabel.SetProperty(TextLabel ::Property::ENABLE_MARKUP, true); + + application.SendNotification(); + application.Render(); + + const uint32_t expectedNumberOfStrikethroughRuns = 4u; + + Toolkit::Internal::TextLabel& textLabelImpl = GetImpl(textLabel); + const Text::Length numberOfStrikethroughRuns = textLabelImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns(); + + DALI_TEST_EQUALS(numberOfStrikethroughRuns, expectedNumberOfStrikethroughRuns, TEST_LOCATION); + + Vector strikethroughRuns; + strikethroughRuns.Resize(numberOfStrikethroughRuns); + textLabelImpl.GetTextController()->GetTextModel()->GetStrikethroughRuns(strikethroughRuns.Begin(), 0u, numberOfStrikethroughRuns); + + struct DataOfCase + { + std::string title; + GlyphIndex glyphIndex; + Length numberOfGlyphs; + StrikethroughStyleProperties properties; + }; + DataOfCase data[] = + { + + {"ABC1", + 5u, + 4u, + {Color::BLACK, + 0.0f, + false, + false}}, + + {"ABC2", + 13u, + 4u, + {Color::GREEN, + 0.0f, + true, + false}}, + + {"ABC3", + 21u, + 4u, + {Color::BLACK, + 5.0f, + false, + true}}, + + {"ABC4", + 29u, + 4u, + {Color::BLUE, + 4.0f, + true, + true}}, + + }; + + for(uint32_t i = 0; i < expectedNumberOfStrikethroughRuns; i++) + { + tet_infoline(data[i].title.c_str()); + DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(strikethroughRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == strikethroughRuns[i].properties); + } + + END_TEST; +} + int UtcDaliTextLabelMarkupSpanStrikethrough(void) { ToolkitTestApplication application; @@ -573,7 +660,8 @@ int UtcDaliTextLabelMarkupSpanStrikethrough(void) std::string testText = "startABC1then" "ABC2then" - "ABC3end"; + "ABC3then" + "ABC4end"; textLabel.SetProperty(TextLabel::Property::TEXT, testText); textLabel.SetProperty(TextLabel ::Property::ENABLE_MARKUP, true); @@ -581,7 +669,7 @@ int UtcDaliTextLabelMarkupSpanStrikethrough(void) application.SendNotification(); application.Render(); - const uint32_t expectedNumberOfStrikethroughRuns = 2u; + const uint32_t expectedNumberOfStrikethroughRuns = 3u; Toolkit::Internal::TextLabel& textLabelImpl = GetImpl(textLabel); const Text::Length numberOfStrikethroughRuns = textLabelImpl.GetTextController()->GetTextModel()->GetNumberOfStrikethroughRuns(); @@ -606,17 +694,25 @@ int UtcDaliTextLabelMarkupSpanStrikethrough(void) 13u, 4u, {Color::BLUE, - 0u, + 0.0f, true, false}}, - {"ABC3", + {"ABC3then", 21u, 4u, + {Color::BLACK, + 2.0f, + false, + true}}, + + {"ABC4", + 29u, + 4u, {Color::GREEN, - 0u, + 5.0f, true, - false}}, + true}}, }; diff --git a/dali-toolkit/internal/text/markup-processor-span.cpp b/dali-toolkit/internal/text/markup-processor-span.cpp index 636c331..1b3cdc2 100644 --- a/dali-toolkit/internal/text/markup-processor-span.cpp +++ b/dali-toolkit/internal/text/markup-processor-span.cpp @@ -55,6 +55,7 @@ const std::string XHTML_UNDERLINE_DASH_WIDTH_ATTRIBUTE("u-dash-width"); //the strikethroughed character's attributes const std::string XHTML_STRIKETHROUGH_COLOR_ATTRIBUTE("s-color"); +const std::string XHTML_STRIKETHROUGH_HEIGHT_ATTRIBUTE("s-height"); } // namespace @@ -143,6 +144,11 @@ void ProcessSpanTag(const Tag& tag, isStrikethroughDefined = true; ProcessColorAttribute(attribute, strikethroughRun); } + else if(TokenComparison(XHTML_STRIKETHROUGH_HEIGHT_ATTRIBUTE, attribute.nameBuffer, attribute.nameLength)) + { + isStrikethroughDefined = true; + ProcessHeightAttribute(attribute, strikethroughRun); + } } } diff --git a/dali-toolkit/internal/text/markup-processor-strikethrough.cpp b/dali-toolkit/internal/text/markup-processor-strikethrough.cpp index 3612461..622a624 100644 --- a/dali-toolkit/internal/text/markup-processor-strikethrough.cpp +++ b/dali-toolkit/internal/text/markup-processor-strikethrough.cpp @@ -22,6 +22,7 @@ #include // INTERNAL INCLUDES +#include #include #include @@ -34,7 +35,8 @@ namespace Text namespace { const std::string XHTML_COLOR_ATTRIBUTE("color"); -} +const std::string XHTML_HEIGHT_ATTRIBUTE("height"); +} // namespace void ProcessColorAttribute(const Attribute& attribute, StrikethroughCharacterRun& strikethroughRun) @@ -43,6 +45,12 @@ void ProcessColorAttribute(const Attribute& attribute, StrikethroughCharacterRun strikethroughRun.properties.colorDefined = true; } +void ProcessHeightAttribute(const Attribute& attribute, StrikethroughCharacterRun& strikethroughRun) +{ + strikethroughRun.properties.height = ProcessFloatAttribute(attribute); + strikethroughRun.properties.heightDefined = true; +} + void ProcessStrikethroughTag(const Tag& tag, StrikethroughCharacterRun& strikethroughRun) { for(Vector::ConstIterator it = tag.attributes.Begin(), @@ -51,10 +59,15 @@ void ProcessStrikethroughTag(const Tag& tag, StrikethroughCharacterRun& striketh ++it) { const Attribute& attribute(*it); + if(TokenComparison(XHTML_COLOR_ATTRIBUTE, attribute.nameBuffer, attribute.nameLength)) { ProcessColorAttribute(attribute, strikethroughRun); } + else if(TokenComparison(XHTML_HEIGHT_ATTRIBUTE, attribute.nameBuffer, attribute.nameLength)) + { + ProcessHeightAttribute(attribute, strikethroughRun); + } } } diff --git a/dali-toolkit/internal/text/markup-processor-strikethrough.h b/dali-toolkit/internal/text/markup-processor-strikethrough.h index 44bfab9..d18966d 100644 --- a/dali-toolkit/internal/text/markup-processor-strikethrough.h +++ b/dali-toolkit/internal/text/markup-processor-strikethrough.h @@ -37,6 +37,14 @@ struct StrikethroughCharacterRun; void ProcessColorAttribute(const Attribute& attribute, StrikethroughCharacterRun& strikethroughCharacterRun); /** + * @brief Fill the strikethrough character run with the height attribute value. + * + * @param[in] attribute the height attribute. + * @param[out] strikethroughRun The strikethrough character run + */ +void ProcessHeightAttribute(const Attribute& attribute, StrikethroughCharacterRun& strikethroughRun); + +/** * @brief Retrieves the strikethrough run info from the tag and sets it to the strikethrough run. * * @param[in] tag The strikethrough tag and its attributes. diff --git a/dali-toolkit/internal/text/markup-processor.cpp b/dali-toolkit/internal/text/markup-processor.cpp index f5b90dc..830d629 100644 --- a/dali-toolkit/internal/text/markup-processor.cpp +++ b/dali-toolkit/internal/text/markup-processor.cpp @@ -83,7 +83,7 @@ const char NEW_LINE = 0x0A; // ASCII value of the newline. // Range 3 0x10000u < XHTML_DECIMAL_ENTITY_RANGE <= 0x10FFFFu const unsigned long XHTML_DECIMAL_ENTITY_RANGE[] = {0x0u, 0xD7FFu, 0xE000u, 0xFFFDu, 0x10000u, 0x10FFFFu}; -const unsigned int MAX_NUM_OF_ATTRIBUTES = 12u; ///< The span tag has the 'font-family', 'font-size' 'font-weight', 'font-width', 'font-slant','text-color', 'u-color', 'u-height','u-type','u-dash-gap', 'u-dash-width' and 's-color' attrubutes. +const unsigned int MAX_NUM_OF_ATTRIBUTES = 13u; ///< The span tag has the 'font-family', 'font-size' 'font-weight', 'font-width', 'font-slant','text-color', 'u-color', 'u-height','u-type','u-dash-gap', 'u-dash-width', 's-color' and 's-height' attrubutes. const unsigned int DEFAULT_VECTOR_SIZE = 16u; ///< Default size of run vectors. #if defined(DEBUG_ENABLED) -- 2.7.4