diff options
Diffstat (limited to 'sw/source/filter/html/htmlnumwriter.cxx')
-rw-r--r-- | sw/source/filter/html/htmlnumwriter.cxx | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/sw/source/filter/html/htmlnumwriter.cxx b/sw/source/filter/html/htmlnumwriter.cxx index 7df3402dda35..f41ac73929f9 100644 --- a/sw/source/filter/html/htmlnumwriter.cxx +++ b/sw/source/filter/html/htmlnumwriter.cxx @@ -84,7 +84,8 @@ void SwHTMLWriter::SetNextNumInfo( std::unique_ptr<SwHTMLNumRuleInfo> pNxt ) } Writer& OutHTML_NumberBulletListStart( SwHTMLWriter& rWrt, - const SwHTMLNumRuleInfo& rInfo ) + const SwHTMLNumRuleInfo& rInfo, + bool& rAtLeastOneNumbered ) { SwHTMLNumRuleInfo& rPrevInfo = rWrt.GetNumInfo(); bool bSameRule = rPrevInfo.GetNumRule() == rInfo.GetNumRule(); @@ -124,6 +125,7 @@ Writer& OutHTML_NumberBulletListStart( SwHTMLWriter& rWrt, ++nPos; } + rAtLeastOneNumbered = bAtLeastOneNumbered; if (!bAtLeastOneNumbered) { return rWrt; @@ -321,25 +323,10 @@ Writer& OutHTML_NumberBulletListEnd( SwHTMLWriter& rWrt, bool bSameRule = rNextInfo.GetNumRule() == rInfo.GetNumRule(); bool bListEnd = !bSameRule || rNextInfo.GetDepth() < rInfo.GetDepth() || rNextInfo.IsRestart(); - if (rWrt.mbXHTML) - { - // XHTML </li> for the list item content. - if ((bListEnd && rInfo.IsNumbered()) || (!bListEnd && rNextInfo.IsNumbered())) - { - HTMLOutFuncs::Out_AsciiTag(rWrt.Strm(), - OStringConcatenation(rWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_li), false); - } - } - - if (!bListEnd) - { - return rWrt; - } - + std::optional<bool> oAtLeastOneNumbered; if (rWrt.mbXHTML && !rInfo.IsNumbered()) { - // If the list only consisted of non-numbered text nodes, then don't end the list. - bool bAtLeastOneNumbered = false; + oAtLeastOneNumbered = false; SwNodeOffset nPos = rWrt.m_pCurrentPam->GetPoint()->nNode.GetIndex() - 1; SwNumRule* pNumRule = nullptr; while (true) @@ -360,13 +347,36 @@ Writer& OutHTML_NumberBulletListEnd( SwHTMLWriter& rWrt, pNumRule = pTextNode->GetNumRule(); if (pTextNode->IsNumbered()) { - bAtLeastOneNumbered = true; + oAtLeastOneNumbered = true; break; } --nPos; } + } - if (!bAtLeastOneNumbered) + if (rWrt.mbXHTML) + { + // The list is numbered if the previous text node is numbered or any other previous text + // node is numbered. + bool bPrevIsNumbered = rInfo.IsNumbered() || *oAtLeastOneNumbered; + // XHTML </li> for the list item content, if there is an open <li>. + if ((bListEnd && bPrevIsNumbered) || (!bListEnd && rNextInfo.IsNumbered())) + { + HTMLOutFuncs::Out_AsciiTag( + rWrt.Strm(), OStringConcatenation(rWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_li), + false); + } + } + + if (!bListEnd) + { + return rWrt; + } + + if (rWrt.mbXHTML && !rInfo.IsNumbered()) + { + // If the list only consisted of non-numbered text nodes, then don't end the list. + if (!*oAtLeastOneNumbered) { return rWrt; } |