include/sfx2/AccessibilityIssue.hxx                      |    1 
 sw/inc/AccessibilityCheckStrings.hrc                     |    1 
 sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx |   12 ++
 sw/qa/core/accessibilitycheck/data/FakeFootnoteTest.odt  |binary
 sw/source/core/access/AccessibilityCheck.cxx             |   72 +++++++++++++++
 5 files changed, 86 insertions(+)

New commits:
commit a1ae31bd248ab62a0614f3a25f1abfcc214ff431
Author:     Paris Oplopoios <paris.oplopo...@collabora.com>
AuthorDate: Tue Oct 25 23:53:32 2022 +0300
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Thu Nov 3 07:41:22 2022 +0100

    a11y: Add check for fake footnotes
    
    Add accessibility check and relevant test for a document that has
    fake footnotes
    
    Change-Id: I22682a161a858f45c956660a51849bd18fcee0e5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141832
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/include/sfx2/AccessibilityIssue.hxx 
b/include/sfx2/AccessibilityIssue.hxx
index 7ca02ef3b7e9..9d1023053515 100644
--- a/include/sfx2/AccessibilityIssue.hxx
+++ b/include/sfx2/AccessibilityIssue.hxx
@@ -31,6 +31,7 @@ enum class AccessibilityIssueID
     TEXT_FORMATTING,
     HYPERLINK_IS_TEXT,
     HYPERLINK_SHORT,
+    FAKE_FOOTNOTE,
     MANUAL_NUMBERING
 };
 
diff --git a/sw/inc/AccessibilityCheckStrings.hrc 
b/sw/inc/AccessibilityCheckStrings.hrc
index 77b93378869f..86be8b494c90 100644
--- a/sw/inc/AccessibilityCheckStrings.hrc
+++ b/sw/inc/AccessibilityCheckStrings.hrc
@@ -21,6 +21,7 @@
 #define STR_TEXT_CONTRAST               NC_("STR_TEXT_CONTRAST", "Text 
contrast is too low.")
 #define STR_TEXT_BLINKING               NC_("STR_TEXT_BLINKING", "Blinking 
text.")
 #define STR_AVOID_FOOTNOTES             NC_("STR_AVOID_FOOTNOTES", "Avoid 
footnotes.")
+#define STR_AVOID_FAKE_FOOTNOTES        NC_("STR_AVOID_FAKE_FOOTNOTES", "Avoid 
fake footnotes.")
 #define STR_AVOID_ENDNOTES              NC_("STR_AVOID_ENDNOTES", "Avoid 
endnotes.")
 #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.")
diff --git a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx 
b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
index 91d6be266a8c..39f094a38c2a 100644
--- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
+++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
@@ -131,6 +131,18 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, 
testNumberingCheck)
     CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::MANUAL_NUMBERING, 
aIssues[4]->m_eIssueID);
 }
 
+CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testCheckFakeFootnote)
+{
+    SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "FakeFootnoteTest.odt");
+    CPPUNIT_ASSERT(pDoc);
+    sw::AccessibilityCheck aCheck(pDoc);
+    aCheck.check();
+    auto& aIssues = aCheck.getIssueCollection().getIssues();
+    CPPUNIT_ASSERT_EQUAL(size_t(2), aIssues.size());
+    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::FAKE_FOOTNOTE, 
aIssues[0]->m_eIssueID);
+    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::FAKE_FOOTNOTE, 
aIssues[1]->m_eIssueID);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/core/accessibilitycheck/data/FakeFootnoteTest.odt 
b/sw/qa/core/accessibilitycheck/data/FakeFootnoteTest.odt
new file mode 100644
index 000000000000..fdacf6cb35de
Binary files /dev/null and 
b/sw/qa/core/accessibilitycheck/data/FakeFootnoteTest.odt differ
diff --git a/sw/source/core/access/AccessibilityCheck.cxx 
b/sw/source/core/access/AccessibilityCheck.cxx
index 0763ff0e90c5..3860eb8904e0 100644
--- a/sw/source/core/access/AccessibilityCheck.cxx
+++ b/sw/source/core/access/AccessibilityCheck.cxx
@@ -23,6 +23,7 @@
 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
 #include <unoparagraph.hxx>
+#include <unotools/intlwrapper.hxx>
 #include <tools/urlobj.hxx>
 #include <editeng/langitem.hxx>
 #include <charatr.hxx>
@@ -770,6 +771,76 @@ public:
     }
 };
 
+class FakeFootnoteCheck : public NodeCheck
+{
+private:
+    void checkAutoFormat(SwTextNode* pTextNode, const SwTextAttr* pTextAttr)
+    {
+        const SwFormatAutoFormat& rAutoFormat = pTextAttr->GetAutoFormat();
+        SfxItemIter aItemIter(*rAutoFormat.GetStyleHandle());
+        const SfxPoolItem* pItem = aItemIter.GetCurItem();
+        while (pItem)
+        {
+            if (pItem->Which() == RES_CHRATR_ESCAPEMENT)
+            {
+                auto pEscapementItem = static_cast<const 
SvxEscapementItem*>(pItem);
+                if (pEscapementItem->GetEscapement() == 
SvxEscapement::Superscript
+                    && pTextAttr->GetStart() == 0 && pTextAttr->GetAnyEnd() == 
1)
+                {
+                    auto pIssue = lclAddIssue(m_rIssueCollection, 
SwResId(STR_AVOID_FAKE_FOOTNOTES),
+                                              
sfx::AccessibilityIssueID::FAKE_FOOTNOTE);
+                    pIssue->setIssueObject(IssueObject::TEXT);
+                    pIssue->setNode(pTextNode);
+                    SwDoc& rDocument = pTextNode->GetDoc();
+                    pIssue->setDoc(rDocument);
+                    pIssue->setStart(0);
+                    pIssue->setEnd(pTextNode->GetText().getLength());
+                    break;
+                }
+            }
+            pItem = aItemIter.NextItem();
+        }
+    }
+
+public:
+    FakeFootnoteCheck(sfx::AccessibilityIssueCollection& rIssueCollection)
+        : NodeCheck(rIssueCollection)
+    {
+    }
+    void check(SwNode* pCurrent) override
+    {
+        if (!pCurrent->IsTextNode())
+            return;
+        SwTextNode* pTextNode = pCurrent->GetTextNode();
+        if (pTextNode->GetText().getLength() == 0)
+            return;
+
+        if (pTextNode->GetText()[0] == '*')
+        {
+            auto pIssue = lclAddIssue(m_rIssueCollection, 
SwResId(STR_AVOID_FAKE_FOOTNOTES),
+                                      
sfx::AccessibilityIssueID::FAKE_FOOTNOTE);
+            pIssue->setIssueObject(IssueObject::TEXT);
+            pIssue->setNode(pTextNode);
+            SwDoc& rDocument = pTextNode->GetDoc();
+            pIssue->setDoc(rDocument);
+            pIssue->setStart(0);
+            pIssue->setEnd(pTextNode->GetText().getLength());
+        }
+        else if (pTextNode->HasHints())
+        {
+            SwpHints& rHints = pTextNode->GetSwpHints();
+            for (size_t i = 0; i < rHints.Count(); ++i)
+            {
+                const SwTextAttr* pTextAttr = rHints.Get(i);
+                if (pTextAttr->Which() == RES_TXTATR_AUTOFMT)
+                {
+                    checkAutoFormat(pTextNode, pTextAttr);
+                }
+            }
+        }
+    }
+};
+
 class BlinkingTextCheck : public NodeCheck
 {
 private:
@@ -1194,6 +1265,7 @@ void AccessibilityCheck::check()
     
aNodeChecks.push_back(std::make_unique<HeadingOrderCheck>(m_aIssueCollection));
     
aNodeChecks.push_back(std::make_unique<NewlineSpacingCheck>(m_aIssueCollection));
     
aNodeChecks.push_back(std::make_unique<SpaceSpacingCheck>(m_aIssueCollection));
+    
aNodeChecks.push_back(std::make_unique<FakeFootnoteCheck>(m_aIssueCollection));
 
     auto const& pNodes = m_pDoc->GetNodes();
     SwNode* pNode = nullptr;

Reply via email to