sw/inc/authfld.hxx | 2 - sw/inc/fldbas.hxx | 2 - sw/source/core/fields/fldbas.cxx | 6 ---- sw/source/filter/ww8/docxattributeoutput.cxx | 4 ++ sw/source/filter/ww8/ww8atr.cxx | 37 ++++++++++++++++++++++++--- 5 files changed, 37 insertions(+), 14 deletions(-)
New commits: commit f56289ac6d7f3da7fd45dd431ce4c540aadcad56 Author: Michael Stahl <mst...@redhat.com> Date: Sat Jun 13 00:37:39 2015 +0200 tdf#88697: sw: make WW8 export of CITATION fields compatible with ... older versions of Word and LO. Based on a prototype patch by Yury <yury.tarasiev...@gmail.com> The problem is that Word 2003 does not understand the new CITATION field added in commit 06f7d1a96eef5aa69d4872ff6d96eb5085296d09. Word 2010 does appear to at least recognize it as a field. Also fix the textual field type, which was omitted for CITATION fields, except when the document was imported from DOCX. Change-Id: I62b13a4f585dce535d587555b357ab7e4ef0e460 diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 616de7b..e669d79 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -1828,6 +1828,27 @@ WW8_WrPlcField* WW8Export::CurrentFieldPlc() const void WW8Export::OutputField( const SwField* pField, ww::eField eFieldType, const OUString& rFieldCmd, sal_uInt8 nMode ) { + OUString sFieldCmd(rFieldCmd); + switch (eFieldType) + { + // map fields that are not supported in WW8 as of Word 2003 + case ww::eBIBLIOGRPAHY: + eFieldType = ww::eQUOTE; + assert(rFieldCmd == FieldString(ww::eBIBLIOGRPAHY)); + sFieldCmd = FieldString(ww::eQUOTE); + break; + case ww::eCITATION: + eFieldType = ww::eQUOTE; + assert(rFieldCmd.startsWith(FieldString(ww::eCITATION))); + sFieldCmd = rFieldCmd.replaceFirst(FieldString(ww::eCITATION), + FieldString(ww::eQUOTE)); + break; + default: + break; + } + + assert(eFieldType <= 0x5F); // 95 is the highest documented one + bool bUnicode = IsUnicode(); WW8_WrPlcField* pFieldP = CurrentFieldPlc(); @@ -1845,10 +1866,10 @@ void WW8Export::OutputField( const SwField* pField, ww::eField eFieldType, if (WRITEFIELD_CMD_START & nMode) { if (bUnicode) - SwWW8Writer::WriteString16(Strm(), rFieldCmd, false); + SwWW8Writer::WriteString16(Strm(), sFieldCmd, false); else { - SwWW8Writer::WriteString8(Strm(), rFieldCmd, false, + SwWW8Writer::WriteString8(Strm(), sFieldCmd, false, RTL_TEXTENCODING_MS_1252); } // #i43956# - write hyperlink character including @@ -1901,7 +1922,7 @@ void WW8Export::OutputField( const SwField* pField, ww::eField eFieldType, if( pField ) sOut = lcl_GetExpandedField(*pField); else - sOut = rFieldCmd; + sOut = sFieldCmd; if( !sOut.isEmpty() ) { if( bUnicode ) @@ -2902,8 +2923,15 @@ void AttributeOutputBase::TextField( const SwFormatField& rField ) break; case RES_AUTHORITY: { - OUString const sRet(static_cast<SwAuthorityField const*>(pField) + OUString sRet(static_cast<SwAuthorityField const*>(pField) ->ExpandCitation(AUTH_FIELD_IDENTIFIER)); + // FIXME: DomainMapper_Impl::CloseFieldCommand() stuffs fully formed + // field instructions in here, but if the field doesn't originate + // from those filters it won't have that + if (!sRet.trim().startsWith("CITATION")) + { + sRet = FieldString(ww::eCITATION) + " \"" + sRet + "\""; + } GetExport().OutputField( pField, ww::eCITATION, sRet ); } break; commit 8ee3cb95638f25fea8dc85e2dc5eec89ea41fc38 Author: Michael Stahl <mst...@redhat.com> Date: Fri Jun 19 13:55:12 2015 +0200 sw: remove the SwField::ExpandCitation disaster Change-Id: I3adf4182ad77bfd1af3737f640e9d3fe6db5dfc9 diff --git a/sw/inc/authfld.hxx b/sw/inc/authfld.hxx index 11ce33e..73e1d09 100644 --- a/sw/inc/authfld.hxx +++ b/sw/inc/authfld.hxx @@ -155,7 +155,7 @@ public: OUString ConditionalExpand(ToxAuthorityField eField) const; //To handle Citation - OUString ExpandCitation(ToxAuthorityField eField) const; + SW_DLLPUBLIC OUString ExpandCitation(ToxAuthorityField eField) const; SwAuthorityField(SwAuthorityFieldType* pType, const OUString& rFieldContents); SwAuthorityField(SwAuthorityFieldType* pType, sal_IntPtr nHandle); diff --git a/sw/inc/fldbas.hxx b/sw/inc/fldbas.hxx index 7447fdb..6406fae 100644 --- a/sw/inc/fldbas.hxx +++ b/sw/inc/fldbas.hxx @@ -319,8 +319,6 @@ public: */ OUString ExpandField(bool const bCached, ToxAuthorityField eField = AUTH_FIELD_IDENTIFIER) const; - OUString ExpandCitation(ToxAuthorityField eField = AUTH_FIELD_IDENTIFIER) const; - /// @return name or content. virtual OUString GetFieldName() const; diff --git a/sw/source/core/fields/fldbas.cxx b/sw/source/core/fields/fldbas.cxx index 7f02e0a..40b96c2 100644 --- a/sw/source/core/fields/fldbas.cxx +++ b/sw/source/core/fields/fldbas.cxx @@ -435,12 +435,6 @@ OUString SwField::ExpandField(bool const bCached, ToxAuthorityField eField) cons return Expand(); } -OUString SwField::ExpandCitation(ToxAuthorityField eField) const -{ - const SwAuthorityField* pAuthorityField = static_cast<const SwAuthorityField*>(this); - return (pAuthorityField ? pAuthorityField->ExpandCitation(eField) : OUString()); -} - SwField * SwField::CopyField() const { SwField *const pNew = Copy(); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 577fb3f..5211c1b 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -91,6 +91,7 @@ #include <svl/whiter.hxx> #include <docufld.hxx> +#include <authfld.hxx> #include <flddropdown.hxx> #include <fmtclds.hxx> #include <fmtinfmt.hxx> @@ -1564,7 +1565,8 @@ void DocxAttributeOutput::EndField_Impl( FieldInfos& rInfos ) OUString sExpand; if(rInfos.eType == ww::eCITATION) { - sExpand = rInfos.pField->ExpandCitation(AUTH_FIELD_TITLE); + sExpand = static_cast<SwAuthorityField const*>(rInfos.pField.get()) + ->ExpandCitation(AUTH_FIELD_TITLE); } else { diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 37f2a10..616de7b 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -2902,7 +2902,8 @@ void AttributeOutputBase::TextField( const SwFormatField& rField ) break; case RES_AUTHORITY: { - OUString sRet(pField->ExpandCitation(AUTH_FIELD_IDENTIFIER)); + OUString const sRet(static_cast<SwAuthorityField const*>(pField) + ->ExpandCitation(AUTH_FIELD_IDENTIFIER)); GetExport().OutputField( pField, ww::eCITATION, sRet ); } break; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits