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(); };
