summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParis Oplopoios <paris.oplopoios@collabora.com>2022-10-25 23:53:32 +0300
committerTomaž Vajngerl <quikee@gmail.com>2022-11-03 07:41:22 +0100
commita1ae31bd248ab62a0614f3a25f1abfcc214ff431 (patch)
tree5ac07f24be0f5b48d72a2b976b6c21796c0a79f7
parente519b121e3e43e4fd9e8e11c2ead4076ccda422f (diff)
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 <quikee@gmail.com>
-rw-r--r--include/sfx2/AccessibilityIssue.hxx1
-rw-r--r--sw/inc/AccessibilityCheckStrings.hrc1
-rw-r--r--sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx12
-rw-r--r--sw/qa/core/accessibilitycheck/data/FakeFootnoteTest.odtbin0 -> 8875 bytes
-rw-r--r--sw/source/core/access/AccessibilityCheck.cxx72
5 files changed, 86 insertions, 0 deletions
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
--- /dev/null
+++ b/sw/qa/core/accessibilitycheck/data/FakeFootnoteTest.odt
Binary files 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;