diff options
author | Michael Stahl <mstahl@redhat.com> | 2015-06-19 13:55:12 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-06-22 12:14:53 +0000 |
commit | a99a8aa1f6ec95a578a34f92aeab3523f090176b (patch) | |
tree | 3267925c742195b9cd96c17c0613dff6c60d4d04 | |
parent | be0f5f5b66c55081849250ffad9f600cd61a00a1 (diff) |
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.tarasievich@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.
(cherry picked from commit f56289ac6d7f3da7fd45dd431ce4c540aadcad56)
(cherry picked from commit 1bcd54e93245dfaea0a072493d8bab9e569bae93)
Conflicts:
sw/source/filter/ww8/ww8atr.cxx
sw: remove the SwField::ExpandCitation disaster
(cherry picked from commit 8ee3cb95638f25fea8dc85e2dc5eec89ea41fc38)
(cherry picked from commit 1b5dc145e4e73fb2b8eaab1af3cb18d48048a1f0)
Conflicts:
sw/source/filter/ww8/ww8atr.cxx
Change-Id: I62b13a4f585dce535d587555b357ab7e4ef0e460
Reviewed-on: https://gerrit.libreoffice.org/16410
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | sw/inc/authfld.hxx | 2 | ||||
-rw-r--r-- | sw/inc/fldbas.hxx | 2 | ||||
-rw-r--r-- | sw/source/core/fields/fldbas.cxx | 6 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 4 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8atr.cxx | 37 |
5 files changed, 37 insertions, 14 deletions
diff --git a/sw/inc/authfld.hxx b/sw/inc/authfld.hxx index 6e3926b72b73..c2cae75c46a6 100644 --- a/sw/inc/authfld.hxx +++ b/sw/inc/authfld.hxx @@ -154,7 +154,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 57780e9671e4..2a65f4da9320 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 18d3f30b9212..e4439e170d21 100644 --- a/sw/source/core/fields/fldbas.cxx +++ b/sw/source/core/fields/fldbas.cxx @@ -405,12 +405,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 873d0f986ad2..8d378218646e 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> @@ -1540,7 +1541,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) + ->ExpandCitation(AUTH_FIELD_TITLE); } else { diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index ea6998fb0fef..ce9ca5ef6f56 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -1864,6 +1864,27 @@ WW8_WrPlcFld* WW8Export::CurrentFieldPlc() const void WW8Export::OutputField( const SwField* pFld, ww::eField eFldType, const OUString& rFldCmd, sal_uInt8 nMode ) { + OUString sFieldCmd(rFldCmd); + switch (eFldType) + { + // map fields that are not supported in WW8 as of Word 2003 + case ww::eBIBLIOGRPAHY: + eFldType = ww::eQUOTE; + assert(rFldCmd == FieldString(ww::eBIBLIOGRPAHY)); + sFieldCmd = FieldString(ww::eQUOTE); + break; + case ww::eCITATION: + eFldType = ww::eQUOTE; + assert(rFldCmd.startsWith(FieldString(ww::eCITATION))); + sFieldCmd = rFldCmd.replaceFirst(FieldString(ww::eCITATION), + FieldString(ww::eQUOTE)); + break; + default: + break; + } + + assert(eFldType <= 0x5F); // 95 is the highest documented one + bool bUnicode = IsUnicode(); WW8_WrPlcFld* pFldP = CurrentFieldPlc(); @@ -1881,10 +1902,10 @@ void WW8Export::OutputField( const SwField* pFld, ww::eField eFldType, if (WRITEFIELD_CMD_START & nMode) { if (bUnicode) - SwWW8Writer::WriteString16(Strm(), rFldCmd, false); + SwWW8Writer::WriteString16(Strm(), sFieldCmd, false); else { - SwWW8Writer::WriteString8(Strm(), rFldCmd, false, + SwWW8Writer::WriteString8(Strm(), sFieldCmd, false, RTL_TEXTENCODING_MS_1252); } // #i43956# - write hyperlink character including @@ -1937,7 +1958,7 @@ void WW8Export::OutputField( const SwField* pFld, ww::eField eFldType, if( pFld ) sOut = lcl_GetExpandedField(*pFld); else - sOut = rFldCmd; + sOut = sFieldCmd; if( !sOut.isEmpty() ) { if( bUnicode ) @@ -2937,7 +2958,15 @@ void AttributeOutputBase::TextField( const SwFmtFld& rField ) break; case RES_AUTHORITY: { - OUString sRet(pFld->ExpandCitation(AUTH_FIELD_IDENTIFIER)); + OUString sRet(static_cast<SwAuthorityField const*>(pFld) + ->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( pFld, ww::eCITATION, sRet ); } break; |