diff options
author | Paris Oplopoios <paris.oplopoios@collabora.com> | 2022-10-24 14:12:44 +0300 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2022-11-22 09:55:07 +0100 |
commit | b5c36927ad59623ac902fdf0ed80adb0cf49d3e8 (patch) | |
tree | a94d7cf29dbc5d4bd5319cdf94be9bcc74c3659b | |
parent | 09e3acfc290d98b4fc4d78bc2cce1b4b6f696e45 (diff) |
a11y: Add check for tabs used for formatting
Add accessibility check and relevant test for a document that uses
tabs for formatting
Useful to detect fake tables made of tabs
Change-Id: Ief765f25c8dc67405d0671e257cf0ba7aec9f16c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141732
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142575
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
-rw-r--r-- | sw/inc/AccessibilityCheckStrings.hrc | 1 | ||||
-rw-r--r-- | sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx | 14 | ||||
-rw-r--r-- | sw/qa/core/accessibilitycheck/data/TabsTest.odt | bin | 0 -> 9333 bytes | |||
-rw-r--r-- | sw/source/core/access/AccessibilityCheck.cxx | 68 |
4 files changed, 64 insertions, 19 deletions
diff --git a/sw/inc/AccessibilityCheckStrings.hrc b/sw/inc/AccessibilityCheckStrings.hrc index 7245a2b8d3e0..baa61cbcb8ba 100644 --- a/sw/inc/AccessibilityCheckStrings.hrc +++ b/sw/inc/AccessibilityCheckStrings.hrc @@ -27,6 +27,7 @@ #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_AVOID_TABS_FORMATTING NC_("STR_AVOID_TABS_FORMATTING", "Avoid using tabs for formatting.") #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 122332931544..0059bdf2fa8f 100644 --- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx +++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx @@ -152,6 +152,20 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheckTableFormatting) CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TABLE_FORMATTING, aIssues[0]->m_eIssueID); } +CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheckTabsFormatting) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "TabsTest.odt"); + CPPUNIT_ASSERT(pDoc); + sw::AccessibilityCheck aCheck(pDoc); + aCheck.check(); + auto& aIssues = aCheck.getIssueCollection().getIssues(); + CPPUNIT_ASSERT_EQUAL(size_t(4), aIssues.size()); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[0]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[1]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[2]->m_eIssueID); + CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, aIssues[3]->m_eIssueID); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/core/accessibilitycheck/data/TabsTest.odt b/sw/qa/core/accessibilitycheck/data/TabsTest.odt Binary files differnew file mode 100644 index 000000000000..29b415df87a7 --- /dev/null +++ b/sw/qa/core/accessibilitycheck/data/TabsTest.odt diff --git a/sw/source/core/access/AccessibilityCheck.cxx b/sw/source/core/access/AccessibilityCheck.cxx index d9d1c76e5b67..fc47ce8f39d0 100644 --- a/sw/source/core/access/AccessibilityCheck.cxx +++ b/sw/source/core/access/AccessibilityCheck.cxx @@ -771,33 +771,63 @@ public: const OUString& sParagraphText = pTextNode->GetText(); sal_Int32 nSpaceCount = 0; sal_Int32 nSpaceStart = 0; + sal_Int32 nTabCount = 0; bool bNonSpaceFound = false; + bool bPreviousWasChar = false; for (sal_Int32 i = 0; i < nParagraphLength; i++) { - if (sParagraphText[i] == ' ') + switch (sParagraphText[i]) { - if (bNonSpaceFound) + case ' ': { - nSpaceCount++; - if (nSpaceCount == 2) - nSpaceStart = i; + if (bNonSpaceFound) + { + nSpaceCount++; + if (nSpaceCount == 2) + nSpaceStart = i; + } + break; } - } - else - { - if (nSpaceCount >= 2) + case '\t': { - 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); + if (bPreviousWasChar) + { + ++nTabCount; + bPreviousWasChar = false; + if (nTabCount == 2) + { + auto pIssue = lclAddIssue(m_rIssueCollection, + SwResId(STR_AVOID_TABS_FORMATTING), + sfx::AccessibilityIssueID::TEXT_FORMATTING); + pIssue->setIssueObject(IssueObject::TEXT); + pIssue->setNode(pTextNode); + SwDoc& rDocument = pTextNode->GetDoc(); + pIssue->setDoc(rDocument); + pIssue->setStart(0); + pIssue->setEnd(nParagraphLength); + } + } + break; + } + default: + { + 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; + bPreviousWasChar = true; + nSpaceCount = 0; + break; } - bNonSpaceFound = true; - nSpaceCount = 0; } } } |