[Libreoffice-commits] core.git: Branch 'libreoffice-4-3' - sw/qa sw/source

Michael Stahl mstahl at redhat.com
Sun Jun 29 03:47:16 PDT 2014


 sw/qa/extras/rtfexport/data/fdo78758.rtf     |    9 ++++++
 sw/qa/extras/rtfexport/rtfexport.cxx         |   10 +++++++
 sw/source/filter/ww8/attributeoutputbase.hxx |    2 -
 sw/source/filter/ww8/docxattributeoutput.cxx |    2 -
 sw/source/filter/ww8/docxattributeoutput.hxx |    2 -
 sw/source/filter/ww8/rtfattributeoutput.cxx  |   37 +++++++++++++--------------
 sw/source/filter/ww8/rtfattributeoutput.hxx  |    9 ------
 sw/source/filter/ww8/wrtw8esh.cxx            |    2 -
 sw/source/filter/ww8/wrtw8nds.cxx            |    4 +-
 sw/source/filter/ww8/wrtww8gr.cxx            |    2 -
 sw/source/filter/ww8/ww8attributeoutput.hxx  |    2 -
 11 files changed, 47 insertions(+), 34 deletions(-)

New commits:
commit 04b5dd4d5080c5ffc0666dcfc62bda78170ba74c
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Jun 27 16:02:45 2014 +0200

    fdo#78758: sw: RTF export: don't export multiple \fldrst for one hyperlink
    
    Ensure that we export only one \fldresult per hyperlink by doing that in
    StartURL() and EndURL(); the TextINetFormat() is called once per text
    portion.  This shouldn't cause problems as there can't be anything
    between the end of the \field group and the start of \fldresult anyway.
    
    Replace the annoying call to EndURL() from EndRun() with a special case
    in EndURL() to store things in the right buffer (hopefully).
    
    (somehow this is regression from c4498251cb7181a9f272b0720f398597c0daef09)
    
    Change-Id: I209ea7a384fb1cb5d1505a70ecc4a4536bbf26a2
    (cherry picked from commit b8907bf3d3b37c686a414ffbbd2d732348aab5b9)
    Reviewed-on: https://gerrit.libreoffice.org/9937
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/sw/qa/extras/rtfexport/data/fdo78758.rtf b/sw/qa/extras/rtfexport/data/fdo78758.rtf
new file mode 100644
index 0000000..49c0502
--- /dev/null
+++ b/sw/qa/extras/rtfexport/data/fdo78758.rtf
@@ -0,0 +1,9 @@
+{\rtf1\ansi
+\par \pard\plain
+{{\field{\*\fldinst HYPERLINK "#__RefHeading___Toc264438068" }
+{\fldrslt {\langfe1024\rtlch \ltrch\loch\lang1024
+EE5E EeEEE5EE}{\scaps\langfe1024\rtlch \ltrch\loch\lang1024
+e}{\langfe1024\rtlch \ltrch\loch\lang1024
+\tab 46}}}}
+\par
+}
diff --git a/sw/qa/extras/rtfexport/rtfexport.cxx b/sw/qa/extras/rtfexport/rtfexport.cxx
index ce91526..de0ae10 100644
--- a/sw/qa/extras/rtfexport/rtfexport.cxx
+++ b/sw/qa/extras/rtfexport/rtfexport.cxx
@@ -468,6 +468,16 @@ DECLARE_RTFEXPORT_TEST(testHyperlink, "hyperlink.rtf")
     CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty<OUString>(getRun(getParagraph(1), 3, "!"), "HyperLinkURL"));
 }
 
