sw/inc/AccessibilityCheckStrings.hrc                     |    1 
 sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx |   14 +++
 sw/qa/core/accessibilitycheck/data/TabsTest.odt          |binary
 sw/source/core/access/AccessibilityCheck.cxx             |   68 ++++++++++-----
 4 files changed, 64 insertions(+), 19 deletions(-)

New commits:
commit 3c0be5564afe1b9cc843a49aba88b72af74c43ab
Author:     Paris Oplopoios <paris.oplopo...@collabora.com>
AuthorDate: Mon Oct 24 14:12:44 2022 +0300
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Wed Nov 9 23:54:58 2022 +0100

    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 <qui...@gmail.com>

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 cc8b3742be74..9397832bebf5 100644
--- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
+++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
@@ -168,6 +168,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("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
Binary files /dev/null and b/sw/qa/core/accessibilitycheck/data/TabsTest.odt 
differ
diff --git a/sw/source/core/access/AccessibilityCheck.cxx 
b/sw/source/core/access/AccessibilityCheck.cxx
index ce0409d6ba5b..897ee0d43c58 100644
--- a/sw/source/core/access/AccessibilityCheck.cxx
+++ b/sw/source/core/access/AccessibilityCheck.cxx
@@ -791,33 +791,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;
             }
         }
     }

Reply via email to