summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2023-01-19 15:46:37 +0100
committerMiklos Vajna <vmiklos@collabora.com>2023-01-19 15:54:08 +0000
commit6ce374140f3bd1cede959ccc8da69fdacecff191 (patch)
treee260364822b2fc12069920eba675551cab81dae1
parent261b1237532f431963358a7b4ac5fd1ad6e5d223 (diff)
sw XHTML export: use CSS instead of <center> for tables
<center> is not valid XHTML, have to use CSS styling instead. HTML export uses <center> by default around tables where the alignment is center. Fix the problem by avoiding <center> in the XHTML case and set the left and right margin to auto, which means: If the values of margin-left and margin-right are both auto, the calculated space is evenly distributed. according to <https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left>. The import will be adjusted to recognize the new markup in a follow-up change. Change-Id: I51e3507e9cde713f961b783378d66db59194a6ca Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145814 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
-rw-r--r--sw/qa/filter/html/html.cxx30
-rw-r--r--sw/source/filter/html/css1atr.cxx11
-rw-r--r--sw/source/filter/html/htmltabw.cxx14
3 files changed, 53 insertions, 2 deletions
diff --git a/sw/qa/filter/html/html.cxx b/sw/qa/filter/html/html.cxx
index 537b437c4bdb..65f67b7378d1 100644
--- a/sw/qa/filter/html/html.cxx
+++ b/sw/qa/filter/html/html.cxx
@@ -196,6 +196,36 @@ CPPUNIT_TEST_FIXTURE(Test, testTableRowSpanInAllCells)
assertXPathNoAttribute(pHtmlDoc, "//tr[1]/td[1]", "rowspan");
assertXPath(pHtmlDoc, "//tr", 1);
}
+
+CPPUNIT_TEST_FIXTURE(Test, testCenteredTableCSSExport)
+{
+ // Given a document with a centered table:
+ createSwDoc();
+ SwDoc* pDoc = getSwDoc();
+ SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
+ SwInsertTableOptions aTableOptions(SwInsertTableFlags::NONE, 0);
+ pWrtShell->InsertTable(aTableOptions, 1, 1);
+ pWrtShell->MoveTable(GotoPrevTable, fnTableStart);
+ SfxItemSetFixed<RES_FRMATR_BEGIN, RES_FRMATR_END - 1> aSet(pWrtShell->GetAttrPool());
+ SwFormatHoriOrient aHoriOrientItem(/*nX=*/0, text::HoriOrientation::CENTER);
+ aSet.Put(aHoriOrientItem);
+ pWrtShell->SetTableAttr(aSet);
+
+ // When exporting to XHTML:
+ setFilterOptions("xhtmlns=reqif-xhtml");
+ save("HTML (StarWriter)");
+
+ // Then make sure that CSS is used to horizontally position the table:
+ SvMemoryStream aStream;
+ WrapReqifFromTempFile(aStream);
+ xmlDocUniquePtr pXmlDoc = parseXmlStream(&aStream);
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Expected: 0
+ // - Actual : 1
+ // i.e <center> was used to position the table, not CSS.
+ assertXPath(pXmlDoc, "//reqif-xhtml:center", 0);
+ assertXPath(pXmlDoc, "//reqif-xhtml:table", "style", "margin-left: auto; margin-right: auto");
+}
}
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/html/css1atr.cxx b/sw/source/filter/html/css1atr.cxx
index 135494df00ca..28c5cc5dea8f 100644
--- a/sw/source/filter/html/css1atr.cxx
+++ b/sw/source/filter/html/css1atr.cxx
@@ -2064,6 +2064,17 @@ void SwHTMLWriter::OutCSS1_TableFrameFormatOptions( const SwFrameFormat& rFrameF
if( SfxItemState::SET==rItemSet.GetItemState( RES_LAYOUT_SPLIT, false, &pItem ) )
OutCSS1_SwFormatLayoutSplit( *this, *pItem );
+ if (mbXHTML)
+ {
+ sal_Int16 eTabHoriOri = rFrameFormat.GetHoriOrient().GetHoriOrient();
+ if (eTabHoriOri == text::HoriOrientation::CENTER)
+ {
+ // Emit XHTML's center using inline CSS.
+ OutCSS1_Property(sCSS1_P_margin_left, "auto", nullptr, sw::Css1Background::Table);
+ OutCSS1_Property(sCSS1_P_margin_right, "auto", nullptr, sw::Css1Background::Table);
+ }
+ }
+
if( !m_bFirstCSS1Property )
Strm().WriteChar( '\"' );
}
diff --git a/sw/source/filter/html/htmltabw.cxx b/sw/source/filter/html/htmltabw.cxx
index ddb8c8eb5f10..a1dee0f75333 100644
--- a/sw/source/filter/html/htmltabw.cxx
+++ b/sw/source/filter/html/htmltabw.cxx
@@ -1113,7 +1113,13 @@ Writer& OutHTML_SwTableNode( Writer& rWrt, SwTableNode & rNode,
if( rHTMLWrt.m_bLFPossible )
rHTMLWrt.OutNewLine(); // <CENTER> in new line
if( text::HoriOrientation::CENTER==eDivHoriOri )
- HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), Concat2View(rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_center) );
+ {
+ if (!rHTMLWrt.mbXHTML)
+ {
+ // Not XHTML's css center: start <center>.
+ HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), Concat2View(rHTMLWrt.GetNamespace() + OOO_STRING_SVTOOLS_HTML_center) );
+ }
+ }
else
{
OStringLiteral sOut = OOO_STRING_SVTOOLS_HTML_division
@@ -1166,7 +1172,11 @@ Writer& OutHTML_SwTableNode( Writer& rWrt, SwTableNode & rNode,
OString aTag = text::HoriOrientation::CENTER == eDivHoriOri
? OOO_STRING_SVTOOLS_HTML_center
: OOO_STRING_SVTOOLS_HTML_division;
- HTMLOutFuncs::Out_AsciiTag(rWrt.Strm(), Concat2View(rHTMLWrt.GetNamespace() + aTag), false);
+ if (!rHTMLWrt.mbXHTML || eDivHoriOri != text::HoriOrientation::CENTER)
+ {
+ // Not XHTML's css center: end <center>.
+ HTMLOutFuncs::Out_AsciiTag(rWrt.Strm(), Concat2View(rHTMLWrt.GetNamespace() + aTag), false);
+ }
rHTMLWrt.m_bLFPossible = true;
}