+DECLARE_RTFEXPORT_TEST(test78758, "fdo78758.rtf")
+{
+    CPPUNIT_ASSERT_EQUAL(OUString("#__RefHeading___Toc264438068"),
+        getProperty<OUString>(getRun(getParagraph(2), 1, "EE5E EeEEE5EE"), "HyperLinkURL"));
+    CPPUNIT_ASSERT_EQUAL(OUString("#__RefHeading___Toc264438068"),
+        getProperty<OUString>(getRun(getParagraph(2), 2, "e"), "HyperLinkURL"));
+    CPPUNIT_ASSERT_EQUAL(OUString("#__RefHeading___Toc264438068"),
+        getProperty<OUString>(getRun(getParagraph(2), 3, "\t46"), "HyperLinkURL"));
+}
+
 DECLARE_RTFEXPORT_TEST(testTextFrameBorders, "textframe-borders.rtf")
 {
     uno::Reference<text::XTextFramesSupplier> xTextFramesSupplier(mxComponent, uno::UNO_QUERY);
diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx b/sw/source/filter/ww8/attributeoutputbase.hxx
index 5a25c86..361d90c 100644
--- a/sw/source/filter/ww8/attributeoutputbase.hxx
+++ b/sw/source/filter/ww8/attributeoutputbase.hxx
@@ -203,7 +203,7 @@ public:
     virtual bool StartURL( const OUString& rUrl, const OUString& rTarget ) = 0;
 
     /// Output URL end.
-    virtual bool EndURL() = 0;
+    virtual bool EndURL(bool isAtEndOfParagraph) = 0;
 
     virtual void FieldVanish( const OUString& rTxt, ww::eField eType ) = 0;
 
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index a8b5fcd..dd76317 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1887,7 +1887,7 @@ bool DocxAttributeOutput::StartURL( const OUString& rUrl, const OUString& rTarge
     return true;
 }
 
-bool DocxAttributeOutput::EndURL()
+bool DocxAttributeOutput::EndURL(bool const)
 {
     m_closeHyperlinkInThisRun = true;
     if(m_startedHyperlink && m_hyperLinkAnchor != "" && m_hyperLinkAnchor.startsWith("_Toc"))
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 76d98cc..59fd6f8 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -190,7 +190,7 @@ public:
     virtual bool StartURL( const OUString& rUrl, const OUString& rTarget ) SAL_OVERRIDE;
 
     /// Output URL end.
-    virtual bool EndURL() SAL_OVERRIDE;
+    virtual bool EndURL(bool) SAL_OVERRIDE;
 
     virtual void FieldVanish( const OUString& rTxt, ww::eField eType ) SAL_OVERRIDE;
 
diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx
index f528776..b9ab17b 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.cxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.cxx
@@ -405,8 +405,6 @@ void RtfAttributeOutput::StartRun(const SwRedlineData* pRedlineData, bool bSingl
 
 void RtfAttributeOutput::EndRun()
 {
-    if (m_bInURL)
-        EndURL();
     m_aRun->append(SAL_NEWLINE_STRING);
     m_aRun.appendAndClear(m_aRunText);
     if (!m_bSingleEmptyRun && m_bInRun)
@@ -481,23 +479,30 @@ bool RtfAttributeOutput::StartURL(const OUString& rUrl, const OUString& rTarget)
     }
 
     m_aStyles.append("}");
-    m_bHadFieldResult = false;
-    m_bInURL = true;
+    m_aStyles.append("{" OOO_STRING_SVTOOLS_RTF_FLDRSLT " {");
     return true;
 }
 
-bool RtfAttributeOutput::EndURL()
+bool RtfAttributeOutput::EndURL(bool const isAtEndOfParagraph)
 {
-    if (m_bInURL)
-        m_bInURL = false;
-    else
-        return true;
-
-    // close the fldrslt group
-    if (m_bHadFieldResult)
+    // UGLY: usually EndRun is called earlier, but there is an extra
+    // call to OutAttrWithRange() when at the end of the paragraph,
+    // so in that special case the output needs to be appended to the
+    // new run's text instead of the previous run
+    if (isAtEndOfParagraph)
+    {
+        // close the fldrslt group
+        m_aRunText->append("}}");
+        // close the field group
         m_aRunText->append('}');
-    // close the field group
-    m_aRunText->append('}');
+    }
+    else
+    {
+        // close the fldrslt group
+        m_aRun->append("}}");
+        // close the field group
+        m_aRun->append('}');
+    }
     return true;
 }
 
@@ -2407,8 +2412,6 @@ void RtfAttributeOutput::TextINetFormat(const SwFmtINetFmt& rURL)
         const SwCharFmt* pFmt;
         const SwTxtINetFmt* pTxtAtr = rURL.GetTxtINetFmt();
 
-        m_aStyles.append("{" OOO_STRING_SVTOOLS_RTF_FLDRSLT " ");
-        m_bHadFieldResult = true;
         if (pTxtAtr && 0 != (pFmt = pTxtAtr->GetCharFmt()))
         {
             sal_uInt16 nStyle = m_rExport.GetId(*pFmt);
@@ -3248,12 +3251,10 @@ RtfAttributeOutput::RtfAttributeOutput(RtfExport& rExport)
       m_bBufferSectionHeaders(false),
       m_bLastTable(true),
       m_bWroteCellInfo(false),
-      m_bHadFieldResult(false),
       m_bTableRowEnded(false),
       m_aCells(),
       m_bSingleEmptyRun(false),
       m_bInRun(false),
-      m_bInURL(false),
       m_pFlyFrameSize(0),
       m_pPrevPageDesc(0)
 {
diff --git a/sw/source/filter/ww8/rtfattributeoutput.hxx b/sw/source/filter/ww8/rtfattributeoutput.hxx
index f43d3d8..8cac684 100644
--- a/sw/source/filter/ww8/rtfattributeoutput.hxx
+++ b/sw/source/filter/ww8/rtfattributeoutput.hxx
@@ -91,7 +91,7 @@ public:
     virtual bool StartURL(const OUString& rUrl, const OUString& rTarget) SAL_OVERRIDE;
 
     /// Output URL end.
-    virtual bool EndURL() SAL_OVERRIDE;
+    virtual bool EndURL(bool isAtEndOfParagraph) SAL_OVERRIDE;
 
     virtual void FieldVanish(const OUString& rTxt, ww::eField eType) SAL_OVERRIDE;
 
@@ -570,11 +570,6 @@ private:
      */
     bool m_bWroteCellInfo;
 
-    /*
-     * If we had a field result in the URL.
-     */
-    bool m_bHadFieldResult;
-
     /// If we ended a table row without starting a new one.
     bool m_bTableRowEnded;
 
@@ -586,8 +581,6 @@ private:
 
     bool m_bInRun;
 
-    bool m_bInURL;
-
     /// Maps ID's to postit fields, used in atrfstart/end and atnref.
     std::map<sal_uInt16, const SwPostItField*> m_aPostitFields;
 
diff --git a/sw/source/filter/ww8/wrtw8esh.cxx b/sw/source/filter/ww8/wrtw8esh.cxx
index a06a244..0034118 100644
--- a/sw/source/filter/ww8/wrtw8esh.cxx
+++ b/sw/source/filter/ww8/wrtw8esh.cxx
@@ -1154,7 +1154,7 @@ void MSWord_SdrAttrIter::OutEEField(const SfxPoolItem& rHt)
         const OUString &rStr = pURL->GetRepresentation();
         m_rExport.AttrOutput().RawText( rStr, true, GetNodeCharSet() ); // FIXME kendy: is the 'true' actually correct here?  It was here before, but... ;-)
 
-        m_rExport.AttrOutput().EndURL();
+        m_rExport.AttrOutput().EndURL(false);
         m_rExport.nTxtTyp = nOldTxtTyp;
     }
 }
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
index 1601997..21aab2d 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -1050,7 +1050,7 @@ bool WW8AttributeOutput::StartURL( const OUString &rUrl, const OUString &rTarget
     return true;
 }
 
-bool WW8AttributeOutput::EndURL()
+bool WW8AttributeOutput::EndURL(bool const)
 {
     // hyperlinks only in WW8
     if ( !m_rWW8Export.bWrtWW8 )
@@ -1192,7 +1192,7 @@ int SwWW8AttrIter::OutAttrWithRange(sal_Int32 nPos)
                     }
                     if ( 0 != ( pEnd = pHt->End() ) && nPos == *pEnd )
                     {
-                        if ( m_rExport.AttrOutput().EndURL() )
+                        if (m_rExport.AttrOutput().EndURL(nPos == rNd.Len()))
                             --nRet;
                     }
                     break;
diff --git a/sw/source/filter/ww8/wrtww8gr.cxx b/sw/source/filter/ww8/wrtww8gr.cxx
index a4c45c9..28a2652 100644
--- a/sw/source/filter/ww8/wrtww8gr.cxx
+++ b/sw/source/filter/ww8/wrtww8gr.cxx
@@ -511,7 +511,7 @@ void WW8Export::OutGrf(const sw::Frame &rFrame)
     //Added for i120568,the hyperlink info within a graphic whose anchor type is
     //"As character" will be exported to ensure the fidelity
     if( bURLStarted )
-        m_pAttrOutput->EndURL();
+        m_pAttrOutput->EndURL(false);
 }
 
 GraphicDetails& GraphicDetails::operator=(const GraphicDetails &rOther)
diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx
index e86ce67..8e8f392 100644
--- a/sw/source/filter/ww8/ww8attributeoutput.hxx
+++ b/sw/source/filter/ww8/ww8attributeoutput.hxx
@@ -80,7 +80,7 @@ public:
     virtual bool StartURL( const OUString &rUrl, const OUString &rTarget ) SAL_OVERRIDE;
 
     /// Output URL end.
-    virtual bool EndURL() SAL_OVERRIDE;
+    virtual bool EndURL(bool) SAL_OVERRIDE;
 
     virtual void FieldVanish( const OUString& rTxt, ww::eField eType ) SAL_OVERRIDE;
 


More information about the Libreoffice-commits mailing list