diff options
author | Paris Oplopoios <paris.oplopoios@collabora.com> | 2022-10-25 23:53:32 +0300 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2022-11-03 07:41:22 +0100 |
commit | a1ae31bd248ab62a0614f3a25f1abfcc214ff431 (patch) | |
tree | 5ac07f24be0f5b48d72a2b976b6c21796c0a79f7 | |
parent | e519b121e3e43e4fd9e8e11c2ead4076ccda422f (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.hxx | 1 | ||||
-rw-r--r-- | sw/inc/AccessibilityCheckStrings.hrc | 1 | ||||
-rw-r--r-- | sw/qa/core/accessibilitycheck/AccessibilityCheckTest.cxx | 12 | ||||
-rw-r--r-- | sw/qa/core/accessibilitycheck/data/FakeFootnoteTest.odt | bin | 0 -> 8875 bytes | |||
-rw-r--r-- | sw/source/core/access/AccessibilityCheck.cxx | 72 |
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 Binary files differnew file mode 100644 index 000000000000..fdacf6cb35de --- /dev/null +++ b/sw/qa/core/accessibilitycheck/data/FakeFootnoteTest.odt 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; |