Kaydet (Commit) aa3c0ddc authored tarafından Vasily Melenchuk's avatar Vasily Melenchuk Kaydeden (comit) Thorsten Behrens

tdf#103090 replace spaces by underscore in bookmark names for DOCX.

Bookmarks containing spaces are incorrectly interpreted by MS Word,
so spaces are replaced in bookmark names and bookmark references
in fields.

Change-Id: I4e23c6b8740b54e94a1ec7e3385cffbe3ba01709
Reviewed-on: https://gerrit.libreoffice.org/41954Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst e55ee82f
......@@ -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: */
......@@ -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();
}
......
......@@ -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;
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment