diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2020-11-13 16:26:43 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2020-11-14 12:01:39 +0100 |
commit | 5d839ff8a81ade6453a239a258b2a2571e32001e (patch) | |
tree | a1e187002f23bbc608b0dfe3bc107e7803ac4c12 /sw | |
parent | 05b279e7e0773d3c3da2688a2b95edfb8c88308c (diff) |
DOCX export: handle conditional fields
At least the subset where the condition syntax matches between Writer
and Word.
Change-Id: I107f2b4caeda6f7777696af8d5c5b455854cfa92
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105798
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/conditional-text.fodt | 8 | ||||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx | 13 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 24 |
3 files changed, 44 insertions, 1 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/conditional-text.fodt b/sw/qa/extras/ooxmlexport/data/conditional-text.fodt new file mode 100644 index 000000000000..296c1c4ecc4d --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/conditional-text.fodt @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<office:document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooow="http://openoffice.org/2004/writer" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:body> + <office:text> + <text:p><text:conditional-text text:condition="ooow:1 < 2" text:string-value-if-true="True" text:string-value-if-false="False">True</text:conditional-text></text:p> + </office:text> + </office:body> +</office:document> diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx index eaf33fdda6b0..1a94982df7e9 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx @@ -663,6 +663,19 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf132185, "tdf132185.docx") assertXPathContent(pXmlDoc, "/w:ftr/w:p/w:r[2]/w:instrText", " PAGE \\* roman "); } +DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testConditionalText, "conditional-text.fodt") +{ + // Load a document which has a conditional text field in it. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + std::u16string_view aExpected(u" IF 1 < 2 \"True\" \"False\""); + + // Without the accompanying fix in place, this test would have failed with: + // - Expression: xmlXPathNodeSetGetLength(pXmlNodes) > 0 + // - In <...>, XPath '/w:document/w:body/w:p/w:r[2]/w:instrText' not found + // i.e. the field was lost on export. + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:instrText", aExpected); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index c2eeeec1bee6..99cd7eabd6c4 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -7881,8 +7881,30 @@ void DocxAttributeOutput::RefField( const SwField& rField, const OUString& rRef // There is nothing to do here for the set fields } -void DocxAttributeOutput::HiddenField( const SwField& /*rField*/ ) +void DocxAttributeOutput::HiddenField(const SwField& rField) { + auto eSubType = static_cast<SwFieldTypesEnum>(rField.GetSubType()); + if (eSubType == SwFieldTypesEnum::ConditionalText) + { + OUString aCond = rField.GetPar1(); + OUString aTrueFalse = rField.GetPar2(); + sal_Int32 nPos = aTrueFalse.indexOf('|'); + OUString aTrue; + OUString aFalse; + if (nPos == -1) + { + aTrue = aTrueFalse; + } + else + { + aTrue = aTrueFalse.subView(0, nPos); + aFalse = aTrueFalse.subView(nPos + 1); + } + OUString aCmd = FieldString(ww::eIF) + aCond + " \"" + aTrue + "\" \"" + aFalse + "\""; + m_rExport.OutputField(&rField, ww::eIF, aCmd); + return; + } + SAL_INFO("sw.ww8", "TODO DocxAttributeOutput::HiddenField()" ); } |