sw/source/filter/ww8/docxattributeoutput.cxx |   37 ++++++++++++++-------------
 sw/source/filter/ww8/wrtw8nds.cxx            |    2 -
 sw/source/filter/ww8/wrtww8.cxx              |    4 ++
 sw/source/filter/ww8/wrtww8.hxx              |    1 
 4 files changed, 26 insertions(+), 18 deletions(-)

New commits:
commit 38bab24446ca7967f604735a04452b4969758c8c
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Sat Feb 8 19:46:50 2025 +0000
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Mon Feb 10 12:22:25 2025 +0100

    check once if there are any urn:bails metadata in the document
    
    for the common case that there are none at all, in which case we
    don't have to check every paragraph for its metadata.
    
    Change-Id: I65a59041d1eeb56db6e312c8b130fbd7d519306a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181304
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index b806e17b4a63..fb1e973c0aae 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1709,23 +1709,26 @@ void DocxAttributeOutput::EndParagraphProperties(const 
SfxItemSet& rParagraphMar
 
     m_pSerializer->endElementNS( XML_w, XML_pPr );
 
-    // RDF metadata for this text node.
-    SwTextNode* pTextNode = m_rExport.m_pCurPam->GetPointNode().GetTextNode();
-    std::map<OUString, OUString> aStatements;
-    if (pTextNode)
-        aStatements = SwRDFHelper::getTextNodeStatements(u"urn:bails"_ustr, 
*pTextNode);
-    if (!aStatements.empty())
-    {
-        m_pSerializer->startElementNS(XML_w, XML_smartTag,
-                                      FSNS(XML_w, XML_uri), 
"http://www.w3.org/1999/02/22-rdf-syntax-ns#";,
-                                      FSNS(XML_w, XML_element), "RDF");
-        m_pSerializer->startElementNS(XML_w, XML_smartTagPr);
-        for (const auto& rStatement : aStatements)
-            m_pSerializer->singleElementNS(XML_w, XML_attr,
-                                           FSNS(XML_w, XML_name), 
rStatement.first,
-                                           FSNS(XML_w, XML_val), 
rStatement.second);
-        m_pSerializer->endElementNS(XML_w, XML_smartTagPr);
-        m_pSerializer->endElementNS(XML_w, XML_smartTag);
+    if (m_rExport.m_bHasBailsMetaData)
+    {
+        // RDF metadata for this text node.
+        SwTextNode* pTextNode = 
m_rExport.m_pCurPam->GetPointNode().GetTextNode();
+        std::map<OUString, OUString> aStatements;
+        if (pTextNode)
+            aStatements = 
SwRDFHelper::getTextNodeStatements(u"urn:bails"_ustr, *pTextNode);
+        if (!aStatements.empty())
+        {
+            m_pSerializer->startElementNS(XML_w, XML_smartTag,
+                                          FSNS(XML_w, XML_uri), 
"http://www.w3.org/1999/02/22-rdf-syntax-ns#";,
+                                          FSNS(XML_w, XML_element), "RDF");
+            m_pSerializer->startElementNS(XML_w, XML_smartTagPr);
+            for (const auto& rStatement : aStatements)
+                m_pSerializer->singleElementNS(XML_w, XML_attr,
+                                               FSNS(XML_w, XML_name), 
rStatement.first,
+                                               FSNS(XML_w, XML_val), 
rStatement.second);
+            m_pSerializer->endElementNS(XML_w, XML_smartTagPr);
+            m_pSerializer->endElementNS(XML_w, XML_smartTag);
+        }
     }
 
     if ((m_nColBreakStatus == COLBRK_WRITE || m_nColBreakStatus == 
COLBRK_WRITEANDPOSTPONE)
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx 
b/sw/source/filter/ww8/wrtw8nds.cxx
index a2b5897ff195..646ed67a955f 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -2565,7 +2565,7 @@ void MSWordExportBase::OutputTextNode( SwTextNode& rNode )
 
             // At the moment smarttags are only written for paragraphs, at the
             // beginning of the paragraph.
-            if (nCurrentPos == 0)
+            if (nCurrentPos == 0 && m_bHasBailsMetaData)
                 AppendSmartTags(rNode);
 
             bool bTextAtr = aAttrIter.IsTextAttr( nCurrentPos );
diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
index 43f142d24cfc..d13aa46e0b09 100644
--- a/sw/source/filter/ww8/wrtww8.cxx
+++ b/sw/source/filter/ww8/wrtww8.cxx
@@ -121,6 +121,7 @@
 #include <fmtwrapinfluenceonobjpos.hxx>
 #include <officecfg/Office/Common.hxx>
 #include <fmtanchr.hxx>
+#include <unotxdoc.hxx>
 
 using namespace css;
 using namespace sw::util;
@@ -3981,12 +3982,15 @@ MSWordExportBase::MSWordExportBase( SwDoc& rDocument, 
std::shared_ptr<SwUnoCurso
     , m_bExportModeRTF(false)
     , m_bFontSizeWritten(false)
     , m_bAddFootnoteTab(false)
+    , m_bHasBailsMetaData(false)
     , m_rDoc(rDocument)
     , m_nCurStart(pCurrentPam->GetPoint()->GetNodeIndex())
     , m_nCurEnd(pCurrentPam->GetMark()->GetNodeIndex())
     , m_pCurPam(pCurrentPam)
     , m_pOrigPam(pOriginalPam)
 {
+    if (SwDocShell* pShell = rDocument.GetDocShell())
+        m_bHasBailsMetaData = 
SwRDFHelper::hasMetadataGraph(pShell->GetBaseModel(), u"urn:bails"_ustr);
 }
 
 MSWordExportBase::~MSWordExportBase()
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 20288160c1af..b9c524bed3d4 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -575,6 +575,7 @@ public:
     /// Is font size written already as part of the current character 
properties?
     bool m_bFontSizeWritten;
     bool m_bAddFootnoteTab;     // only one aesthetic spacing tab per footnote
+    bool m_bHasBailsMetaData;   // false if there is no urn:bails metadata in 
the document
 
     SwDoc& m_rDoc;
     SwNodeOffset m_nCurStart, m_nCurEnd;

Reply via email to