officecfg/registry/schema/org/openoffice/Office/Common.xcs | 6 +++ sw/qa/extras/ooxmlexport/ooxmlexport12.cxx | 2 - sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx | 2 - sw/source/filter/ww8/docxattributeoutput.cxx | 21 +++++++++++-- sw/source/filter/ww8/docxattributeoutput.hxx | 7 +++- sw/source/filter/ww8/rtfattributeoutput.cxx | 21 ++++++++----- writerfilter/source/dmapper/DomainMapper.cxx | 8 +++- writerfilter/source/dmapper/DomainMapper_Impl.cxx | 3 + writerfilter/source/dmapper/DomainMapper_Impl.hxx | 3 + 9 files changed, 56 insertions(+), 17 deletions(-)
New commits: commit ddd08c8996d444d7c0fe49d083c4f70f0a278d14 Author: Michael Stahl <[email protected]> AuthorDate: Wed Oct 2 18:49:47 2019 +0200 Commit: Michael Stahl <[email protected]> CommitDate: Wed Oct 23 13:09:44 2019 +0200 writerfilter: add config to import all fields as generic, incl. commands Change-Id: I02d178de3672200b69e60ba5841c993fa0d797f9 Reviewed-on: https://gerrit.libreoffice.org/80076 Tested-by: Jenkins Reviewed-by: Michael Stahl <[email protected]> diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs index 5eeb6c570331..8f33efdb29cb 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Common.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Common.xcs @@ -3870,6 +3870,12 @@ </info> <value>true</value> </prop> + <prop oor:name="ForceImportWWFieldsAsGenericFields" oor:type="xs:boolean" oor:nillable="false"> + <info> + <desc>Experimental: force all fields in RTF/DOCX to be imported as dumb generic enhanced fields.</desc> + </info> + <value>false</value> + </prop> <prop oor:name="CreateMSOLockFiles" oor:type="xs:boolean" oor:nillable="false"> <info> <desc>Specifies if LO should create MSO lock files next to the LO lock files diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index cb46699fad95..5ad13d6145e5 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -3111,8 +3111,10 @@ void DomainMapper::lcl_text(const sal_uInt8 * data_, size_t len) m_pImpl->SetCustomFtnMark( false ); //otherwise ignore sText } - else if( m_pImpl->IsOpenFieldCommand() ) + else if (m_pImpl->IsOpenFieldCommand() && !m_pImpl->IsForceGenericFields()) + { m_pImpl->AppendFieldCommand(sText); + } else if( m_pImpl->IsOpenField() && m_pImpl->IsFieldResultAsString()) /*depending on the success of the field insert operation this result will be set at the field or directly inserted into the text*/ @@ -3380,8 +3382,10 @@ void DomainMapper::lcl_utext(const sal_uInt8 * data_, size_t len) pContext->GetFootnote()->setLabel( sText ); //otherwise ignore sText } - else if( m_pImpl->IsOpenFieldCommand() ) + else if (m_pImpl->IsOpenFieldCommand() && !m_pImpl->IsForceGenericFields()) + { m_pImpl->AppendFieldCommand(sText); + } else if( m_pImpl->IsOpenField() && m_pImpl->IsFieldResultAsString()) /*depending on the success of the field insert operation this result will be set at the field or directly inserted into the text*/ diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index f23775bc8731..9df643e07f4f 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -193,6 +193,7 @@ DomainMapper_Impl::DomainMapper_Impl( m_xTextDocument( xModel, uno::UNO_QUERY ), m_xTextFactory( xModel, uno::UNO_QUERY ), m_xComponentContext( xContext ), + m_bForceGenericFields(!utl::ConfigManager::IsFuzzing() && officecfg::Office::Common::Filter::Microsoft::Import::ForceImportWWFieldsAsGenericFields::get(m_xComponentContext)), m_bSetUserFieldContent( false ), m_bSetCitation( false ), m_bSetDateValue( false ), @@ -4354,7 +4355,7 @@ void DomainMapper_Impl::CloseFieldCommand() FieldConversionMap_t::const_iterator const aIt = aFieldConversionMap.find(std::get<0>(field)); - if(aIt != aFieldConversionMap.end()) + if (aIt != aFieldConversionMap.end() && !m_bForceGenericFields) { pContext->SetFieldId(aIt->second.eFieldId); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 6f5aaedd1fed..813d45bab770 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -418,6 +418,7 @@ private: std::stack<AnchoredContext> m_aAnchoredStack; std::stack<HeaderFooterContext> m_aHeaderFooterStack; std::stack<FieldContextPtr> m_aFieldStack; + bool m_bForceGenericFields; bool m_bSetUserFieldContent; bool m_bSetCitation; bool m_bSetDateValue; @@ -1000,6 +1001,8 @@ public: bool IsDiscardHeaderFooter() const; + bool IsForceGenericFields() const { return m_bForceGenericFields; } + void SetParaAutoBefore(bool bParaAutoBefore) { m_bParaAutoBefore = bParaAutoBefore; } /// Forget about the previous paragraph, as it's not inside the same commit 94e0b8407b02d76b27324b8b08012eb024aca9e9 Author: Michael Stahl <[email protected]> AuthorDate: Mon Oct 21 18:33:51 2019 +0200 Commit: Michael Stahl <[email protected]> CommitDate: Wed Oct 23 13:09:20 2019 +0200 sw: DOCX export of nested fieldmarks The DocxAttributeOutput was more or less ignoring FieldFlags::CmdEnd; split CmdField_Impl() into 2 functions to write the command text with the Start like WW8/RTF and the separator with the CmdEnd. Change-Id: I7cfa52e2d786a8c9b427057eadc9ccc271d2f90f Reviewed-on: https://gerrit.libreoffice.org/81263 Tested-by: Jenkins Reviewed-by: Michael Stahl <[email protected]> diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx index b60c6cd571e6..c48efcb95cc0 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx @@ -678,7 +678,7 @@ DECLARE_OOXMLEXPORT_TEST(testTdf79435_legacyInputFields, "tdf79435_legacyInputFi { //using .doc input file to verify cross-format compatibility. uno::Reference<text::XFormField> xFormField - = getProperty<uno::Reference<text::XFormField>>(getRun(getParagraph(5), 2), "Bookmark"); + = getProperty<uno::Reference<text::XFormField>>(getRun(getParagraph(5), 3), "Bookmark"); uno::Reference<container::XNameContainer> xParameters(xFormField->getParameters()); OUString sTmp; diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx index 3996c634ab8f..15390ccd574c 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx @@ -537,7 +537,7 @@ DECLARE_OOXMLEXPORT_TEST(testSdtDateDuplicate, "sdt-date-duplicate.docx") DECLARE_OOXMLEXPORT_TEST(testFdo81492, "fdo81492.docx") { if (xmlDocPtr pXmlDoc = parseExport()) - assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[7]/w:instrText", "ADDIN EN.CITE.DATA"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[6]/w:instrText", "ADDIN EN.CITE.DATA"); } DECLARE_OOXMLEXPORT_TEST(testEditTime, "fdo81341.docx") diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 3eb6cf085b7c..9e5c5aad1784 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -1394,7 +1394,18 @@ void DocxAttributeOutput::EndRun(const SwTextNode* pNode, sal_Int32 nPos, bool / ++m_nFieldsInHyperlink; // Remove the field if no end needs to be written - if ( !pIt->bClose ) { + if (!pIt->bSep) + { + pIt = m_Fields.erase( pIt ); + continue; + } + } + if (pIt->bSep && !pIt->pField) + { + CmdEndField_Impl(pNode, nPos, true); + // Remove the field if no end needs to be written + if (!pIt->bClose) + { pIt = m_Fields.erase( pIt ); continue; } @@ -2073,9 +2084,12 @@ void DocxAttributeOutput::CmdField_Impl( const SwTextNode* pNode, sal_Int32 nPos m_pSerializer->endElementNS( XML_w, XML_r ); } } +} +void DocxAttributeOutput::CmdEndField_Impl(SwTextNode const*const pNode, + sal_Int32 const nPos, bool const bWriteRun) +{ // Write the Field separator - { if ( bWriteRun ) { m_pSerializer->startElementNS(XML_w, XML_r); @@ -2089,7 +2103,6 @@ void DocxAttributeOutput::CmdField_Impl( const SwTextNode* pNode, sal_Int32 nPos { m_pSerializer->endElementNS( XML_w, XML_r ); } - } } /// Writes properties for run that is used to separate field implementation. @@ -2190,6 +2203,7 @@ void DocxAttributeOutput::EndField_Impl( const SwTextNode* pNode, sal_Int32 nPos if ( rInfos.pField ) { CmdField_Impl( pNode, nPos, rInfos, true ); + CmdEndField_Impl( pNode, nPos, true ); } // Write the bookmark start if any @@ -7356,6 +7370,7 @@ void DocxAttributeOutput::WriteField_Impl( const SwField* pField, ww::eField eTy infos.sCmd = rFieldCmd; infos.eType = eType; infos.bClose = bool(FieldFlags::Close & nMode); + infos.bSep = bool(FieldFlags::CmdEnd & nMode); infos.bOpen = bool(FieldFlags::Start & nMode); m_Fields.push_back( infos ); diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index df8e10724987..d0f92c1f6fc6 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -58,9 +58,13 @@ struct FieldInfos const ::sw::mark::IFieldmark* pFieldmark; ww::eField eType; bool bOpen; + bool bSep; bool bClose; OUString sCmd; - FieldInfos() : pFieldmark(nullptr), eType(ww::eUNKNOWN), bOpen(false), bClose(false){} + FieldInfos() + : pFieldmark(nullptr), eType(ww::eUNKNOWN) + , bOpen(false), bSep(false), bClose(false) + {} }; enum DocxColBreakStatus @@ -717,6 +721,7 @@ private: void StartField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos const & rInfos, bool bWriteRun = false ); void DoWriteCmd( const OUString& rCmd ); void CmdField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos const & rInfos, bool bWriteRun ); + void CmdEndField_Impl( const SwTextNode* pNode, sal_Int32 nPos, bool bWriteRun ); void EndField_Impl( const SwTextNode* pNode, sal_Int32 nPos, FieldInfos& rInfos ); void DoWriteFieldRunProperties( const SwTextNode* pNode, sal_Int32 nPos, bool bWriteCombChars = false ); commit 4f174e66431628fa1343ec44d63cc3f02cc0bb0b Author: Michael Stahl <[email protected]> AuthorDate: Fri Oct 18 18:23:18 2019 +0200 Commit: Michael Stahl <[email protected]> CommitDate: Wed Oct 23 13:09:03 2019 +0200 sw: RTF export: export fieldmarks There was some special code that was used only to export ruby attributes; generalise it a little. Change-Id: Iac5316b97e095fb3811404cad0568b9ab63a96f0 Reviewed-on: https://gerrit.libreoffice.org/81085 Tested-by: Jenkins Reviewed-by: Michael Stahl <[email protected]> diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx index 1fdbcd307541..078f9dc94dd6 100644 --- a/sw/source/filter/ww8/rtfattributeoutput.cxx +++ b/sw/source/filter/ww8/rtfattributeoutput.cxx @@ -532,7 +532,8 @@ void RtfAttributeOutput::StartRuby(const SwTextNode& rNode, sal_Int32 nPos, void RtfAttributeOutput::EndRuby(const SwTextNode& rNode, sal_Int32 nPos) { - m_rExport.OutputField(nullptr, ww::eEQ, ")", FieldFlags::End | FieldFlags::Close); + m_rExport.OutputField(nullptr, ww::eEQ, ")", + FieldFlags::CmdEnd | FieldFlags::End | FieldFlags::Close); EndRun(&rNode, nPos); } @@ -1585,7 +1586,7 @@ void RtfAttributeOutput::NumberingLevel(sal_uInt8 nLevel, sal_uInt16 nStart, m_rExport.Strm().WriteChar('}'); } -void RtfAttributeOutput::WriteField_Impl(const SwField* pField, ww::eField eType, +void RtfAttributeOutput::WriteField_Impl(const SwField* const pField, ww::eField, const OUString& rFieldCmd, FieldFlags nMode) { // If there are no field instructions, don't export it as a field. @@ -1607,21 +1608,25 @@ void RtfAttributeOutput::WriteField_Impl(const SwField* pField, ww::eField eType if (bHasInstructions) m_aRunText->append("}}"); } - else if (eType == ww::eEQ) + else { - if (FieldFlags::Start & nMode) + if (nMode & FieldFlags::CmdStart) { m_aRunText->append("{" OOO_STRING_SVTOOLS_RTF_FIELD); m_aRunText->append("{" OOO_STRING_SVTOOLS_RTF_IGNORE OOO_STRING_SVTOOLS_RTF_FLDINST - " "); + // paragraph break closes group so open another one "inside" to + " {"); // prevent leaving the field instruction } if (bHasInstructions) m_aRunText->append( msfilter::rtfutil::OutString(rFieldCmd, m_rExport.GetCurrentEncoding())); - if (FieldFlags::End & nMode) + if (nMode & FieldFlags::CmdEnd) { - m_aRunText->append("}{" OOO_STRING_SVTOOLS_RTF_FLDRSLT " "); - m_aRunText->append("}}"); + m_aRunText->append("}}{" OOO_STRING_SVTOOLS_RTF_FLDRSLT " {"); + } + if (nMode & FieldFlags::Close) + { + m_aRunText->append("}}}"); } } } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
