summaryrefslogtreecommitdiff
path: root/sw/source/filter/ww8/docxattributeoutput.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/ww8/docxattributeoutput.cxx')
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx42
1 files changed, 38 insertions, 4 deletions
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index d0fd48ffb15f..e3ad3f917942 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1451,6 +1451,16 @@ void DocxAttributeOutput::EndRun(const SwTextNode* pNode, sal_Int32 nPos, bool /
}
if (pIt->bSep && !pIt->pField)
{
+ // for TOXMark:
+ // Word ignores bookmarks in field result that is empty;
+ // work around this by writing bookmark into field command.
+ if (!m_sFieldBkm.isEmpty())
+ {
+ DoWriteBookmarkTagStart(m_sFieldBkm);
+ DoWriteBookmarkTagEnd(m_nNextBookmarkId);
+ m_nNextBookmarkId++;
+ m_sFieldBkm.clear();
+ }
CmdEndField_Impl(pNode, nPos, true);
// Remove the field if no end needs to be written
if (!pIt->bClose)
@@ -2370,13 +2380,21 @@ void DocxAttributeOutput::EndField_Impl( const SwTextNode* pNode, sal_Int32 nPos
// Write the ref field if a bookmark had to be set and the field
// should be visible
if ( !rInfos.pField )
+ {
+ m_sFieldBkm.clear();
return;
+ }
sal_uInt16 nSubType = rInfos.pField->GetSubType( );
bool bIsSetField = rInfos.pField->GetTyp( )->Which( ) == SwFieldIds::SetExp;
bool bShowRef = bIsSetField && ( nSubType & nsSwExtendedSubType::SUB_INVISIBLE ) == 0;
- if ( m_sFieldBkm.isEmpty() || !bShowRef )
+ if (!bShowRef)
+ {
+ m_sFieldBkm.clear();
+ }
+
+ if (m_sFieldBkm.isEmpty())
return;
// Write the field beginning
@@ -3059,6 +3077,14 @@ bool DocxAttributeOutput::StartURL( const OUString& rUrl, const OUString& rTarge
}
}
}
+ else if (sMark.endsWith("|toxmark"))
+ {
+ if (auto const it = GetExport().m_TOXMarkBookmarksByURL.find(sMark);
+ it != GetExport().m_TOXMarkBookmarksByURL.end())
+ {
+ sMark = it->second;
+ }
+ }
// Spaces are prohibited in bookmark name.
sMark = sMark.replace(' ', '_');
m_pHyperlinkAttrList->add( FSNS( XML_w, XML_anchor ),
@@ -3085,9 +3111,10 @@ bool DocxAttributeOutput::EndURL(bool const)
return true;
}
-void DocxAttributeOutput::FieldVanish( const OUString& rText, ww::eField eType )
+void DocxAttributeOutput::FieldVanish(const OUString& rText,
+ ww::eField const eType, OUString const*const pBookmarkName)
{
- WriteField_Impl( nullptr, eType, rText, FieldFlags::All );
+ WriteField_Impl(nullptr, eType, rText, FieldFlags::All, pBookmarkName);
}
// The difference between 'Redline' and 'StartRedline'+'EndRedline' is that:
@@ -8044,7 +8071,9 @@ void DocxAttributeOutput::WriteExpand( const SwField* pField )
m_rExport.OutputField( pField, ww::eUNKNOWN, OUString() );
}
-void DocxAttributeOutput::WriteField_Impl( const SwField* pField, ww::eField eType, const OUString& rFieldCmd, FieldFlags nMode )
+void DocxAttributeOutput::WriteField_Impl(const SwField *const pField,
+ ww::eField const eType, const OUString& rFieldCmd, FieldFlags const nMode,
+ OUString const*const pBookmarkName)
{
if (m_bPreventDoubleFieldsHandling)
return;
@@ -8059,6 +8088,11 @@ void DocxAttributeOutput::WriteField_Impl( const SwField* pField, ww::eField eTy
infos.bOpen = bool(FieldFlags::Start & nMode);
m_Fields.push_back( infos );
+ if (pBookmarkName)
+ {
+ m_sFieldBkm = *pBookmarkName;
+ }
+
if ( !pField )
return;