sw/inc/AccessibilityCheckStrings.hrc         |    1 
 sw/source/core/access/AccessibilityCheck.cxx |   43 +++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)

New commits:
commit c21dd1a08e7cb776a0d7170001ee8ea3b88f1367
Author:     Ivan Stefanenko <ivan.stefane...@collabora.com>
AuthorDate: Tue Nov 3 23:52:23 2020 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Thu Nov 5 09:34:41 2020 +0100

    tdf#137968 Added check for the headings order
    
    Headings' levels order is important for readers and converters.
    Check firstly finds out if the node is a TextNode, then gets it's 
OutlineLevel.
    If it is greater than 0, i.e. the node is a heading, then it checks if
    node's heading level is greater then previous one's by more than 1.
    If so, warning is thrown.
    So the first heading level is always 1 and no heading levels are greater 
then previous
    by more than 1.
    
    Change-Id: I39d230d747699eddd36610193bde9b23f348e257
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105274
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Tested-by: Jenkins

diff --git a/sw/inc/AccessibilityCheckStrings.hrc 
b/sw/inc/AccessibilityCheckStrings.hrc
index 73ac5043e57b..7470ab4b9248 100644
--- a/sw/inc/AccessibilityCheckStrings.hrc
+++ b/sw/inc/AccessibilityCheckStrings.hrc
@@ -26,6 +26,7 @@
 #define STR_NON_INTERACTIVE_FORMS       NC_("STR_NON_INTERACTIVE_FORMS", "An 
input form is not interactive.")
 #define STR_FLOATING_TEXT               NC_("STR_FLOATING_TEXT", "Avoid 
floating text.")
 #define STR_HEADING_IN_TABLE            NC_("STR_HEADING_IN_TABLE", "Tables 
must not contain headings.")
+#define STR_HEADING_ORDER               NC_("STR_HEADING_ORDER", "Keep 
headings' levels ordered. Heading level %LEVEL_CURRENT% must not go after 
%LEVEL_PREV%.")
 
 #define STR_DOCUMENT_DEFAULT_LANGUAGE   NC_("STR_DOCUMENT_DEFAULT_LANGUAGE", 
"Document default language is not set")
 #define STR_STYLE_NO_LANGUAGE           NC_("STR_STYLE_NO_LANGUAGE", "Style 
'%STYLE_NAME%' has no language set")
diff --git a/sw/source/core/access/AccessibilityCheck.cxx 
b/sw/source/core/access/AccessibilityCheck.cxx
index 08e8f1d47051..3f97837d97d0 100644
--- a/sw/source/core/access/AccessibilityCheck.cxx
+++ b/sw/source/core/access/AccessibilityCheck.cxx
@@ -726,6 +726,48 @@ public:
     }
 };
 
+/// Checking if headings are ordered correctly.
+class HeadingOrderCheck : public NodeCheck
+{
+public:
+    HeadingOrderCheck(sfx::AccessibilityIssueCollection& rIssueCollection)
+        : NodeCheck(rIssueCollection)
+    {
+    }
+
+    void check(SwNode* pCurrent) override
+    {
+        const SwTextNode* pTextNode = pCurrent->GetTextNode();
+        if (!pTextNode)
+            return;
+
+        // If outline level stands for heading level...
+        const int currentLevel = pTextNode->GetAttrOutlineLevel();
+        if (currentLevel)
+        {
+            // ... and if is bigger than previous by more than 1, warn.
+            if (currentLevel - m_prevLevel > 1)
+            {
+                // Preparing and posting a warning.
+                OUString resultString = SwResId(STR_HEADING_ORDER);
+                resultString
+                    = resultString.replaceAll("%LEVEL_CURRENT%", 
OUString::number(currentLevel));
+                resultString
+                    = resultString.replaceAll("%LEVEL_PREV%", 
OUString::number(m_prevLevel));
+
+                lclAddIssue(m_rIssueCollection, resultString);
+            }
+
+            // Updating previous level.
+            m_prevLevel = currentLevel;
+        }
+    }
+
+private:
+    // Previous heading level to compare with.
+    int m_prevLevel = 0;
+};
+
 class DocumentCheck : public BaseCheck
 {
 public:
@@ -879,6 +921,7 @@ void AccessibilityCheck::check()
     
aNodeChecks.push_back(std::make_unique<NonInteractiveFormCheck>(m_aIssueCollection));
     
aNodeChecks.push_back(std::make_unique<FloatingTextCheck>(m_aIssueCollection));
     
aNodeChecks.push_back(std::make_unique<TableHeadingCheck>(m_aIssueCollection));
+    
aNodeChecks.push_back(std::make_unique<HeadingOrderCheck>(m_aIssueCollection));
 
     auto const& pNodes = m_pDoc->GetNodes();
     SwNode* pNode = nullptr;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to