summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2022-10-12 21:38:52 +0200
committerTomaž Vajngerl <quikee@gmail.com>2022-12-06 08:43:55 +0000
commit3084202fee867b2370708f17975a7e50c4cead8b (patch)
treecde651db8103f408e19d09039f75676796c7d29a
parent1ca337267e4f0aa3b513461a42626ac619171833 (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.hxx1
-rw-r--r--sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx15
-rw-r--r--sw/qa/core/accessibilitycheck/data/AccessibilityTests_NumberingCheck.odtbin0 -> 14373 bytes
-rw-r--r--sw/source/core/access/AccessibilityCheck.cxx50
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
new file mode 100644
index 000000000000..190ee91a8fde
--- /dev/null
+++ b/sw/qa/core/accessibilitycheck/data/AccessibilityTests_NumberingCheck.odt
Binary files differ
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())