include/filter/msfilter/ww8fields.hxx | 130 ++++++++++++++++++++++ sw/source/filter/ww8/fields.hxx | 107 ------------------ sw/source/filter/ww8/ww8atr.cxx | 8 - writerfilter/source/dmapper/DomainMapper_Impl.cxx | 112 ++++++++++++++++++ 4 files changed, 245 insertions(+), 112 deletions(-)
New commits: commit c97aea90c63aa41e43a15f24ad65a00dfd686f0d Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Mon Jul 6 19:14:08 2020 +0200 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Fri Jul 10 17:34:04 2020 +0200 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.st...@cib.de> (cherry picked from commit ae2e8202407e82c9b14f0cc307742561f8c6e530) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98244 Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98510 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Michael Meeks <michael.me...@collabora.com> 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 8f3b6850bef4..320bfc80ccb1 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -1795,9 +1795,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: @@ -2305,7 +2305,7 @@ void AttributeOutputBase::StartTOX( const SwSection& rSect ) break; case TOX_AUTHORITIES: - eCode = ww::eBIBLIOGRPAHY; + eCode = ww::eBIBLIOGRAPHY; sStr = FieldString(eCode); break; // case TOX_USER: @@ -2972,7 +2972,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 61fa9bf80d45..2afbaeef52bd 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -93,6 +93,7 @@ #include <vcl/outdev.hxx> #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> @@ -3684,6 +3685,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 @@ -5410,9 +5515,10 @@ void DomainMapper_Impl::CloseFieldCommand() // the ODF_UNHANDLED string! assert(!m_bForceGenericFields || aCode.isEmpty()); xNameCont->insertByName(ODF_CODE_PARAM, uno::makeAny(aCode)); - if (std::get<0>(field) == "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(std::get<0>(field))); + 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 _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits