diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2022-10-12 21:38:52 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2022-12-06 08:43:55 +0000 |
commit | 3084202fee867b2370708f17975a7e50c4cead8b (patch) | |
tree | cde651db8103f408e19d09039f75676796c7d29a | |
parent | 1ca337267e4f0aa3b513461a42626ac619171833 (diff) |
sw: modify NumberingCheck to work independent of node order
Previosuly the NumberingCheck assumed we iterated throught nodes
and remembered the previous text node. This changes how the check
works so that the we find the next text node and check is with the
current node.
Change-Id: I043da74ae90b6387bff273f62eb2589faa2d1d31
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141430
Tested-by: Tomaž Vajngerl <quikee@gmail.com>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
(cherry picked from commit d4c4e3053ce59dba96d7531fc4c1828c1366f419)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143655
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
-rw-r--r-- | include/sfx2/AccessibilityIssue.hxx | 1 | ||||
-rw-r--r-- | sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx | 15 | ||||
-rw-r--r-- | sw/qa/core/accessibilitycheck/data/AccessibilityTests_NumberingCheck.odt | bin | 0 -> 14373 bytes | |||
-rw-r--r-- | sw/source/core/access/AccessibilityCheck.cxx | 50 |
4 files changed, 51 insertions, 15 deletions
diff --git a/include/sfx2/AccessibilityIssue.hxx b/include/sfx2/AccessibilityIssue.hxx index 1f1287408736..82e6c49f2941 100644 --- a/include/sfx2/AccessibilityIssue.hxx +++ b/include/sfx2/AccessibilityIssue.hxx @@ -35,6 +35,7 @@ enum class AccessibilityIssueID HYPERLINK_SHORT, FAKE_FOOTNOTE, FAKE_CAPTION, + MANUAL_NUMBERING }; class SFX2_DLLPUBLIC AccessibilityIssue diff --git a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx index 0059bdf2fa8f..3a7ea285efbf 100644 --- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx +++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx @@ -166,6 +166,21 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheckTabsFormatting) CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[3]->m_eIssueID); } +CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testNumberingCheck) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "AccessibilityTests_NumberingCheck.odt"); + CPPUNIT_ASSERT(pDoc); + sw::AccessibilityCheck aCheck(pDoc); + aCheck.check(); + auto& aIssues = aCheck.getIssueCollection().getIssues(); + CPPUNIT_ASSERT_EQUAL(size_t(5), aIssues.size()); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::MANUAL_NUMBERING, aIssues[0]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::MANUAL_NUMBERING, aIssues[1]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::MANUAL_NUMBERING, aIssues[2]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::MANUAL_NUMBERING, aIssues[3]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::MANUAL_NUMBERING, aIssues[4]->m_eIssueID); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/core/accessibilitycheck/data/AccessibilityTests_NumberingCheck.odt b/sw/qa/core/accessibilitycheck/data/AccessibilityTests_NumberingCheck.odt Binary files differnew file mode 100644 index 000000000000..190ee91a8fde --- /dev/null +++ b/sw/qa/core/accessibilitycheck/data/AccessibilityTests_NumberingCheck.odt diff --git a/sw/source/core/access/AccessibilityCheck.cxx b/sw/source/core/access/AccessibilityCheck.cxx index fc47ce8f39d0..d1bcb1cd5279 100644 --- a/sw/source/core/access/AccessibilityCheck.cxx +++ b/sw/source/core/access/AccessibilityCheck.cxx @@ -47,6 +47,26 @@ namespace sw { namespace { +SwTextNode* lclSearchNextTextNode(SwNode* pCurrent) +{ + SwTextNode* pTextNode = nullptr; + + auto nIndex = pCurrent->GetIndex(); + auto nCount = pCurrent->GetNodes().Count(); + + nIndex++; // go to next node + + while (pTextNode == nullptr && nIndex < nCount) + { + auto pNode = pCurrent->GetNodes()[nIndex]; + if (pNode->IsTextNode()) + pTextNode = pNode->GetTextNode(); + nIndex++; + } + + return pTextNode; +} + std::shared_ptr<sw::AccessibilityIssue> lclAddIssue(sfx::AccessibilityIssueCollection& rIssueCollection, OUString const& rText, sfx::AccessibilityIssueID eIssue = sfx::AccessibilityIssueID::UNSPECIFIED) @@ -263,8 +283,6 @@ public: class NumberingCheck : public NodeCheck { private: - SwTextNode* m_pPreviousTextNode; - const std::vector<std::pair<OUString, OUString>> m_aNumberingCombinations{ { "1.", "2." }, { "(1)", "(2)" }, { "1)", "2)" }, { "a.", "b." }, { "(a)", "(b)" }, { "a)", "b)" }, { "A.", "B." }, { "(A)", "(B)" }, { "A)", "B)" } @@ -273,7 +291,6 @@ private: public: NumberingCheck(sfx::AccessibilityIssueCollection& rIssueCollection) : NodeCheck(rIssueCollection) - , m_pPreviousTextNode(nullptr) { } @@ -282,21 +299,24 @@ public: if (!pCurrent->IsTextNode()) return; - if (m_pPreviousTextNode) + SwTextNode* pCurrentTextNode = pCurrent->GetTextNode(); + SwTextNode* pNextTextNode = lclSearchNextTextNode(pCurrent); + + if (!pNextTextNode) + return; + + for (auto& rPair : m_aNumberingCombinations) { - for (auto& rPair : m_aNumberingCombinations) + if (pCurrentTextNode->GetText().startsWith(rPair.first) + && pNextTextNode->GetText().startsWith(rPair.second)) { - if (pCurrent->GetTextNode()->GetText().startsWith(rPair.second) - && m_pPreviousTextNode->GetText().startsWith(rPair.first)) - { - OUString sNumbering = rPair.first + " " + rPair.second + "..."; - OUString sIssueText - = SwResId(STR_FAKE_NUMBERING).replaceAll("%NUMBERING%", sNumbering); - lclAddIssue(m_rIssueCollection, sIssueText); - } + OUString sNumbering = rPair.first + " " + rPair.second + "..."; + OUString sIssueText + = SwResId(STR_FAKE_NUMBERING).replaceAll("%NUMBERING%", sNumbering); + lclAddIssue(m_rIssueCollection, sIssueText, + sfx::AccessibilityIssueID::MANUAL_NUMBERING); } } - m_pPreviousTextNode = pCurrent->GetTextNode(); } }; @@ -523,7 +543,6 @@ public: class TextFormattingCheck : public NodeCheck { -private: public: TextFormattingCheck(sfx::AccessibilityIssueCollection& rIssueCollection) : NodeCheck(rIssueCollection) @@ -615,6 +634,7 @@ public: pIssue->setStart(pTextAttr->GetStart()); pIssue->setEnd(pTextAttr->GetAnyEnd()); } + void check(SwNode* pCurrent) override { if (!pCurrent->IsTextNode()) |