[Libreoffice-commits] core.git: include/filter sw/source writerfilter/source

Michael Stahl (via logerrit) logerrit at kemper.freedesktop.org
Tue Jul 7 08:48:49 UTC 2020


 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 ae2e8202407e82c9b14f0cc307742561f8c6e530
Author:     Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Mon Jul 6 19:14:08 2020 +0200
Commit:     Michael Stahl <michael.stahl at cib.de>
CommitDate: Tue Jul 7 10:48:06 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.stahl at cib.de>

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 da9e60091df0..3a45a4cb5bb4 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -1768,9 +1768,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:
@@ -2278,7 +2278,7 @@ void AttributeOutputBase::StartTOX( const SwSection& rSect )
                 break;
 
             case TOX_AUTHORITIES:
-                eCode = ww::eBIBLIOGRPAHY;
+                eCode = ww::eBIBLIOGRAPHY;
                 sStr = FieldString(eCode);
                  break;
                 //      case TOX_USER:
@@ -2945,7 +2945,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 c474d596766b..04e087fc4d30 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>
@@ -3909,6 +3910,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
@@ -5657,9 +5762,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


More information about the Libreoffice-commits mailing list