include/sfx2/AccessibilityIssue.hxx                      |    2 +
 sw/inc/AccessibilityCheckStrings.hrc                     |    1 
 sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx |   12 ++++++++
 sw/qa/core/accessibilitycheck/data/HyperlinkTest.odt     |binary
 sw/source/core/access/AccessibilityCheck.cxx             |   21 ++++++++++++---
 5 files changed, 33 insertions(+), 3 deletions(-)

New commits:
commit de02e5560168060af0b0c9be847af01c4fadec0b
Author:     offtkp <parisop...@gmail.com>
AuthorDate: Thu Oct 13 19:35:06 2022 +0300
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Fri Oct 21 08:53:31 2022 +0200

    a11y: Add check for short hyperlinks
    
    Add accessibility check and relevant test for a document that uses
    short hyperlinks
    
    Change-Id: I5d6bfe345b50d6d42dc04e9e2f7f853cf5f63a84
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141338
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/include/sfx2/AccessibilityIssue.hxx 
b/include/sfx2/AccessibilityIssue.hxx
index 085863cbd405..60700bad8d35 100644
--- a/include/sfx2/AccessibilityIssue.hxx
+++ b/include/sfx2/AccessibilityIssue.hxx
@@ -29,6 +29,8 @@ enum class AccessibilityIssueID
     NO_ALT_SHAPE,
     TABLE_MERGE_SPLIT,
     TEXT_FORMATTING,
+    HYPERLINK_IS_TEXT,
+    HYPERLINK_SHORT,
 };
 
 class SFX2_DLLPUBLIC AccessibilityIssue
diff --git a/sw/inc/AccessibilityCheckStrings.hrc 
b/sw/inc/AccessibilityCheckStrings.hrc
index 9c45cb84ecd9..77b93378869f 100644
--- a/sw/inc/AccessibilityCheckStrings.hrc
+++ b/sw/inc/AccessibilityCheckStrings.hrc
@@ -17,6 +17,7 @@
 #define STR_TABLE_MERGE_SPLIT           NC_("STR_TABLE_MERGE_SPLIT", "Table 
'%OBJECT_NAME%' contains merges or splits")
 #define STR_FAKE_NUMBERING              NC_("STR_FAKE_NUMBERING", "Fake 
numbering '%NUMBERING%'")
 #define STR_HYPERLINK_TEXT_IS_LINK      NC_("STR_HYPERLINK_TEXT_IS_LINK", 
"Hyperlink text is the same as the link address '%LINK%'")
+#define STR_HYPERLINK_TEXT_IS_SHORT     NC_("STR_HYPERLINK_TEXT_IS_SHORT", 
"Hyperlink text is too short.")
 #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.")
diff --git a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx 
b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
index 98b08b5a207c..75cf071c1e69 100644
--- a/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
+++ b/sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx
@@ -93,6 +93,18 @@ CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, 
testCheckSpacebarSpace)
     CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::TEXT_FORMATTING, 
aIssues[0]->m_eIssueID);
 }
 
+CPPUNIT_TEST_FIXTURE(AccessibilityCheckTest, testHyperlinks)
+{
+    SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "HyperlinkTest.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::HYPERLINK_SHORT, 
aIssues[0]->m_eIssueID);
+    CPPUNIT_ASSERT_EQUAL(sfx::AccessibilityIssueID::HYPERLINK_IS_TEXT, 
aIssues[1]->m_eIssueID);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/qa/core/accessibilitycheck/data/HyperlinkTest.odt 
b/sw/qa/core/accessibilitycheck/data/HyperlinkTest.odt
new file mode 100644
index 000000000000..1eba1932ce21
Binary files /dev/null and 
b/sw/qa/core/accessibilitycheck/data/HyperlinkTest.odt differ
diff --git a/sw/source/core/access/AccessibilityCheck.cxx 
b/sw/source/core/access/AccessibilityCheck.cxx
index 9746e17c0794..9195fcfcbd52 100644
--- a/sw/source/core/access/AccessibilityCheck.cxx
+++ b/sw/source/core/access/AccessibilityCheck.cxx
@@ -254,7 +254,8 @@ public:
 class HyperlinkCheck : public NodeCheck
 {
 private:
-    void checkTextRange(uno::Reference<text::XTextRange> const& xTextRange)
+    void checkTextRange(uno::Reference<text::XTextRange> const& xTextRange, 
SwTextNode* pTextNode,
+                        sal_Int32 nStart)
     {
         uno::Reference<beans::XPropertySet> xProperties(xTextRange, 
uno::UNO_QUERY);
         if 
(!xProperties->getPropertySetInfo()->hasPropertyByName("HyperLinkURL"))
@@ -269,7 +270,19 @@ private:
             {
                 OUString sIssueText
                     = 
SwResId(STR_HYPERLINK_TEXT_IS_LINK).replaceFirst("%LINK%", sHyperlink);
-                lclAddIssue(m_rIssueCollection, sIssueText);
+                lclAddIssue(m_rIssueCollection, sIssueText,
+                            sfx::AccessibilityIssueID::HYPERLINK_IS_TEXT);
+            }
+            else if (sText.getLength() <= 5)
+            {
+                auto pIssue = lclAddIssue(m_rIssueCollection, 
SwResId(STR_HYPERLINK_TEXT_IS_SHORT),
+                                          
sfx::AccessibilityIssueID::HYPERLINK_SHORT);
+                pIssue->setIssueObject(IssueObject::TEXT);
+                pIssue->setNode(pTextNode);
+                SwDoc& rDocument = pTextNode->GetDoc();
+                pIssue->setDoc(rDocument);
+                pIssue->setStart(nStart);
+                pIssue->setEnd(nStart + sText.getLength());
             }
         }
     }
@@ -293,12 +306,14 @@ public:
 
         uno::Reference<container::XEnumerationAccess> 
xRunEnumAccess(xParagraph, uno::UNO_QUERY);
         uno::Reference<container::XEnumeration> xRunEnum = 
xRunEnumAccess->createEnumeration();
+        sal_Int32 nStart = 0;
         while (xRunEnum->hasMoreElements())
         {
             uno::Reference<text::XTextRange> xRun(xRunEnum->nextElement(), 
uno::UNO_QUERY);
             if (xRun.is())
             {
-                checkTextRange(xRun);
+                checkTextRange(xRun, pTextNode, nStart);
+                nStart += xRun->getString().getLength();
             }
         }
     }

Reply via email to