sd/source/filter/html/a11yex.cxx |   62 ++++++++
 sd/source/filter/html/htmlex.cxx |  291 ++++++++++++++++++---------------------
 sd/source/filter/html/htmlex.hxx |   12 +
 3 files changed, 209 insertions(+), 156 deletions(-)

New commits:
commit ea3f225a3c0f03d4baa356ffd13e7494f3acf9f4
Author:     Henry Castro <[email protected]>
AuthorDate: Mon Sep 15 07:08:04 2025 -0400
Commit:     Henry Castro <[email protected]>
CommitDate: Mon Oct 20 23:13:38 2025 +0200

    sd: mark functions as static to reuse them for a11y
    
    Change-Id: Iac4450b1b66172ccfbb7453c77dd457c74faac48
    Signed-off-by: Henry Castro <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191024
    Reviewed-by: Caolán McNamara <[email protected]>
    Tested-by: Caolán McNamara <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192539
    Tested-by: Jenkins

diff --git a/sd/source/filter/html/a11yex.cxx b/sd/source/filter/html/a11yex.cxx
index ee492ae75876..cd82003c564b 100644
--- a/sd/source/filter/html/a11yex.cxx
+++ b/sd/source/filter/html/a11yex.cxx
@@ -40,7 +40,67 @@ using namespace sdr::table;
 
 void SdHTMLFilter::ExportPage(SdrOutliner* pOutliner, SdPage* pPage, 
OUStringBuffer& rHtml)
 {
-    HtmlExport::ExportPage(pOutliner, pPage, rHtml);
+    if (!pPage || !pOutliner)
+    {
+        return;
+    }
+
+    // page title
+    OUString sTitleText(HtmlExport::CreateTextForTitle(pOutliner, pPage));
+
+    rHtml.append("<h1>" + sTitleText + "</h1>
");
+
+    for (const rtl::Reference<SdrObject>& pObject : *pPage)
+    {
+        PresObjKind eKind = pPage->GetPresObjKind(pObject.get());
+
+        switch (eKind)
+        {
+            case PresObjKind::NONE:
+            {
+                if (pObject->GetObjIdentifier() == SdrObjKind::Group)
+                {
+                    SdrObjGroup* pObjectGroup = 
static_cast<SdrObjGroup*>(pObject.get());
+                    HtmlExport::WriteObjectGroup(rHtml, pObjectGroup, 
pOutliner, false);
+                }
+                else if (pObject->GetObjIdentifier() == SdrObjKind::Table)
+                {
+                    SdrTableObj* pTableObject = 
static_cast<SdrTableObj*>(pObject.get());
+                    HtmlExport::WriteTable(rHtml, pTableObject, pOutliner);
+                }
+                else
+                {
+                    if (pObject->GetOutlinerParaObject())
+                    {
+                        HtmlExport::WriteOutlinerParagraph(rHtml, pOutliner,
+                                                           
pObject->GetOutlinerParaObject(), false);
+                    }
+                }
+            }
+            break;
+
+            case PresObjKind::Table:
+            {
+                SdrTableObj* pTableObject = 
static_cast<SdrTableObj*>(pObject.get());
+                HtmlExport::WriteTable(rHtml, pTableObject, pOutliner);
+            }
+            break;
+
+            case PresObjKind::Text:
+            case PresObjKind::Outline:
+            {
+                SdrTextObj* pTextObject = 
static_cast<SdrTextObj*>(pObject.get());
+                if (pTextObject->IsEmptyPresObj())
+                    continue;
+                HtmlExport::WriteOutlinerParagraph(rHtml, pOutliner,
+                                                   
pTextObject->GetOutlinerParaObject(), true);
+            }
+            break;
+
+            default:
+                break;
+        }
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/html/htmlex.cxx b/sd/source/filter/html/htmlex.cxx
index 55c68bb88b0e..24991dfe2295 100644
--- a/sd/source/filter/html/htmlex.cxx
+++ b/sd/source/filter/html/htmlex.cxx
@@ -414,116 +414,6 @@ OUString ParagraphToHTMLString( SdrOutliner const * 
pOutliner, sal_Int32 nPara )
     return aStr.makeStringAndClear();
 }
 
-void WriteOutlinerParagraph(OUStringBuffer& aStr, SdrOutliner* pOutliner,
-                                        OutlinerParaObject const * 
pOutlinerParagraphObject,
-                                        bool bHeadLine)
-{
-    if (pOutlinerParagraphObject == nullptr)
-        return;
-
-    pOutliner->SetText(*pOutlinerParagraphObject);
-
-    sal_Int32 nCount = pOutliner->GetParagraphCount();
-
-
-    sal_Int16 nCurrentDepth = -1;
-
-    for (sal_Int32 nIndex = 0; nIndex < nCount; nIndex++)
-    {
-        Paragraph* pParagraph = pOutliner->GetParagraph(nIndex);
-        if(pParagraph == nullptr)
-            continue;
-
-        const sal_Int16 nDepth = 
static_cast<sal_uInt16>(pOutliner->GetDepth(nIndex));
-        OUString aParaText = ParagraphToHTMLString(pOutliner, nIndex);
-
-        if (aParaText.isEmpty())
-            continue;
-
-        if (nDepth < 0)
-        {
-            OUString aTag = bHeadLine ? u"h2"_ustr : u"p"_ustr;
-            lclAppendStyle(aStr, aTag, getParagraphStyle(pOutliner, nIndex));
-
-            aStr.append(aParaText);
-            aStr.append("</" + aTag + ">
");
-        }
-        else
-        {
-            while(nCurrentDepth < nDepth)
-            {
-                aStr.append("<ul>
");
-                nCurrentDepth++;
-            }
-            while(nCurrentDepth > nDepth)
-            {
-                aStr.append("</ul>
");
-                nCurrentDepth--;
-            }
-            lclAppendStyle(aStr, u"li", getParagraphStyle(pOutliner, nIndex));
-            aStr.append(aParaText);
-            aStr.append("</li>
");
-        }
-    }
-    while(nCurrentDepth >= 0)
-    {
-        aStr.append("</ul>
");
-        nCurrentDepth--;
-    }
-    pOutliner->Clear();
-}
-
-void WriteTable(OUStringBuffer& aStr, SdrTableObj const * pTableObject, 
SdrOutliner* pOutliner)
-{
-    CellPos aStart, aEnd;
-
-    aStart = SdrTableObj::getFirstCell();
-    aEnd = pTableObject->getLastCell();
-
-    sal_Int32 nColCount = pTableObject->getColumnCount();
-    aStr.append("<table>
");
-    for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++)
-    {
-        aStr.append("  <tr>
");
-        for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++)
-        {
-            aStr.append("    <td>
");
-            sal_Int32 nCellIndex = nRow * nColCount + nCol;
-            SdrText* pText = pTableObject->getText(nCellIndex);
-
-            if (pText == nullptr)
-                continue;
-            WriteOutlinerParagraph(aStr, pOutliner, 
pText->GetOutlinerParaObject(), false);
-            aStr.append("    </td>
");
-        }
-        aStr.append("  </tr>
");
-    }
-    aStr.append("</table>
");
-}
-
-void WriteObjectGroup(OUStringBuffer& aStr, SdrObjGroup const * pObjectGroup, 
SdrOutliner* pOutliner,
-                                  bool bHeadLine)
-{
-    SdrObjListIter aGroupIterator(pObjectGroup->GetSubList(), 
SdrIterMode::DeepNoGroups);
-    while (aGroupIterator.IsMore())
-    {
-        SdrObject* pCurrentObject = aGroupIterator.Next();
-        if (pCurrentObject->GetObjIdentifier() == SdrObjKind::Group)
-        {
-            SdrObjGroup* pCurrentGroupObject = 
static_cast<SdrObjGroup*>(pCurrentObject);
-            WriteObjectGroup(aStr, pCurrentGroupObject, pOutliner, bHeadLine);
-        }
-        else
-        {
-            OutlinerParaObject* pOutlinerParagraphObject = 
pCurrentObject->GetOutlinerParaObject();
-            if (pOutlinerParagraphObject != nullptr)
-            {
-                WriteOutlinerParagraph(aStr, pOutliner, 
pOutlinerParagraphObject, bHeadLine);
-            }
-        }
-    }
-}
-
 // get SdrTextObject with layout text of this page
 SdrTextObj* GetLayoutTextObject(SdrPage const * pPage)
 {
@@ -541,29 +431,6 @@ SdrTextObj* GetLayoutTextObject(SdrPage const * pPage)
     return pResult;
 }
 
-
-/** creates an outliner text for the title objects of a page
- */
-OUString CreateTextForTitle( SdrOutliner* pOutliner, SdPage* pPage )
-{
-    SdrTextObj* pTO = 
static_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Title));
-    if(!pTO)
-        pTO = GetLayoutTextObject(pPage);
-
-    if (pTO && !pTO->IsEmptyPresObj())
-    {
-        OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
-        if(pOPO && pOutliner->GetParagraphCount() != 0)
-        {
-            pOutliner->Clear();
-            pOutliner->SetText(*pOPO);
-            return ParagraphToHTMLString(pOutliner, 0);
-        }
-    }
-
-    return OUString();
-}
-
 // creates an outliner text for a page
 OUString CreateTextForPage(SdrOutliner* pOutliner, SdPage const * pPage,
                                        bool bHeadLine)
@@ -581,18 +448,18 @@ OUString CreateTextForPage(SdrOutliner* pOutliner, SdPage 
const * pPage,
                 if (pObject->GetObjIdentifier() == SdrObjKind::Group)
                 {
                     SdrObjGroup* pObjectGroup = 
static_cast<SdrObjGroup*>(pObject.get());
-                    WriteObjectGroup(aStr, pObjectGroup, pOutliner, false);
+                    HtmlExport::WriteObjectGroup(aStr, pObjectGroup, 
pOutliner, false);
                 }
                 else if (pObject->GetObjIdentifier() == SdrObjKind::Table)
                 {
                     SdrTableObj* pTableObject = 
static_cast<SdrTableObj*>(pObject.get());
-                    WriteTable(aStr, pTableObject, pOutliner);
+                    HtmlExport::WriteTable(aStr, pTableObject, pOutliner);
                 }
                 else
                 {
                     if (pObject->GetOutlinerParaObject())
                     {
-                        WriteOutlinerParagraph(aStr, pOutliner, 
pObject->GetOutlinerParaObject(), false);
+                        HtmlExport::WriteOutlinerParagraph(aStr, pOutliner, 
pObject->GetOutlinerParaObject(), false);
                     }
                 }
             }
@@ -601,7 +468,7 @@ OUString CreateTextForPage(SdrOutliner* pOutliner, SdPage 
const * pPage,
             case PresObjKind::Table:
             {
                 SdrTableObj* pTableObject = 
static_cast<SdrTableObj*>(pObject.get());
-                WriteTable(aStr, pTableObject, pOutliner);
+                HtmlExport::WriteTable(aStr, pTableObject, pOutliner);
             }
             break;
 
@@ -611,7 +478,7 @@ OUString CreateTextForPage(SdrOutliner* pOutliner, SdPage 
const * pPage,
                 SdrTextObj* pTextObject = 
static_cast<SdrTextObj*>(pObject.get());
                 if (pTextObject->IsEmptyPresObj())
                     continue;
-                WriteOutlinerParagraph(aStr, pOutliner, 
pTextObject->GetOutlinerParaObject(), bHeadLine);
+                HtmlExport::WriteOutlinerParagraph(aStr, pOutliner, 
pTextObject->GetOutlinerParaObject(), bHeadLine);
             }
             break;
 
@@ -674,6 +541,138 @@ void HtmlExport::Init()
     maDocFileName = maIndex;
 }
 
+/** creates an outliner text for the title objects of a page
+ */
+OUString HtmlExport::CreateTextForTitle( SdrOutliner* pOutliner, SdPage* pPage 
)
+{
+    SdrTextObj* pTO = 
static_cast<SdrTextObj*>(pPage->GetPresObj(PresObjKind::Title));
+    if(!pTO)
+        pTO = GetLayoutTextObject(pPage);
+
+    if (pTO && !pTO->IsEmptyPresObj())
+    {
+        OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
+        if(pOPO && pOutliner->GetParagraphCount() != 0)
+        {
+            pOutliner->Clear();
+            pOutliner->SetText(*pOPO);
+            return ParagraphToHTMLString(pOutliner, 0);
+        }
+    }
+
+    return OUString();
+}
+
+void HtmlExport::WriteObjectGroup(OUStringBuffer& aStr, SdrObjGroup const * 
pObjectGroup, SdrOutliner* pOutliner,
+                                  bool bHeadLine)
+{
+    SdrObjListIter aGroupIterator(pObjectGroup->GetSubList(), 
SdrIterMode::DeepNoGroups);
+    while (aGroupIterator.IsMore())
+    {
+        SdrObject* pCurrentObject = aGroupIterator.Next();
+        if (pCurrentObject->GetObjIdentifier() == SdrObjKind::Group)
+        {
+            SdrObjGroup* pCurrentGroupObject = 
static_cast<SdrObjGroup*>(pCurrentObject);
+            WriteObjectGroup(aStr, pCurrentGroupObject, pOutliner, bHeadLine);
+        }
+        else
+        {
+            OutlinerParaObject* pOutlinerParagraphObject = 
pCurrentObject->GetOutlinerParaObject();
+            if (pOutlinerParagraphObject != nullptr)
+            {
+                WriteOutlinerParagraph(aStr, pOutliner, 
pOutlinerParagraphObject, bHeadLine);
+            }
+        }
+    }
+}
+
+void HtmlExport::WriteTable(OUStringBuffer& aStr, SdrTableObj const * 
pTableObject, SdrOutliner* pOutliner)
+{
+    CellPos aStart, aEnd;
+
+    aStart = SdrTableObj::getFirstCell();
+    aEnd = pTableObject->getLastCell();
+
+    sal_Int32 nColCount = pTableObject->getColumnCount();
+    aStr.append("<table>
");
+    for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++)
+    {
+        aStr.append("  <tr>
");
+        for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++)
+        {
+            aStr.append("    <td>
");
+            sal_Int32 nCellIndex = nRow * nColCount + nCol;
+            SdrText* pText = pTableObject->getText(nCellIndex);
+
+            if (pText == nullptr)
+                continue;
+            WriteOutlinerParagraph(aStr, pOutliner, 
pText->GetOutlinerParaObject(), false);
+            aStr.append("    </td>
");
+        }
+        aStr.append("  </tr>
");
+    }
+    aStr.append("</table>
");
+}
+
+void HtmlExport::WriteOutlinerParagraph(OUStringBuffer& aStr, SdrOutliner* 
pOutliner,
+                                        OutlinerParaObject const * 
pOutlinerParagraphObject,
+                                        bool bHeadLine)
+{
+    if (pOutlinerParagraphObject == nullptr)
+        return;
+
+    pOutliner->SetText(*pOutlinerParagraphObject);
+
+    sal_Int32 nCount = pOutliner->GetParagraphCount();
+
+
+    sal_Int16 nCurrentDepth = -1;
+
+    for (sal_Int32 nIndex = 0; nIndex < nCount; nIndex++)
+    {
+        Paragraph* pParagraph = pOutliner->GetParagraph(nIndex);
+        if(pParagraph == nullptr)
+            continue;
+
+        const sal_Int16 nDepth = 
static_cast<sal_uInt16>(pOutliner->GetDepth(nIndex));
+        OUString aParaText = ParagraphToHTMLString(pOutliner, nIndex);
+
+        if (aParaText.isEmpty())
+            continue;
+
+        if (nDepth < 0)
+        {
+            OUString aTag = bHeadLine ? u"h2"_ustr : u"p"_ustr;
+            lclAppendStyle(aStr, aTag, getParagraphStyle(pOutliner, nIndex));
+
+            aStr.append(aParaText);
+            aStr.append("</" + aTag + ">
");
+        }
+        else
+        {
+            while(nCurrentDepth < nDepth)
+            {
+                aStr.append("<ul>
");
+                nCurrentDepth++;
+            }
+            while(nCurrentDepth > nDepth)
+            {
+                aStr.append("</ul>
");
+                nCurrentDepth--;
+            }
+            lclAppendStyle(aStr, u"li", getParagraphStyle(pOutliner, nIndex));
+            aStr.append(aParaText);
+            aStr.append("</li>
");
+        }
+    }
+    while(nCurrentDepth >= 0)
+    {
+        aStr.append("</ul>
");
+        nCurrentDepth--;
+    }
+    pOutliner->Clear();
+}
+
 void HtmlExport::ExportSingleDocument()
 {
     SdrOutliner* pOutliner = mrDoc.GetInternalOutliner();
@@ -720,22 +719,6 @@ void HtmlExport::ExportSingleDocument()
     ResetProgress();
 }
 
-void HtmlExport::ExportPage(SdrOutliner* pOutliner, SdPage* pPage, 
OUStringBuffer& rHtml)
-{
-    if (!pPage || !pOutliner)
-    {
-        return;
-    }
-
-    // page title
-    OUString sTitleText(CreateTextForTitle(pOutliner, pPage));
-
-    rHtml.append("<h1>" + sTitleText + "</h1>
");
-
-    // write outline text
-    rHtml.append(CreateTextForPage(pOutliner, pPage, true));
-}
-
 void HtmlExport::InitProgress( sal_uInt16 nProgrCount )
 {
     mpProgress.reset(new SfxProgress( mpDocSh, SdResId(STR_CREATE_PAGES), 
nProgrCount ));
diff --git a/sd/source/filter/html/htmlex.hxx b/sd/source/filter/html/htmlex.hxx
index 37d8135fb77f..338a4b6f309e 100644
--- a/sd/source/filter/html/htmlex.hxx
+++ b/sd/source/filter/html/htmlex.hxx
@@ -31,12 +31,15 @@
 #include <vector>
 
 namespace sd { class DrawDocShell; }
+namespace sdr::table { class SdrTableObj; };
 
 class SfxProgress;
 class SdPage;
 class SdrOutliner;
 class HtmlState;
 class SdDrawDocument;
+class SdrObjGroup;
+class OutlinerParaObject;
 
 /// this class exports an Impress Document as a HTML Presentation.
 class HtmlExport final
@@ -72,7 +75,14 @@ class HtmlExport final
                SdDrawDocument& rExpDoc,
                sd::DrawDocShell* pDocShell);
 
-    static void ExportPage(SdrOutliner* pOutliner, SdPage* pPage, 
OUStringBuffer& rHtml);
+    static OUString CreateTextForTitle(SdrOutliner* pOutliner, SdPage* pPage);
+    static void WriteObjectGroup(OUStringBuffer& aStr, SdrObjGroup const * 
pObjectGroup,
+                                 SdrOutliner* pOutliner, bool bHeadLine);
+    static void WriteTable(OUStringBuffer& aStr, sdr::table::SdrTableObj const 
* pTableObject,
+                           SdrOutliner* pOutliner);
+    static void WriteOutlinerParagraph(OUStringBuffer& aStr, SdrOutliner* 
pOutliner,
+                                       OutlinerParaObject const * 
pOutlinerParagraphObject,
+                                       bool bHeadLine);
 
     ~HtmlExport();
 };

Reply via email to