summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2020-07-06 19:14:08 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2020-07-07 14:09:19 +0200
commit997e7011877b6559fce7173972c73fe0917212cb (patch)
tree01df91f4b98d8b04a599fca774c5efacc1f08187
parente4f697e510e0450375895d15256f27ee666e2968 (diff)
tdf#134264 writerfilter: fix DOCX->DOC of ADDRESSBLOCK field
... and other unsupported ones; the problem was that the field got exported with ww::eUNKNOWN = 1, which can't be imported again. Move the ww8 eField enum to include/ so it can be used from writerfilter. (regression from e511a0ca5dde6d731bb126bbfe21768867890102..d9030ad6298e2f49ee63489d6158ea6ad23c0111) Change-Id: I19193392d62fdf0bba01fac2516bafe9fdfa5a99 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98221 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@cib.de> (cherry picked from commit ae2e8202407e82c9b14f0cc307742561f8c6e530) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98086 Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r--include/filter/msfilter/ww8fields.hxx130
-rw-r--r--sw/source/filter/ww8/fields.hxx107
-rw-r--r--sw/source/filter/ww8/ww8atr.cxx8
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx112
4 files changed, 245 insertions, 112 deletions
diff --git a/include/filter/msfilter/ww8fields.hxx b/include/filter/msfilter/ww8fields.hxx
new file mode 100644
index 000000000000..8399fe22edb0
--- /dev/null
+++ b/include/filter/msfilter/ww8fields.hxx
@@ -0,0 +1,130 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+namespace ww
+{
+enum eField
+{
+ eNONE = 0,
+ eUNKNOWN = 1,
+ ePOSSIBLEBOOKMARK = 2,
+ eREF = 3,
+ eXE = 4,
+ eFOOTREF = 5,
+ eSET = 6,
+ eIF = 7,
+ eINDEX = 8,
+ eTC = 9,
+ eSTYLEREF = 10,
+ eRD = 11,
+ eSEQ = 12,
+ eTOC = 13,
+ eINFO = 14,
+ eTITLE = 15,
+ eSUBJECT = 16,
+ eAUTHOR = 17,
+ eKEYWORDS = 18,
+ eCOMMENTS = 19,
+ eLASTSAVEDBY = 20,
+ eCREATEDATE = 21,
+ eSAVEDATE = 22,
+ ePRINTDATE = 23,
+ eREVNUM = 24,
+ eEDITTIME = 25,
+ eNUMPAGES = 26,
+ eNUMWORDS = 27,
+ eNUMCHARS = 28,
+ eFILENAME = 29,
+ eTEMPLATE = 30,
+ eDATE = 31,
+ eTIME = 32,
+ ePAGE = 33,
+ eEquals = 34,
+ eQUOTE = 35,
+ eMERGEINC = 36,
+ ePAGEREF = 37,
+ eASK = 38,
+ eFILLIN = 39,
+ eMERGEDATA = 40,
+ eNEXT = 41,
+ eNEXTIF = 42,
+ eSKIPIF = 43,
+ eMERGEREC = 44,
+ eDDEREF = 45,
+ eDDEAUTOREF = 46,
+ eGLOSSREF = 47,
+ ePRINT = 48,
+ eEQ = 49,
+ eGOTOBUTTON = 50,
+ eMACROBUTTON = 51,
+ eAUTONUMOUT = 52,
+ eAUTONUMLGL = 53,
+ eAUTONUM = 54,
+ eINCLUDETIFF = 55,
+ eLINK = 56,
+ eSYMBOL = 57,
+ eEMBED = 58,
+ eMERGEFIELD = 59,
+ eUSERNAME = 60,
+ eUSERINITIALS = 61,
+ eUSERADDRESS = 62,
+ eBARCODE = 63,
+ eDOCVARIABLE = 64,
+ eSECTION = 65,
+ eSECTIONPAGES = 66,
+ eINCLUDEPICTURE = 67,
+ eINCLUDETEXT = 68,
+ eFILESIZE = 69,
+ eFORMTEXT = 70,
+ eFORMCHECKBOX = 71,
+ eNOTEREF = 72,
+ eTOA = 73,
+ eTA = 74,
+ eMERGESEQ = 75,
+ eMACRO = 76,
+ ePRIVATE = 77,
+ eDATABASE = 78,
+ eAUTOTEXT = 79,
+ eCOMPARE = 80,
+ ePLUGIN = 81,
+ eSUBSCRIBER = 82,
+ eFORMDROPDOWN = 83,
+ eADVANCE = 84,
+ eDOCPROPERTY = 85,
+ eUNKNOWN2 = 86,
+ eCONTROL = 87,
+ eHYPERLINK = 88,
+ eAUTOTEXTLIST = 89,
+ eLISTNUM = 90,
+ eHTMLCONTROL = 91,
+ eBIDIOUTLINE = 92,
+ eADDRESSBLOCK = 93,
+ eGREETINGLINE = 94,
+ eSHAPE = 95,
+ // NOTE: values > 95 / 0x5F do not correspond to documented WW8 fields
+ // and thus need special handling in WW8Export::OutputField()!
+ eBIBLIOGRAPHY = 96,
+ eCITATION = 97,
+ eFORMDATE = 98,
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/fields.hxx b/sw/source/filter/ww8/fields.hxx
index 8e24ca11d37b..9f3b0aafa252 100644
--- a/sw/source/filter/ww8/fields.hxx
+++ b/sw/source/filter/ww8/fields.hxx
@@ -21,113 +21,10 @@
#ifndef INCLUDED_SW_SOURCE_FILTER_WW8_FIELDS_HXX
#define INCLUDED_SW_SOURCE_FILTER_WW8_FIELDS_HXX
+#include <filter/msfilter/ww8fields.hxx>
+
namespace ww
{
- enum eField
- {
- eNONE = 0,
- eUNKNOWN = 1,
- ePOSSIBLEBOOKMARK = 2,
- eREF = 3,
- eXE = 4,
- eFOOTREF = 5,
- eSET = 6,
- eIF = 7,
- eINDEX = 8,
- eTC = 9,
- eSTYLEREF = 10,
- eRD = 11,
- eSEQ = 12,
- eTOC = 13,
- eINFO = 14,
- eTITLE = 15,
- eSUBJECT = 16,
- eAUTHOR = 17,
- eKEYWORDS = 18,
- eCOMMENTS = 19,
- eLASTSAVEDBY = 20,
- eCREATEDATE = 21,
- eSAVEDATE = 22,
- ePRINTDATE = 23,
- eREVNUM = 24,
- eEDITTIME = 25,
- eNUMPAGE = 26,
- eNUMWORDS = 27,
- eNUMCHARS = 28,
- eFILENAME = 29,
- eTEMPLATE = 30,
- eDATE = 31,
- eTIME = 32,
- ePAGE = 33,
- eEquals = 34,
- eQUOTE = 35,
- eMERGEINC = 36,
- ePAGEREF = 37,
- eASK = 38,
- eFILLIN = 39,
- eMERGEDATA = 40,
- eNEXT = 41,
- eNEXTIF = 42,
- eSKIPIF = 43,
- eMERGEREC = 44,
- eDDEREF = 45,
- eDDEAUTOREF = 46,
- eGLOSSREF = 47,
- ePRINT = 48,
- eEQ = 49,
- eGOTOBUTTON = 50,
- eMACROBUTTON = 51,
- eAUTONUMOUT = 52,
- eAUTONUMLGL = 53,
- eAUTONUM = 54,
- eINCLUDETIFF = 55,
- eLINK = 56,
- eSYMBOL = 57,
- eEMBED = 58,
- eMERGEFIELD = 59,
- eUSERNAME = 60,
- eUSERINITIALS = 61,
- eUSERADDRESS = 62,
- eBARCODE = 63,
- eDOCVARIABLE = 64,
- eSECTION = 65,
- eSECTIONPAGES = 66,
- eINCLUDEPICTURE = 67,
- eINCLUDETEXT = 68,
- eFILESIZE = 69,
- eFORMTEXT = 70,
- eFORMCHECKBOX = 71,
- eNOTEREF = 72,
- eTOA = 73,
- eTA = 74,
- eMERGESEQ = 75,
- eMACRO = 76,
- ePRIVATE = 77,
- eDATABASE = 78,
- eAUTOTEXT = 79,
- eCOMPARE = 80,
- ePLUGIN = 81,
- eSUBSCRIBER = 82,
- eFORMDROPDOWN = 83,
- eADVANCE = 84,
- eDOCPROPERTY = 85,
- eUNKNOWN2 = 86,
- eCONTROL = 87,
- eHYPERLINK = 88,
- eAUTOTEXTLIST = 89,
- eLISTNUM = 90,
- eHTMLCONTROL = 91,
- eBIDIOUTLINE = 92,
- eADDRESSBLOCK = 93,
- eGREETINGLINE = 94,
- eSHAPE = 95,
- // NOTE: values > 95 / 0x5F do not correspond to documented WW8 fields
- // and thus need special handling in WW8Export::OutputField()!
- eBIBLIOGRPAHY=96,
- eCITATION = 97,
- eFORMDATE = 98,
- };
-
/** Find the English Field Name from a winword index
See OpenOffice.org issue 12831
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index 4b913d9fa576..e9c236d8e872 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -1767,9 +1767,9 @@ void WW8Export::OutputField( const SwField* pField, ww::eField eFieldType,
switch (eFieldType)
{
// map fields that are not supported in WW8 as of Word 2003
- case ww::eBIBLIOGRPAHY:
+ case ww::eBIBLIOGRAPHY:
eFieldType = ww::eQUOTE;
- assert(rFieldCmd == FieldString(ww::eBIBLIOGRPAHY));
+ assert(rFieldCmd == FieldString(ww::eBIBLIOGRAPHY));
sFieldCmd = FieldString(ww::eQUOTE);
break;
case ww::eCITATION:
@@ -2277,7 +2277,7 @@ void AttributeOutputBase::StartTOX( const SwSection& rSect )
break;
case TOX_AUTHORITIES:
- eCode = ww::eBIBLIOGRPAHY;
+ eCode = ww::eBIBLIOGRAPHY;
sStr = FieldString(eCode);
break;
// case TOX_USER:
@@ -2944,7 +2944,7 @@ void AttributeOutputBase::TextField( const SwFormatField& rField )
switch (nSubType)
{
case DS_PAGE:
- eField = ww::eNUMPAGE;
+ eField = ww::eNUMPAGES;
break;
case DS_WORD:
eField = ww::eNUMWORDS;
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 861fcf678ab4..b987b58d8f40 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -91,6 +91,7 @@
#include <officecfg/Office/Common.hxx>
#include <filter/msfilter/util.hxx>
+#include <filter/msfilter/ww8fields.hxx>
#include <comphelper/sequence.hxx>
#include <comphelper/propertyvalue.hxx>
#include <comphelper/propertysequence.hxx>
@@ -3891,6 +3892,110 @@ void DomainMapper_Impl::AppendFieldCommand(OUString const & rPartOfCommand)
typedef std::multimap < sal_Int32, OUString > TOCStyleMap;
+
+static ww::eField GetWW8FieldId(OUString const& rType)
+{
+ std::unordered_map<OUString, ww::eField> mapID
+ {
+ {"ADDRESSBLOCK", ww::eADDRESSBLOCK},
+ {"ADVANCE", ww::eADVANCE},
+ {"ASK", ww::eASK},
+ {"AUTONUM", ww::eAUTONUM},
+ {"AUTONUMLGL", ww::eAUTONUMLGL},
+ {"AUTONUMOUT", ww::eAUTONUMOUT},
+ {"AUTOTEXT", ww::eAUTOTEXT},
+ {"AUTOTEXTLIST", ww::eAUTOTEXTLIST},
+ {"AUTHOR", ww::eAUTHOR},
+ {"BARCODE", ww::eBARCODE},
+ {"BIDIOUTLINE", ww::eBIDIOUTLINE},
+ {"DATE", ww::eDATE},
+ {"COMMENTS", ww::eCOMMENTS},
+ {"COMPARE", ww::eCOMPARE},
+ {"CONTROL", ww::eCONTROL},
+ {"CREATEDATE", ww::eCREATEDATE},
+ {"DATABASE", ww::eDATABASE},
+ {"DDEAUTOREF", ww::eDDEAUTOREF},
+ {"DDEREF", ww::eDDEREF},
+ {"DOCPROPERTY", ww::eDOCPROPERTY},
+ {"DOCVARIABLE", ww::eDOCVARIABLE},
+ {"EDITTIME", ww::eEDITTIME},
+ {"EMBED", ww::eEMBED},
+ {"EQ", ww::eEQ},
+ {"FILLIN", ww::eFILLIN},
+ {"FILENAME", ww::eFILENAME},
+ {"FILESIZE", ww::eFILESIZE},
+ {"FOOTREF", ww::eFOOTREF},
+// {"FORMULA", ww::},
+ {"FORMCHECKBOX", ww::eFORMCHECKBOX},
+ {"FORMDROPDOWN", ww::eFORMDROPDOWN},
+ {"FORMTEXT", ww::eFORMTEXT},
+ {"GLOSSREF", ww::eGLOSSREF},
+ {"GOTOBUTTON", ww::eGOTOBUTTON},
+ {"GREETINGLINE", ww::eGREETINGLINE},
+ {"HTMLCONTROL", ww::eHTMLCONTROL},
+ {"HYPERLINK", ww::eHYPERLINK},
+ {"IF", ww::eIF},
+ {"INFO", ww::eINFO},
+ {"INCLUDEPICTURE", ww::eINCLUDEPICTURE},
+ {"INCLUDETEXT", ww::eINCLUDETEXT},
+ {"INCLUDETIFF", ww::eINCLUDETIFF},
+ {"KEYWORDS", ww::eKEYWORDS},
+ {"LASTSAVEDBY", ww::eLASTSAVEDBY},
+ {"LINK", ww::eLINK},
+ {"LISTNUM", ww::eLISTNUM},
+ {"MACRO", ww::eMACRO},
+ {"MACROBUTTON", ww::eMACROBUTTON},
+ {"MERGEDATA", ww::eMERGEDATA},
+ {"MERGEFIELD", ww::eMERGEFIELD},
+ {"MERGEINC", ww::eMERGEINC},
+ {"MERGEREC", ww::eMERGEREC},
+ {"MERGESEQ", ww::eMERGESEQ},
+ {"NEXT", ww::eNEXT},
+ {"NEXTIF", ww::eNEXTIF},
+ {"NOTEREF", ww::eNOTEREF},
+ {"PAGE", ww::ePAGE},
+ {"PAGEREF", ww::ePAGEREF},
+ {"PLUGIN", ww::ePLUGIN},
+ {"PRINT", ww::ePRINT},
+ {"PRINTDATE", ww::ePRINTDATE},
+ {"PRIVATE", ww::ePRIVATE},
+ {"QUOTE", ww::eQUOTE},
+ {"RD", ww::eRD},
+ {"REF", ww::eREF},
+ {"REVNUM", ww::eREVNUM},
+ {"SAVEDATE", ww::eSAVEDATE},
+ {"SECTION", ww::eSECTION},
+ {"SECTIONPAGES", ww::eSECTIONPAGES},
+ {"SEQ", ww::eSEQ},
+ {"SET", ww::eSET},
+ {"SKIPIF", ww::eSKIPIF},
+ {"STYLEREF", ww::eSTYLEREF},
+ {"SUBSCRIBER", ww::eSUBSCRIBER},
+ {"SUBJECT", ww::eSUBJECT},
+ {"SYMBOL", ww::eSYMBOL},
+ {"TA", ww::eTA},
+ {"TEMPLATE", ww::eTEMPLATE},
+ {"TIME", ww::eTIME},
+ {"TITLE", ww::eTITLE},
+ {"TOA", ww::eTOA},
+ {"USERINITIALS", ww::eUSERINITIALS},
+ {"USERADDRESS", ww::eUSERADDRESS},
+ {"USERNAME", ww::eUSERNAME},
+
+ {"TOC", ww::eTOC},
+ {"TC", ww::eTC},
+ {"NUMCHARS", ww::eNUMCHARS},
+ {"NUMWORDS", ww::eNUMWORDS},
+ {"NUMPAGES", ww::eNUMPAGES},
+ {"INDEX", ww::eINDEX},
+ {"XE", ww::eXE},
+ {"BIBLIOGRAPHY", ww::eBIBLIOGRAPHY},
+ {"CITATION", ww::eCITATION},
+ };
+ auto const it = mapID.find(rType);
+ return (it == mapID.end()) ? ww::eNONE : it->second;
+}
+
static const FieldConversionMap_t & lcl_GetFieldConversion()
{
static const FieldConversionMap_t aFieldConversionMap
@@ -5640,9 +5745,10 @@ void DomainMapper_Impl::CloseFieldCommand()
// the ODF_UNHANDLED string!
assert(!m_bForceGenericFields || aCode.isEmpty());
xNameCont->insertByName(ODF_CODE_PARAM, uno::makeAny(aCode));
- if (sType == "CONTROL")
- { // tdf#129247 HACK probably this should be imported as something else, like in ww8?
- xNameCont->insertByName(ODF_ID_PARAM, uno::makeAny(OUString::number(87))); // ww8::eCONTROL
+ ww::eField const id(GetWW8FieldId(sType));
+ if (id != ww::eNONE)
+ { // tdf#129247 tdf#134264 set WW8 id for WW8 export
+ xNameCont->insertByName(ODF_ID_PARAM, uno::makeAny(OUString::number(id)));
}
}
else