summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParis Oplopoios <paris.oplopoios@collabora.com>2022-10-24 14:12:44 +0300
committerTomaž Vajngerl <quikee@gmail.com>2022-11-22 09:55:07 +0100
commitb5c36927ad59623ac902fdf0ed80adb0cf49d3e8 (patch)
treea94d7cf29dbc5d4bd5319cdf94be9bcc74c3659b
parent09e3acfc290d98b4fc4d78bc2cce1b4b6f696e45 (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.hrc1
-rw-r--r--sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx14
-rw-r--r--sw/qa/core/accessibilitycheck/data/TabsTest.odtbin0 -> 9333 bytes
-rw-r--r--sw/source/core/access/AccessibilityCheck.cxx68
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
new file mode 100644
index 000000000000..29b415df87a7
--- /dev/null
+++ b/sw/qa/core/accessibilitycheck/data/TabsTest.odt
Binary files differ
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;
}
}
}