summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/qa/extras/ooxmlexport/data/tdf103090.odtbin0 -> 8845 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport9.cxx22
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx30
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.hxx6
-rw-r--r--sw/source/filter/ww8/wrtw8nds.cxx3
5 files changed, 39 insertions, 22 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf103090.odt b/sw/qa/extras/ooxmlexport/data/tdf103090.odt
new file mode 100644
index 000000000000..d264f255abb7
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf103090.odt
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
index 930cbdc41b4f..5f45cbcc7109 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
@@ -1049,6 +1049,28 @@ DECLARE_OOXMLEXPORT_TEST(tdf112169, "tdf112169.odt")
// LO crashed while export because of character background color handling
}
+DECLARE_OOXMLEXPORT_TEST(testTdf103090, "tdf103090.odt")
+{
+ xmlDocPtr pXmlDoc = parseExport("word/document.xml");
+ if (!pXmlDoc)
+ return;
+
+ // Get bookmark name
+ OUString bookmarkName = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:bookmarkStart", "name");
+
+ // Ensure that name has no spaces
+ CPPUNIT_ASSERT(bookmarkName.indexOf(" ") < 0);
+
+ // Get PAGEREF field
+ OUString fieldName = getXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:instrText");
+
+ // Ensure that PAGEREF field refers exactly our bookmark
+ OUString expectedFieldName(" PAGEREF ");
+ expectedFieldName += bookmarkName;
+ expectedFieldName += " \\h ";
+ CPPUNIT_ASSERT_EQUAL(expectedFieldName, fieldName);
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index f1413e5f62d7..365db5e55728 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1374,14 +1374,13 @@ void DocxAttributeOutput::EndRun()
void DocxAttributeOutput::DoWriteBookmarks()
{
// Write the start bookmarks
- for ( std::vector< OString >::const_iterator it = m_rBookmarksStart.begin(), end = m_rBookmarksStart.end();
- it != end; ++it )
+ for ( const auto & it : m_rBookmarksStart )
{
- const OString& rName = *it;
+ OString rName = OUStringToOString( BookmarkToWord( it ), RTL_TEXTENCODING_UTF8 ).getStr();
// Output the bookmark
const sal_Int32 nId = m_nNextBookmarkId++;
- m_rOpenedBookmarksIds[rName] = nId;
+ m_rOpenedBookmarksIds[it] = nId;
m_pSerializer->singleElementNS( XML_w, XML_bookmarkStart,
FSNS( XML_w, XML_id ), OString::number( nId ).getStr( ),
FSNS( XML_w, XML_name ), rName.getStr(),
@@ -1391,20 +1390,17 @@ void DocxAttributeOutput::DoWriteBookmarks()
m_rBookmarksStart.clear();
// export the end bookmarks
- for ( std::vector< OString >::const_iterator it = m_rBookmarksEnd.begin(), end = m_rBookmarksEnd.end();
- it != end; ++it )
+ for ( const auto & it : m_rBookmarksEnd )
{
- const OString& rName = *it;
-
// Get the id of the bookmark
- std::map< OString, sal_Int32 >::iterator pPos = m_rOpenedBookmarksIds.find( rName );
- if ( pPos != m_rOpenedBookmarksIds.end( ) )
+ auto pPos = m_rOpenedBookmarksIds.find(it);
+ if ( pPos != m_rOpenedBookmarksIds.end() )
{
const sal_Int32 nId = ( *pPos ).second;
m_pSerializer->singleElementNS( XML_w, XML_bookmarkEnd,
- FSNS( XML_w, XML_id ), OString::number( nId ).getStr( ),
+ FSNS( XML_w, XML_id ), OString::number( nId ).getStr(),
FSEND );
- m_rOpenedBookmarksIds.erase( rName );
+ m_rOpenedBookmarksIds.erase( it );
}
}
m_rBookmarksEnd.clear();
@@ -6988,17 +6984,15 @@ void DocxAttributeOutput::WriteFormData_Impl( const ::sw::mark::IFieldmark& rFie
void DocxAttributeOutput::WriteBookmarks_Impl( std::vector< OUString >& rStarts,
std::vector< OUString >& rEnds )
{
- for ( std::vector< OUString >::const_iterator it = rStarts.begin(), end = rStarts.end(); it != end; ++it )
+ for ( const auto & it : rStarts )
{
- OString rName = OUStringToOString( *it, RTL_TEXTENCODING_UTF8 ).getStr( );
- m_rBookmarksStart.push_back( rName );
+ m_rBookmarksStart.push_back( it );
}
rStarts.clear();
- for ( std::vector< OUString >::const_iterator it = rEnds.begin(), end = rEnds.end(); it != end; ++it )
+ for ( const auto & it : rEnds )
{
- OString rName = OUStringToOString( *it, RTL_TEXTENCODING_UTF8 ).getStr( );
- m_rBookmarksEnd.push_back( rName );
+ m_rBookmarksEnd.push_back( it );
}
rEnds.clear();
}
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 1a32aec81824..53c05ea2f65c 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -773,15 +773,15 @@ private:
sal_Int32 m_nNextAnnotationMarkId;
/// Bookmarks to output
- std::vector<OString> m_rBookmarksStart;
- std::vector<OString> m_rBookmarksEnd;
+ std::vector<OUString> m_rBookmarksStart;
+ std::vector<OUString> m_rBookmarksEnd;
/// Annotation marks to output
std::vector<OString> m_rAnnotationMarksStart;
std::vector<OString> m_rAnnotationMarksEnd;
/// Maps of the bookmarks ids
- std::map<OString, sal_Int32> m_rOpenedBookmarksIds;
+ std::map<OUString, sal_Int32> m_rOpenedBookmarksIds;
/// Name of the last opened bookmark.
OString m_sLastOpenedBookmark;
diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
index bc536d49c876..4c99f18b1d53 100644
--- a/sw/source/filter/ww8/wrtw8nds.cxx
+++ b/sw/source/filter/ww8/wrtw8nds.cxx
@@ -1118,7 +1118,8 @@ bool WW8AttributeOutput::EndURL(bool const)
OUString BookmarkToWord(const OUString &rBookmark)
{
- OUString sRet(INetURLObject::encode(rBookmark,
+ OUString sRet(INetURLObject::encode(
+ rBookmark.replace(' ', '_'), // Spaces are prohibited in bookmark name
INetURLObject::PART_REL_SEGMENT_EXTRA,
INetURLObject::EncodeMechanism::All, RTL_TEXTENCODING_ASCII_US));
return TruncateBookmark(sRet);