sw/inc/AccessibilityCheckStrings.hrc | 1 sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx | 11 +++ sw/qa/core/accessibilitycheck/data/SpaceTest.odt |binary sw/source/core/access/AccessibilityCheck.cxx | 49 +++++++++++++++ 4 files changed, 61 insertions(+)
New commits: commit 2c44f57b3f59012057a7a0a4d912648d362cf6f3 Author: offtkp <[email protected]> AuthorDate: Wed Oct 12 19:29:28 2022 +0300 Commit: Tomaž Vajngerl <[email protected]> CommitDate: Mon Oct 17 16:33:40 2022 +0200 a11y: Add check for spacing spaces Add accessibility check and relevant test for a document that uses multiple spaces for spacing Change-Id: Ib92471c50a25ead28f2b6c7d5e00ed222d4b429e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141267 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <[email protected]> diff --git a/sw/inc/AccessibilityCheckStrings.hrc b/sw/inc/AccessibilityCheckStrings.hrc index 4d65bd095f51..9c45cb84ecd9 100644 --- a/sw/inc/AccessibilityCheckStrings.hrc +++ b/sw/inc/AccessibilityCheckStrings.hrc @@ -23,6 +23,7 @@ #define STR_AVOID_ENDNOTES NC_("STR_AVOID_ENDNOTES", "Avoid endnotes.") #define STR_AVOID_BACKGROUND_IMAGES NC_("STR_AVOID_BACKGROUND_IMAGES", "Avoid background images.") #define STR_AVOID_NEWLINES_SPACE NC_("STR_AVOID_NEWLINES_SPACE", "Avoid newlines to create space.") +#define STR_AVOID_SPACES_SPACE NC_("STR_AVOID_SPACES_SPACE", "Avoid spaces to create space.") #define STR_HEADINGS_NOT_IN_ORDER NC_("STR_HEADINGS_NOT_IN_ORDER", "Headings not in order.") #define STR_TEXT_FORMATTING_CONVEYS_MEANING NC_("STR_TEXT_FORMATTING_CONVEYS_MEANING", "The text formatting conveys additional meaning.") #define STR_NON_INTERACTIVE_FORMS NC_("STR_NON_INTERACTIVE_FORMS", "An input form is not interactive.") diff --git a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx index 7a60b1578e21..98b08b5a207c 100644 --- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx +++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx @@ -82,6 +82,17 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheckNewlineSpace) CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[1]->m_eIssueID); } +CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheckSpacebarSpace) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "SpaceTest.odt"); + CPPUNIT_ASSERT(pDoc); + sw::AccessibilityCheck aCheck(pDoc); + aCheck.check(); + auto& aIssues = aCheck.getIssueCollection().getIssues(); + CPPUNIT_ASSERT_EQUAL(size_t(1), aIssues.size()); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[0]->m_eIssueID); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/core/accessibilitycheck/data/SpaceTest.odt b/sw/qa/core/accessibilitycheck/data/SpaceTest.odt new file mode 100644 index 000000000000..0f00f78f9698 Binary files /dev/null and b/sw/qa/core/accessibilitycheck/data/SpaceTest.odt differ diff --git a/sw/source/core/access/AccessibilityCheck.cxx b/sw/source/core/access/AccessibilityCheck.cxx index f56bdf3e0c7b..9746e17c0794 100644 --- a/sw/source/core/access/AccessibilityCheck.cxx +++ b/sw/source/core/access/AccessibilityCheck.cxx @@ -670,6 +670,54 @@ public: } }; +class SpaceSpacingCheck : public NodeCheck +{ +public: + SpaceSpacingCheck(sfx::AccessibilityIssueCollection& rIssueCollection) + : NodeCheck(rIssueCollection) + { + } + void check(SwNode* pCurrent) override + { + if (!pCurrent->IsTextNode()) + return; + SwTextNode* pTextNode = pCurrent->GetTextNode(); + auto nParagraphLength = pTextNode->GetText().getLength(); + const OUString& sParagraphText = pTextNode->GetText(); + sal_Int32 nSpaceCount = 0; + sal_Int32 nSpaceStart = 0; + bool bNonSpaceFound = false; + for (sal_Int32 i = 0; i < nParagraphLength; i++) + { + if (sParagraphText[i] == ' ') + { + if (bNonSpaceFound) + { + nSpaceCount++; + if (nSpaceCount == 2) + nSpaceStart = i; + } + } + else + { + if (nSpaceCount >= 2) + { + auto pIssue = lclAddIssue(m_rIssueCollection, SwResId(STR_AVOID_SPACES_SPACE), + sfx::AccessibilityIssueID::TEXT_FORMATTING); + pIssue->setIssueObject(IssueObject::TEXT); + pIssue->setNode(pTextNode); + SwDoc& rDocument = pTextNode->GetDoc(); + pIssue->setDoc(rDocument); + pIssue->setStart(nSpaceStart); + pIssue->setEnd(nSpaceStart + nSpaceCount - 1); + } + bNonSpaceFound = true; + nSpaceCount = 0; + } + } + } +}; + class BlinkingTextCheck : public NodeCheck { private: @@ -1093,6 +1141,7 @@ void AccessibilityCheck::check() aNodeChecks.push_back(std::make_unique<TableHeadingCheck>(m_aIssueCollection)); aNodeChecks.push_back(std::make_unique<HeadingOrderCheck>(m_aIssueCollection)); aNodeChecks.push_back(std::make_unique<NewlineSpacingCheck>(m_aIssueCollection)); + aNodeChecks.push_back(std::make_unique<SpaceSpacingCheck>(m_aIssueCollection)); auto const& pNodes = m_pDoc->GetNodes(); SwNode* pNode = nullptr;
